Updated to 3.1.2.9855 client build, fixed quests, some work on monster movement. Not tested.

This commit is contained in:
tomrus88 2009-05-02 19:38:14 +04:00
parent 21a38a42d8
commit b980e9ac59
22 changed files with 114 additions and 92 deletions

View file

@ -1484,7 +1484,7 @@ void Creature::setDeathState(DeathState s)
CreatureInfo const *cinfo = GetCreatureInfo(); CreatureInfo const *cinfo = GetCreatureInfo();
SetUInt32Value(UNIT_DYNAMIC_FLAGS, 0); SetUInt32Value(UNIT_DYNAMIC_FLAGS, 0);
RemoveFlag (UNIT_FIELD_FLAGS, UNIT_FLAG_SKINNABLE); RemoveFlag (UNIT_FIELD_FLAGS, UNIT_FLAG_SKINNABLE);
AddUnitMovementFlag(MOVEMENTFLAG_WALK_MODE); AddUnitMovementFlag(MONSTER_MOVE_FLAG_WALK);
SetUInt32Value(UNIT_NPC_FLAGS, cinfo->npcflag); SetUInt32Value(UNIT_NPC_FLAGS, cinfo->npcflag);
clearUnitState(UNIT_STAT_ALL_STATE); clearUnitState(UNIT_STAT_ALL_STATE);
i_motionMaster.Clear(); i_motionMaster.Clear();

View file

@ -150,7 +150,7 @@ void PlayerMenu::SendGossipMenu( uint32 TitleTextId, uint64 npcGUID )
Quest const* pQuest = objmgr.GetQuestTemplate(questID); Quest const* pQuest = objmgr.GetQuestTemplate(questID);
data << uint32(questID); data << uint32(questID);
data << uint32( qItem.m_qIcon ); data << uint32(qItem.m_qIcon);
data << uint32(pSession->GetPlayer()->GetQuestLevel(pQuest)); data << uint32(pSession->GetPlayer()->GetQuestLevel(pQuest));
std::string Title = pQuest->GetTitle(); std::string Title = pQuest->GetTitle();

View file

@ -41,10 +41,10 @@ class Player;
#define MIN_GRID_DELAY (MINUTE*IN_MILISECONDS) #define MIN_GRID_DELAY (MINUTE*IN_MILISECONDS)
#define MIN_MAP_UPDATE_DELAY 50 #define MIN_MAP_UPDATE_DELAY 50
#define MAX_NUMBER_OF_CELLS 8 #define MAX_NUMBER_OF_CELLS 4
#define SIZE_OF_GRID_CELL (SIZE_OF_GRIDS/MAX_NUMBER_OF_CELLS) #define SIZE_OF_GRID_CELL (SIZE_OF_GRIDS/MAX_NUMBER_OF_CELLS)
#define CENTER_GRID_CELL_ID 256 #define CENTER_GRID_CELL_ID 128
#define CENTER_GRID_CELL_OFFSET (SIZE_OF_GRID_CELL/2) #define CENTER_GRID_CELL_OFFSET (SIZE_OF_GRID_CELL/2)
#define TOTAL_NUMBER_OF_CELLS_PER_MAP (MAX_NUMBER_OF_GRIDS*MAX_NUMBER_OF_CELLS) #define TOTAL_NUMBER_OF_CELLS_PER_MAP (MAX_NUMBER_OF_GRIDS*MAX_NUMBER_OF_CELLS)

View file

