*Check movementflag to interrupt casting instead of checking position.

*Also some other fixes about movement flags.

--HG--
branch : trunk
This commit is contained in:
megamage
2009-06-15 12:02:55 -05:00
parent 4d6fb6c8b2
commit b9610f27dd
19 changed files with 120 additions and 118 deletions
@@ -310,7 +310,7 @@ struct TRINITY_DLL_DECL mob_rizzle_sprysprocketAI : public ScriptedAI
Player* player = Unit::GetPlayer(PlayerGUID); Player* player = Unit::GetPlayer(PlayerGUID);
SendText(MSG_ESCAPE_NOTICE, player); SendText(MSG_ESCAPE_NOTICE, player);
DoCast(m_creature, SPELL_PERIODIC_DEPTH_CHARGE); DoCast(m_creature, SPELL_PERIODIC_DEPTH_CHARGE);
m_creature->SetUnitMovementFlags(MOVEMENTFLAG_FLYING2 | MOVEMENTFLAG_SWIMMING); m_creature->SetUnitMovementFlags(MOVEMENTFLAG_HOVER | MOVEMENTFLAG_SWIMMING);
m_creature->SetSpeed(MOVE_RUN, 0.85f, true); m_creature->SetSpeed(MOVE_RUN, 0.85f, true);
m_creature->GetMotionMaster()->MovementExpired(); m_creature->GetMotionMaster()->MovementExpired();
m_creature->GetMotionMaster()->MovePoint(CurrWP, WPs[CurrWP][0], WPs[CurrWP][1], WPs[CurrWP][2]); m_creature->GetMotionMaster()->MovePoint(CurrWP, WPs[CurrWP][0], WPs[CurrWP][1], WPs[CurrWP][2]);
@@ -441,7 +441,7 @@ struct TRINITY_DLL_DECL mob_depth_chargeAI : public ScriptedAI
void Reset() void Reset()
{ {
m_creature->SetUnitMovementFlags(MOVEMENTFLAG_FLYING2 | MOVEMENTFLAG_SWIMMING); m_creature->SetUnitMovementFlags(MOVEMENTFLAG_HOVER | MOVEMENTFLAG_SWIMMING);
m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
we_must_die = false; we_must_die = false;
must_die_timer = 1000; must_die_timer = 1000;
@@ -400,7 +400,7 @@ struct TRINITY_DLL_DECL boss_headless_horsemanAI : public ScriptedAI
{ {
m_creature->SetVisibility(VISIBILITY_OFF); m_creature->SetVisibility(VISIBILITY_OFF);
m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
m_creature->AddUnitMovementFlag(MOVEMENTFLAG_FLYING2); m_creature->AddUnitMovementFlag(MOVEMENTFLAG_HOVER);
m_creature->SetSpeed(MOVE_WALK,5.0f,true); m_creature->SetSpeed(MOVE_WALK,5.0f,true);
wp_reached = false; wp_reached = false;
count = 0; count = 0;
@@ -432,7 +432,7 @@ struct TRINITY_DLL_DECL boss_headless_horsemanAI : public ScriptedAI
pInstance->SetData(GAMEOBJECT_PUMPKIN_SHRINE, 0); //hide gameobject pInstance->SetData(GAMEOBJECT_PUMPKIN_SHRINE, 0); //hide gameobject
break; break;
case 19: case 19:
m_creature->RemoveUnitMovementFlag(MOVEMENTFLAG_FLYING2);break; m_creature->RemoveUnitMovementFlag(MOVEMENTFLAG_HOVER);break;
case 20: { case 20: {
Phase = 1; Phase = 1;
IsFlying = false; IsFlying = false;
@@ -295,7 +295,7 @@ struct TRINITY_DLL_DECL mob_annhylde_the_callerAI : public ScriptedAI
void Reset() void Reset()
{ {
m_creature->AddUnitMovementFlag(MOVEMENTFLAG_FLYING + MOVEMENTFLAG_FLYING2); m_creature->AddUnitMovementFlag(MOVEMENTFLAG_FLYING + MOVEMENTFLAG_HOVER);
m_creature->SetSpeed(MOVE_SWIM , 0.1f); m_creature->SetSpeed(MOVE_SWIM , 0.1f);
m_creature->SetSpeed(MOVE_RUN , 0.1f); m_creature->SetSpeed(MOVE_RUN , 0.1f);
m_creature->SetSpeed(MOVE_WALK , 0.1f); m_creature->SetSpeed(MOVE_WALK , 0.1f);
+11 -4
View File
@@ -1648,9 +1648,13 @@ bool Creature::IsWithinSightDist(Unit const* u) const
bool Creature::canStartAttack(Unit const* who, bool force) const bool Creature::canStartAttack(Unit const* who, bool force) const
{ {
if(isCivilian() if(isCivilian() || !who->isInAccessiblePlaceFor(this))
|| !who->isInAccessiblePlaceFor(this) return false;
|| !canFly() && GetDistanceZ(who) > CREATURE_Z_ATTACK_RANGE)
if(!canFly() && (GetDistanceZ(who) > CREATURE_Z_ATTACK_RANGE))
//|| who->IsControlledByPlayer() && who->IsFlying()))
// we cannot check flying for other creatures, too much map/vmap calculation
// TODO: should switch to range attack
return false; return false;
if(!force && (IsNeutralToAll() || !IsWithinDistInMap(who, GetAttackDistance(who)))) if(!force && (IsNeutralToAll() || !IsWithinDistInMap(who, GetAttackDistance(who))))
@@ -2190,6 +2194,9 @@ bool Creature::LoadCreaturesAddon(bool reload)
if (cainfo->move_flags != 0) if (cainfo->move_flags != 0)
SetUnitMovementFlags(cainfo->move_flags); SetUnitMovementFlags(cainfo->move_flags);
if(GetCreatureInfo()->InhabitType & INHABIT_AIR)
AddUnitMovementFlag(MOVEMENTFLAG_FLY_MODE);
if(cainfo->auras) if(cainfo->auras)
{ {
for (CreatureDataAddonAura const* cAura = cainfo->auras; cAura->spell_id; ++cAura) for (CreatureDataAddonAura const* cAura = cainfo->auras; cAura->spell_id; ++cAura)
@@ -2504,4 +2511,4 @@ time_t Creature::GetLinkedCreatureRespawnTime() const
} }
return 0; return 0;
} }
+1 -1
View File
@@ -516,7 +516,7 @@ class TRINITY_DLL_SPEC Creature : public Unit
bool isTrigger() const { return GetCreatureInfo()->flags_extra & CREATURE_FLAG_EXTRA_TRIGGER; } bool isTrigger() const { return GetCreatureInfo()->flags_extra & CREATURE_FLAG_EXTRA_TRIGGER; }
bool canWalk() const { return GetCreatureInfo()->InhabitType & INHABIT_GROUND; } bool canWalk() const { return GetCreatureInfo()->InhabitType & INHABIT_GROUND; }
bool canSwim() const { return GetCreatureInfo()->InhabitType & INHABIT_WATER; } bool canSwim() const { return GetCreatureInfo()->InhabitType & INHABIT_WATER; }
bool canFly() const { return GetCreatureInfo()->InhabitType & INHABIT_AIR; } //bool canFly() const { return GetCreatureInfo()->InhabitType & INHABIT_AIR; }
void SetReactState(ReactStates st) { m_reactState = st; } void SetReactState(ReactStates st) { m_reactState = st; }
ReactStates GetReactState() { return m_reactState; } ReactStates GetReactState() { return m_reactState; }
bool HasReactState(ReactStates state) const { return (m_reactState == state); } bool HasReactState(ReactStates state) const { return (m_reactState == state); }
+7 -3
View File
@@ -299,9 +299,6 @@ void WorldSession::HandleMovementOpcodes( WorldPacket & recv_data )
plMover->SetPosition(movementInfo.x, movementInfo.y, movementInfo.z, movementInfo.o); plMover->SetPosition(movementInfo.x, movementInfo.y, movementInfo.z, movementInfo.o);
plMover->UpdateFallInformationIfNeed(movementInfo, recv_data.GetOpcode()); plMover->UpdateFallInformationIfNeed(movementInfo, recv_data.GetOpcode());
if(plMover->isMovingOrTurning())
plMover->RemoveAurasByType(SPELL_AURA_FEIGN_DEATH);
if(movementInfo.z < -500.0f) if(movementInfo.z < -500.0f)
{ {
if(plMover->InBattleGround() if(plMover->InBattleGround()
@@ -339,6 +336,13 @@ void WorldSession::HandleMovementOpcodes( WorldPacket & recv_data )
if(mover->m_Vehicle) if(mover->m_Vehicle)
return; return;
mover->GetMap()->CreatureRelocation((Creature*)mover, movementInfo.x, movementInfo.y, movementInfo.z, movementInfo.o); mover->GetMap()->CreatureRelocation((Creature*)mover, movementInfo.x, movementInfo.y, movementInfo.z, movementInfo.o);
/*if(mover->canFly())
{
bool flying = mover->IsFlying();
if(flying != ((mover->GetByteValue(UNIT_FIELD_BYTES_1, 3) & 0x02) ? true : false))
mover->SetFlying(flying);
}*/
} }
//sLog.outString("Receive Movement Packet %s:", opcodeTable[recv_data.GetOpcode()]); //sLog.outString("Receive Movement Packet %s:", opcodeTable[recv_data.GetOpcode()]);
+19 -22
View File
@@ -5635,39 +5635,36 @@ bool Player::SetPosition(float x, float y, float z, float orientation, bool tele
return false; return false;
} }
Map *m = GetMap(); //if(movementInfo.flags & MOVEMENTFLAG_MOVING)
// mover->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_MOVE);
//if(movementInfo.flags & MOVEMENTFLAG_TURNING)
// mover->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_TURNING);
//AURA_INTERRUPT_FLAG_JUMP not sure
const float old_x = GetPositionX(); if(GetOrientation() != orientation)
const float old_y = GetPositionY(); RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_TURNING);
const float old_z = GetPositionZ();
const float old_r = GetOrientation();
if( teleport || old_x != x || old_y != y || old_z != z || old_r != orientation ) bool move2d = (teleport || GetPositionX() != x || GetPositionY() != y);
if(move2d || GetPositionZ() != z)
{ {
if (teleport || old_x != x || old_y != y || old_z != z) RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_MOVE);
RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_MOVE | AURA_INTERRUPT_FLAG_TURNING);
else
RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_TURNING);
// move and update visible state if need // move and update visible state if need
m->PlayerRelocation(this, x, y, z, orientation); GetMap()->PlayerRelocation(this, x, y, z, orientation);
// reread after Map::Relocation // reread after Map::Relocation
m = GetMap(); GetPosition(x, y, z);
x = GetPositionX();
y = GetPositionY();
z = GetPositionZ();
// group update // group update
if(GetGroup() && (old_x != x || old_y != y)) if(move2d && GetGroup())
SetGroupUpdateFlag(GROUP_UPDATE_FLAG_POSITION); SetGroupUpdateFlag(GROUP_UPDATE_FLAG_POSITION);
// code block for underwater state update
UpdateUnderwaterState(GetMap(), x, y, z);
CheckExploreSystem();
} }
// code block for underwater state update
UpdateUnderwaterState(m, x, y, z);
CheckExploreSystem();
return true; return true;
} }
@@ -6415,7 +6412,7 @@ void Player::CheckDuelDistance(time_t currTime)
bool Player::IsOutdoorPvPActive() bool Player::IsOutdoorPvPActive()
{ {
return (isAlive() && !HasInvisibilityAura() && !HasStealthAura() && (HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_IN_PVP) || sWorld.IsPvPRealm()) && !HasUnitMovementFlag(MOVEMENTFLAG_FLYING2) && !isInFlight()); return (isAlive() && !HasInvisibilityAura() && !HasStealthAura() && (HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_IN_PVP) || sWorld.IsPvPRealm()) && !HasUnitMovementFlag(MOVEMENTFLAG_FLYING) && !isInFlight());
} }
void Player::DuelComplete(DuelCompleteType type) void Player::DuelComplete(DuelCompleteType type)
-16
View File
@@ -689,17 +689,6 @@ enum InstanceResetWarningType
RAID_INSTANCE_EXPIRED = 5 RAID_INSTANCE_EXPIRED = 5
}; };
// flags that use in movement check for example at spell casting
MovementFlags const movementFlagsMask = MovementFlags(
MOVEMENTFLAG_FORWARD |MOVEMENTFLAG_BACKWARD |MOVEMENTFLAG_STRAFE_LEFT|MOVEMENTFLAG_STRAFE_RIGHT|
MOVEMENTFLAG_PITCH_UP|MOVEMENTFLAG_PITCH_DOWN|MOVEMENTFLAG_FLY_UNK1 |
MOVEMENTFLAG_JUMPING |MOVEMENTFLAG_FALLING |MOVEMENTFLAG_FLY_UP |
MOVEMENTFLAG_FLYING |MOVEMENTFLAG_SPLINE
);
MovementFlags const movementOrTurningFlagsMask = MovementFlags(
movementFlagsMask | MOVEMENTFLAG_LEFT | MOVEMENTFLAG_RIGHT
);
class InstanceSave; class InstanceSave;
enum RestType enum RestType
@@ -1951,11 +1940,6 @@ class TRINITY_DLL_SPEC Player : public Unit
} }
void HandleFall(MovementInfo const& movementInfo); void HandleFall(MovementInfo const& movementInfo);
bool isMoving() const { return m_movementInfo.HasMovementFlag(movementFlagsMask); }
bool isMovingOrTurning() const { return m_movementInfo.HasMovementFlag(movementOrTurningFlagsMask); }
bool CanFly() const { return m_movementInfo.HasMovementFlag(MOVEMENTFLAG_CAN_FLY); }
bool IsFlying() const { return m_movementInfo.HasMovementFlag(MOVEMENTFLAG_FLYING); }
bool IsAllowUseFlyMountsHere() const; bool IsAllowUseFlyMountsHere() const;
void SetClientControl(Unit* target, uint8 allowMove); void SetClientControl(Unit* target, uint8 allowMove);
+1 -1
View File
@@ -35,7 +35,7 @@ void PointMovementGenerator<T>::Initialize(T &unit)
i_destinationHolder.SetDestination(traveller,i_x,i_y,i_z, !unit.hasUnitState(UNIT_STAT_JUMPING)); i_destinationHolder.SetDestination(traveller,i_x,i_y,i_z, !unit.hasUnitState(UNIT_STAT_JUMPING));
if (unit.GetTypeId() == TYPEID_UNIT && ((Creature*)&unit)->canFly()) if (unit.GetTypeId() == TYPEID_UNIT && ((Creature*)&unit)->canFly())
unit.AddUnitMovementFlag(MOVEMENTFLAG_FLYING2); unit.AddUnitMovementFlag(MOVEMENTFLAG_FLYING);
} }
template<class T> template<class T>
+3 -3
View File
@@ -124,7 +124,7 @@ RandomMovementGenerator<Creature>::_setRandomLocation(Creature &creature)
if (is_air_ok) if (is_air_ok)
{ {
i_nextMoveTime.Reset(i_destinationHolder.GetTotalTravelTime()); i_nextMoveTime.Reset(i_destinationHolder.GetTotalTravelTime());
creature.AddUnitMovementFlag(MOVEMENTFLAG_FLYING2); creature.AddUnitMovementFlag(MOVEMENTFLAG_FLYING);
} }
//else if (is_water_ok) // Swimming mode to be done with more than this check //else if (is_water_ok) // Swimming mode to be done with more than this check
else else
@@ -151,7 +151,7 @@ RandomMovementGenerator<Creature>::Initialize(Creature &creature)
wander_distance = creature.GetRespawnRadius(); wander_distance = creature.GetRespawnRadius();
if (creature.canFly()) if (creature.canFly())
creature.AddUnitMovementFlag(MOVEMENTFLAG_FLYING2); creature.AddUnitMovementFlag(MOVEMENTFLAG_FLYING);
else if(irand(0,RUNNING_CHANCE_RANDOMMV) > 0) else if(irand(0,RUNNING_CHANCE_RANDOMMV) > 0)
creature.AddUnitMovementFlag(MOVEMENTFLAG_WALK_MODE); creature.AddUnitMovementFlag(MOVEMENTFLAG_WALK_MODE);
_setRandomLocation(creature); _setRandomLocation(creature);
@@ -194,7 +194,7 @@ RandomMovementGenerator<Creature>::Update(Creature &creature, const uint32 &diff
if(i_nextMoveTime.Passed()) if(i_nextMoveTime.Passed())
{ {
if (creature.canFly()) if (creature.canFly())
creature.AddUnitMovementFlag(MOVEMENTFLAG_FLYING2); creature.AddUnitMovementFlag(MOVEMENTFLAG_FLYING);
else if(irand(0,RUNNING_CHANCE_RANDOMMV) > 0) else if(irand(0,RUNNING_CHANCE_RANDOMMV) > 0)
creature.AddUnitMovementFlag(MOVEMENTFLAG_WALK_MODE); creature.AddUnitMovementFlag(MOVEMENTFLAG_WALK_MODE);
_setRandomLocation(creature); _setRandomLocation(creature);
+2 -21
View File
@@ -423,7 +423,6 @@ Spell::Spell( Unit* Caster, SpellEntry const *info, bool triggered, uint64 origi
m_spellState = SPELL_STATE_NULL; m_spellState = SPELL_STATE_NULL;
m_castPositionX = m_castPositionY = m_castPositionZ = 0;
m_TriggerSpells.clear(); m_TriggerSpells.clear();
m_IsTriggeredSpell = triggered; m_IsTriggeredSpell = triggered;
//m_AreaAura = false; //m_AreaAura = false;
@@ -2391,9 +2390,6 @@ void Spell::prepare(SpellCastTargets const* targets, AuraEffect* triggeredByAura
m_spellState = SPELL_STATE_PREPARING; m_spellState = SPELL_STATE_PREPARING;
m_caster->GetPosition(m_castPositionX, m_castPositionY, m_castPositionZ);
m_castOrientation = m_caster->GetOrientation();
if(triggeredByAura) if(triggeredByAura)
m_triggeredByAuraSpell = triggeredByAura->GetSpellProto(); m_triggeredByAuraSpell = triggeredByAura->GetSpellProto();
@@ -2920,15 +2916,11 @@ void Spell::update(uint32 difftime)
// check if the player caster has moved before the spell finished // check if the player caster has moved before the spell finished
if ((m_caster->GetTypeId() == TYPEID_PLAYER && m_timer != 0) && if ((m_caster->GetTypeId() == TYPEID_PLAYER && m_timer != 0) &&
(m_castPositionX != m_caster->GetPositionX() || m_castPositionY != m_caster->GetPositionY() || m_castPositionZ != m_caster->GetPositionZ()) && m_caster->isMoving() && (m_spellInfo->InterruptFlags & SPELL_INTERRUPT_FLAG_MOVEMENT) &&
(m_spellInfo->Effect[0] != SPELL_EFFECT_STUCK || !m_caster->HasUnitMovementFlag(MOVEMENTFLAG_FALLING))) (m_spellInfo->Effect[0] != SPELL_EFFECT_STUCK || !m_caster->HasUnitMovementFlag(MOVEMENTFLAG_FALLING)))
{ {
// always cancel for channeled spells
//if( m_spellState == SPELL_STATE_CASTING )
// cancel();
// don't cancel for melee, autorepeat, triggered and instant spells // don't cancel for melee, autorepeat, triggered and instant spells
//else if(!IsNextMeleeSwingSpell() && !IsAutoRepeat() && !m_IsTriggeredSpell)
if(!IsNextMeleeSwingSpell() && !IsAutoRepeat() && !m_IsTriggeredSpell && (m_spellInfo->InterruptFlags & SPELL_INTERRUPT_FLAG_MOVEMENT))
cancel(); cancel();
} }
@@ -2951,17 +2943,6 @@ void Spell::update(uint32 difftime)
{ {
if(m_timer > 0) if(m_timer > 0)
{ {
if( m_caster->GetTypeId() == TYPEID_PLAYER )
{
// check if player has jumped before the channeling finished
if(m_caster->HasUnitMovementFlag(MOVEMENTFLAG_JUMPING))
cancel();
// check for incapacitating player states
//if( m_caster->hasUnitState(UNIT_STAT_STUNNED | UNIT_STAT_CONFUSED))
// cancel();
}
// check if there are alive targets left // check if there are alive targets left
if (!UpdateChanneledTargetList()) if (!UpdateChanneledTargetList())
{ {
+3 -14
View File
@@ -5668,26 +5668,15 @@ void AuraEffect::HandleAuraAllowFlight(bool apply, bool Real, bool /*changeAmoun
if(!Real) if(!Real)
return; return;
if(m_target->GetTypeId() == TYPEID_UNIT)
m_target->SetFlying(apply);
// allow fly // allow fly
WorldPacket data; WorldPacket data;
if(apply) if(apply)
{
data.Initialize(SMSG_MOVE_SET_CAN_FLY, 12); data.Initialize(SMSG_MOVE_SET_CAN_FLY, 12);
if(m_target->GetTypeId() == TYPEID_UNIT)
{
m_target->SetByteFlag(UNIT_FIELD_BYTES_1, 3, 0x02);
m_target->AddUnitMovementFlag(MOVEMENTFLAG_FLYING2);
}
}
else else
{
data.Initialize(SMSG_MOVE_UNSET_CAN_FLY, 12); data.Initialize(SMSG_MOVE_UNSET_CAN_FLY, 12);
if(m_target->GetTypeId() == TYPEID_UNIT)
{
m_target->RemoveByteFlag(UNIT_FIELD_BYTES_1, 3, 0x02);
m_target->RemoveUnitMovementFlag(MOVEMENTFLAG_FLYING2);
}
}
data.append(m_target->GetPackGUID()); data.append(m_target->GetPackGUID());
data << uint32(0); // unk data << uint32(0); // unk
m_target->SendMessageToSet(&data, true); m_target->SendMessageToSet(&data, true);
+3 -3
View File
@@ -132,7 +132,7 @@ TargetedMovementGenerator<T>::_setTargetLocation(T &owner)
i_destinationHolder.SetDestination(traveller, x, y, z); i_destinationHolder.SetDestination(traveller, x, y, z);
owner.addUnitState(UNIT_STAT_CHASE); owner.addUnitState(UNIT_STAT_CHASE);
if (owner.GetTypeId() == TYPEID_UNIT && ((Creature*)&owner)->canFly()) if (owner.GetTypeId() == TYPEID_UNIT && ((Creature*)&owner)->canFly())
owner.AddUnitMovementFlag(MOVEMENTFLAG_FLYING2); owner.AddUnitMovementFlag(MOVEMENTFLAG_FLYING);
i_destinationHolder.StartTravel(traveller); i_destinationHolder.StartTravel(traveller);
return true; return true;
} }
@@ -147,7 +147,7 @@ TargetedMovementGenerator<T>::Initialize(T &owner)
owner.RemoveUnitMovementFlag(MOVEMENTFLAG_WALK_MODE); owner.RemoveUnitMovementFlag(MOVEMENTFLAG_WALK_MODE);
if (owner.GetTypeId() == TYPEID_UNIT && ((Creature*)&owner)->canFly()) if (owner.GetTypeId() == TYPEID_UNIT && ((Creature*)&owner)->canFly())
owner.AddUnitMovementFlag(MOVEMENTFLAG_FLYING2); owner.AddUnitMovementFlag(MOVEMENTFLAG_FLYING);
_setTargetLocation(owner); _setTargetLocation(owner);
} }
@@ -199,7 +199,7 @@ TargetedMovementGenerator<T>::Update(T &owner, const uint32 & time_diff)
{ {
owner.addUnitState(UNIT_STAT_CHASE); owner.addUnitState(UNIT_STAT_CHASE);
if (owner.GetTypeId() == TYPEID_UNIT && ((Creature*)&owner)->canFly()) if (owner.GetTypeId() == TYPEID_UNIT && ((Creature*)&owner)->canFly())
owner.AddUnitMovementFlag(MOVEMENTFLAG_FLYING2); owner.AddUnitMovementFlag(MOVEMENTFLAG_FLYING);
i_destinationHolder.StartTravel(traveller); i_destinationHolder.StartTravel(traveller);
return true; return true;
+2 -2
View File
@@ -79,7 +79,7 @@ inline float Traveller<Creature>::Speed()
return i_traveller.m_TempSpeed; return i_traveller.m_TempSpeed;
else if(i_traveller.HasUnitMovementFlag(MOVEMENTFLAG_WALK_MODE)) else if(i_traveller.HasUnitMovementFlag(MOVEMENTFLAG_WALK_MODE))
return i_traveller.GetSpeed(MOVE_WALK); return i_traveller.GetSpeed(MOVE_WALK);
else if(i_traveller.HasUnitMovementFlag(MOVEMENTFLAG_FLYING2)) else if(i_traveller.HasUnitMovementFlag(MOVEMENTFLAG_FLYING))
return i_traveller.GetSpeed(MOVE_FLIGHT); return i_traveller.GetSpeed(MOVE_FLIGHT);
else else
return i_traveller.GetSpeed(MOVE_RUN); return i_traveller.GetSpeed(MOVE_RUN);
@@ -98,7 +98,7 @@ inline float Traveller<Creature>::GetMoveDestinationTo(float x, float y, float z
float dy = y - GetPositionY(); float dy = y - GetPositionY();
float dz = z - GetPositionZ(); float dz = z - GetPositionZ();
if(i_traveller.HasUnitMovementFlag(MOVEMENTFLAG_FLYING2)) if(i_traveller.HasUnitMovementFlag(MOVEMENTFLAG_FLYING))
return sqrt((dx*dx) + (dy*dy) + (dz*dz)); return sqrt((dx*dx) + (dy*dy) + (dz*dz));
else //Walking on the ground else //Walking on the ground
return sqrt((dx*dx) + (dy*dy)); return sqrt((dx*dx) + (dy*dy));
+40 -14
View File
@@ -13777,13 +13777,13 @@ void Unit::SetStunned(bool apply)
SetUInt64Value(UNIT_FIELD_TARGET, 0); SetUInt64Value(UNIT_FIELD_TARGET, 0);
SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED); SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED);
CastStop(); CastStop();
AddUnitMovementFlag(MOVEMENTFLAG_ROOT);
// Creature specific // Creature specific
if(GetTypeId() != TYPEID_PLAYER) if(GetTypeId() != TYPEID_PLAYER)
((Creature*)this)->StopMoving(); ((Creature*)this)->StopMoving();
else else
SetStandState(UNIT_STAND_STATE_STAND); SetStandState(UNIT_STAND_STATE_STAND);
// SetUnitMovementFlags(0); //Clear movement flags
WorldPacket data(SMSG_FORCE_MOVE_ROOT, 8); WorldPacket data(SMSG_FORCE_MOVE_ROOT, 8);
data.append(GetPackGUID()); data.append(GetPackGUID());
@@ -13806,21 +13806,20 @@ void Unit::SetStunned(bool apply)
data.append(GetPackGUID()); data.append(GetPackGUID());
data << uint32(0); data << uint32(0);
SendMessageToSet(&data,true); SendMessageToSet(&data,true);
RemoveUnitMovementFlag(MOVEMENTFLAG_ROOT);
} }
} }
} }
void Unit::SetRooted(bool apply) void Unit::SetRooted(bool apply)
{ {
uint32 apply_stat = UNIT_STAT_ROOT;
if(apply) if(apply)
{ {
//SetFlag(UNIT_FIELD_FLAGS,(apply_stat<<16)); // probably wrong AddUnitMovementFlag(MOVEMENTFLAG_ROOT);
if(GetTypeId() == TYPEID_PLAYER) if(GetTypeId() == TYPEID_PLAYER)
{ {
//SetUnitMovementFlags(0);
WorldPacket data(SMSG_FORCE_MOVE_ROOT, 10); WorldPacket data(SMSG_FORCE_MOVE_ROOT, 10);
data.append(GetPackGUID()); data.append(GetPackGUID());
data << (uint32)2; data << (uint32)2;
@@ -13831,8 +13830,6 @@ void Unit::SetRooted(bool apply)
} }
else else
{ {
//RemoveFlag(UNIT_FIELD_FLAGS,(apply_stat<<16)); // probably wrong
if(!hasUnitState(UNIT_STAT_STUNNED)) // prevent allow move if have also stun effect if(!hasUnitState(UNIT_STAT_STUNNED)) // prevent allow move if have also stun effect
{ {
if(GetTypeId() == TYPEID_PLAYER) if(GetTypeId() == TYPEID_PLAYER)
@@ -13842,6 +13839,8 @@ void Unit::SetRooted(bool apply)
data << (uint32)2; data << (uint32)2;
SendMessageToSet(&data,true); SendMessageToSet(&data,true);
} }
RemoveUnitMovementFlag(MOVEMENTFLAG_ROOT);
} }
} }
} }
@@ -13850,6 +13849,8 @@ void Unit::SetFeared(bool apply)
{ {
if(apply) if(apply)
{ {
SetUInt64Value(UNIT_FIELD_TARGET, 0);
Unit *caster = NULL; Unit *caster = NULL;
Unit::AuraEffectList const& fearAuras = GetAurasByType(SPELL_AURA_MOD_FEAR); Unit::AuraEffectList const& fearAuras = GetAurasByType(SPELL_AURA_MOD_FEAR);
if(!fearAuras.empty()) if(!fearAuras.empty())
@@ -13860,8 +13861,13 @@ void Unit::SetFeared(bool apply)
} }
else else
{ {
if(isAlive() && GetMotionMaster()->GetCurrentMovementGeneratorType() == FLEEING_MOTION_TYPE) if(isAlive())
GetMotionMaster()->MovementExpired(); {
if(GetMotionMaster()->GetCurrentMovementGeneratorType() == FLEEING_MOTION_TYPE)
GetMotionMaster()->MovementExpired();
if(getVictim())
SetUInt64Value(UNIT_FIELD_TARGET, getVictim()->GetGUID());
}
} }
if (GetTypeId() == TYPEID_PLAYER) if (GetTypeId() == TYPEID_PLAYER)
@@ -13872,12 +13878,18 @@ void Unit::SetConfused(bool apply)
{ {
if(apply) if(apply)
{ {
SetUInt64Value(UNIT_FIELD_TARGET, 0);
GetMotionMaster()->MoveConfused(); GetMotionMaster()->MoveConfused();
} }
else else
{ {
if(isAlive() && GetMotionMaster()->GetCurrentMovementGeneratorType() == CONFUSED_MOTION_TYPE) if(isAlive())
GetMotionMaster()->MovementExpired(); {
if(GetMotionMaster()->GetCurrentMovementGeneratorType() == CONFUSED_MOTION_TYPE)
GetMotionMaster()->MovementExpired();
if(getVictim())
SetUInt64Value(UNIT_FIELD_TARGET, getVictim()->GetGUID());
}
} }
if(GetTypeId() == TYPEID_PLAYER) if(GetTypeId() == TYPEID_PLAYER)
@@ -14568,7 +14580,7 @@ void Unit::ExitVehicle()
clearUnitState(UNIT_STAT_ONVEHICLE); clearUnitState(UNIT_STAT_ONVEHICLE);
SetControlled(false, UNIT_STAT_ROOT); SetControlled(false, UNIT_STAT_ROOT);
RemoveUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT + MOVEMENTFLAG_FLY_UNK1); RemoveUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT);
m_movementInfo.t_x = 0; m_movementInfo.t_x = 0;
m_movementInfo.t_y = 0; m_movementInfo.t_y = 0;
m_movementInfo.t_z = 0; m_movementInfo.t_z = 0;
@@ -14638,7 +14650,7 @@ void Unit::BuildMovementPacket(ByteBuffer *data) const
} }
// 0x02200000 // 0x02200000
if((GetUnitMovementFlags() & (MOVEMENTFLAG_SWIMMING | MOVEMENTFLAG_FLYING2)) if((GetUnitMovementFlags() & (MOVEMENTFLAG_SWIMMING | MOVEMENTFLAG_FLYING))
|| (m_movementInfo.unk1 & 0x20)) || (m_movementInfo.unk1 & 0x20))
*data << (float)m_movementInfo.s_pitch; *data << (float)m_movementInfo.s_pitch;
@@ -14669,7 +14681,7 @@ void Unit::OutMovementInfo() const
sLog.outString("MovementInfo for %u: Flag %u, Unk1 %u, Time %u, Pos %f %f %f %f, Fall %u", GetEntry(), m_movementInfo.flags, (uint32)m_movementInfo.unk1, m_movementInfo.time, GetPositionX(), GetPositionY(), GetPositionZ(), GetOrientation(), m_movementInfo.fallTime); sLog.outString("MovementInfo for %u: Flag %u, Unk1 %u, Time %u, Pos %f %f %f %f, Fall %u", GetEntry(), m_movementInfo.flags, (uint32)m_movementInfo.unk1, m_movementInfo.time, GetPositionX(), GetPositionY(), GetPositionZ(), GetOrientation(), m_movementInfo.fallTime);
if(m_movementInfo.flags & MOVEMENTFLAG_ONTRANSPORT) if(m_movementInfo.flags & MOVEMENTFLAG_ONTRANSPORT)
sLog.outString("Transport: GUID " UI64FMTD ", Pos %f %f %f %f, Time %u, Seat %d", m_movementInfo.t_guid, m_movementInfo.t_x, m_movementInfo.t_y, m_movementInfo.t_z, m_movementInfo.t_o, m_movementInfo.t_time, (int32)m_movementInfo.t_seat); sLog.outString("Transport: GUID " UI64FMTD ", Pos %f %f %f %f, Time %u, Seat %d", m_movementInfo.t_guid, m_movementInfo.t_x, m_movementInfo.t_y, m_movementInfo.t_z, m_movementInfo.t_o, m_movementInfo.t_time, (int32)m_movementInfo.t_seat);
if((m_movementInfo.flags & (MOVEMENTFLAG_SWIMMING | MOVEMENTFLAG_FLYING2)) || (m_movementInfo.unk1 & 0x20)) if((m_movementInfo.flags & (MOVEMENTFLAG_SWIMMING | MOVEMENTFLAG_FLYING)) || (m_movementInfo.unk1 & 0x20))
sLog.outString("Pitch: %f", m_movementInfo.s_pitch); sLog.outString("Pitch: %f", m_movementInfo.s_pitch);
if(m_movementInfo.flags & MOVEMENTFLAG_JUMPING) if(m_movementInfo.flags & MOVEMENTFLAG_JUMPING)
sLog.outString("Jump: speedz %f, sin %f, cos %f, speedxy %f", m_movementInfo.j_zspeed, m_movementInfo.j_sinAngle, m_movementInfo.j_cosAngle, m_movementInfo.j_xyspeed); sLog.outString("Jump: speedz %f, sin %f, cos %f, speedxy %f", m_movementInfo.j_zspeed, m_movementInfo.j_sinAngle, m_movementInfo.j_cosAngle, m_movementInfo.j_xyspeed);
@@ -14677,6 +14689,20 @@ void Unit::OutMovementInfo() const
sLog.outString("Spline: %f", m_movementInfo.u_unk1); sLog.outString("Spline: %f", m_movementInfo.u_unk1);
} }
void Unit::SetFlying(bool apply)
{
if(apply)
{
SetByteFlag(UNIT_FIELD_BYTES_1, 3, 0x02);
AddUnitMovementFlag(MOVEMENTFLAG_FLYING);
}
else
{
RemoveByteFlag(UNIT_FIELD_BYTES_1, 3, 0x02);
RemoveUnitMovementFlag(MOVEMENTFLAG_FLYING);
}
}
void Unit::NearTeleportTo( float x, float y, float z, float orientation, bool casting /*= false*/ ) void Unit::NearTeleportTo( float x, float y, float z, float orientation, bool casting /*= false*/ )
{ {
if(GetTypeId() == TYPEID_PLAYER) if(GetTypeId() == TYPEID_PLAYER)
+20 -6
View File
@@ -642,21 +642,29 @@ enum MovementFlags
MOVEMENTFLAG_WALK_MODE = 0x00000100, // Walking MOVEMENTFLAG_WALK_MODE = 0x00000100, // Walking
MOVEMENTFLAG_ONTRANSPORT = 0x00000200, // Used for flying on some creatures MOVEMENTFLAG_ONTRANSPORT = 0x00000200, // Used for flying on some creatures
MOVEMENTFLAG_LEVITATING = 0x00000400, MOVEMENTFLAG_LEVITATING = 0x00000400,
MOVEMENTFLAG_FLY_UNK1 = 0x00000800, MOVEMENTFLAG_ROOT = 0x00000800,
MOVEMENTFLAG_JUMPING = 0x00001000, MOVEMENTFLAG_JUMPING = 0x00001000,
MOVEMENTFLAG_UNK4 = 0x00002000, MOVEMENTFLAG_FALL_DAMAGE = 0x00002000, // newZ < oldZ
MOVEMENTFLAG_FALLING = 0x00004000, MOVEMENTFLAG_FALLING = 0x00004000,
// 0x8000, 0x10000, 0x20000, 0x40000, 0x80000, 0x100000 // 0x8000, 0x10000, 0x20000, 0x40000, 0x80000, 0x100000
MOVEMENTFLAG_SWIMMING = 0x00200000, // appears with fly flag also MOVEMENTFLAG_SWIMMING = 0x00200000, // appears with fly flag also
MOVEMENTFLAG_FLY_UP = 0x00400000, // press "space" when flying MOVEMENTFLAG_ASCEND = 0x00400000, // press "space" when flying
MOVEMENTFLAG_CAN_FLY = 0x00800000, MOVEMENTFLAG_CAN_FLY = 0x00800000,
MOVEMENTFLAG_FLYING = 0x01000000, // fly land MOVEMENTFLAG_FLY_MODE = 0x01000000, // can fly
MOVEMENTFLAG_FLYING2 = 0x02000000, // fly hover MOVEMENTFLAG_FLYING = 0x02000000, // hover
MOVEMENTFLAG_SPLINE = 0x04000000, // used for flight paths MOVEMENTFLAG_SPLINE = 0x04000000, // used for flight paths
MOVEMENTFLAG_SPLINE2 = 0x08000000, // used for flight paths MOVEMENTFLAG_SPLINE2 = 0x08000000, // used for flight paths
MOVEMENTFLAG_WATERWALKING = 0x10000000, // prevent unit from falling through water MOVEMENTFLAG_WATERWALKING = 0x10000000, // prevent unit from falling through water
MOVEMENTFLAG_SAFE_FALL = 0x20000000, // active rogue safe fall spell (passive) MOVEMENTFLAG_SAFE_FALL = 0x20000000, // active rogue safe fall spell (passive)
MOVEMENTFLAG_UNK3 = 0x40000000 MOVEMENTFLAG_HOVER = 0x40000000, // hover, cannot jump
MOVEMENTFLAG_MOVING =
MOVEMENTFLAG_FORWARD |MOVEMENTFLAG_BACKWARD |MOVEMENTFLAG_STRAFE_LEFT|MOVEMENTFLAG_STRAFE_RIGHT|
MOVEMENTFLAG_PITCH_UP|MOVEMENTFLAG_PITCH_DOWN|MOVEMENTFLAG_FALL_DAMAGE|
MOVEMENTFLAG_JUMPING |MOVEMENTFLAG_FALLING |MOVEMENTFLAG_ASCEND |
MOVEMENTFLAG_SPLINE,
MOVEMENTFLAG_TURNING =
MOVEMENTFLAG_LEFT | MOVEMENTFLAG_RIGHT,
}; };
/* /*
@@ -1767,6 +1775,12 @@ class TRINITY_DLL_SPEC Unit : public WorldObject
void SetTransport(Transport * t) { m_transport = t; } void SetTransport(Transport * t) { m_transport = t; }
void BuildMovementPacket(ByteBuffer *data) const; void BuildMovementPacket(ByteBuffer *data) const;
bool isMoving() const { return m_movementInfo.HasMovementFlag(MOVEMENTFLAG_MOVING); }
bool isTurning() const { return m_movementInfo.HasMovementFlag(MOVEMENTFLAG_TURNING); }
bool canFly() const { return m_movementInfo.HasMovementFlag(MOVEMENTFLAG_FLY_MODE); }
bool IsFlying() const { return m_movementInfo.HasMovementFlag(MOVEMENTFLAG_FLYING); }
void SetFlying(bool apply);
protected: protected:
explicit Unit (); explicit Unit ();
+1 -1
View File
@@ -284,7 +284,7 @@ bool Vehicle::AddPassenger(Unit *unit, int8 seatId)
//SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNK_24); //SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNK_24);
unit->AddUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT + MOVEMENTFLAG_FLY_UNK1); unit->AddUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT);
VehicleSeatEntry const *veSeat = seat->second.seatInfo; VehicleSeatEntry const *veSeat = seat->second.seatInfo;
unit->m_movementInfo.t_x = veSeat->m_attachmentOffsetX; unit->m_movementInfo.t_x = veSeat->m_attachmentOffsetX;
unit->m_movementInfo.t_y = veSeat->m_attachmentOffsetY; unit->m_movementInfo.t_y = veSeat->m_attachmentOffsetY;
+1 -1
View File
@@ -86,7 +86,7 @@ void WaypointMovementGenerator<Creature>::InitTraveller(Creature &unit, const Wa
unit.SetUInt32Value(UNIT_FIELD_BYTES_1, 0); unit.SetUInt32Value(UNIT_FIELD_BYTES_1, 0);
if(unit.canFly()) if(unit.canFly())
unit.AddUnitMovementFlag(MOVEMENTFLAG_FLYING2); unit.AddUnitMovementFlag(MOVEMENTFLAG_FLYING);
unit.addUnitState(UNIT_STAT_ROAMING); unit.addUnitState(UNIT_STAT_ROAMING);
} }
+1 -1
View File
@@ -654,7 +654,7 @@ void WorldSession::ReadMovementInfo(WorldPacket &data, MovementInfo *mi)
data >> mi->t_seat; data >> mi->t_seat;
} }
if((mi->flags & (MOVEMENTFLAG_SWIMMING | MOVEMENTFLAG_FLYING2)) || (mi->unk1 & 0x20)) if((mi->flags & (MOVEMENTFLAG_SWIMMING | MOVEMENTFLAG_FLYING)) || (mi->unk1 & 0x20))
{ {
CHECK_PACKET_SIZE(data, data.rpos()+4); CHECK_PACKET_SIZE(data, data.rpos()+4);
data >> mi->s_pitch; data >> mi->s_pitch;