|
关于解决卡马问题的说明 在 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()) { |
| 上一篇魔兽私服文章:上一篇: | 给单独种族多增加天赋 |
| 下一篇魔兽私服文章:下一篇: | 伊利丹代码 |