@ -27,7 +27,7 @@
void void
HomeMovementGenerator<Creature>::Initialize(Creature & owner) HomeMovementGenerator<Creature>::Initialize(Creature & owner)
{ {
owner.RemoveUnitMovementFlag(MOVEMENTFLAG_WALK_MODE); owner.RemoveUnitMovementFlag(MONSTER_MOVE_FLAG_WALK);
_setTargetLocation(owner); _setTargetLocation(owner);
} }
@ -63,7 +63,7 @@ HomeMovementGenerator<Creature>::Update(Creature &owner, const uint32& time_diff
if (time_diff > i_travel_timer) if (time_diff > i_travel_timer)
{ {
owner.AddUnitMovementFlag(MOVEMENTFLAG_WALK_MODE); owner.AddUnitMovementFlag(MONSTER_MOVE_FLAG_WALK);
// restore orientation of not moving creature at returning to home // restore orientation of not moving creature at returning to home
if(owner.GetDefaultMovementType()==IDLE_MOTION_TYPE) if(owner.GetDefaultMovementType()==IDLE_MOTION_TYPE)

View file

@ -276,7 +276,7 @@ void WorldSession::HandleLogoutRequestOpcode( WorldPacket & /*recv_data*/ )
if( GetPlayer()->isInCombat() || //...is in combat if( GetPlayer()->isInCombat() || //...is in combat
GetPlayer()->duel || //...is in Duel GetPlayer()->duel || //...is in Duel
//...is jumping ...is falling //...is jumping ...is falling
GetPlayer()->HasUnitMovementFlag(MOVEMENTFLAG_JUMPING | MOVEMENTFLAG_FALLING)) GetPlayer()->m_movementInfo.HasMovementFlag(MOVEMENTFLAG_JUMPING | MOVEMENTFLAG_FALLING))
{ {
WorldPacket data( SMSG_LOGOUT_RESPONSE, (2+4) ) ; WorldPacket data( SMSG_LOGOUT_RESPONSE, (2+4) ) ;
data << (uint8)0xC; data << (uint8)0xC;
@ -1543,17 +1543,7 @@ void WorldSession::HandleMoveFlyModeChangeAckOpcode( WorldPacket & recv_data )
recv_data >> guid >> unk >> flags; recv_data >> guid >> unk >> flags;
_player->SetUnitMovementFlags(flags); _player->m_movementInfo.flags = flags;
/*
on:
25 00 00 00 00 00 00 00 | 00 00 00 00 00 00 80 00
85 4E A9 01 19 BA 7A C3 | 42 0D 70 44 44 B0 A8 42
78 15 94 40 39 03 00 00 | 00 00 80 3F
off:
25 00 00 00 00 00 00 00 | 00 00 00 00 00 00 00 00
10 FD A9 01 19 BA 7A C3 | 42 0D 70 44 44 B0 A8 42
78 15 94 40 39 03 00 00 | 00 00 00 00
*/
} }
void WorldSession::HandleRequestPetInfoOpcode( WorldPacket & /*recv_data */) void WorldSession::HandleRequestPetInfoOpcode( WorldPacket & /*recv_data */)

View file

@ -295,7 +295,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->m_movementInfo = movementInfo; plMover->m_movementInfo = movementInfo;
plMover->SetUnitMovementFlags(movementInfo.flags);
plMover->UpdateFallInformationIfNeed(movementInfo,recv_data.GetOpcode()); plMover->UpdateFallInformationIfNeed(movementInfo,recv_data.GetOpcode());
if(plMover->isMovingOrTurning()) if(plMover->isMovingOrTurning())
@ -336,7 +335,7 @@ void WorldSession::HandleMovementOpcodes( WorldPacket & recv_data )
{ {
if(Map *map = mover->GetMap()) if(Map *map = mover->GetMap())
map->CreatureRelocation((Creature*)mover, movementInfo.x, movementInfo.y, movementInfo.z, movementInfo.o); map->CreatureRelocation((Creature*)mover, movementInfo.x, movementInfo.y, movementInfo.z, movementInfo.o);
mover->SetUnitMovementFlags(movementInfo.flags); //mover->SetUnitMovementFlags(movementInfo.flags);
} }
} }

View file

