diff options
| author | Vincent-Michael <Vincent_Michael@gmx.de> | 2013-08-30 23:46:24 +0200 |
|---|---|---|
| committer | Vincent-Michael <Vincent_Michael@gmx.de> | 2013-08-30 23:46:24 +0200 |
| commit | 38bb6fe8e7935d91cc9e487c73a966689146d8f2 (patch) | |
| tree | 348d72809628705ca88e05c29927de12fbba9870 /src/server/game | |
| parent | 224c5c5d3d4876f6cf05c37d7183205b1b9b565f (diff) | |
| parent | 3f6296b65ebd63849f67895f7ab6280b8828da28 (diff) | |
Merge branch 'master' of github.com:TrinityCore/TrinityCore into 4.3.4
Conflicts:
src/server/game/AI/EventAI/CreatureEventAIMgr.cpp
src/server/game/Entities/Creature/Creature.h
src/server/game/Entities/Player/Player.cpp
src/server/game/Globals/ObjectMgr.cpp
src/server/game/Handlers/CharacterHandler.cpp
src/server/game/Quests/QuestDef.cpp
src/server/game/Quests/QuestDef.h
Diffstat (limited to 'src/server/game')
| -rw-r--r-- | src/server/game/Entities/Creature/Creature.h | 6 | ||||
| -rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 10 | ||||
| -rw-r--r-- | src/server/game/Globals/ObjectMgr.cpp | 12 | ||||
| -rw-r--r-- | src/server/game/Handlers/CharacterHandler.cpp | 6 | ||||
| -rw-r--r-- | src/server/game/Movement/Spline/Spline.h | 4 | ||||
| -rw-r--r-- | src/server/game/Quests/QuestDef.cpp | 26 | ||||
| -rw-r--r-- | src/server/game/Quests/QuestDef.h | 39 | ||||
| -rw-r--r-- | src/server/game/Spells/SpellEffects.cpp | 3 |
8 files changed, 59 insertions, 47 deletions
diff --git a/src/server/game/Entities/Creature/Creature.h b/src/server/game/Entities/Creature/Creature.h index 13ed277eda3..365bb05444e 100644 --- a/src/server/game/Entities/Creature/Creature.h +++ b/src/server/game/Entities/Creature/Creature.h @@ -193,7 +193,7 @@ struct CreatureBaseStats uint32 GenerateHealth(CreatureTemplate const* info) const { - return uint32((BaseHealth[info->expansion] * info->ModHealth) + 0.5f); + return uint32(ceil(BaseHealth[info->expansion] * info->ModHealth)); } uint32 GenerateMana(CreatureTemplate const* info) const @@ -202,12 +202,12 @@ struct CreatureBaseStats if (!BaseMana) return 0; - return uint32((BaseMana * info->ModMana * info->ModManaExtra) + 0.5f); + return uint32(ceil(BaseMana * info->ModMana * info->ModManaExtra)); } uint32 GenerateArmor(CreatureTemplate const* info) const { - return uint32((BaseArmor * info->ModArmor) + 0.5f); + return uint32(ceil(BaseArmor * info->ModArmor)); } static CreatureBaseStats const* GetBaseStats(uint8 level, uint8 unitClass); diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 02e95fd3975..fcdc59da9c6 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -15000,7 +15000,7 @@ bool Player::CanCompleteQuest(uint32 quest_id) } } - if (qInfo->HasSpecialFlag(QUEST_SPECIAL_FLAGS_KILL | QUEST_SPECIAL_FLAGS_SPEAKTO)) + if (qInfo->HasSpecialFlag(QUEST_SPECIAL_FLAGS_KILL | QUEST_SPECIAL_FLAGS_CAST | QUEST_SPECIAL_FLAGS_SPEAKTO)) { for (uint8 i = 0; i < QUEST_OBJECTIVES_COUNT; i++) { @@ -15159,7 +15159,7 @@ void Player::AddQuest(Quest const* quest, Object* questGiver) questStatusData.ItemCount[i] = 0; } - if (quest->HasSpecialFlag(QUEST_SPECIAL_FLAGS_KILL | QUEST_SPECIAL_FLAGS_SPEAKTO)) + if (quest->HasSpecialFlag(QUEST_SPECIAL_FLAGS_KILL | QUEST_SPECIAL_FLAGS_CAST | QUEST_SPECIAL_FLAGS_SPEAKTO)) { for (uint8 i = 0; i < QUEST_OBJECTIVES_COUNT; ++i) questStatusData.CreatureOrGOCount[i] = 0; @@ -16359,7 +16359,7 @@ void Player::KilledMonsterCredit(uint32 entry, uint64 guid /*= 0*/) QuestStatusData& q_status = m_QuestStatus[questid]; if (q_status.Status == QUEST_STATUS_INCOMPLETE && (!GetGroup() || !GetGroup()->isRaidGroup() || qInfo->IsAllowedInRaid(GetMap()->GetDifficulty()))) { - if (qInfo->HasSpecialFlag(QUEST_SPECIAL_FLAGS_KILL)) + if (qInfo->HasSpecialFlag(QUEST_SPECIAL_FLAGS_KILL) /*&& !qInfo->HasSpecialFlag(QUEST_SPECIAL_FLAGS_CAST)*/) { for (uint8 j = 0; j < QUEST_OBJECTIVES_COUNT; ++j) { @@ -16450,7 +16450,7 @@ void Player::KillCreditGO(uint32 entry, uint64 guid) if (q_status.Status == QUEST_STATUS_INCOMPLETE) { - if (qInfo->HasSpecialFlag(QUEST_SPECIAL_FLAGS_KILL)) + if (qInfo->HasSpecialFlag(QUEST_SPECIAL_FLAGS_CAST) /*&& !qInfo->HasSpecialFlag(QUEST_SPECIAL_FLAGS_KILL)*/) { for (uint8 j = 0; j < QUEST_OBJECTIVES_COUNT; ++j) { @@ -16504,7 +16504,7 @@ void Player::TalkedToCreature(uint32 entry, uint64 guid) if (q_status.Status == QUEST_STATUS_INCOMPLETE) { - if (qInfo->HasSpecialFlag(QUEST_SPECIAL_FLAGS_KILL | QUEST_SPECIAL_FLAGS_SPEAKTO)) + if (qInfo->HasSpecialFlag(QUEST_SPECIAL_FLAGS_KILL | QUEST_SPECIAL_FLAGS_CAST | QUEST_SPECIAL_FLAGS_SPEAKTO)) { for (uint8 j = 0; j < QUEST_OBJECTIVES_COUNT; ++j) { diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index 1cd6125cc95..81a07e2620d 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -3627,12 +3627,12 @@ void ObjectMgr::LoadQuests() } } - if (qinfo->Flags & QUEST_SPECIAL_FLAGS_MONTHLY) + if (qinfo->SpecialFlags & QUEST_SPECIAL_FLAGS_MONTHLY) { - if (!(qinfo->Flags & QUEST_SPECIAL_FLAGS_REPEATABLE)) + if (!(qinfo->SpecialFlags & QUEST_SPECIAL_FLAGS_REPEATABLE)) { TC_LOG_ERROR(LOG_FILTER_SQL, "Monthly quest %u not marked as repeatable in `SpecialFlags`, added.", qinfo->GetQuestId()); - qinfo->Flags |= QUEST_SPECIAL_FLAGS_REPEATABLE; + qinfo->SpecialFlags |= QUEST_SPECIAL_FLAGS_REPEATABLE; } } @@ -3699,13 +3699,13 @@ void ObjectMgr::LoadQuests() } // RequiredRaces, can be 0/RACEMASK_ALL_PLAYABLE to allow any race if (qinfo->RequiredRaces) - { + { if (!(qinfo->RequiredRaces & RACEMASK_ALL_PLAYABLE)) { TC_LOG_ERROR(LOG_FILTER_SQL, "Quest %u does not contain any playable races in `RequiredRaces` (%u), value set to 0 (all races).", qinfo->GetQuestId(), qinfo->RequiredRaces); qinfo->RequiredRaces = 0; } - } + } // RequiredSkillId, can be 0 if (qinfo->RequiredSkillId) { @@ -3917,7 +3917,7 @@ void ObjectMgr::LoadQuests() { // In fact SpeakTo and Kill are quite same: either you can speak to mob:SpeakTo or you can't:Kill/Cast - qinfo->SetSpecialFlag(QUEST_SPECIAL_FLAGS_KILL | QUEST_SPECIAL_FLAGS_SPEAKTO); + qinfo->SetSpecialFlag(QUEST_SPECIAL_FLAGS_KILL | QUEST_SPECIAL_FLAGS_CAST | QUEST_SPECIAL_FLAGS_SPEAKTO); if (!qinfo->RequiredNpcOrGoCount[j]) { diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp index 1cf197aeb69..341a1a89403 100644 --- a/src/server/game/Handlers/CharacterHandler.cpp +++ b/src/server/game/Handlers/CharacterHandler.cpp @@ -1279,6 +1279,7 @@ void WorldSession::HandleCharRenameOpcode(WorldPacket& recvData) void WorldSession::HandleChangePlayerNameOpcodeCallBack(PreparedQueryResult result, std::string const& newName) { + AntiDOS.AllowOpcode(CMSG_CHAR_ENUM, true); if (!result) { WorldPacket data(SMSG_CHAR_RENAME, 1); @@ -1528,6 +1529,9 @@ void WorldSession::HandleCharCustomize(WorldPacket& recvData) PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHARACTER_AT_LOGIN); stmt->setUInt32(0, GUID_LOPART(guid)); + // TODO: Make async with callback + // TODO 2: Allow opcode at end of callback + AntiDOS.AllowOpcode(CMSG_CHAR_ENUM, true); PreparedQueryResult result = CharacterDatabase.Query(stmt); if (!result) @@ -1781,6 +1785,8 @@ void WorldSession::HandleCharFactionOrRaceChange(WorldPacket& recvData) uint8 playerClass = nameData->m_class; uint8 level = nameData->m_level; + // TO Do: Make async and allow opcode on callback + AntiDOS.AllowOpcode(CMSG_CHAR_ENUM, true); PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHAR_AT_LOGIN_TITLES); stmt->setUInt32(0, lowGuid); PreparedQueryResult result = CharacterDatabase.Query(stmt); diff --git a/src/server/game/Movement/Spline/Spline.h b/src/server/game/Movement/Spline/Spline.h index 42090cae71b..d4b100ee46e 100644 --- a/src/server/game/Movement/Spline/Spline.h +++ b/src/server/game/Movement/Spline/Spline.h @@ -21,6 +21,7 @@ #include "MovementTypedefs.h" #include <G3D/Vector3.h> +#include <limits> namespace Movement { @@ -184,6 +185,9 @@ public: while (i < index_hi) { new_length = cacher(*this, i); + // length overflowed, assign to max positive value + if (new_length < 0) + new_length = std::numeric_limits<length_type>::max(); lengths[++i] = new_length; ASSERT(prev_length <= new_length); diff --git a/src/server/game/Quests/QuestDef.cpp b/src/server/game/Quests/QuestDef.cpp index 9f374dec8e4..d377aa0a197 100644 --- a/src/server/game/Quests/QuestDef.cpp +++ b/src/server/game/Quests/QuestDef.cpp @@ -72,7 +72,6 @@ Quest::Quest(Field* questRecord) RewardReputationMask = questRecord[46].GetUInt8(); QuestGiverPortrait = questRecord[47].GetUInt32(); QuestTurnInPortrait = questRecord[48].GetUInt32(); - for (int i = 0; i < QUEST_REWARDS_COUNT; ++i) RewardItemId[i] = questRecord[49+i].GetUInt32(); @@ -168,37 +167,36 @@ Quest::Quest(Field* questRecord) if (SpecialFlags & QUEST_SPECIAL_FLAGS_AUTO_ACCEPT) Flags |= QUEST_FLAGS_AUTO_ACCEPT; - m_reqItemsCount = 0; - m_reqNpcOrGoCount = 0; - m_rewItemsCount = 0; - m_rewChoiceItemsCount = 0; - m_rewCurrencyCount = 0; - m_reqCurrencyCount = 0; + _reqItemsCount = 0; + _reqNpcOrGoCount = 0; + _rewItemsCount = 0; + _rewChoiceItemsCount = 0; + _rewCurrencyCount = 0; + _reqCurrencyCount = 0; for (int i = 0; i < QUEST_ITEM_OBJECTIVES_COUNT; ++i) if (RequiredItemId[i]) - ++m_reqItemsCount; + ++_reqItemsCount; for (int i = 0; i < QUEST_OBJECTIVES_COUNT; ++i) if (RequiredNpcOrGo[i]) - ++m_reqNpcOrGoCount; + ++_reqNpcOrGoCount; for (int i = 0; i < QUEST_REWARDS_COUNT; ++i) if (RewardItemId[i]) - ++m_rewItemsCount; + ++_rewItemsCount; for (int i = 0; i < QUEST_REWARD_CHOICES_COUNT; ++i) if (RewardChoiceItemId[i]) - ++m_rewChoiceItemsCount; + ++_rewChoiceItemsCount; for (int i = 0; i < QUEST_REWARD_CURRENCY_COUNT; ++i) if (RewardCurrencyId[i]) - ++m_rewCurrencyCount; + ++_rewCurrencyCount; for (int i = 0; i < QUEST_REQUIRED_CURRENCY_COUNT; ++i) if (RequiredCurrencyId[i]) - ++m_reqCurrencyCount; - + ++_reqCurrencyCount; } uint32 Quest::XPValue(Player* player) const diff --git a/src/server/game/Quests/QuestDef.h b/src/server/game/Quests/QuestDef.h index ee7c47ded91..599780d5cbe 100644 --- a/src/server/game/Quests/QuestDef.h +++ b/src/server/game/Quests/QuestDef.h @@ -160,14 +160,15 @@ enum QuestSpecialFlags { QUEST_SPECIAL_FLAGS_NONE = 0x000, // Trinity flags for set SpecialFlags in DB if required but used only at server - QUEST_SPECIAL_FLAGS_REPEATABLE = 0x001, - QUEST_SPECIAL_FLAGS_EXPLORATION_OR_EVENT = 0x002, // if required area explore, spell SPELL_EFFECT_QUEST_COMPLETE casting, table `*_script` command SCRIPT_COMMAND_QUEST_EXPLORED use, set from script) - QUEST_SPECIAL_FLAGS_AUTO_ACCEPT = 0x004, // quest is to be auto-accepted. - QUEST_SPECIAL_FLAGS_DF_QUEST = 0x008, // quest is used by Dungeon Finder. - QUEST_SPECIAL_FLAGS_MONTHLY = 0x010, // quest is reset at the begining of the month + QUEST_SPECIAL_FLAGS_REPEATABLE = 0x001, // Set by 1 in SpecialFlags from DB + QUEST_SPECIAL_FLAGS_EXPLORATION_OR_EVENT = 0x002, // Set by 2 in SpecialFlags from DB (if required area explore, spell SPELL_EFFECT_QUEST_COMPLETE casting, table `FECT_QUEST_COMPLETE casting, table `*_script` command SCRIPT_COMMAND_QUEST_EXPLORED use, set from script) + QUEST_SPECIAL_FLAGS_AUTO_ACCEPT = 0x004, // Set by 4 in SpecialFlags in DB if the quest is to be auto-accepted. + QUEST_SPECIAL_FLAGS_DF_QUEST = 0x008, // Set by 8 in SpecialFlags in DB if the quest is used by Dungeon Finder. + QUEST_SPECIAL_FLAGS_MONTHLY = 0x010, // Set by 16 in SpecialFlags in DB if the quest is reset at the begining of the month + QUEST_SPECIAL_FLAGS_CAST = 0x020, // Set by 32 in SpecialFlags in DB if the quest requires RequiredOrNpcGo killcredit but NOT kill (a spell cast) // room for more custom flags - QUEST_SPECIAL_FLAGS_DB_ALLOWED = QUEST_SPECIAL_FLAGS_REPEATABLE | QUEST_SPECIAL_FLAGS_EXPLORATION_OR_EVENT | QUEST_SPECIAL_FLAGS_AUTO_ACCEPT | QUEST_SPECIAL_FLAGS_DF_QUEST | QUEST_SPECIAL_FLAGS_MONTHLY, + QUEST_SPECIAL_FLAGS_DB_ALLOWED = QUEST_SPECIAL_FLAGS_REPEATABLE | QUEST_SPECIAL_FLAGS_EXPLORATION_OR_EVENT | QUEST_SPECIAL_FLAGS_AUTO_ACCEPT | QUEST_SPECIAL_FLAGS_DF_QUEST | QUEST_SPECIAL_FLAGS_MONTHLY | QUEST_SPECIAL_FLAGS_CAST, QUEST_SPECIAL_FLAGS_DELIVER = 0x080, // Internal flag computed only QUEST_SPECIAL_FLAGS_SPEAKTO = 0x100, // Internal flag computed only @@ -286,7 +287,7 @@ class Quest uint32 GetQuestTurnInPortrait() const { return QuestTurnInPortrait; } bool IsDaily() const { return Flags & QUEST_FLAGS_DAILY; } bool IsWeekly() const { return Flags & QUEST_FLAGS_WEEKLY; } - bool IsMonthly() const { return Flags & QUEST_SPECIAL_FLAGS_MONTHLY; } + bool IsMonthly() const { return SpecialFlags & QUEST_SPECIAL_FLAGS_MONTHLY; } bool IsSeasonal() const { return (ZoneOrSort == -QUEST_SORT_SEASONAL || ZoneOrSort == -QUEST_SORT_SPECIAL || ZoneOrSort == -QUEST_SORT_LUNAR_FESTIVAL || ZoneOrSort == -QUEST_SORT_MIDSUMMER || ZoneOrSort == -QUEST_SORT_BREWFEST || ZoneOrSort == -QUEST_SORT_LOVE_IS_IN_THE_AIR || ZoneOrSort == -QUEST_SORT_NOBLEGARDEN) && !IsRepeatable(); } bool IsDailyOrWeekly() const { return Flags & (QUEST_FLAGS_DAILY | QUEST_FLAGS_WEEKLY); } bool IsRaidQuest(Difficulty difficulty) const; @@ -319,12 +320,12 @@ class Quest uint32 RequiredCurrencyId[QUEST_REQUIRED_CURRENCY_COUNT]; uint32 RequiredCurrencyCount[QUEST_REQUIRED_CURRENCY_COUNT]; - uint32 GetReqItemsCount() const { return m_reqItemsCount; } - uint32 GetReqCreatureOrGOcount() const { return m_reqNpcOrGoCount; } - uint32 GetRewChoiceItemsCount() const { return m_rewChoiceItemsCount; } - uint32 GetRewItemsCount() const { return m_rewItemsCount; } - uint32 GetRewCurrencyCount() const { return m_rewCurrencyCount; } - uint32 GetReqCurrencyCount() const { return m_reqCurrencyCount; } + uint32 GetReqItemsCount() const { return _reqItemsCount; } + uint32 GetReqCreatureOrGOcount() const { return _reqNpcOrGoCount; } + uint32 GetRewChoiceItemsCount() const { return _rewChoiceItemsCount; } + uint32 GetRewItemsCount() const { return _rewItemsCount; } + uint32 GetRewCurrencyCount() const { return _rewCurrencyCount; } + uint32 GetReqCurrencyCount() const { return _reqCurrencyCount; } void BuildExtraQuestInfo(WorldPacket& data, Player* player) const; @@ -335,12 +336,12 @@ class Quest // cached data private: - uint32 m_reqItemsCount; - uint32 m_reqNpcOrGoCount; - uint32 m_rewChoiceItemsCount; - uint32 m_rewItemsCount; - uint32 m_rewCurrencyCount; - uint32 m_reqCurrencyCount; + uint32 _reqItemsCount; + uint32 _reqNpcOrGoCount; + uint32 _rewChoiceItemsCount; + uint32 _rewItemsCount; + uint32 _rewCurrencyCount; + uint32 _reqCurrencyCount; // table data protected: diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index cc6a584847d..db7e8b35f2f 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -898,6 +898,9 @@ void Spell::EffectForceCast(SpellEffIndex effIndex) case 52349: // Overtake unitTarget->CastCustomSpell(unitTarget, spellInfo->Id, &damage, NULL, NULL, true, NULL, NULL, m_originalCasterGUID); return; + case 72299: // Malleable Goo Summon Trigger + unitTarget->CastSpell(unitTarget, spellInfo->Id, true, NULL, NULL, m_originalCasterGUID); + return; } } |
