Changeset 14
- Timestamp:
- 11/19/08 13:23:07 (17 years ago)
- Location:
- trunk/src
- Files:
-
- 4 modified
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/bindings/scripts/include/sc_creature.h
r13 r14 72 72 //Bool for if we are in combat or not 73 73 bool InCombat; 74 75 //For fleeing 76 bool IsFleeing; 74 77 75 78 //************* -
trunk/src/bindings/scripts/scripts/creature/mob_event_ai.cpp
r6 r14 80 80 uint32 AttackDistance; //Distance to attack from 81 81 float AttackAngle; //Angle of attack 82 uint32 TimetoFleeLeft; //For fleeing 82 83 83 84 void AttackTarget(Unit* pTarget, bool Follow) … … 775 776 case ACTION_T_FLEE: 776 777 { 777 //TODO: Replace with Flee movement generator 778 m_creature->CastSpell(m_creature, SPELL_RUN_AWAY, true); 778 TimetoFleeLeft = 8000; 779 m_creature->DoFleeToGetAssistance(); 780 IsFleeing = true; 779 781 } 780 782 break; … … 955 957 { 956 958 InCombat = false; 959 IsFleeing = false; 957 960 Reset(); 958 961 … … 1015 1018 1016 1019 InCombat = false; 1020 IsFleeing = false; 1017 1021 Reset(); 1018 1022 … … 1035 1039 { 1036 1040 InCombat = false; 1041 IsFleeing = false; 1037 1042 Reset(); 1038 1043 … … 1132 1137 return; 1133 1138 1134 if (who->isTargetableForAttack() )1139 if (who->isTargetableForAttack() && !IsFleeing) 1135 1140 { 1136 1141 //Begin melee attack if we are within range … … 1224 1229 //Must return if creature isn't alive. Normally select hostil target and get victim prevent this 1225 1230 if (!m_creature->isAlive()) 1231 return; 1232 1233 if ((TimetoFleeLeft < diff || (m_creature->GetMotionMaster()->GetCurrentMovementGeneratorType() != POINT_MOTION_TYPE && m_creature->GetMotionMaster()->GetCurrentMovementGeneratorType() != FLEEING_MOTION_TYPE)) && IsFleeing) 1234 { 1235 m_creature->GetMotionMaster()->Clear(false); 1236 m_creature->SetNoCallAssistence(false); 1237 m_creature->CallAssistence(); 1238 m_creature->GetMotionMaster()->MoveChase(m_creature->getVictim()); 1239 IsFleeing = false; 1240 } 1241 else 1242 TimetoFleeLeft -= diff; 1243 1244 if(IsFleeing) 1226 1245 return; 1227 1246 -
trunk/src/game/Creature.cpp
r6 r14 1645 1645 } 1646 1646 1647 void Creature::DoFleeToGetAssistance(float radius) // Optional parameter 1648 { 1649 if (!getVictim()) 1650 return; 1651 1652 Creature* pCreature = NULL; 1653 1654 CellPair p(MaNGOS::ComputeCellPair(GetPositionX(), GetPositionY())); 1655 Cell cell(p); 1656 cell.data.Part.reserved = ALL_DISTRICT; 1657 cell.SetNoCreate(); 1658 1659 MaNGOS::NearestAssistCreatureInCreatureRangeCheck u_check(this,getVictim(),radius); 1660 MaNGOS::CreatureLastSearcher<MaNGOS::NearestAssistCreatureInCreatureRangeCheck> searcher(pCreature, u_check); 1661 1662 TypeContainerVisitor<MaNGOS::CreatureLastSearcher<MaNGOS::NearestAssistCreatureInCreatureRangeCheck>, GridTypeMapContainer > grid_creature_searcher(searcher); 1663 1664 CellLock<GridReadGuard> cell_lock(cell, p); 1665 cell_lock->Visit(cell_lock, grid_creature_searcher, *(GetMap())); 1666 1667 if(!GetMotionMaster()->empty() && (GetMotionMaster()->GetCurrentMovementGeneratorType() != POINT_MOTION_TYPE)) 1668 GetMotionMaster()->Clear(false); 1669 if(pCreature == NULL) 1670 { 1671 GetMotionMaster()->MoveIdle(); 1672 GetMotionMaster()->MoveFleeing(getVictim()); 1673 } 1674 else 1675 { 1676 GetMotionMaster()->MoveIdle(); 1677 GetMotionMaster()->MovePoint(0,pCreature->GetPositionX(),pCreature->GetPositionY(),pCreature->GetPositionZ()); 1678 } 1679 } 1680 1647 1681 void Creature::CallAssistence() 1648 1682 { -
trunk/src/game/Creature.h
r6 r14 511 511 void CallAssistence(); 512 512 void SetNoCallAssistence(bool val) { m_AlreadyCallAssistence = val; } 513 void DoFleeToGetAssistance(float radius = 50); 513 514 514 515 MovementGeneratorType GetDefaultMovementType() const { return m_defaultMovementType; }