@ -273,12 +273,12 @@ void Object::_BuildMovementUpdate(ByteBuffer * data, uint16 flags, uint32 flags2
{ {
case TYPEID_UNIT: case TYPEID_UNIT:
{ {
flags2 = ((Unit*)this)->GetUnitMovementFlags(); flags2 = ((Unit*)this)->isInFlight() ? (MOVEMENTFLAG_FORWARD | MOVEMENTFLAG_LEVITATING) : MOVEMENTFLAG_NONE;
} }
break; break;
case TYPEID_PLAYER: case TYPEID_PLAYER:
{ {
flags2 = ((Player*)this)->GetUnitMovementFlags(); flags2 = ((Player*)this)->m_movementInfo.GetMovementFlags();
if(((Player*)this)->GetTransport()) if(((Player*)this)->GetTransport())
flags2 |= MOVEMENTFLAG_ONTRANSPORT; flags2 |= MOVEMENTFLAG_ONTRANSPORT;
@ -394,25 +394,27 @@ void Object::_BuildMovementUpdate(ByteBuffer * data, uint16 flags, uint32 flags2
FlightPathMovementGenerator *fmg = (FlightPathMovementGenerator*)(((Player*)this)->GetMotionMaster()->top()); FlightPathMovementGenerator *fmg = (FlightPathMovementGenerator*)(((Player*)this)->GetMotionMaster()->top());
uint16 flags3 = 0x0000; uint32 flags3 = MONSTER_MOVE_FLAG_SPLINE_FLY;
*data << uint16(flags3); // splines flag? *data << uint32(flags3); // splines flag?
if(flags3 & 0x80) // probably x,y,z coords there if(flags3 & 0x20000) // may be orientation
{ {
*data << (float)0; *data << (float)0;
*data << (float)0;
*data << (float)0;
} }
else
if(flags3 & 0x100) // probably guid there
{ {
*data << uint64(0); if(flags3 & 0x8000) // probably x,y,z coords there
} {
*data << (float)0;
*data << (float)0;
*data << (float)0;
}
if(flags3 & 0x200) // may be orientation if(flags3 & 0x10000) // probably guid there
{ {
*data << (float)0; *data << uint64(0);
}
} }
Path &path = fmg->GetPath(); Path &path = fmg->GetPath();
@ -423,9 +425,6 @@ void Object::_BuildMovementUpdate(ByteBuffer * data, uint16 flags, uint32 flags2
uint32 inflighttime = uint32(path.GetPassedLength(fmg->GetCurrentNode(), x, y, z) * 32); uint32 inflighttime = uint32(path.GetPassedLength(fmg->GetCurrentNode(), x, y, z) * 32);
uint32 traveltime = uint32(path.GetTotalLength() * 32); uint32 traveltime = uint32(path.GetTotalLength() * 32);
*data << uint8(0); // added in 3.1
*data << uint8(0); // added in 3.1
*data << uint32(inflighttime); // passed move time? *data << uint32(inflighttime); // passed move time?
*data << uint32(traveltime); // full move time? *data << uint32(traveltime); // full move time?
*data << uint32(0); // ticks count? *data << uint32(0); // ticks count?

View file

@ -1253,4 +1253,6 @@ OpcodeHandler opcodeTable[NUM_MSG_TYPES] =
/*0x4C8*/ { "SMSG_UNKNOWN_1224", STATUS_NEVER, &WorldSession::Handle_ServerSide }, /*0x4C8*/ { "SMSG_UNKNOWN_1224", STATUS_NEVER, &WorldSession::Handle_ServerSide },
/*0x4C9*/ { "UMSG_UNKNOWN_1225", STATUS_NEVER, &WorldSession::Handle_NULL }, /*0x4C9*/ { "UMSG_UNKNOWN_1225", STATUS_NEVER, &WorldSession::Handle_NULL },
/*0x4CA*/ { "UMSG_UNKNOWN_1226", STATUS_NEVER, &WorldSession::Handle_NULL }, /*0x4CA*/ { "UMSG_UNKNOWN_1226", STATUS_NEVER, &WorldSession::Handle_NULL },
/*0x4CB*/ { "UMSG_UNKNOWN_1227", STATUS_NEVER, &WorldSession::Handle_NULL },
/*0x4CC*/ { "UMSG_UNKNOWN_1228", STATUS_NEVER, &WorldSession::Handle_NULL },
}; };

View file

@ -1261,7 +1261,9 @@ enum Opcodes
SMSG_UNKNOWN_1224 = 0x4C8, // uint32 "Can't change arena team..." SMSG_UNKNOWN_1224 = 0x4C8, // uint32 "Can't change arena team..."
UMSG_UNKNOWN_1225 = 0x4C9, // not found UMSG_UNKNOWN_1225 = 0x4C9, // not found
UMSG_UNKNOWN_1226 = 0x4CA, // not found UMSG_UNKNOWN_1226 = 0x4CA, // not found
NUM_MSG_TYPES = 0x4CB UMSG_UNKNOWN_1227 = 0x4CB, // CMSG, lua: UseEquipmentSet
UMSG_UNKNOWN_1228 = 0x4CC, // SMSG, UseEquipmentSetResult?
NUM_MSG_TYPES = 0x4CD
}; };
/// Player state /// Player state

View file

@ -1598,7 +1598,7 @@ bool Player::TeleportTo(uint32 mapid, float x, float y, float z, float orientati
} }
// reset movement flags at teleport, because player will continue move with these flags after teleport // reset movement flags at teleport, because player will continue move with these flags after teleport
SetUnitMovementFlags(0); m_movementInfo.flags = 0;
if ((GetMapId() == mapid) && (!m_transport)) if ((GetMapId() == mapid) && (!m_transport))
{ {
@ -11803,9 +11803,9 @@ void Player::PrepareQuestMenu( uint64 guid )
uint32 quest_id = i->second; uint32 quest_id = i->second;
QuestStatus status = GetQuestStatus( quest_id ); QuestStatus status = GetQuestStatus( quest_id );
if ( status == QUEST_STATUS_COMPLETE && !GetQuestRewardStatus( quest_id ) ) if ( status == QUEST_STATUS_COMPLETE && !GetQuestRewardStatus( quest_id ) )
qm.AddMenuItem(quest_id, DIALOG_STATUS_REWARD_REP); qm.AddMenuItem(quest_id, DIALOG_STATUS_UNK2);
else if ( status == QUEST_STATUS_INCOMPLETE ) else if ( status == QUEST_STATUS_INCOMPLETE )
qm.AddMenuItem(quest_id, DIALOG_STATUS_INCOMPLETE); qm.AddMenuItem(quest_id, DIALOG_STATUS_UNK2);
else if (status == QUEST_STATUS_AVAILABLE ) else if (status == QUEST_STATUS_AVAILABLE )
qm.AddMenuItem(quest_id, DIALOG_STATUS_CHAT); qm.AddMenuItem(quest_id, DIALOG_STATUS_CHAT);
} }
@ -11819,9 +11819,9 @@ void Player::PrepareQuestMenu( uint64 guid )
QuestStatus status = GetQuestStatus( quest_id ); QuestStatus status = GetQuestStatus( quest_id );
if (pQuest->IsAutoComplete() && CanTakeQuest(pQuest, false)) if (pQuest->IsAutoComplete() && CanTakeQuest(pQuest, false))
qm.AddMenuItem(quest_id, DIALOG_STATUS_REWARD_REP); qm.AddMenuItem(quest_id, DIALOG_STATUS_UNK2);
else if ( status == QUEST_STATUS_NONE && CanTakeQuest( pQuest, false ) ) else if ( status == QUEST_STATUS_NONE && CanTakeQuest( pQuest, false ) )
qm.AddMenuItem(quest_id, DIALOG_STATUS_AVAILABLE); qm.AddMenuItem(quest_id, DIALOG_STATUS_CHAT);
} }
} }
@ -17791,7 +17791,7 @@ void Player::SendInitialPacketsBeforeAddToMap()
// set fly flag if in fly form or taxi flight to prevent visually drop at ground in showup moment // set fly flag if in fly form or taxi flight to prevent visually drop at ground in showup moment
if(HasAuraType(SPELL_AURA_MOD_INCREASE_FLIGHT_SPEED) || isInFlight()) if(HasAuraType(SPELL_AURA_MOD_INCREASE_FLIGHT_SPEED) || isInFlight())
AddUnitMovementFlag(MOVEMENTFLAG_FLYING2); m_movementInfo.flags |= MOVEMENTFLAG_FLYING2;
m_mover = this; m_mover = this;
} }

