在 player.cpp 最下面加入
void Player::ChackMountdisplay() { if(GetUInt32Value(UNIT_FIELD_MOUNTDISPLAYID) == 0) return; else { SetUInt32Value( UNIT_FIELD_MOUNTDISPLAYID , 0); if(HasFlag(UNIT_FIELD_FLAGS, U_FIELD_FLAG_MOUNT_SIT)) RemoveFlag( UNIT_FIELD_FLAGS , U_FIELD_FLAG_MOUNT_SIT ); if(m_MountSpellId) RemoveAura(m_MountSpellId); if(flying_aura) RemoveAura(flying_aura); return; } }
其次在 player.h 里面加入
uint32 SoulStone; + void ChackMountdisplay();
这样,就可以在需要检测的地方调用上面的代码
具体是下面的几处
void WorldSession::_HandleAreaTriggerOpcode(uint32 id) { sLog.outDebug("AreaTrigger: %u", id);
AreaTrigger * pAreaTrigger = AreaTriggerStorage.LookupEntry(id);
// Are we REALLY here? if(pAreaTrigger) { LocationVector l(pAreaTrigger->x, pAreaTrigger->y, pAreaTrigger->z); if((_player->GetMapId() == pAreaTrigger->Mapid) && _player->CalcDistance(l) > sWorld.GetUpdateDistance()) return; }
WorldPacket data(80);
// Search quest log, find any exploration quests sQuestMgr.OnPlayerExploreArea(GetPlayer(),id);
+ if(GetPlayer()->GetUInt32Value(UNIT_FIELD_MOUNTDISPLAYID) != 0) + GetPlayer()->ChackMountdisplay();
==========================================================================
void Spell::HandleTeleport(uint32 id, Unit* Target) { if(Target->GetTypeId()!=TYPEID_PLAYER) return;
+ Player* pTarget = (Player*)Target; + if(pTarget->GetUInt32Value(UNIT_FIELD_MOUNTDISPLAYID) != 0) + { + pTarget->ChackMountdisplay(); + return; + }
还有一处就是 NPC 传送加入,因为传送代码都不一样,所以,只是一个提示,我的是下面的这样,可以参考一下
bool Player::NPCTeler(uint32 MapID, const LocationVector & v) { if( !MapID || !IsInWorld() || !isAlive()) return false;
if(GetUInt32Value(UNIT_FIELD_MOUNTDISPLAYID) != 0) ChackMountdisplay();
if(GetPlayerStatus() != TRANSFER_PENDING) { SaveEntryPoint(MapID);
MapInfo * pMapinfo = WorldMapInfoStorage.LookupEntry(MapID); if(!pMapinfo) return false;
if(pMapinfo && !pMapinfo->HasFlag(WMI_INSTANCE_ENA*LED) && !GetSession()->HasGMPermissions()) { |