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__