View file

@ -695,6 +695,10 @@ struct MovementInfo
x = y = z = o = t_x = t_y = t_z = t_o = s_pitch = j_unk = j_sinAngle = j_cosAngle = j_xyspeed = u_unk1 = 0.0f; x = y = z = o = t_x = t_y = t_z = t_o = s_pitch = j_unk = j_sinAngle = j_cosAngle = j_xyspeed = u_unk1 = 0.0f;
t_guid = 0; t_guid = 0;
} }
uint32 GetMovementFlags() { return flags; }
void AddMovementFlag(uint32 flag) { flags |= flag; }
bool HasMovementFlag(uint32 flag) const { return flags & flag; }
}; };
// flags that use in movement check for example at spell casting // flags that use in movement check for example at spell casting
@ -1908,11 +1912,11 @@ class MANGOS_DLL_SPEC Player : public Unit
} }
void HandleFall(MovementInfo const& movementInfo); void HandleFall(MovementInfo const& movementInfo);
bool isMoving() const { return HasUnitMovementFlag(movementFlagsMask); } bool isMoving() const { return m_movementInfo.HasMovementFlag(movementFlagsMask); }
bool isMovingOrTurning() const { return HasUnitMovementFlag(movementOrTurningFlagsMask); } bool isMovingOrTurning() const { return m_movementInfo.HasMovementFlag(movementOrTurningFlagsMask); }
bool CanFly() const { return HasUnitMovementFlag(MOVEMENTFLAG_CAN_FLY); } bool CanFly() const { return m_movementInfo.HasMovementFlag(MOVEMENTFLAG_CAN_FLY); }
bool IsFlying() const { return HasUnitMovementFlag(MOVEMENTFLAG_FLYING); } 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);

View file

@ -110,16 +110,17 @@ void WorldSession::HandleQuestgiverHelloOpcode( WorldPacket & recv_data )
void WorldSession::HandleQuestgiverAcceptQuestOpcode( WorldPacket & recv_data ) void WorldSession::HandleQuestgiverAcceptQuestOpcode( WorldPacket & recv_data )
{ {
CHECK_PACKET_SIZE(recv_data,8+4); CHECK_PACKET_SIZE(recv_data,8+4+4);
uint64 guid; uint64 guid;
uint32 quest; uint32 quest;
recv_data >> guid >> quest; uint32 unk1;
recv_data >> guid >> quest >> unk1;
if(!GetPlayer()->isAlive()) if(!GetPlayer()->isAlive())
return; return;
sLog.outDebug( "WORLD: Received CMSG_QUESTGIVER_ACCEPT_QUEST npc = %u, quest = %u",uint32(GUID_LOPART(guid)),quest ); sLog.outDebug( "WORLD: Received CMSG_QUESTGIVER_ACCEPT_QUEST npc = %u, quest = %u, unk1 = %u",uint32(GUID_LOPART(guid)), quest, unk1 );
Object* pObject = ObjectAccessor::GetObjectByTypeMask(*_player, guid,TYPEMASK_UNIT|TYPEMASK_GAMEOBJECT|TYPEMASK_ITEM|TYPEMASK_PLAYER); Object* pObject = ObjectAccessor::GetObjectByTypeMask(*_player, guid,TYPEMASK_UNIT|TYPEMASK_GAMEOBJECT|TYPEMASK_ITEM|TYPEMASK_PLAYER);
@ -206,12 +207,13 @@ void WorldSession::HandleQuestgiverAcceptQuestOpcode( WorldPacket & recv_data )
void WorldSession::HandleQuestgiverQuestQueryOpcode( WorldPacket & recv_data ) void WorldSession::HandleQuestgiverQuestQueryOpcode( WorldPacket & recv_data )
{ {
CHECK_PACKET_SIZE(recv_data,8+4); CHECK_PACKET_SIZE(recv_data,8+4+1);
uint64 guid; uint64 guid;
uint32 quest; uint32 quest;
recv_data >> guid >> quest; uint8 unk1;
sLog.outDebug( "WORLD: Received CMSG_QUESTGIVER_QUERY_QUEST npc = %u, quest = %u",uint32(GUID_LOPART(guid)),quest ); recv_data >> guid >> quest >> unk1;
sLog.outDebug( "WORLD: Received CMSG_QUESTGIVER_QUERY_QUEST npc = %u, quest = %u, unk1 = %u",uint32(GUID_LOPART(guid)), quest, unk1 );
// Verify that the guid is valid and is a questgiver or involved in the requested quest // Verify that the guid is valid and is a questgiver or involved in the requested quest
Object* pObject = ObjectAccessor::GetObjectByTypeMask(*_player, guid,TYPEMASK_UNIT|TYPEMASK_GAMEOBJECT|TYPEMASK_ITEM); Object* pObject = ObjectAccessor::GetObjectByTypeMask(*_player, guid,TYPEMASK_UNIT|TYPEMASK_GAMEOBJECT|TYPEMASK_ITEM);
@ -407,7 +409,12 @@ void WorldSession::HandleQuestComplete(WorldPacket& recv_data)
_player->PlayerTalkClass->SendQuestGiverRequestItems(pQuest, guid, _player->CanRewardQuest(pQuest,false), false); _player->PlayerTalkClass->SendQuestGiverRequestItems(pQuest, guid, _player->CanRewardQuest(pQuest,false), false);
} }
else else
_player->PlayerTalkClass->SendQuestGiverRequestItems(pQuest, guid, _player->CanRewardQuest(pQuest,false), false); {
if(pQuest->GetReqItemsCount()) // some items required
_player->PlayerTalkClass->SendQuestGiverRequestItems(pQuest, guid, _player->CanRewardQuest(pQuest,false), false);
else // no items required
_player->PlayerTalkClass->SendQuestGiverOfferReward(pQuest, guid, true);
}
} }
} }

