From e3f27a36fe1e40cf3fde0541329536a7f34c6fd6 Mon Sep 17 00:00:00 2001 From: Machiavelli Date: Fri, 30 Aug 2013 20:59:29 +0100 Subject: Core/Creatures: Fix base stats calculations for some cases. i.e. health_mod of 0.001 resulting in hp of 0 instead of 1 --- src/server/game/Entities/Creature/Creature.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/server/game/Entities/Creature/Creature.h b/src/server/game/Entities/Creature/Creature.h index 34084dd662b..b720a063f2d 100644 --- a/src/server/game/Entities/Creature/Creature.h +++ b/src/server/game/Entities/Creature/Creature.h @@ -195,7 +195,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 @@ -204,12 +204,12 @@ struct CreatureBaseStats if (!BaseMana) return 0; - return uint32((BaseMana * info->ModMana) + 0.5f); + return uint32(ceil(BaseMana * info->ModMana)); } 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); -- cgit v1.2.3 From be7d82ba8de464d0d0a817bb4adbfa81930e68d0 Mon Sep 17 00:00:00 2001 From: jackpoz Date: Fri, 30 Aug 2013 21:27:04 +0100 Subject: Core/Maps: Fix Spline triggered assert Fix an assert triggered by float to int32 cast overflowing to -1, now it replaces -1 with max int32 value. Fix another assert triggered by Vector3 magnitude float overflow to max/infinity in StaticMapTree::isInLineOfSight(), in this case return false. Both asserts can be reproduced by casting Mind Control to a NPC, tele to z: 1.0e+38 using client hack tools, move to allow the server to register the new position and stop Mind Control. Closes #8970 Closes #10578 Closes #10355 Closes #10673 --- src/server/collision/Maps/MapTree.cpp | 5 +++++ src/server/game/Movement/Spline/Spline.h | 4 ++++ 2 files changed, 9 insertions(+) (limited to 'src') diff --git a/src/server/collision/Maps/MapTree.cpp b/src/server/collision/Maps/MapTree.cpp index dc12bb68e0d..436f30eed10 100644 --- a/src/server/collision/Maps/MapTree.cpp +++ b/src/server/collision/Maps/MapTree.cpp @@ -156,6 +156,11 @@ namespace VMAP bool StaticMapTree::isInLineOfSight(const Vector3& pos1, const Vector3& pos2) const { float maxDist = (pos2 - pos1).magnitude(); + // return false if distance is over max float, in case of cheater teleporting to the end of the universe + if (maxDist == std::numeric_limits::max() || + maxDist == std::numeric_limits::infinity()) + return false; + // valid map coords should *never ever* produce float overflow, but this would produce NaNs too ASSERT(maxDist < std::numeric_limits::max()); // prevent NaN values which can cause BIH intersection to enter infinite loop 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 +#include 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::max(); lengths[++i] = new_length; ASSERT(prev_length <= new_length); -- cgit v1.2.3 From 4b5c4ab12adc91860b59302ed84d9ab977743d8a Mon Sep 17 00:00:00 2001 From: Machiavelli Date: Fri, 30 Aug 2013 21:52:59 +0100 Subject: Core/CharacterHandler: Some more rules for CMSG_CHAR_ENUM allowance Thanks to @TakenBacon for heads up --- src/server/game/Handlers/CharacterHandler.cpp | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'src') diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp index 79d5c22e6a2..6a7e6c5dedd 100644 --- a/src/server/game/Handlers/CharacterHandler.cpp +++ b/src/server/game/Handlers/CharacterHandler.cpp @@ -1165,6 +1165,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); @@ -1422,6 +1423,8 @@ void WorldSession::HandleCharCustomize(WorldPacket& recvData) 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) @@ -1675,6 +1678,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); -- cgit v1.2.3 From 16eefd18fa942f9317b0eb22249b0e13a77622eb Mon Sep 17 00:00:00 2001 From: Shauren Date: Fri, 30 Aug 2013 23:00:43 +0200 Subject: Scripts/Icecrown Citaldel: Fixed spells cast by Professor Putricide during heroic Festergut and Rotface encounters Closes #7641 Closes #8243 --- .../2013_08_30_07_world_spell_script_names.sql | 4 + src/server/game/Spells/SpellEffects.cpp | 3 + .../Northrend/IcecrownCitadel/boss_festergut.cpp | 26 ++++-- .../IcecrownCitadel/boss_professor_putricide.cpp | 24 ++---- .../Northrend/IcecrownCitadel/boss_rotface.cpp | 98 ++++++++++++++++++++-- .../Northrend/IcecrownCitadel/icecrown_citadel.h | 2 + 6 files changed, 129 insertions(+), 28 deletions(-) create mode 100644 sql/updates/world/2013_08_30_07_world_spell_script_names.sql (limited to 'src') diff --git a/sql/updates/world/2013_08_30_07_world_spell_script_names.sql b/sql/updates/world/2013_08_30_07_world_spell_script_names.sql new file mode 100644 index 00000000000..d9857b0e789 --- /dev/null +++ b/sql/updates/world/2013_08_30_07_world_spell_script_names.sql @@ -0,0 +1,4 @@ +DELETE FROM `spell_script_names` WHERE `ScriptName`='spell_rotface_vile_gas_trigger'; +INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES +(72285, 'spell_rotface_vile_gas_trigger'), +(72288, 'spell_rotface_vile_gas_trigger'); diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index ac3f12ed8c5..91a5c35955a 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -1034,6 +1034,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; } } diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_festergut.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_festergut.cpp index bf85fe455c7..68df37f0fdd 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_festergut.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_festergut.cpp @@ -206,15 +206,27 @@ class boss_festergut : public CreatureScript } case EVENT_VILE_GAS: { - std::list targets; + std::list ranged, melee; uint32 minTargets = RAID_MODE(3, 8, 3, 8); - SelectTargetList(targets, minTargets, SELECT_TARGET_RANDOM, -5.0f, true); - float minDist = 0.0f; - if (targets.size() >= minTargets) - minDist = -5.0f; + SelectTargetList(ranged, 25, SELECT_TARGET_RANDOM, -5.0f, true); + SelectTargetList(melee, 25, SELECT_TARGET_RANDOM, 5.0f, true); + while (ranged.size() < minTargets) + { + if (melee.empty()) + break; + + Unit* target = Trinity::Containers::SelectRandomContainerElement(melee); + ranged.push_back(target); + melee.remove(target); + } + + if (!ranged.empty()) + { + Trinity::Containers::RandomResizeList(ranged, RAID_MODE(1, 3, 1, 3)); + for (std::list::iterator itr = ranged.begin(); itr != ranged.end(); ++itr) + DoCast(*itr, SPELL_VILE_GAS); + } - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, minDist, true)) - DoCast(target, SPELL_VILE_GAS); events.ScheduleEvent(EVENT_VILE_GAS, urand(28000, 35000)); break; } diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp index 927b3dfe467..96627548848 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp @@ -55,10 +55,8 @@ enum Spells SPELL_GASEOUS_BLIGHT_LARGE = 69157, SPELL_GASEOUS_BLIGHT_MEDIUM = 69162, SPELL_GASEOUS_BLIGHT_SMALL = 69164, - SPELL_MALLABLE_GOO_H = 70852, - - // Rotface - SPELL_VILE_GAS_H = 69240, + SPELL_MALLEABLE_GOO_H = 72296, + SPELL_MALLEABLE_GOO_SUMMON = 72299, // Professor Putricide SPELL_SLIME_PUDDLE_TRIGGER = 70341, @@ -122,7 +120,6 @@ enum Events // Rotface EVENT_ROTFACE_DIES = 3, - EVENT_ROTFACE_VILE_GAS = 4, EVENT_ROTFACE_OOZE_FLOOD = 5, // Professor Putricide @@ -305,6 +302,9 @@ class boss_professor_putricide : public CreatureScript summons.Summon(summon); switch (summon->GetEntry()) { + case NPC_MALLEABLE_OOZE_STALKER: + DoCast(summon, SPELL_MALLEABLE_GOO_H); + return; case NPC_GROWING_OOZE_PUDDLE: summon->CastSpell(summon, SPELL_GROW_STACKER, true); summon->CastSpell(summon, SPELL_SLIME_PUDDLE_AURA, true); @@ -424,7 +424,7 @@ class boss_professor_putricide : public CreatureScript me->SetReactState(REACT_PASSIVE); DoZoneInCombat(me); if (IsHeroic()) - events.ScheduleEvent(EVENT_FESTERGUT_GOO, urand(15000, 20000), 0, PHASE_FESTERGUT); + events.ScheduleEvent(EVENT_FESTERGUT_GOO, urand(13000, 18000), 0, PHASE_FESTERGUT); break; case ACTION_FESTERGUT_GAS: Talk(SAY_FESTERGUT_GASEOUS_BLIGHT); @@ -441,8 +441,6 @@ class boss_professor_putricide : public CreatureScript me->SetReactState(REACT_PASSIVE); _oozeFloodStage = 0; DoZoneInCombat(me); - if (IsHeroic()) - events.ScheduleEvent(EVENT_ROTFACE_VILE_GAS, urand(15000, 20000), 0, PHASE_ROTFACE); // init random sequence of floods if (Creature* rotface = Unit::GetCreature(*me, instance->GetData64(DATA_ROTFACE))) { @@ -582,19 +580,13 @@ class boss_professor_putricide : public CreatureScript EnterEvadeMode(); break; case EVENT_FESTERGUT_GOO: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, NonTankTargetSelector(me))) - DoCast(target, SPELL_MALLABLE_GOO_H, true); // triggered, to skip LoS check - events.ScheduleEvent(EVENT_FESTERGUT_GOO, urand(15000, 20000), 0, PHASE_FESTERGUT); + me->CastCustomSpell(SPELL_MALLEABLE_GOO_SUMMON, SPELLVALUE_MAX_TARGETS, 1, NULL, true); + events.ScheduleEvent(EVENT_FESTERGUT_GOO, (Is25ManRaid() ? 10000 : 30000) + urand(0, 5000), 0, PHASE_FESTERGUT); break; case EVENT_ROTFACE_DIES: Talk(SAY_ROTFACE_DEATH); EnterEvadeMode(); break; - case EVENT_ROTFACE_VILE_GAS: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, NonTankTargetSelector(me))) - DoCast(target, SPELL_VILE_GAS_H, true); // triggered, to skip LoS check - events.ScheduleEvent(EVENT_ROTFACE_VILE_GAS, urand(15000, 20000), 0, PHASE_ROTFACE); - break; case EVENT_ROTFACE_OOZE_FLOOD: DoAction(ACTION_ROTFACE_OOZE); events.ScheduleEvent(EVENT_ROTFACE_OOZE_FLOOD, 25000, 0, PHASE_ROTFACE); diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp index 97385b108b6..eddc67b5f5e 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp @@ -46,6 +46,7 @@ enum Spells // Rotface SPELL_SLIME_SPRAY = 69508, // every 20 seconds SPELL_MUTATED_INFECTION = 69674, // hastens every 1:30 + SPELL_VILE_GAS_TRIGGER_SUMMON = 72287, // Oozes SPELL_LITTLE_OOZE_COMBINE = 69537, // combine 2 Small Oozes @@ -64,6 +65,10 @@ enum Spells SPELL_MORTAL_WOUND = 71127, SPELL_DECIMATE = 71123, SPELL_AWAKEN_PLAGUED_ZOMBIES = 71159, + + // Professor Putricide + SPELL_VILE_GAS_H = 72272, + SPELL_VILE_GAS_TRIGGER = 72285, }; #define MUTATED_INFECTION RAID_MODE(69674, 71224, 73022, 73023) @@ -74,13 +79,14 @@ enum Events EVENT_SLIME_SPRAY = 1, EVENT_HASTEN_INFECTIONS = 2, EVENT_MUTATED_INFECTION = 3, + EVENT_VILE_GAS = 4, // Precious - EVENT_DECIMATE = 4, - EVENT_MORTAL_WOUND = 5, - EVENT_SUMMON_ZOMBIES = 6, + EVENT_DECIMATE = 5, + EVENT_MORTAL_WOUND = 6, + EVENT_SUMMON_ZOMBIES = 7, - EVENT_STICKY_OOZE = 7, + EVENT_STICKY_OOZE = 8, }; class boss_rotface : public CreatureScript @@ -102,6 +108,9 @@ class boss_rotface : public CreatureScript events.ScheduleEvent(EVENT_SLIME_SPRAY, 20000); events.ScheduleEvent(EVENT_HASTEN_INFECTIONS, 90000); events.ScheduleEvent(EVENT_MUTATED_INFECTION, 14000); + if (IsHeroic()) + events.ScheduleEvent(EVENT_VILE_GAS, urand(22000, 27000)); + infectionStage = 0; infectionCooldown = 14000; } @@ -119,7 +128,9 @@ class boss_rotface : public CreatureScript Talk(SAY_AGGRO); if (Creature* professor = Unit::GetCreature(*me, instance->GetData64(DATA_PROFESSOR_PUTRICIDE))) professor->AI()->DoAction(ACTION_ROTFACE_COMBAT); + DoZoneInCombat(); + DoCast(me, SPELL_GREEN_ABOMINATION_HITTIN__YA_PROC, true); } void JustDied(Unit* /*killer*/) OVERRIDE @@ -158,11 +169,17 @@ class boss_rotface : public CreatureScript } void MoveInLineOfSight(Unit* /*who*/) OVERRIDE - { // don't enter combat } + void JustSummoned(Creature* summon) OVERRIDE + { + if (summon->GetEntry() == NPC_VILE_GAS_STALKER) + if (Creature* professor = Unit::GetCreature(*me, instance->GetData64(DATA_PROFESSOR_PUTRICIDE))) + professor->CastSpell(summon, SPELL_VILE_GAS_H, true); + } + void UpdateAI(uint32 diff) OVERRIDE { if (!UpdateVictim() || !CheckInRoom()) @@ -197,6 +214,10 @@ class boss_rotface : public CreatureScript me->CastCustomSpell(SPELL_MUTATED_INFECTION, SPELLVALUE_MAX_TARGETS, 1, NULL, false); events.ScheduleEvent(EVENT_MUTATED_INFECTION, infectionCooldown); break; + case EVENT_VILE_GAS: + DoCastAOE(SPELL_VILE_GAS_TRIGGER); + events.ScheduleEvent(EVENT_VILE_GAS, urand(30000, 35000)); + break; default: break; } @@ -231,6 +252,7 @@ class npc_little_ooze : public CreatureScript { DoCast(me, SPELL_LITTLE_OOZE_COMBINE, true); DoCast(me, SPELL_WEAK_RADIATING_OOZE, true); + DoCast(me, SPELL_GREEN_ABOMINATION_HITTIN__YA_PROC, true); events.ScheduleEvent(EVENT_STICKY_OOZE, 5000); me->AddThreat(summoner, 500000.0f); } @@ -775,6 +797,71 @@ class spell_rotface_unstable_ooze_explosion_suicide : public SpellScriptLoader } }; +class spell_rotface_vile_gas_trigger : public SpellScriptLoader +{ + public: + spell_rotface_vile_gas_trigger() : SpellScriptLoader("spell_rotface_vile_gas_trigger") { } + + class spell_rotface_vile_gas_trigger_SpellScript : public SpellScript + { + PrepareSpellScript(spell_rotface_vile_gas_trigger_SpellScript); + + void FilterTargets(std::list& targets) + { + targets.sort(Trinity::ObjectDistanceOrderPred(GetCaster())); + if (targets.empty()) + return; + + std::list ranged, melee; + std::list::iterator itr = targets.begin(); + while (itr != targets.end() && (*itr)->GetDistance(GetCaster()) < 5.0f) + { + melee.push_back((*itr)->ToUnit()); + ++itr; + } + + while (itr != targets.end()) + { + ranged.push_back((*itr)->ToUnit()); + ++itr; + } + + uint32 minTargets = GetCaster()->GetMap()->Is25ManRaid() ? 8 : 3; + while (ranged.size() < minTargets) + { + if (melee.empty()) + break; + + WorldObject* target = Trinity::Containers::SelectRandomContainerElement(melee); + ranged.push_back(target); + melee.remove(target); + } + + if (!ranged.empty()) + Trinity::Containers::RandomResizeList(ranged, GetCaster()->GetMap()->Is25ManRaid() ? 3 : 1); + + targets.swap(ranged); + } + + void HandleDummy(SpellEffIndex effIndex) + { + PreventHitDefaultEffect(effIndex); + GetCaster()->CastSpell(GetHitUnit(), SPELL_VILE_GAS_TRIGGER_SUMMON); + } + + void Register() + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_rotface_vile_gas_trigger_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); + OnEffectHitTarget += SpellEffectFn(spell_rotface_vile_gas_trigger_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_rotface_vile_gas_trigger_SpellScript(); + } +}; + void AddSC_boss_rotface() { new boss_rotface(); @@ -789,4 +876,5 @@ void AddSC_boss_rotface() new spell_rotface_unstable_ooze_explosion_init(); new spell_rotface_unstable_ooze_explosion(); new spell_rotface_unstable_ooze_explosion_suicide(); + new spell_rotface_vile_gas_trigger(); } diff --git a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h index e328658b9af..6090d4b8368 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h +++ b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h @@ -183,12 +183,14 @@ enum CreaturesIds // Festergut NPC_FESTERGUT = 36626, NPC_GAS_DUMMY = 36659, + NPC_MALLEABLE_OOZE_STALKER = 38556, // Rotface NPC_ROTFACE = 36627, NPC_OOZE_SPRAY_STALKER = 37986, NPC_PUDDLE_STALKER = 37013, NPC_UNSTABLE_EXPLOSION_STALKER = 38107, + NPC_VILE_GAS_STALKER = 38548, // Professor Putricide NPC_PROFESSOR_PUTRICIDE = 36678, -- cgit v1.2.3 From 7ecf4fdec147af7da51541aae9de4d91aff05ad6 Mon Sep 17 00:00:00 2001 From: Nay Date: Sat, 18 Aug 2012 21:08:21 +0100 Subject: Core/Quests: Split Flags and SpecialFlags --- src/server/game/AI/EventAI/CreatureEventAIMgr.cpp | 4 +- src/server/game/AI/SmartScripts/SmartScriptMgr.cpp | 2 +- src/server/game/Entities/Player/Player.cpp | 42 +++++++------- src/server/game/Globals/ObjectMgr.cpp | 48 ++++++++-------- src/server/game/Handlers/QuestHandler.cpp | 2 +- src/server/game/Quests/QuestDef.cpp | 29 +++++----- src/server/game/Quests/QuestDef.h | 65 +++++++++++++--------- 7 files changed, 101 insertions(+), 91 deletions(-) (limited to 'src') diff --git a/src/server/game/AI/EventAI/CreatureEventAIMgr.cpp b/src/server/game/AI/EventAI/CreatureEventAIMgr.cpp index f77499fa7e3..c6bfd33d57d 100644 --- a/src/server/game/AI/EventAI/CreatureEventAIMgr.cpp +++ b/src/server/game/AI/EventAI/CreatureEventAIMgr.cpp @@ -507,7 +507,7 @@ void CreatureEventAIMgr::LoadCreatureEventAI_Scripts() case ACTION_T_QUEST_EVENT: if (Quest const* qid = sObjectMgr->GetQuestTemplate(action.quest_event.questId)) { - if (!qid->HasFlag(QUEST_TRINITY_FLAGS_EXPLORATION_OR_EVENT)) + if (!qid->HasSpecialFlag(QUEST_SPECIAL_FLAGS_EXPLORATION_OR_EVENT)) TC_LOG_ERROR(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 @@ -541,7 +541,7 @@ void CreatureEventAIMgr::LoadCreatureEventAI_Scripts() 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)) + if (!qid->HasSpecialFlag(QUEST_SPECIAL_FLAGS_EXPLORATION_OR_EVENT)) TC_LOG_ERROR(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 diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp index 2e0fd222b6e..081599c322e 100644 --- a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp +++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp @@ -696,7 +696,7 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e) case SMART_ACTION_CALL_GROUPEVENTHAPPENS: if (Quest const* qid = sObjectMgr->GetQuestTemplate(e.action.quest.quest)) { - if (!qid->HasFlag(QUEST_TRINITY_FLAGS_EXPLORATION_OR_EVENT)) + if (!qid->HasSpecialFlag(QUEST_SPECIAL_FLAGS_EXPLORATION_OR_EVENT)) { TC_LOG_ERROR(LOG_FILTER_SQL, "SmartAIMgr: Entry %d SourceType %u Event %u Action %u SpecialFlags for Quest entry %u does not include FLAGS_EXPLORATION_OR_EVENT(2), skipped.", e.entryOrGuid, e.GetScriptType(), e.event_id, e.GetActionType(), e.action.quest.quest); return false; diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 9b381175280..b1ee724e5f7 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -14921,7 +14921,7 @@ bool Player::CanCompleteQuest(uint32 quest_id) if (q_status.Status == QUEST_STATUS_INCOMPLETE) { - if (qInfo->HasFlag(QUEST_TRINITY_FLAGS_DELIVER)) + if (qInfo->HasSpecialFlag(QUEST_SPECIAL_FLAGS_DELIVER)) { for (uint8 i = 0; i < QUEST_ITEM_OBJECTIVES_COUNT; i++) { @@ -14930,7 +14930,7 @@ bool Player::CanCompleteQuest(uint32 quest_id) } } - if (qInfo->HasFlag(QUEST_TRINITY_FLAGS_KILL | QUEST_TRINITY_FLAGS_CAST | QUEST_TRINITY_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++) { @@ -14942,14 +14942,14 @@ bool Player::CanCompleteQuest(uint32 quest_id) } } - if (qInfo->HasFlag(QUEST_TRINITY_FLAGS_PLAYER_KILL)) + if (qInfo->HasSpecialFlag(QUEST_SPECIAL_FLAGS_PLAYER_KILL)) if (qInfo->GetPlayersSlain() != 0 && q_status.PlayerCount < qInfo->GetPlayersSlain()) return false; - if (qInfo->HasFlag(QUEST_TRINITY_FLAGS_EXPLORATION_OR_EVENT) && !q_status.Explored) + if (qInfo->HasSpecialFlag(QUEST_SPECIAL_FLAGS_EXPLORATION_OR_EVENT) && !q_status.Explored) return false; - if (qInfo->HasFlag(QUEST_TRINITY_FLAGS_TIMED) && q_status.Timer == 0) + if (qInfo->HasSpecialFlag(QUEST_SPECIAL_FLAGS_TIMED) && q_status.Timer == 0) return false; if (qInfo->GetRewOrReqMoney() < 0) @@ -14976,7 +14976,7 @@ bool Player::CanCompleteRepeatableQuest(Quest const* quest) if (!CanTakeQuest(quest, false)) return false; - if (quest->HasFlag(QUEST_TRINITY_FLAGS_DELIVER)) + if (quest->HasSpecialFlag(QUEST_SPECIAL_FLAGS_DELIVER)) for (uint8 i = 0; i < QUEST_ITEM_OBJECTIVES_COUNT; i++) if (quest->RequiredItemId[i] && quest->RequiredItemCount[i] && !HasItemCount(quest->RequiredItemId[i], quest->RequiredItemCount[i])) return false; @@ -15002,7 +15002,7 @@ bool Player::CanRewardQuest(Quest const* quest, bool msg) return false; // prevent receive reward with quest items in bank - if (quest->HasFlag(QUEST_TRINITY_FLAGS_DELIVER)) + if (quest->HasSpecialFlag(QUEST_SPECIAL_FLAGS_DELIVER)) { for (uint8 i = 0; i < QUEST_ITEM_OBJECTIVES_COUNT; i++) { @@ -15079,19 +15079,19 @@ void Player::AddQuest(Quest const* quest, Object* questGiver) questStatusData.Status = QUEST_STATUS_INCOMPLETE; questStatusData.Explored = false; - if (quest->HasFlag(QUEST_TRINITY_FLAGS_DELIVER)) + if (quest->HasSpecialFlag(QUEST_SPECIAL_FLAGS_DELIVER)) { for (uint8 i = 0; i < QUEST_ITEM_OBJECTIVES_COUNT; ++i) questStatusData.ItemCount[i] = 0; } - if (quest->HasFlag(QUEST_TRINITY_FLAGS_KILL | QUEST_TRINITY_FLAGS_CAST | QUEST_TRINITY_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; } - if (quest->HasFlag(QUEST_TRINITY_FLAGS_PLAYER_KILL)) + if (quest->HasSpecialFlag(QUEST_SPECIAL_FLAGS_PLAYER_KILL)) questStatusData.PlayerCount = 0; GiveQuestSourceItem(quest); @@ -15106,7 +15106,7 @@ void Player::AddQuest(Quest const* quest, Object* questGiver) GetReputationMgr().SetVisible(factionEntry); uint32 qtime = 0; - if (quest->HasFlag(QUEST_TRINITY_FLAGS_TIMED)) + if (quest->HasSpecialFlag(QUEST_SPECIAL_FLAGS_TIMED)) { uint32 limittime = quest->GetLimitTime(); @@ -15347,7 +15347,7 @@ void Player::FailQuest(uint32 questId) SetQuestSlotState(log_slot, QUEST_STATE_FAIL); } - if (quest->HasFlag(QUEST_TRINITY_FLAGS_TIMED)) + if (quest->HasSpecialFlag(QUEST_SPECIAL_FLAGS_TIMED)) { QuestStatusData& q_status = m_QuestStatus[questId]; @@ -15643,7 +15643,7 @@ bool Player::SatisfyQuestConditions(Quest const* qInfo, bool msg) bool Player::SatisfyQuestTimed(Quest const* qInfo, bool msg) { - if (!m_timedquests.empty() && qInfo->HasFlag(QUEST_TRINITY_FLAGS_TIMED)) + if (!m_timedquests.empty() && qInfo->HasSpecialFlag(QUEST_SPECIAL_FLAGS_TIMED)) { if (msg) { @@ -16003,7 +16003,7 @@ uint16 Player::GetReqKillOrCastCurrentCount(uint32 quest_id, int32 entry) void Player::AdjustQuestReqItemCount(Quest const* quest, QuestStatusData& questStatusData) { - if (quest->HasFlag(QUEST_TRINITY_FLAGS_DELIVER)) + if (quest->HasSpecialFlag(QUEST_SPECIAL_FLAGS_DELIVER)) { for (uint8 i = 0; i < QUEST_ITEM_OBJECTIVES_COUNT; ++i) { @@ -16144,7 +16144,7 @@ void Player::ItemAddedQuestCheck(uint32 entry, uint32 count) continue; Quest const* qInfo = sObjectMgr->GetQuestTemplate(questid); - if (!qInfo || !qInfo->HasFlag(QUEST_TRINITY_FLAGS_DELIVER)) + if (!qInfo || !qInfo->HasSpecialFlag(QUEST_SPECIAL_FLAGS_DELIVER)) continue; for (uint8 j = 0; j < QUEST_ITEM_OBJECTIVES_COUNT; ++j) @@ -16182,7 +16182,7 @@ void Player::ItemRemovedQuestCheck(uint32 entry, uint32 count) Quest const* qInfo = sObjectMgr->GetQuestTemplate(questid); if (!qInfo) continue; - if (!qInfo->HasFlag(QUEST_TRINITY_FLAGS_DELIVER)) + if (!qInfo->HasSpecialFlag(QUEST_SPECIAL_FLAGS_DELIVER)) continue; for (uint8 j = 0; j < QUEST_ITEM_OBJECTIVES_COUNT; ++j) @@ -16254,7 +16254,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->HasFlag(QUEST_TRINITY_FLAGS_KILL) /*&& !qInfo->HasFlag(QUEST_TRINITY_FLAGS_CAST)*/) + if (qInfo->HasSpecialFlag(QUEST_SPECIAL_FLAGS_KILL) /*&& !qInfo->HasSpecialFlag(QUEST_SPECIAL_FLAGS_CAST)*/) { for (uint8 j = 0; j < QUEST_OBJECTIVES_COUNT; ++j) { @@ -16305,7 +16305,7 @@ void Player::KilledPlayerCredit() QuestStatusData& q_status = m_QuestStatus[questid]; if (q_status.Status == QUEST_STATUS_INCOMPLETE && (!GetGroup() || !GetGroup()->isRaidGroup() || qInfo->IsAllowedInRaid(GetMap()->GetDifficulty()))) { - if (qInfo->HasFlag(QUEST_TRINITY_FLAGS_PLAYER_KILL)) + if (qInfo->HasSpecialFlag(QUEST_SPECIAL_FLAGS_PLAYER_KILL)) { uint32 reqkill = qInfo->GetPlayersSlain(); uint16 curkill = q_status.PlayerCount; @@ -16345,7 +16345,7 @@ void Player::KillCreditGO(uint32 entry, uint64 guid) if (q_status.Status == QUEST_STATUS_INCOMPLETE) { - if (qInfo->HasFlag(QUEST_TRINITY_FLAGS_CAST) /*&& !qInfo->HasFlag(QUEST_TRINITY_FLAGS_KILL)*/) + if (qInfo->HasSpecialFlag(QUEST_SPECIAL_FLAGS_CAST) /*&& !qInfo->HasSpecialFlag(QUEST_SPECIAL_FLAGS_KILL)*/) { for (uint8 j = 0; j < QUEST_OBJECTIVES_COUNT; ++j) { @@ -16399,7 +16399,7 @@ void Player::TalkedToCreature(uint32 entry, uint64 guid) if (q_status.Status == QUEST_STATUS_INCOMPLETE) { - if (qInfo->HasFlag(QUEST_TRINITY_FLAGS_KILL | QUEST_TRINITY_FLAGS_CAST | QUEST_TRINITY_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) { @@ -18188,7 +18188,7 @@ void Player::_LoadQuestStatus(PreparedQueryResult result) time_t quest_time = time_t(fields[3].GetUInt32()); - if (quest->HasFlag(QUEST_TRINITY_FLAGS_TIMED) && !GetQuestRewardStatus(quest_id)) + if (quest->HasSpecialFlag(QUEST_SPECIAL_FLAGS_TIMED) && !GetQuestRewardStatus(quest_id)) { AddTimedQuest(quest_id); diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index 804967c760a..39dea3ca5fe 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -3765,11 +3765,11 @@ void ObjectMgr::LoadQuests() if (qinfo->GetQuestMethod() >= 3) TC_LOG_ERROR(LOG_FILTER_SQL, "Quest %u has `Method` = %u, expected values are 0, 1 or 2.", qinfo->GetQuestId(), qinfo->GetQuestMethod()); - if (qinfo->Flags & ~QUEST_TRINITY_FLAGS_DB_ALLOWED) + if (qinfo->SpecialFlags & ~QUEST_SPECIAL_FLAGS_DB_ALLOWED) { TC_LOG_ERROR(LOG_FILTER_SQL, "Quest %u has `SpecialFlags` = %u > max allowed value. Correct `SpecialFlags` to value <= %u", - qinfo->GetQuestId(), qinfo->Flags >> 20, QUEST_TRINITY_FLAGS_DB_ALLOWED >> 20); - qinfo->Flags &= QUEST_TRINITY_FLAGS_DB_ALLOWED; + qinfo->GetQuestId(), qinfo->SpecialFlags, QUEST_SPECIAL_FLAGS_DB_ALLOWED); + qinfo->SpecialFlags &= QUEST_SPECIAL_FLAGS_DB_ALLOWED; } if (qinfo->Flags & QUEST_FLAGS_DAILY && qinfo->Flags & QUEST_FLAGS_WEEKLY) @@ -3780,28 +3780,28 @@ void ObjectMgr::LoadQuests() if (qinfo->Flags & QUEST_FLAGS_DAILY) { - if (!(qinfo->Flags & QUEST_TRINITY_FLAGS_REPEATABLE)) + if (!(qinfo->SpecialFlags & QUEST_SPECIAL_FLAGS_REPEATABLE)) { TC_LOG_ERROR(LOG_FILTER_SQL, "Daily Quest %u not marked as repeatable in `SpecialFlags`, added.", qinfo->GetQuestId()); - qinfo->Flags |= QUEST_TRINITY_FLAGS_REPEATABLE; + qinfo->SpecialFlags |= QUEST_SPECIAL_FLAGS_REPEATABLE; } } if (qinfo->Flags & QUEST_FLAGS_WEEKLY) { - if (!(qinfo->Flags & QUEST_TRINITY_FLAGS_REPEATABLE)) + if (!(qinfo->SpecialFlags & QUEST_SPECIAL_FLAGS_REPEATABLE)) { TC_LOG_ERROR(LOG_FILTER_SQL, "Weekly Quest %u not marked as repeatable in `SpecialFlags`, added.", qinfo->GetQuestId()); - qinfo->Flags |= QUEST_TRINITY_FLAGS_REPEATABLE; + qinfo->SpecialFlags |= QUEST_SPECIAL_FLAGS_REPEATABLE; } } - if (qinfo->Flags & QUEST_TRINITY_FLAGS_MONTHLY) + if (qinfo->SpecialFlags & QUEST_SPECIAL_FLAGS_MONTHLY) { - if (!(qinfo->Flags & QUEST_TRINITY_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_TRINITY_FLAGS_REPEATABLE; + qinfo->SpecialFlags |= QUEST_SPECIAL_FLAGS_REPEATABLE; } } @@ -4019,7 +4019,7 @@ void ObjectMgr::LoadQuests() // no changes, quest can't be done for this requirement } - qinfo->SetFlag(QUEST_TRINITY_FLAGS_DELIVER); + qinfo->SetSpecialFlag(QUEST_SPECIAL_FLAGS_DELIVER); if (!sObjectMgr->GetItemTemplate(id)) { @@ -4080,7 +4080,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->SetFlag(QUEST_TRINITY_FLAGS_KILL | QUEST_TRINITY_FLAGS_CAST | QUEST_TRINITY_FLAGS_SPEAKTO); + qinfo->SetSpecialFlag(QUEST_SPECIAL_FLAGS_KILL | QUEST_SPECIAL_FLAGS_CAST | QUEST_SPECIAL_FLAGS_SPEAKTO); if (!qinfo->RequiredNpcOrGoCount[j]) { @@ -4290,12 +4290,12 @@ void ObjectMgr::LoadQuests() if (qinfo->ExclusiveGroup) mExclusiveQuestGroups.insert(std::pair(qinfo->ExclusiveGroup, qinfo->GetQuestId())); if (qinfo->LimitTime) - qinfo->SetFlag(QUEST_TRINITY_FLAGS_TIMED); + qinfo->SetSpecialFlag(QUEST_SPECIAL_FLAGS_TIMED); if (qinfo->RequiredPlayerKills) - qinfo->SetFlag(QUEST_TRINITY_FLAGS_PLAYER_KILL); + qinfo->SetSpecialFlag(QUEST_SPECIAL_FLAGS_PLAYER_KILL); } - // check QUEST_TRINITY_FLAGS_EXPLORATION_OR_EVENT for spell with SPELL_EFFECT_QUEST_COMPLETE + // check QUEST_SPECIAL_FLAGS_EXPLORATION_OR_EVENT for spell with SPELL_EFFECT_QUEST_COMPLETE for (uint32 i = 0; i < sSpellMgr->GetSpellInfoStoreSize(); ++i) { SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(i); @@ -4315,12 +4315,12 @@ void ObjectMgr::LoadQuests() if (!quest) continue; - if (!quest->HasFlag(QUEST_TRINITY_FLAGS_EXPLORATION_OR_EVENT)) + if (!quest->HasSpecialFlag(QUEST_SPECIAL_FLAGS_EXPLORATION_OR_EVENT)) { - TC_LOG_ERROR(LOG_FILTER_SQL, "Spell (id: %u) have SPELL_EFFECT_QUEST_COMPLETE for quest %u, but quest not have flag QUEST_TRINITY_FLAGS_EXPLORATION_OR_EVENT. Quest flags must be fixed, quest modified to enable objective.", spellInfo->Id, quest_id); + TC_LOG_ERROR(LOG_FILTER_SQL, "Spell (id: %u) have SPELL_EFFECT_QUEST_COMPLETE for quest %u, but quest not have flag QUEST_SPECIAL_FLAGS_EXPLORATION_OR_EVENT. Quest flags must be fixed, quest modified to enable objective.", spellInfo->Id, quest_id); // this will prevent quest completing without objective - const_cast(quest)->SetFlag(QUEST_TRINITY_FLAGS_EXPLORATION_OR_EVENT); + const_cast(quest)->SetSpecialFlag(QUEST_SPECIAL_FLAGS_EXPLORATION_OR_EVENT); } } } @@ -4491,13 +4491,13 @@ void ObjectMgr::LoadScripts(ScriptsType type) continue; } - if (!quest->HasFlag(QUEST_TRINITY_FLAGS_EXPLORATION_OR_EVENT)) + if (!quest->HasSpecialFlag(QUEST_SPECIAL_FLAGS_EXPLORATION_OR_EVENT)) { - TC_LOG_ERROR(LOG_FILTER_SQL, "Table `%s` has quest (ID: %u) in SCRIPT_COMMAND_QUEST_EXPLORED in `datalong` for script id %u, but quest not have flag QUEST_TRINITY_FLAGS_EXPLORATION_OR_EVENT in quest flags. Script command or quest flags wrong. Quest modified to require objective.", + TC_LOG_ERROR(LOG_FILTER_SQL, "Table `%s` has quest (ID: %u) in SCRIPT_COMMAND_QUEST_EXPLORED in `datalong` for script id %u, but quest not have flag QUEST_SPECIAL_FLAGS_EXPLORATION_OR_EVENT in quest flags. Script command or quest flags wrong. Quest modified to require objective.", tableName.c_str(), tmp.QuestExplored.QuestID, tmp.id); // this will prevent quest completing without objective - const_cast(quest)->SetFlag(QUEST_TRINITY_FLAGS_EXPLORATION_OR_EVENT); + const_cast(quest)->SetSpecialFlag(QUEST_SPECIAL_FLAGS_EXPLORATION_OR_EVENT); // continue; - quest objective requirement set and command can be allowed } @@ -5390,12 +5390,12 @@ void ObjectMgr::LoadQuestAreaTriggers() continue; } - if (!quest->HasFlag(QUEST_TRINITY_FLAGS_EXPLORATION_OR_EVENT)) + if (!quest->HasSpecialFlag(QUEST_SPECIAL_FLAGS_EXPLORATION_OR_EVENT)) { - TC_LOG_ERROR(LOG_FILTER_SQL, "Table `areatrigger_involvedrelation` has record (id: %u) for not quest %u, but quest not have flag QUEST_TRINITY_FLAGS_EXPLORATION_OR_EVENT. Trigger or quest flags must be fixed, quest modified to require objective.", trigger_ID, quest_ID); + TC_LOG_ERROR(LOG_FILTER_SQL, "Table `areatrigger_involvedrelation` has record (id: %u) for not quest %u, but quest not have flag QUEST_SPECIAL_FLAGS_EXPLORATION_OR_EVENT. Trigger or quest flags must be fixed, quest modified to require objective.", trigger_ID, quest_ID); // this will prevent quest completing without objective - const_cast(quest)->SetFlag(QUEST_TRINITY_FLAGS_EXPLORATION_OR_EVENT); + const_cast(quest)->SetSpecialFlag(QUEST_SPECIAL_FLAGS_EXPLORATION_OR_EVENT); // continue; - quest modified to required objective and trigger can be allowed. } diff --git a/src/server/game/Handlers/QuestHandler.cpp b/src/server/game/Handlers/QuestHandler.cpp index e51d87c7733..e032c82ab1f 100644 --- a/src/server/game/Handlers/QuestHandler.cpp +++ b/src/server/game/Handlers/QuestHandler.cpp @@ -450,7 +450,7 @@ void WorldSession::HandleQuestLogRemoveQuest(WorldPacket& recvData) if (Quest const* quest = sObjectMgr->GetQuestTemplate(questId)) { - if (quest->HasFlag(QUEST_TRINITY_FLAGS_TIMED)) + if (quest->HasSpecialFlag(QUEST_SPECIAL_FLAGS_TIMED)) _player->RemoveTimedQuest(questId); if (quest->HasFlag(QUEST_FLAGS_FLAGS_PVP)) diff --git a/src/server/game/Quests/QuestDef.cpp b/src/server/game/Quests/QuestDef.cpp index 7345dcafe92..f2e80bdb996 100644 --- a/src/server/game/Quests/QuestDef.cpp +++ b/src/server/game/Quests/QuestDef.cpp @@ -60,7 +60,7 @@ Quest::Quest(Field* questRecord) SourceItemIdCount = questRecord[35].GetUInt8(); SourceSpellid = questRecord[36].GetUInt32(); Flags = questRecord[37].GetUInt32(); - uint32 SpecialFlags = questRecord[38].GetUInt8(); + SpecialFlags = questRecord[38].GetUInt8(); RewardTitleId = questRecord[39].GetUInt8(); RequiredPlayerKills = questRecord[40].GetUInt8(); RewardTalents = questRecord[41].GetUInt8(); @@ -139,30 +139,29 @@ Quest::Quest(Field* questRecord) //int32 WDBVerified = questRecord[140].GetInt32(); - Flags |= SpecialFlags << 20; - if (Flags & QUEST_TRINITY_FLAGS_AUTO_ACCEPT) + if (SpecialFlags & QUEST_SPECIAL_FLAGS_AUTO_ACCEPT) Flags |= QUEST_FLAGS_AUTO_ACCEPT; - m_reqitemscount = 0; - m_reqCreatureOrGOcount = 0; - m_rewitemscount = 0; - m_rewchoiceitemscount = 0; + _reqItemsCount = 0; + _reqCreatureOrGOcount = 0; + _rewItemsCount = 0; + _rewChoiceItemsCount = 0; - for (int i=0; i < QUEST_ITEM_OBJECTIVES_COUNT; ++i) + 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) + for (int i = 0; i < QUEST_OBJECTIVES_COUNT; ++i) if (RequiredNpcOrGo[i]) - ++m_reqCreatureOrGOcount; + ++_reqCreatureOrGOcount; - for (int i=0; i < QUEST_REWARDS_COUNT; ++i) + 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) + for (int i = 0; i < QUEST_REWARD_CHOICES_COUNT; ++i) if (RewardChoiceItemId[i]) - ++m_rewchoiceitemscount; + ++_rewChoiceItemsCount; } uint32 Quest::XPValue(Player* player) const diff --git a/src/server/game/Quests/QuestDef.h b/src/server/game/Quests/QuestDef.h index b2796652a01..88a4ddfcad9 100644 --- a/src/server/game/Quests/QuestDef.h +++ b/src/server/game/Quests/QuestDef.h @@ -75,7 +75,7 @@ enum QuestShareMessages QUEST_PARTY_MSG_NOT_IN_PARTY = 10 }; -enum __QuestTradeSkill +enum QuestTradeSkill { QUEST_TRSKILL_NONE = 0, QUEST_TRSKILL_ALCHEMY = 1, @@ -106,7 +106,7 @@ enum QuestStatus MAX_QUEST_STATUS }; -enum __QuestGiverStatus +enum QuestGiverStatus { DIALOG_STATUS_NONE = 0, DIALOG_STATUS_UNAVAILABLE = 1, @@ -146,22 +146,28 @@ enum QuestFlags QUEST_FLAGS_OBJ_TEXT = 0x00040000, // use Objective text as Complete text QUEST_FLAGS_AUTO_ACCEPT = 0x00080000, // The client recognizes this flag as auto-accept. However, NONE of the current quests (3.3.5a) have this flag. Maybe blizz used to use it, or will use it in the future. + // ... 4.x added flags up to 0x80000000 - all unknown for now +}; + +enum QuestSpecialFlags +{ + QUEST_SPECIAL_FLAGS_NONE = 0x000, // Trinity flags for set SpecialFlags in DB if required but used only at server - QUEST_TRINITY_FLAGS_REPEATABLE = 0x00100000, // Set by 1 in SpecialFlags from DB - QUEST_TRINITY_FLAGS_EXPLORATION_OR_EVENT = 0x00200000, // Set by 2 in SpecialFlags from DB (if reequired area explore, spell SPELL_EFFECT_QUEST_COMPLETE casting, table `*_script` command SCRIPT_COMMAND_QUEST_EXPLORED use, set from script) - QUEST_TRINITY_FLAGS_AUTO_ACCEPT = 0x00400000, // Set by 4 in SpecialFlags in DB if the quest is to be auto-accepted. - QUEST_TRINITY_FLAGS_DF_QUEST = 0x00800000, // Set by 8 in SpecialFlags in DB if the quest is used by Dungeon Finder. - QUEST_TRINITY_FLAGS_MONTHLY = 0x01000000, // Set by 16 in SpecialFlags in DB if the quest is reset at the begining of the month - QUEST_TRINITY_FLAGS_CAST = 0x02000000, // Set by 32 in SpecialFlags in DB if the quest requires RequiredOrNpcGo killcredit but NOT kill (a spell cast) - - QUEST_TRINITY_FLAGS_DB_ALLOWED = 0xFFFFF | QUEST_TRINITY_FLAGS_REPEATABLE | QUEST_TRINITY_FLAGS_EXPLORATION_OR_EVENT | QUEST_TRINITY_FLAGS_AUTO_ACCEPT | QUEST_TRINITY_FLAGS_DF_QUEST | QUEST_TRINITY_FLAGS_MONTHLY | QUEST_TRINITY_FLAGS_CAST, + 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 - // Trinity flags for internal use only - QUEST_TRINITY_FLAGS_DELIVER = 0x04000000, // Internal flag computed only - QUEST_TRINITY_FLAGS_SPEAKTO = 0x08000000, // Internal flag computed only - QUEST_TRINITY_FLAGS_KILL = 0x10000000, // Internal flag computed only - QUEST_TRINITY_FLAGS_TIMED = 0x20000000, // Internal flag computed only - QUEST_TRINITY_FLAGS_PLAYER_KILL = 0x40000000 // Internal flag computed only + 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 + QUEST_SPECIAL_FLAGS_KILL = 0x200, // Internal flag computed only + QUEST_SPECIAL_FLAGS_TIMED = 0x400, // Internal flag computed only + QUEST_SPECIAL_FLAGS_PLAYER_KILL = 0x800 // Internal flag computed only }; struct QuestLocale @@ -191,6 +197,9 @@ class Quest bool HasFlag(uint32 flag) const { return (Flags & flag) != 0; } void SetFlag(uint32 flag) { Flags |= flag; } + bool HasSpecialFlag(uint32 flag) const { return (SpecialFlags & flag) != 0; } + void SetSpecialFlag(uint32 flag) { SpecialFlags |= flag; } + // table data accessors: uint32 GetQuestId() const { return Id; } uint32 GetQuestMethod() const { return Method; } @@ -246,18 +255,18 @@ class Quest uint32 GetPointOpt() const { return PointOption; } uint32 GetIncompleteEmote() const { return EmoteOnIncomplete; } uint32 GetCompleteEmote() const { return EmoteOnComplete; } - bool IsRepeatable() const { return Flags & QUEST_TRINITY_FLAGS_REPEATABLE; } + bool IsRepeatable() const { return SpecialFlags & QUEST_SPECIAL_FLAGS_REPEATABLE; } bool IsAutoAccept() const; bool IsAutoComplete() const; uint32 GetFlags() const { return Flags; } bool IsDaily() const { return Flags & QUEST_FLAGS_DAILY; } bool IsWeekly() const { return Flags & QUEST_FLAGS_WEEKLY; } - bool IsMonthly() const { return Flags & QUEST_TRINITY_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; bool IsAllowedInRaid(Difficulty difficulty) const; - bool IsDFQuest() const { return Flags & QUEST_TRINITY_FLAGS_DF_QUEST; } + bool IsDFQuest() const { return SpecialFlags & QUEST_SPECIAL_FLAGS_DF_QUEST; } uint32 CalculateHonorGain(uint8 level) const; // multiple values @@ -280,10 +289,10 @@ class Quest uint32 OfferRewardEmote[QUEST_EMOTE_COUNT]; uint32 OfferRewardEmoteDelay[QUEST_EMOTE_COUNT]; - uint32 GetReqItemsCount() const { return m_reqitemscount; } - uint32 GetReqCreatureOrGOcount() const { return m_reqCreatureOrGOcount; } - uint32 GetRewChoiceItemsCount() const { return m_rewchoiceitemscount; } - uint32 GetRewItemsCount() const { return m_rewitemscount; } + uint32 GetReqItemsCount() const { return _reqItemsCount; } + uint32 GetReqCreatureOrGOcount() const { return _reqCreatureOrGOcount; } + uint32 GetRewChoiceItemsCount() const { return _rewChoiceItemsCount; } + uint32 GetRewItemsCount() const { return _rewItemsCount; } typedef std::vector PrevQuests; PrevQuests prevQuests; @@ -292,10 +301,10 @@ class Quest // cached data private: - uint32 m_reqitemscount; - uint32 m_reqCreatureOrGOcount; - uint32 m_rewchoiceitemscount; - uint32 m_rewitemscount; + uint32 _reqItemsCount; + uint32 _reqCreatureOrGOcount; + uint32 _rewChoiceItemsCount; + uint32 _rewItemsCount; // table data protected: @@ -354,6 +363,8 @@ class Quest uint32 PointOption; uint32 EmoteOnIncomplete; uint32 EmoteOnComplete; + + uint32 SpecialFlags; // custom flags, not sniffed/WDB }; struct QuestStatusData -- cgit v1.2.3