aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRat <none@none>2009-08-24 00:14:32 +0200
committerRat <none@none>2009-08-24 00:14:32 +0200
commit6ce460e04db03bbe7fd5f50b7d4d025ab0fb5baf (patch)
treecd4621c70f0a0ed51dbb22cb3c9a7545bd2890dc /src
parent73c66a028cea21e46af5834497a96b72d0902780 (diff)
*add new fuction StartAutoRotate(direction, fullturntime) to creatures, it will rotate any creature 360degrees, turning shouldn't be stopped by taunt and other effects.
useful for some boss scripts --HG-- branch : trunk
Diffstat (limited to 'src')
-rw-r--r--src/game/Unit.cpp46
-rw-r--r--src/game/Unit.h24
2 files changed, 67 insertions, 3 deletions
diff --git a/src/game/Unit.cpp b/src/game/Unit.cpp
index 69143f8cab3..3a99ec8c22f 100644
--- a/src/game/Unit.cpp
+++ b/src/game/Unit.cpp
@@ -171,6 +171,8 @@ Unit::Unit()
// remove aurastates allowing special moves
for(uint8 i=0; i < MAX_REACTIVE; ++i)
m_reactiveTimer[i] = 0;
+
+ IsRotating = 0;
}
Unit::~Unit()
@@ -253,7 +255,10 @@ void Unit::Update( uint32 p_time )
ModifyAuraState(AURA_STATE_HEALTHLESS_35_PERCENT, GetHealth() < GetMaxHealth()*0.35f);
ModifyAuraState(AURA_STATE_HEALTH_ABOVE_75_PERCENT, GetHealth() > GetMaxHealth()*0.75f);
- i_motionMaster.UpdateMotion(p_time);
+ if(!IsUnitRotating())
+ i_motionMaster.UpdateMotion(p_time);
+ else
+ AutoRotate(p_time);
}
bool Unit::haveOffhandWeapon() const
@@ -497,6 +502,42 @@ void Unit::GetRandomContactPoint( const Unit* obj, float &x, float &y, float &z,
, GetAngle(obj) + (attacker_number ? (M_PI/2 - M_PI * rand_norm()) * (float)attacker_number / combat_reach * 0.3 : 0));
}
+void Unit::StartAutoRotate(uint8 type, uint32 fulltime)
+{
+ if(getVictim())
+ RotateAngle = GetAngle(getVictim());
+ else
+ RotateAngle = GetOrientation();
+ RotateTimer = fulltime;
+ RotateTimerFull = fulltime;
+ IsRotating = type;
+ LastTargetGUID = GetUInt64Value(UNIT_FIELD_TARGET);
+ SetUInt64Value(UNIT_FIELD_TARGET, 0);
+}
+
+void Unit::AutoRotate(uint32 time)
+{
+ if(!IsRotating)return;
+ if(IsRotating == CREATURE_ROTATE_LEFT)
+ {
+ RotateAngle += (double)time/RotateTimerFull*(double)M_PI*2;
+ if (RotateAngle >= M_PI*2)RotateAngle = 0;
+ }
+ else
+ {
+ RotateAngle -= (double)time/RotateTimerFull*(double)M_PI*2;
+ if (RotateAngle < 0)RotateAngle = M_PI*2;
+ }
+ SetOrientation(RotateAngle);
+ StopMoving();
+ if(RotateTimer <= time)
+ {
+ IsRotating = CREATURE_ROTATE_NONE;
+ RotateAngle = 0;
+ RotateTimer = RotateTimerFull;
+ SetUInt64Value(UNIT_FIELD_TARGET, LastTargetGUID);
+ }else RotateTimer -= time;
+}
void Unit::RemoveMovementImpairingAuras()
{
for(AuraMap::iterator iter = m_Auras.begin(); iter != m_Auras.end();)
@@ -3422,7 +3463,8 @@ bool Unit::isInFrontInMap(Unit const* target, float distance, float arc) const
void Unit::SetInFront(Unit const* target)
{
- SetOrientation(GetAngle(target));
+ if(!IsUnitRotating())
+ SetOrientation(GetAngle(target));
}
bool Unit::isInBackInMap(Unit const* target, float distance, float arc) const
diff --git a/src/game/Unit.h b/src/game/Unit.h
index e976b481e0a..b8784f1aca7 100644
--- a/src/game/Unit.h
+++ b/src/game/Unit.h
@@ -943,6 +943,13 @@ enum ActionBarIndex
ACTION_BAR_INDEX_END = 10,
};
+enum Rotation
+{
+ CREATURE_ROTATE_NONE = 0,
+ CREATURE_ROTATE_LEFT = 1,
+ CREATURE_ROTATE_RIGHT = 2
+};
+
#define MAX_UNIT_ACTION_BAR_INDEX (ACTION_BAR_INDEX_END-ACTION_BAR_INDEX_START)
struct CharmInfo
@@ -1067,6 +1074,9 @@ class TRINITY_DLL_SPEC Unit : public WorldObject
void GetRandomContactPoint( const Unit* target, float &x, float &y, float &z, float distance2dMin, float distance2dMax ) const;
uint32 m_extraAttacks;
bool m_canDualWield;
+ void StartAutoRotate(uint8 type, uint32 fulltime);
+ void AutoRotate(uint32 time);
+ bool IsUnitRotating() {return IsRotating;}
void _addAttacker(Unit *pAttacker) // must be called only from Unit::Attack(Unit*)
{
@@ -1092,7 +1102,13 @@ class TRINITY_DLL_SPEC Unit : public WorldObject
void RemoveAllAttackers();
AttackerSet const& getAttackers() const { return m_attackers; }
bool isAttackingPlayer() const;
- Unit* getVictim() const { return m_attacking; }
+ Unit* getVictim() const
+ {
+ if(IsRotating)return NULL;
+ return m_attacking;
+ }
+
+
void CombatStop(bool includingCast = false);
void CombatStopWithPets(bool includingCast = false);
Unit* SelectNearbyTarget(float dist = NOMINAL_MELEE_RANGE) const;
@@ -1928,6 +1944,12 @@ class TRINITY_DLL_SPEC Unit : public WorldObject
uint32 m_reducedThreatPercent;
uint64 m_misdirectionTargetGUID;
+
+ uint8 IsRotating;//0none 1left 2right
+ uint32 RotateTimer;
+ uint32 RotateTimerFull;
+ double RotateAngle;
+ uint64 LastTargetGUID;
};
namespace Trinity