View file

@ -91,13 +91,13 @@ 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(MONSTER_MOVE_FLAG_TEST_FLY);
} }
//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
{ {
i_nextMoveTime.Reset(urand(500+i_destinationHolder.GetTotalTravelTime(),5000+i_destinationHolder.GetTotalTravelTime())); i_nextMoveTime.Reset(urand(500+i_destinationHolder.GetTotalTravelTime(),5000+i_destinationHolder.GetTotalTravelTime()));
creature.SetUnitMovementFlags(MOVEMENTFLAG_WALK_MODE); creature.SetUnitMovementFlags(MONSTER_MOVE_FLAG_WALK);
} }
} }
@ -109,9 +109,9 @@ RandomMovementGenerator<Creature>::Initialize(Creature &creature)
return; return;
if (creature.canFly()) if (creature.canFly())
creature.AddUnitMovementFlag(MOVEMENTFLAG_FLYING2); creature.AddUnitMovementFlag(MONSTER_MOVE_FLAG_TEST_FLY);
else else
creature.SetUnitMovementFlags(irand(0,RUNNING_CHANCE_RANDOMMV) > 0 ? MOVEMENTFLAG_WALK_MODE : MOVEMENTFLAG_NONE ); creature.SetUnitMovementFlags(irand(0,RUNNING_CHANCE_RANDOMMV) > 0 ? MONSTER_MOVE_FLAG_WALK : MONSTER_MOVE_FLAG_RUN);
_setRandomLocation(creature); _setRandomLocation(creature);
} }
@ -148,14 +148,14 @@ 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(MONSTER_MOVE_FLAG_TEST_FLY);
else else
creature.SetUnitMovementFlags(irand(0,RUNNING_CHANCE_RANDOMMV) > 0 ? MOVEMENTFLAG_WALK_MODE : MOVEMENTFLAG_NONE); creature.SetUnitMovementFlags(irand(0,RUNNING_CHANCE_RANDOMMV) > 0 ? MONSTER_MOVE_FLAG_WALK : MONSTER_MOVE_FLAG_RUN);
_setRandomLocation(creature); _setRandomLocation(creature);
} }
else if(creature.isPet() && creature.GetOwner() && creature.GetDistance(creature.GetOwner()) > PET_FOLLOW_DIST+2.5f) else if(creature.isPet() && creature.GetOwner() && creature.GetDistance(creature.GetOwner()) > PET_FOLLOW_DIST+2.5f)
{ {
creature.SetUnitMovementFlags(MOVEMENTFLAG_NONE); creature.SetUnitMovementFlags(MONSTER_MOVE_FLAG_WALK);
_setRandomLocation(creature); _setRandomLocation(creature);
} }
} }

View file

@ -3671,7 +3671,7 @@ SpellCastResult Spell::CheckCast(bool strict)
if( m_caster->GetTypeId()==TYPEID_PLAYER && ((Player*)m_caster)->isMoving() ) if( m_caster->GetTypeId()==TYPEID_PLAYER && ((Player*)m_caster)->isMoving() )
{ {
// skip stuck spell to allow use it in falling case and apply spell limitations at movement // skip stuck spell to allow use it in falling case and apply spell limitations at movement
if( (!m_caster->HasUnitMovementFlag(MOVEMENTFLAG_FALLING) || m_spellInfo->Effect[0] != SPELL_EFFECT_STUCK) && if( (!((Player*)m_caster)->m_movementInfo.HasMovementFlag(MOVEMENTFLAG_FALLING) || m_spellInfo->Effect[0] != SPELL_EFFECT_STUCK) &&
(IsAutoRepeat() || (m_spellInfo->AuraInterruptFlags & AURA_INTERRUPT_FLAG_NOT_SEATED) != 0) ) (IsAutoRepeat() || (m_spellInfo->AuraInterruptFlags & AURA_INTERRUPT_FLAG_NOT_SEATED) != 0) )
return SPELL_FAILED_MOVING; return SPELL_FAILED_MOVING;
} }

View file

