From 8a03785470ad798b2daa81c4eb0a9682e93d4bb2 Mon Sep 17 00:00:00 2001 From: VladimirMangos Date: Sun, 17 Jan 2010 09:28:49 +0300 Subject: [PATCH] [9198] Replace targeted movegen by 2 new: chase/follow movegens. NOTE: this is mostly just formal adding 2 movegens with very limited cleanups. Real result from adding 2 new movegens possible after apply more deep cleanups/fixes in UNIT_STAT_CHASE/UNIT_STAT_FOLLOW set. But this will need more cereful changes because we have currently sometime strange dependences and places for set for this flags. Similar cleanups required for other movegen related flags. Infact i have related patches but need more testing before apply step by step. --- sql/mangos.sql | 5 +- sql/updates/9198_01_mangos_mangos_string.sql | 8 + sql/updates/Makefile.am | 2 + src/game/AggressorAI.cpp | 16 +- src/game/CreatureEventAI.cpp | 17 +- src/game/GuardAI.cpp | 4 +- src/game/Language.h | 11 +- src/game/Level2.cpp | 6 +- src/game/Level3.cpp | 45 ++++-- src/game/MotionMaster.cpp | 19 +-- src/game/MotionMaster.h | 3 +- src/game/ReactorAI.cpp | 12 +- src/game/TargetedMovementGenerator.cpp | 154 +++++++++++-------- src/game/TargetedMovementGenerator.h | 62 ++++++-- src/game/Unit.cpp | 2 +- src/shared/revision_nr.h | 2 +- src/shared/revision_sql.h | 2 +- 17 files changed, 232 insertions(+), 138 deletions(-) create mode 100644 sql/updates/9198_01_mangos_mangos_string.sql diff --git a/sql/mangos.sql b/sql/mangos.sql index 34f6f3d30..4b4aa3ee1 100644 --- a/sql/mangos.sql +++ b/sql/mangos.sql @@ -24,7 +24,7 @@ CREATE TABLE `db_version` ( `version` varchar(120) default NULL, `creature_ai_version` varchar(120) default NULL, `cache_id` int(10) default '0', - `required_9160_02_mangos_spell_chain` bit(1) default NULL + `required_9198_01_mangos_mangos_string` bit(1) default NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Used DB version notes'; -- @@ -3590,6 +3590,9 @@ INSERT INTO `mangos_string` VALUES (1129,'%d - %s %s (Map:%u X:%f Y:%f Z:%f)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL), (1130,'event started %u "%s"',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL), (1131,'event stopped %u "%s"',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL), +(1132,' Follow player %s (lowguid %u)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL), +(1133,' Follow creature %s (lowguid %u)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL), +(1134,' Follow ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL), (1200,'You try to view cinemitic %u but it doesn\'t exist.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL), (1201,'You try to view movie %u but it doesn\'t exist.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL); /*!40000 ALTER TABLE `mangos_string` ENABLE KEYS */; diff --git a/sql/updates/9198_01_mangos_mangos_string.sql b/sql/updates/9198_01_mangos_mangos_string.sql new file mode 100644 index 000000000..d75b44247 --- /dev/null +++ b/sql/updates/9198_01_mangos_mangos_string.sql @@ -0,0 +1,8 @@ +ALTER TABLE db_version CHANGE COLUMN required_9160_02_mangos_spell_chain required_9198_01_mangos_mangos_string bit; + +DELETE FROM mangos_string WHERE entry in (1132,1133,1134); + +INSERT INTO mangos_string VALUES +(1132,' Follow player %s (lowguid %u)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL), +(1133,' Follow creature %s (lowguid %u)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL), +(1134,' Follow ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL); diff --git a/sql/updates/Makefile.am b/sql/updates/Makefile.am index ac71f5c38..f51fe66b4 100644 --- a/sql/updates/Makefile.am +++ b/sql/updates/Makefile.am @@ -244,6 +244,7 @@ pkgdata_DATA = \ 9156_02_mangos_spell_proc_event.sql \ 9160_01_mangos_spell_proc_event.sql \ 9160_02_mangos_spell_chain.sql \ + 9198_01_mangos_mangos_string.sql \ README ## Additional files to include when running 'make dist' @@ -468,4 +469,5 @@ EXTRA_DIST = \ 9156_02_mangos_spell_proc_event.sql \ 9160_01_mangos_spell_proc_event.sql \ 9160_02_mangos_spell_chain.sql \ + 9198_01_mangos_mangos_string.sql \ README diff --git a/src/game/AggressorAI.cpp b/src/game/AggressorAI.cpp index 42a268dce..5fe3981ba 100644 --- a/src/game/AggressorAI.cpp +++ b/src/game/AggressorAI.cpp @@ -70,7 +70,7 @@ AggressorAI::MoveInLineOfSight(Unit *u) void AggressorAI::EnterEvadeMode() { - if( !m_creature->isAlive() ) + if (!m_creature->isAlive()) { DEBUG_LOG("Creature stopped attacking, he is dead [guid=%u]", m_creature->GetGUIDLow()); i_victimGuid = 0; @@ -81,19 +81,19 @@ void AggressorAI::EnterEvadeMode() Unit* victim = ObjectAccessor::GetUnit(*m_creature, i_victimGuid ); - if( !victim ) + if (!victim) { DEBUG_LOG("Creature stopped attacking, no victim [guid=%u]", m_creature->GetGUIDLow()); } - else if( !victim->isAlive() ) + else if (!victim->isAlive()) { DEBUG_LOG("Creature stopped attacking, victim is dead [guid=%u]", m_creature->GetGUIDLow()); } - else if( victim->HasStealthAura() ) + else if (victim->HasStealthAura()) { DEBUG_LOG("Creature stopped attacking, victim is in stealth [guid=%u]", m_creature->GetGUIDLow()); } - else if( victim->isInFlight() ) + else if (victim->isInFlight()) { DEBUG_LOG("Creature stopped attacking, victim is in flight [guid=%u]", m_creature->GetGUIDLow()); } @@ -104,12 +104,12 @@ void AggressorAI::EnterEvadeMode() //i_tracker.Reset(TIME_INTERVAL_LOOK); } - if(!m_creature->isCharmed()) + if (!m_creature->isCharmed()) { m_creature->RemoveAllAuras(); - // Remove TargetedMovementGenerator from MotionMaster stack list, and add HomeMovementGenerator instead - if( m_creature->GetMotionMaster()->GetCurrentMovementGeneratorType() == TARGETED_MOTION_TYPE ) + // Remove ChaseMovementGenerator from MotionMaster stack list, and add HomeMovementGenerator instead + if (m_creature->GetMotionMaster()->GetCurrentMovementGeneratorType() == CHASE_MOTION_TYPE) m_creature->GetMotionMaster()->MoveTargetedHome(); } diff --git a/src/game/CreatureEventAI.cpp b/src/game/CreatureEventAI.cpp index 83c6d4848..dbd0b96f4 100644 --- a/src/game/CreatureEventAI.cpp +++ b/src/game/CreatureEventAI.cpp @@ -474,13 +474,16 @@ void CreatureEventAI::ProcessAction(CreatureEventAI_Action const& action, uint32 //Melee current victim if flag not set if (!(action.cast.castFlags & CAST_NO_MELEE_IF_OOM)) { - if (m_creature->GetMotionMaster()->GetCurrentMovementGeneratorType() == TARGETED_MOTION_TYPE) + switch(m_creature->GetMotionMaster()->GetCurrentMovementGeneratorType()) { - AttackDistance = 0.0f; - AttackAngle = 0.0f; + case CHASE_MOTION_TYPE: + case FOLLOW_MOTION_TYPE: + AttackDistance = 0.0f; + AttackAngle = 0.0f; - m_creature->GetMotionMaster()->Clear(false); - m_creature->GetMotionMaster()->MoveChase(m_creature->getVictim(), AttackDistance, AttackAngle); + m_creature->GetMotionMaster()->Clear(false); + m_creature->GetMotionMaster()->MoveChase(m_creature->getVictim(), AttackDistance, AttackAngle); + break; } } @@ -589,7 +592,7 @@ void CreatureEventAI::ProcessAction(CreatureEventAI_Action const& action, uint32 if(Unit* victim = m_creature->getVictim()) m_creature->SendMeleeAttackStop(victim); - if (m_creature->GetMotionMaster()->GetCurrentMovementGeneratorType() == TARGETED_MOTION_TYPE) + if (m_creature->GetMotionMaster()->GetCurrentMovementGeneratorType() == CHASE_MOTION_TYPE) { m_creature->GetMotionMaster()->Clear(false); m_creature->GetMotionMaster()->MoveIdle(); @@ -651,7 +654,7 @@ void CreatureEventAI::ProcessAction(CreatureEventAI_Action const& action, uint32 if (CombatMovementEnabled) { - if (m_creature->GetMotionMaster()->GetCurrentMovementGeneratorType() == TARGETED_MOTION_TYPE) + if (m_creature->GetMotionMaster()->GetCurrentMovementGeneratorType() == CHASE_MOTION_TYPE) { //Drop current movement gen m_creature->GetMotionMaster()->Clear(false); diff --git a/src/game/GuardAI.cpp b/src/game/GuardAI.cpp index 703d66c94..93c1df685 100644 --- a/src/game/GuardAI.cpp +++ b/src/game/GuardAI.cpp @@ -100,8 +100,8 @@ void GuardAI::EnterEvadeMode() m_creature->CombatStop(true); i_state = STATE_NORMAL; - // Remove TargetedMovementGenerator from MotionMaster stack list, and add HomeMovementGenerator instead - if (m_creature->GetMotionMaster()->GetCurrentMovementGeneratorType() == TARGETED_MOTION_TYPE) + // Remove ChaseMovementGenerator from MotionMaster stack list, and add HomeMovementGenerator instead + if (m_creature->GetMotionMaster()->GetCurrentMovementGeneratorType() == CHASE_MOTION_TYPE) m_creature->GetMotionMaster()->MoveTargetedHome(); } diff --git a/src/game/Language.h b/src/game/Language.h index fb90a71fb..4e03a5c44 100644 --- a/src/game/Language.h +++ b/src/game/Language.h @@ -498,9 +498,9 @@ enum MangosStrings LANG_MOVEGENS_WAYPOINT = 529, LANG_MOVEGENS_ANIMAL_RANDOM = 530, LANG_MOVEGENS_CONFUSED = 531, - LANG_MOVEGENS_TARGETED_PLAYER = 532, - LANG_MOVEGENS_TARGETED_CREATURE = 533, - LANG_MOVEGENS_TARGETED_NULL = 534, + LANG_MOVEGENS_CHASE_PLAYER = 532, + LANG_MOVEGENS_CHASE_CREATURE = 533, + LANG_MOVEGENS_CHASE_NULL = 534, LANG_MOVEGENS_HOME_CREATURE = 535, LANG_MOVEGENS_HOME_PLAYER = 536, LANG_MOVEGENS_FLIGHT = 537, @@ -816,7 +816,10 @@ enum MangosStrings LANG_TAXINODE_ENTRY_LIST_CONSOLE = 1129, LANG_EVENT_STARTED = 1130, LANG_EVENT_STOPPED = 1131, - // Room for more level 3 1132-1199 not used + LANG_MOVEGENS_FOLLOW_PLAYER = 1132, + LANG_MOVEGENS_FOLLOW_CREATURE = 1133, + LANG_MOVEGENS_FOLLOW_NULL = 1134, + // Room for more level 3 1135-1199 not used // Debug commands LANG_CINEMATIC_NOT_EXIST = 1200, diff --git a/src/game/Level2.cpp b/src/game/Level2.cpp index 8a378611b..39131e03a 100644 --- a/src/game/Level2.cpp +++ b/src/game/Level2.cpp @@ -1745,15 +1745,15 @@ bool ChatHandler::HandleNpcUnFollowCommand(const char* /*args*/) } if (creature->GetMotionMaster()->empty() || - creature->GetMotionMaster()->GetCurrentMovementGeneratorType ()!=TARGETED_MOTION_TYPE) + creature->GetMotionMaster()->GetCurrentMovementGeneratorType ()!=FOLLOW_MOTION_TYPE) { PSendSysMessage(LANG_CREATURE_NOT_FOLLOW_YOU); SetSentErrorMessage(true); return false; } - TargetedMovementGenerator const* mgen - = static_cast const*>((creature->GetMotionMaster()->top())); + FollowMovementGenerator const* mgen + = static_cast const*>((creature->GetMotionMaster()->top())); if(mgen->GetTarget()!=player) { diff --git a/src/game/Level3.cpp b/src/game/Level3.cpp index 2f20e405d..eff7af635 100644 --- a/src/game/Level3.cpp +++ b/src/game/Level3.cpp @@ -5571,26 +5571,37 @@ bool ChatHandler::HandleMovegensCommand(const char* /*args*/) case WAYPOINT_MOTION_TYPE: SendSysMessage(LANG_MOVEGENS_WAYPOINT); break; case ANIMAL_RANDOM_MOTION_TYPE: SendSysMessage(LANG_MOVEGENS_ANIMAL_RANDOM); break; case CONFUSED_MOTION_TYPE: SendSysMessage(LANG_MOVEGENS_CONFUSED); break; - case TARGETED_MOTION_TYPE: + + case CHASE_MOTION_TYPE: { + Unit* target = NULL; if(unit->GetTypeId()==TYPEID_PLAYER) - { - TargetedMovementGenerator const* mgen = static_cast const*>(*itr); - Unit* target = mgen->GetTarget(); - if(target) - PSendSysMessage(LANG_MOVEGENS_TARGETED_PLAYER,target->GetName(),target->GetGUIDLow()); - else - SendSysMessage(LANG_MOVEGENS_TARGETED_NULL); - } + target = static_cast const*>(*itr)->GetTarget(); else - { - TargetedMovementGenerator const* mgen = static_cast const*>(*itr); - Unit* target = mgen->GetTarget(); - if(target) - PSendSysMessage(LANG_MOVEGENS_TARGETED_CREATURE,target->GetName(),target->GetGUIDLow()); - else - SendSysMessage(LANG_MOVEGENS_TARGETED_NULL); - } + target = static_cast const*>(*itr)->GetTarget(); + + if (!target) + SendSysMessage(LANG_MOVEGENS_CHASE_NULL); + else if (target->GetTypeId()==TYPEID_PLAYER) + PSendSysMessage(LANG_MOVEGENS_CHASE_PLAYER,target->GetName(),target->GetGUIDLow()); + else + 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*>(*itr)->GetTarget(); + else + target = static_cast const*>(*itr)->GetTarget(); + + if (!target) + SendSysMessage(LANG_MOVEGENS_FOLLOW_NULL); + else if (target->GetTypeId()==TYPEID_PLAYER) + PSendSysMessage(LANG_MOVEGENS_FOLLOW_PLAYER,target->GetName(),target->GetGUIDLow()); + else + PSendSysMessage(LANG_MOVEGENS_FOLLOW_CREATURE,target->GetName(),target->GetGUIDLow()); break; } case HOME_MOTION_TYPE: diff --git a/src/game/MotionMaster.cpp b/src/game/MotionMaster.cpp index 94cbdb082..add862af7 100644 --- a/src/game/MotionMaster.cpp +++ b/src/game/MotionMaster.cpp @@ -159,7 +159,7 @@ MotionMaster::DirectExpire(bool reset) pop(); // also drop stored under top() targeted motions - while( !empty() && top()->GetMovementGeneratorType() == TARGETED_MOTION_TYPE ) + while (!empty() && (top()->GetMovementGeneratorType() == CHASE_MOTION_TYPE || top()->GetMovementGeneratorType() == FOLLOW_MOTION_TYPE)) { MovementGenerator *temp = top(); pop(); @@ -192,7 +192,7 @@ MotionMaster::DelayedExpire() m_expList = new ExpireList(); // also drop stored under top() targeted motions - while( !empty() && top()->GetMovementGeneratorType() == TARGETED_MOTION_TYPE ) + while (!empty() && (top()->GetMovementGeneratorType() == CHASE_MOTION_TYPE || top()->GetMovementGeneratorType() == FOLLOW_MOTION_TYPE)) { MovementGenerator *temp = top(); pop(); @@ -236,7 +236,7 @@ MotionMaster::MoveTargetedHome() DEBUG_LOG("Following %s (GUID: %u)", target->GetTypeId()==TYPEID_PLAYER ? "player" : "creature", target->GetTypeId()==TYPEID_PLAYER ? target->GetGUIDLow() : ((Creature*)target)->GetDBTableGUIDLow() ); - Mutate(new TargetedMovementGenerator(*target,PET_FOLLOW_DIST,PET_FOLLOW_ANGLE)); + Mutate(new FollowMovementGenerator(*target,PET_FOLLOW_DIST,PET_FOLLOW_ANGLE)); } } else @@ -275,7 +275,7 @@ MotionMaster::MoveChase(Unit* target, float dist, float angle) i_owner->GetGUIDLow(), target->GetTypeId()==TYPEID_PLAYER ? "player" : "creature", target->GetTypeId()==TYPEID_PLAYER ? i_owner->GetGUIDLow() : ((Creature*)i_owner)->GetDBTableGUIDLow() ); - Mutate(new TargetedMovementGenerator(*target,dist,angle)); + Mutate(new ChaseMovementGenerator(*target,dist,angle)); } else { @@ -283,7 +283,7 @@ MotionMaster::MoveChase(Unit* target, float dist, float angle) i_owner->GetEntry(), i_owner->GetGUIDLow(), target->GetTypeId()==TYPEID_PLAYER ? "player" : "creature", target->GetTypeId()==TYPEID_PLAYER ? target->GetGUIDLow() : ((Creature*)target)->GetDBTableGUIDLow() ); - Mutate(new TargetedMovementGenerator(*target,dist,angle)); + Mutate(new ChaseMovementGenerator(*target,dist,angle)); } } @@ -302,7 +302,7 @@ MotionMaster::MoveFollow(Unit* target, float dist, float angle) DEBUG_LOG("Player (GUID: %u) follow to %s (GUID: %u)", i_owner->GetGUIDLow(), target->GetTypeId()==TYPEID_PLAYER ? "player" : "creature", target->GetTypeId()==TYPEID_PLAYER ? i_owner->GetGUIDLow() : ((Creature*)i_owner)->GetDBTableGUIDLow() ); - Mutate(new TargetedMovementGenerator(*target,dist,angle)); + Mutate(new FollowMovementGenerator(*target,dist,angle)); } else { @@ -310,7 +310,7 @@ MotionMaster::MoveFollow(Unit* target, float dist, float angle) i_owner->GetEntry(), i_owner->GetGUIDLow(), target->GetTypeId()==TYPEID_PLAYER ? "player" : "creature", target->GetTypeId()==TYPEID_PLAYER ? target->GetGUIDLow() : ((Creature*)target)->GetDBTableGUIDLow() ); - Mutate(new TargetedMovementGenerator(*target,dist,angle)); + Mutate(new FollowMovementGenerator(*target,dist,angle)); } } @@ -470,8 +470,5 @@ bool MotionMaster::GetDestination(float &x, float &y, float &z) void MotionMaster::UpdateFinalDistanceToTarget(float fDistance) { if (!empty()) - { - if (top()->GetMovementGeneratorType() == TARGETED_MOTION_TYPE) - top()->UpdateFinalDistance(fDistance); - } + top()->UpdateFinalDistance(fDistance); } diff --git a/src/game/MotionMaster.h b/src/game/MotionMaster.h index 371b39c3b..01ed0e90d 100644 --- a/src/game/MotionMaster.h +++ b/src/game/MotionMaster.h @@ -38,7 +38,7 @@ enum MovementGeneratorType MAX_DB_MOTION_TYPE = 3, // *** this and below motion types can't be set in DB. ANIMAL_RANDOM_MOTION_TYPE = MAX_DB_MOTION_TYPE, // Just a dummy CONFUSED_MOTION_TYPE = 4, // ConfusedMovementGenerator.h - TARGETED_MOTION_TYPE = 5, // TargetedMovementGenerator.h + CHASE_MOTION_TYPE = 5, // TargetedMovementGenerator.h HOME_MOTION_TYPE = 6, // HomeMovementGenerator.h FLIGHT_MOTION_TYPE = 7, // WaypointMovementGenerator.h POINT_MOTION_TYPE = 8, // PointMovementGenerator.h @@ -47,6 +47,7 @@ enum MovementGeneratorType ASSISTANCE_MOTION_TYPE= 11, // PointMovementGenerator.h (first part of flee for assistance) ASSISTANCE_DISTRACT_MOTION_TYPE = 12, // IdleMovementGenerator.h (second part of flee for assistance) TIMED_FLEEING_MOTION_TYPE = 13, // FleeingMovementGenerator.h (alt.second part of flee for assistance) + FOLLOW_MOTION_TYPE = 14, // TargetedMovementGenerator.h }; enum MMCleanFlag diff --git a/src/game/ReactorAI.cpp b/src/game/ReactorAI.cpp index 97d92d687..2ea08d446 100644 --- a/src/game/ReactorAI.cpp +++ b/src/game/ReactorAI.cpp @@ -86,7 +86,7 @@ ReactorAI::UpdateAI(const uint32 /*time_diff*/) void ReactorAI::EnterEvadeMode() { - if( !m_creature->isAlive() ) + if (!m_creature->isAlive()) { DEBUG_LOG("Creature stopped attacking, he is dead [guid=%u]", m_creature->GetGUIDLow()); m_creature->GetMotionMaster()->MovementExpired(); @@ -99,15 +99,15 @@ ReactorAI::EnterEvadeMode() Unit* victim = ObjectAccessor::GetUnit(*m_creature, i_victimGuid ); - if( !victim ) + if (!victim) { DEBUG_LOG("Creature stopped attacking, no victim [guid=%u]", m_creature->GetGUIDLow()); } - else if( victim->HasStealthAura() ) + else if (victim->HasStealthAura()) { DEBUG_LOG("Creature stopped attacking, victim is in stealth [guid=%u]", m_creature->GetGUIDLow()); } - else if( victim->isInFlight() ) + else if (victim->isInFlight()) { DEBUG_LOG("Creature stopped attacking, victim is in flight [guid=%u]", m_creature->GetGUIDLow()); } @@ -122,7 +122,7 @@ ReactorAI::EnterEvadeMode() m_creature->CombatStop(true); m_creature->SetLootRecipient(NULL); - // Remove TargetedMovementGenerator from MotionMaster stack list, and add HomeMovementGenerator instead - if( m_creature->GetMotionMaster()->GetCurrentMovementGeneratorType() == TARGETED_MOTION_TYPE ) + // Remove ChaseMovementGenerator from MotionMaster stack list, and add HomeMovementGenerator instead + if (m_creature->GetMotionMaster()->GetCurrentMovementGeneratorType() == CHASE_MOTION_TYPE) m_creature->GetMotionMaster()->MoveTargetedHome(); } diff --git a/src/game/TargetedMovementGenerator.cpp b/src/game/TargetedMovementGenerator.cpp index 6cfe5b2ed..25e37ab16 100644 --- a/src/game/TargetedMovementGenerator.cpp +++ b/src/game/TargetedMovementGenerator.cpp @@ -26,22 +26,10 @@ #define SMALL_ALPHA 0.05f #include -/* -struct StackCleaner -{ - Creature &i_creature; - StackCleaner(Creature &creature) : i_creature(creature) {} - void Done(void) { i_creature.StopMoving(); } - ~StackCleaner() - { - i_creature->Clear(); - } -}; -*/ +//-----------------------------------------------// template -void -TargetedMovementGenerator::_setTargetLocation(T &owner) +void TargetedMovementGeneratorMedium::_setTargetLocation(T &owner) { if (!i_target.isValid() || !i_target->IsInWorld()) return; @@ -89,55 +77,26 @@ TargetedMovementGenerator::_setTargetLocation(T &owner) } template<> -void TargetedMovementGenerator::Initialize(Player &owner) -{ - _setTargetLocation(owner); -} - -template<> -void TargetedMovementGenerator::Initialize(Creature &owner) -{ - if (owner.isInCombat()) - owner.RemoveMonsterMoveFlag(MONSTER_MOVE_WALK); - - if (((Creature*)&owner)->canFly()) - owner.AddMonsterMoveFlag(MONSTER_MOVE_FLY); - - _setTargetLocation(owner); -} - -template<> -void TargetedMovementGenerator::UpdateFinalDistance(float fDistance) +void TargetedMovementGeneratorMedium::UpdateFinalDistance(float fDistance) { // nothing to do for Player } template<> -void TargetedMovementGenerator::UpdateFinalDistance(float fDistance) +void TargetedMovementGeneratorMedium::UpdateFinalDistance(float fDistance) { i_offset = fDistance; i_recalculateTravel = true; } template -void TargetedMovementGenerator::Finalize(T &owner) +Unit* TargetedMovementGeneratorMedium::GetTarget() const { - owner.clearUnitState(UNIT_STAT_CHASE | UNIT_STAT_FOLLOW); + return i_target.getTarget(); } template -void TargetedMovementGenerator::Interrupt(T &owner) -{ -} - -template -void TargetedMovementGenerator::Reset(T &owner) -{ - Initialize(owner); -} - -template -bool TargetedMovementGenerator::Update(T &owner, const uint32 & time_diff) +bool TargetedMovementGeneratorMedium::Update(T &owner, const uint32 & time_diff) { if (!i_target.isValid() || !i_target->IsInWorld()) return false; @@ -208,21 +167,90 @@ bool TargetedMovementGenerator::Update(T &owner, const uint32 & time_diff) return true; } -template -Unit* TargetedMovementGenerator::GetTarget() const +//-----------------------------------------------// +template<> +void ChaseMovementGenerator::Initialize(Player &owner) { - return i_target.getTarget(); + _setTargetLocation(owner); } -template void TargetedMovementGenerator::_setTargetLocation(Player &); -template void TargetedMovementGenerator::_setTargetLocation(Creature &); -template void TargetedMovementGenerator::Finalize(Player &); -template void TargetedMovementGenerator::Finalize(Creature &); -template void TargetedMovementGenerator::Interrupt(Player &); -template void TargetedMovementGenerator::Interrupt(Creature &); -template void TargetedMovementGenerator::Reset(Player &); -template void TargetedMovementGenerator::Reset(Creature &); -template bool TargetedMovementGenerator::Update(Player &, const uint32 &); -template bool TargetedMovementGenerator::Update(Creature &, const uint32 &); -template Unit* TargetedMovementGenerator::GetTarget() const; -template Unit* TargetedMovementGenerator::GetTarget() const; +template<> +void ChaseMovementGenerator::Initialize(Creature &owner) +{ + owner.RemoveMonsterMoveFlag(MONSTER_MOVE_WALK); + + if (((Creature*)&owner)->canFly()) + owner.AddMonsterMoveFlag(MONSTER_MOVE_FLY); + + _setTargetLocation(owner); +} + +template +void ChaseMovementGenerator::Finalize(T &owner) +{ + owner.clearUnitState(UNIT_STAT_CHASE | UNIT_STAT_FOLLOW); +} + +template +void ChaseMovementGenerator::Interrupt(T &owner) +{ +} + +template +void ChaseMovementGenerator::Reset(T &owner) +{ + Initialize(owner); +} + +//-----------------------------------------------// +template<> +void FollowMovementGenerator::Initialize(Player &owner) +{ + _setTargetLocation(owner); +} + +template<> +void FollowMovementGenerator::Initialize(Creature &owner) +{ + if (((Creature*)&owner)->canFly()) + owner.AddMonsterMoveFlag(MONSTER_MOVE_FLY); + + _setTargetLocation(owner); +} + +template +void FollowMovementGenerator::Finalize(T &owner) +{ + owner.clearUnitState(UNIT_STAT_CHASE | UNIT_STAT_FOLLOW); +} + +template +void FollowMovementGenerator::Interrupt(T &owner) +{ +} + +template +void FollowMovementGenerator::Reset(T &owner) +{ + Initialize(owner); +} + +//-----------------------------------------------// +template Unit* TargetedMovementGeneratorMedium::GetTarget() const; +template Unit* TargetedMovementGeneratorMedium::GetTarget() const; +template bool TargetedMovementGeneratorMedium::Update(Player &, const uint32 &); +template bool TargetedMovementGeneratorMedium::Update(Creature &, const uint32 &); + +template void ChaseMovementGenerator::Finalize(Player &); +template void ChaseMovementGenerator::Finalize(Creature &); +template void ChaseMovementGenerator::Interrupt(Player &); +template void ChaseMovementGenerator::Interrupt(Creature &); +template void ChaseMovementGenerator::Reset(Player &); +template void ChaseMovementGenerator::Reset(Creature &); + +template void FollowMovementGenerator::Finalize(Player &); +template void FollowMovementGenerator::Finalize(Creature &); +template void FollowMovementGenerator::Interrupt(Player &); +template void FollowMovementGenerator::Interrupt(Creature &); +template void FollowMovementGenerator::Reset(Player &); +template void FollowMovementGenerator::Reset(Creature &); diff --git a/src/game/TargetedMovementGenerator.h b/src/game/TargetedMovementGenerator.h index 250c31db5..3a83f09bf 100644 --- a/src/game/TargetedMovementGenerator.h +++ b/src/game/TargetedMovementGenerator.h @@ -34,23 +34,24 @@ class MANGOS_DLL_SPEC TargetedMovementGeneratorBase }; template -class MANGOS_DLL_SPEC TargetedMovementGenerator -: public MovementGeneratorMedium< T, TargetedMovementGenerator >, public TargetedMovementGeneratorBase +class MANGOS_DLL_SPEC TargetedMovementGeneratorMedium +: public MovementGeneratorMedium< T, TargetedMovementGeneratorMedium >, public TargetedMovementGeneratorBase { - public: + protected: + TargetedMovementGeneratorMedium() : MovementGeneratorMedium< T, TargetedMovementGeneratorMedium >(), TargetedMovementGeneratorBase() {} - TargetedMovementGenerator(Unit &target) + TargetedMovementGeneratorMedium(Unit &target) : TargetedMovementGeneratorBase(target), i_offset(0), i_angle(0), i_recalculateTravel(false) {} - TargetedMovementGenerator(Unit &target, float offset, float angle) + TargetedMovementGeneratorMedium(Unit &target, float offset, float angle) : TargetedMovementGeneratorBase(target), i_offset(offset), i_angle(angle), i_recalculateTravel(false) {} - ~TargetedMovementGenerator() {} + ~TargetedMovementGeneratorMedium() {} - void Initialize(T &); - void Finalize(T &); - void Interrupt(T &); - void Reset(T &); + public: + void Initialize(T &) {} + void Finalize(T &) {} + void Interrupt(T &) {} + void Reset(T &) {} bool Update(T &, const uint32 &); - MovementGeneratorType GetMovementGeneratorType() { return TARGETED_MOTION_TYPE; } Unit* GetTarget() const; @@ -64,7 +65,7 @@ class MANGOS_DLL_SPEC TargetedMovementGenerator void unitSpeedChanged() { i_recalculateTravel=true; } void UpdateFinalDistance(float fDistance); - private: + protected: void _setTargetLocation(T &); @@ -73,4 +74,41 @@ class MANGOS_DLL_SPEC TargetedMovementGenerator DestinationHolder< Traveller > i_destinationHolder; bool i_recalculateTravel; }; + +template +class MANGOS_DLL_SPEC ChaseMovementGenerator : public TargetedMovementGeneratorMedium +{ + public: + ChaseMovementGenerator(Unit &target) : TargetedMovementGeneratorMedium(target) {} + ChaseMovementGenerator(Unit &target, float offset, float angle) + : TargetedMovementGeneratorMedium(target, offset, angle) {} + ~ChaseMovementGenerator() {} + + MovementGeneratorType GetMovementGeneratorType() { return CHASE_MOTION_TYPE; } + + void Initialize(T &); + void Finalize(T &); + void Interrupt(T &); + void Reset(T &); + bool Update(T &, const uint32 &); +}; + +template +class MANGOS_DLL_SPEC FollowMovementGenerator : public TargetedMovementGeneratorMedium +{ + public: + FollowMovementGenerator(Unit &target) : TargetedMovementGeneratorMedium(target) {} + FollowMovementGenerator(Unit &target, float offset, float angle) + : TargetedMovementGeneratorMedium(target, offset, angle) {} + ~FollowMovementGenerator() {} + + MovementGeneratorType GetMovementGeneratorType() { return FOLLOW_MOTION_TYPE; } + + void Initialize(T &); + void Finalize(T &); + void Interrupt(T &); + void Reset(T &); + bool Update(T &, const uint32 &); +}; + #endif diff --git a/src/game/Unit.cpp b/src/game/Unit.cpp index 5f8f180f2..b79f4bbbe 100644 --- a/src/game/Unit.cpp +++ b/src/game/Unit.cpp @@ -10873,7 +10873,7 @@ bool Unit::SelectHostileTarget() // it in combat but attacker not make any damage and not enter to aggro radius to have record in threat list // for example at owner command to pet attack some far away creature // Note: creature not have targeted movement generator but have attacker in this case - if (GetMotionMaster()->GetCurrentMovementGeneratorType() != TARGETED_MOTION_TYPE || hasUnitState(UNIT_STAT_FOLLOW)) + if (GetMotionMaster()->GetCurrentMovementGeneratorType() != CHASE_MOTION_TYPE) { for(AttackerSet::const_iterator itr = m_attackers.begin(); itr != m_attackers.end(); ++itr) { diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 8c4b87edf..fd326059c 100644 --- a/src/shared/revision_nr.h +++ b/src/shared/revision_nr.h @@ -1,4 +1,4 @@ #ifndef __REVISION_NR_H__ #define __REVISION_NR_H__ - #define REVISION_NR "9197" + #define REVISION_NR "9198" #endif // __REVISION_NR_H__ diff --git a/src/shared/revision_sql.h b/src/shared/revision_sql.h index 0eaedae9c..97a021126 100644 --- a/src/shared/revision_sql.h +++ b/src/shared/revision_sql.h @@ -1,6 +1,6 @@ #ifndef __REVISION_SQL_H__ #define __REVISION_SQL_H__ #define REVISION_DB_CHARACTERS "required_9136_07_characters_characters" - #define REVISION_DB_MANGOS "required_9160_02_mangos_spell_chain" + #define REVISION_DB_MANGOS "required_9198_01_mangos_mangos_string" #define REVISION_DB_REALMD "required_9010_01_realmd_realmlist" #endif // __REVISION_SQL_H__