@ -3189,7 +3189,7 @@ void Aura::HandleModPossessPet(bool apply, bool Real)
{ {
pet->AttackStop(); pet->AttackStop();
pet->GetMotionMaster()->MoveFollow(caster, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE); pet->GetMotionMaster()->MoveFollow(caster, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE);
pet->SetUnitMovementFlags(MOVEMENTFLAG_NONE); pet->SetUnitMovementFlags(MONSTER_MOVE_FLAG_WALK);
} }
} }
@ -3198,7 +3198,7 @@ void Aura::HandleAuraModPetTalentsPoints(bool Apply, bool Real)
if(!Real) if(!Real)
return; return;
// Recalculate pet tlaent points // Recalculate pet talent points
if (Pet *pet=m_target->GetPet()) if (Pet *pet=m_target->GetPet())
pet->InitTalentForLevel(); pet->InitTalentForLevel();
} }
@ -3430,7 +3430,7 @@ void Aura::HandleAuraModStun(bool apply, bool Real)
if(m_target->GetTypeId() != TYPEID_PLAYER) if(m_target->GetTypeId() != TYPEID_PLAYER)
((Creature*)m_target)->StopMoving(); ((Creature*)m_target)->StopMoving();
else else
m_target->SetUnitMovementFlags(0); //Clear movement flags ((Player*)m_target)->m_movementInfo.flags = 0; //Clear movement flags
WorldPacket data(SMSG_FORCE_MOVE_ROOT, 8); WorldPacket data(SMSG_FORCE_MOVE_ROOT, 8);
@ -3697,9 +3697,9 @@ void Aura::HandleAuraModRoot(bool apply, bool Real)
m_target->addUnitState(UNIT_STAT_ROOT); m_target->addUnitState(UNIT_STAT_ROOT);
m_target->SetUInt64Value (UNIT_FIELD_TARGET, 0); m_target->SetUInt64Value (UNIT_FIELD_TARGET, 0);
// probably wrong (this add skinable flag) // probably wrong (this add skinable flag)
// TODO: find correct flag // TODO: find correct flag
// m_target->SetFlag(UNIT_FIELD_FLAGS,(apply_stat<<16)); //m_target->SetFlag(UNIT_FIELD_FLAGS,(apply_stat<<16));
//Save last orientation //Save last orientation
if( m_target->getVictim() ) if( m_target->getVictim() )
@ -3713,7 +3713,7 @@ void Aura::HandleAuraModRoot(bool apply, bool Real)
m_target->SendMessageToSet(&data,true); m_target->SendMessageToSet(&data,true);
//Clear unit movement flags //Clear unit movement flags
m_target->SetUnitMovementFlags(0); ((Player*)m_target)->m_movementInfo.flags = 0;
} }
else else
((Creature *)m_target)->StopMoving(); ((Creature *)m_target)->StopMoving();
@ -3748,9 +3748,9 @@ void Aura::HandleAuraModRoot(bool apply, bool Real)
return; return;
m_target->clearUnitState(UNIT_STAT_ROOT); m_target->clearUnitState(UNIT_STAT_ROOT);
// probably wrong (this add skinable flag) // probably wrong (this add skinable flag)
// TODO: find correct flag // TODO: find correct flag
// m_target->RemoveFlag(UNIT_FIELD_FLAGS,(apply_stat<<16)); //m_target->RemoveFlag(UNIT_FIELD_FLAGS,(apply_stat<<16));
if(!m_target->hasUnitState(UNIT_STAT_STUNNED)) // prevent allow move if have also stun effect if(!m_target->hasUnitState(UNIT_STAT_STUNNED)) // prevent allow move if have also stun effect
{ {

View file

@ -5895,7 +5895,7 @@ void Spell::EffectCharge(uint32 /*i*/)
((Creature *)unitTarget)->StopMoving(); ((Creature *)unitTarget)->StopMoving();
// Only send MOVEMENTFLAG_WALK_MODE, client has strange issues with other move flags // Only send MOVEMENTFLAG_WALK_MODE, client has strange issues with other move flags
m_caster->SendMonsterMove(x, y, z, 0, MOVEMENTFLAG_WALK_MODE, 1); m_caster->SendMonsterMove(x, y, z, 0, MONSTER_MOVE_FLAG_WALK, 1);
if(m_caster->GetTypeId() != TYPEID_PLAYER) if(m_caster->GetTypeId() != TYPEID_PLAYER)
m_caster->GetMap()->CreatureRelocation((Creature*)m_caster,x,y,z,m_caster->GetOrientation()); m_caster->GetMap()->CreatureRelocation((Creature*)m_caster,x,y,z,m_caster->GetOrientation());

View file

@ -71,9 +71,9 @@ inline uint32 Traveller<T>::GetTotalTrevelTimeTo(float x, float y, float z)
template<> template<>
inline float Traveller<Creature>::Speed() inline float Traveller<Creature>::Speed()
{ {
if(i_traveller.HasUnitMovementFlag(MOVEMENTFLAG_WALK_MODE)) if(i_traveller.HasUnitMovementFlag(MONSTER_MOVE_FLAG_WALK))
return i_traveller.GetSpeed(MOVE_WALK); return i_traveller.GetSpeed(MOVE_WALK);
else if(i_traveller.HasUnitMovementFlag(MOVEMENTFLAG_FLYING2)) else if(i_traveller.HasUnitMovementFlag(MONSTER_MOVE_FLAG_TEST_FLY))
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);
@ -112,7 +112,7 @@ inline float Traveller<Player>::Speed()
if (i_traveller.isInFlight()) if (i_traveller.isInFlight())
return PLAYER_FLIGHT_SPEED; return PLAYER_FLIGHT_SPEED;
else else
return i_traveller.GetSpeed(i_traveller.HasUnitMovementFlag(MOVEMENTFLAG_WALK_MODE) ? MOVE_WALK : MOVE_RUN); return i_traveller.GetSpeed(i_traveller.m_movementInfo.HasMovementFlag(MOVEMENTFLAG_WALK_MODE) ? MOVE_WALK : MOVE_RUN);
} }
template<> template<>
@ -138,7 +138,7 @@ template<>
inline void Traveller<Player>::MoveTo(float x, float y, float z, uint32 t) inline void Traveller<Player>::MoveTo(float x, float y, float z, uint32 t)
{ {
//Only send MOVEMENTFLAG_WALK_MODE, client has strange issues with other move flags //Only send MOVEMENTFLAG_WALK_MODE, client has strange issues with other move flags
i_traveller.SendMonsterMove(x, y, z, 0, MOVEMENTFLAG_WALK_MODE, t); i_traveller.SendMonsterMove(x, y, z, 0, MONSTER_MOVE_FLAG_WALK, t);
} }
typedef Traveller<Creature> CreatureTraveller; typedef Traveller<Creature> CreatureTraveller;

View file

@ -284,6 +284,9 @@ void Unit::SendMonsterMove(float NewPosX, float NewPosY, float NewPosZ, uint8 ty
break; break;
} }
if(MovementFlags & MONSTER_MOVE_FLAG_SPLINE) // we shouldn't get here with this flag
sLog.outError("SHIT HAPPENED!");
data << uint32(MovementFlags); data << uint32(MovementFlags);
data << uint32(Time); // Time in between points data << uint32(Time); // Time in between points
data << uint32(1); // 1 single waypoint data << uint32(1); // 1 single waypoint
@ -301,13 +304,13 @@ void Unit::SendMonsterMoveByPath(Path const& path, uint32 start, uint32 end, uin
uint32 pathSize = end-start; uint32 pathSize = end-start;
WorldPacket data( SMSG_MONSTER_MOVE, (GetPackGUID().size()+4+4+4+4+1+4+4+4+pathSize*4*3) ); WorldPacket data( SMSG_MONSTER_MOVE, (GetPackGUID().size()+1+4+4+4+4+1+4+4+4+pathSize*4*3) );
data.append(GetPackGUID()); data.append(GetPackGUID());
data << uint8(0); data << uint8(0);
data << GetPositionX(); data << GetPositionX();
data << GetPositionY(); data << GetPositionY();
data << GetPositionZ(); data << GetPositionZ();
data << getMSTime(); data << uint32(getMSTime());
data << uint8( 0 ); data << uint8( 0 );
data << uint32( MovementFlags ); data << uint32( MovementFlags );
data << uint32( traveltime ); data << uint32( traveltime );
@ -10816,7 +10819,7 @@ void Unit::StopMoving()
// Relocate(GetPositionX(), GetPositionY(), z); // Relocate(GetPositionX(), GetPositionY(), z);
Relocate(GetPositionX(), GetPositionY(),GetPositionZ()); Relocate(GetPositionX(), GetPositionY(),GetPositionZ());
SendMonsterMove(GetPositionX(), GetPositionY(), GetPositionZ(), 0, true, 0); SendMonsterMove(GetPositionX(), GetPositionY(), GetPositionZ(), 0, 0, 0);
// update position and orientation; // update position and orientation;
WorldPacket data; WorldPacket data;

View file

@ -595,6 +595,22 @@ enum MovementFlags
MOVEMENTFLAG_UNK3 = 0x40000000 MOVEMENTFLAG_UNK3 = 0x40000000
}; };
enum MonsterMovementFlags
{
MONSTER_MOVE_FLAG_WALK = 0x00000000,
MONSTER_MOVE_FLAG_UNK1 = 0x00000800, // float+uint32
MONSTER_MOVE_FLAG_RUN = 0x00001000,
MONSTER_MOVE_FLAG_SPLINE = 0x00002000, // spline n*(float x,y,z)
MONSTER_MOVE_FLAG_SPLINE2 = 0x00040000, // spline n*(float x,y,z)
MONSTER_MOVE_FLAG_UNK2 = 0x00080000,
MONSTER_MOVE_FLAG_UNK3 = 0x00100000,
MONSTER_MOVE_FLAG_UNK4 = 0x00200000, // uint8+uint32
// masks
MONSTER_MOVE_FLAG_SPLINE_FLY= 0x00003000, // fly by points
MONSTER_MOVE_FLAG_TEST_FLY = 0x00180000 // found these flags on flying mob with MONSTER_MOVE_FLAG_SPLINE in same time
};
enum DiminishingLevels enum DiminishingLevels
{ {
DIMINISHING_LEVEL_1 = 0, DIMINISHING_LEVEL_1 = 0,

View file

@ -109,7 +109,7 @@ bool WaypointMovementGenerator<Creature>::Update(Creature &creature, const uint3
// Now we re-set destination to same node and start travel // Now we re-set destination to same node and start travel
creature.addUnitState(UNIT_STAT_ROAMING); creature.addUnitState(UNIT_STAT_ROAMING);
if (creature.canFly()) if (creature.canFly())
creature.AddUnitMovementFlag(MOVEMENTFLAG_FLYING2); creature.AddUnitMovementFlag(MONSTER_MOVE_FLAG_TEST_FLY);
const WaypointNode &node = i_path->at(i_currentNode); const WaypointNode &node = i_path->at(i_currentNode);
i_destinationHolder.SetDestination(traveller, node.x, node.y, node.z); i_destinationHolder.SetDestination(traveller, node.x, node.y, node.z);
i_nextMoveTime.Reset(i_destinationHolder.GetTotalTravelTime()); i_nextMoveTime.Reset(i_destinationHolder.GetTotalTravelTime());
@ -172,7 +172,7 @@ bool WaypointMovementGenerator<Creature>::Update(Creature &creature, const uint3
{ {
creature.addUnitState(UNIT_STAT_ROAMING); creature.addUnitState(UNIT_STAT_ROAMING);
if (creature.canFly()) if (creature.canFly())
creature.AddUnitMovementFlag(MOVEMENTFLAG_FLYING2); creature.AddUnitMovementFlag(MONSTER_MOVE_FLAG_TEST_FLY);
const WaypointNode &node = i_path->at(i_currentNode); const WaypointNode &node = i_path->at(i_currentNode);
i_destinationHolder.SetDestination(traveller, node.x, node.y, node.z); i_destinationHolder.SetDestination(traveller, node.x, node.y, node.z);
i_nextMoveTime.Reset(i_destinationHolder.GetTotalTravelTime()); i_nextMoveTime.Reset(i_destinationHolder.GetTotalTravelTime());
@ -240,7 +240,7 @@ void FlightPathMovementGenerator::Initialize(Player &player)
// do not send movement, it was sent already // do not send movement, it was sent already
i_destinationHolder.SetDestination(traveller, i_path[i_currentNode].x, i_path[i_currentNode].y, i_path[i_currentNode].z, false); i_destinationHolder.SetDestination(traveller, i_path[i_currentNode].x, i_path[i_currentNode].y, i_path[i_currentNode].z, false);
player.SendMonsterMoveByPath(GetPath(),GetCurrentNode(),GetPathAtMapEnd(),0x420); player.SendMonsterMoveByPath(GetPath(),GetCurrentNode(),GetPathAtMapEnd(),MONSTER_MOVE_FLAG_SPLINE_FLY);
} }
void FlightPathMovementGenerator::Finalize(Player & player) void FlightPathMovementGenerator::Finalize(Player & player)
@ -261,7 +261,7 @@ void FlightPathMovementGenerator::Finalize(Player & player)
if(player.pvpInfo.inHostileArea) if(player.pvpInfo.inHostileArea)
player.CastSpell(&player, 2479, true); player.CastSpell(&player, 2479, true);
player.SetUnitMovementFlags(MOVEMENTFLAG_WALK_MODE); player.SetUnitMovementFlags(MONSTER_MOVE_FLAG_WALK);
player.StopMoving(); player.StopMoving();
} }
} }

View file

@ -901,9 +901,9 @@ GM.AllowAchievementGain = 1
# Visibility.Distance.Creature # Visibility.Distance.Creature
# Visibility.Distance.Player # Visibility.Distance.Player
# Visibility distance for different in game object # Visibility distance for different in game object
# Max limited by active player zone: ~ 166 # Max limited by active player zone: ~ 333
# Min limit dependent from objects # Min limit dependent from objects
# Default: 66 (cell size) # Default: 132 (cell size)
# Min limit is max aggro radius (45) * Rate.Creature.Aggro # Min limit is max aggro radius (45) * Rate.Creature.Aggro
# #
# Visibility.Distance.Object # Visibility.Distance.Object
@ -929,10 +929,10 @@ GM.AllowAchievementGain = 1
################################################################################################################### ###################################################################################################################
Visibility.GroupMode = 0 Visibility.GroupMode = 0
Visibility.Distance.Creature = 66 Visibility.Distance.Creature = 100
Visibility.Distance.Player = 66 Visibility.Distance.Player = 100
Visibility.Distance.Object = 66 Visibility.Distance.Object = 100
Visibility.Distance.InFlight = 66 Visibility.Distance.InFlight = 100
Visibility.Distance.Grey.Unit = 1 Visibility.Distance.Grey.Unit = 1
Visibility.Distance.Grey.Object = 10 Visibility.Distance.Grey.Object = 10

View file

@ -68,6 +68,6 @@ enum LoginResult
// others will not and opposite // others will not and opposite
// will only support WoW, WoW:TBC and WoW:WotLK 3.1.1a client build 9835... // will only support WoW, WoW:TBC and WoW:WotLK 3.1.1a client build 9835...
#define EXPECTED_MANGOS_CLIENT_BUILD {9835, 0} #define EXPECTED_MANGOS_CLIENT_BUILD {9835, 9855, 0}
#endif #endif