mirror of
https://github.com/mangosfour/server.git
synced 2025-12-16 13:37:00 +00:00
[10080] Fixed ghost teleport and cleanup code.
This commit is contained in:
parent
6bfd0aa5b5
commit
e63dc32f4d
4 changed files with 28 additions and 27 deletions
|
|
@ -480,6 +480,7 @@ Player::Player (WorldSession *session): Unit(), m_achievementMgr(this), m_reputa
|
||||||
m_DelayedOperations = 0;
|
m_DelayedOperations = 0;
|
||||||
m_bCanDelayTeleport = false;
|
m_bCanDelayTeleport = false;
|
||||||
m_bHasDelayedTeleport = false;
|
m_bHasDelayedTeleport = false;
|
||||||
|
m_bHasBeenAliveAtDelayedTeleport = true; // overwrite always at setup teleport data, so not used infact
|
||||||
m_teleport_options = 0;
|
m_teleport_options = 0;
|
||||||
|
|
||||||
m_trade = NULL;
|
m_trade = NULL;
|
||||||
|
|
@ -1474,9 +1475,7 @@ void Player::Update( uint32 p_time )
|
||||||
RemovePet(pet, PET_SAVE_NOT_IN_SLOT, true);
|
RemovePet(pet, PET_SAVE_NOT_IN_SLOT, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
//we should execute delayed teleports only for alive(!) players
|
if (IsHasDelayedTeleport())
|
||||||
//because we don't want player's ghost teleported from graveyard
|
|
||||||
if(IsHasDelayedTeleport() && isAlive())
|
|
||||||
TeleportTo(m_teleport_dest, m_teleport_options);
|
TeleportTo(m_teleport_dest, m_teleport_options);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1775,10 +1774,9 @@ bool Player::TeleportTo(uint32 mapid, float x, float y, float z, float orientati
|
||||||
//lets reset far teleport flag if it wasn't reset during chained teleports
|
//lets reset far teleport flag if it wasn't reset during chained teleports
|
||||||
SetSemaphoreTeleportFar(false);
|
SetSemaphoreTeleportFar(false);
|
||||||
//setup delayed teleport flag
|
//setup delayed teleport flag
|
||||||
SetDelayedTeleportFlag(IsCanDelayTeleport());
|
|
||||||
//if teleport spell is casted in Unit::Update() func
|
//if teleport spell is casted in Unit::Update() func
|
||||||
//then we need to delay it until update process will be finished
|
//then we need to delay it until update process will be finished
|
||||||
if(IsHasDelayedTeleport())
|
if (SetDelayedTeleportFlagIfCan())
|
||||||
{
|
{
|
||||||
SetSemaphoreTeleportNear(true);
|
SetSemaphoreTeleportNear(true);
|
||||||
//lets save teleport destination for player
|
//lets save teleport destination for player
|
||||||
|
|
@ -1831,10 +1829,9 @@ bool Player::TeleportTo(uint32 mapid, float x, float y, float z, float orientati
|
||||||
//lets reset near teleport flag if it wasn't reset during chained teleports
|
//lets reset near teleport flag if it wasn't reset during chained teleports
|
||||||
SetSemaphoreTeleportNear(false);
|
SetSemaphoreTeleportNear(false);
|
||||||
//setup delayed teleport flag
|
//setup delayed teleport flag
|
||||||
SetDelayedTeleportFlag(IsCanDelayTeleport());
|
|
||||||
//if teleport spell is casted in Unit::Update() func
|
//if teleport spell is casted in Unit::Update() func
|
||||||
//then we need to delay it until update process will be finished
|
//then we need to delay it until update process will be finished
|
||||||
if(IsHasDelayedTeleport())
|
if (SetDelayedTeleportFlagIfCan())
|
||||||
{
|
{
|
||||||
SetSemaphoreTeleportFar(true);
|
SetSemaphoreTeleportFar(true);
|
||||||
//lets save teleport destination for player
|
//lets save teleport destination for player
|
||||||
|
|
@ -13538,10 +13535,6 @@ void Player::IncompleteQuest( uint32 quest_id )
|
||||||
|
|
||||||
void Player::RewardQuest( Quest const *pQuest, uint32 reward, Object* questGiver, bool announce )
|
void Player::RewardQuest( Quest const *pQuest, uint32 reward, Object* questGiver, bool announce )
|
||||||
{
|
{
|
||||||
//this THING should be here to protect code from quest, which cast on player far teleport as a reward
|
|
||||||
//should work fine, cause far teleport will be executed in Player::Update()
|
|
||||||
SetCanDelayTeleport(true);
|
|
||||||
|
|
||||||
uint32 quest_id = pQuest->GetQuestId();
|
uint32 quest_id = pQuest->GetQuestId();
|
||||||
|
|
||||||
for (int i = 0; i < QUEST_ITEM_OBJECTIVES_COUNT; ++i )
|
for (int i = 0; i < QUEST_ITEM_OBJECTIVES_COUNT; ++i )
|
||||||
|
|
@ -13693,9 +13686,6 @@ void Player::RewardQuest( Quest const *pQuest, uint32 reward, Object* questGiver
|
||||||
if (!HasAura(itr->second->spellId, EFFECT_INDEX_0))
|
if (!HasAura(itr->second->spellId, EFFECT_INDEX_0))
|
||||||
CastSpell(this,itr->second->spellId,true);
|
CastSpell(this,itr->second->spellId,true);
|
||||||
}
|
}
|
||||||
|
|
||||||
//lets remove flag for delayed teleports
|
|
||||||
SetCanDelayTeleport(false);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Player::FailQuest(uint32 questId)
|
void Player::FailQuest(uint32 questId)
|
||||||
|
|
|
||||||
|
|
@ -2593,10 +2593,20 @@ class MANGOS_DLL_SPEC Player : public Unit
|
||||||
int32 CalculateReputationGain(uint32 creatureOrQuestLevel, int32 rep, int32 faction, bool for_quest);
|
int32 CalculateReputationGain(uint32 creatureOrQuestLevel, int32 rep, int32 faction, bool for_quest);
|
||||||
void AdjustQuestReqItemCount( Quest const* pQuest, QuestStatusData& questStatusData );
|
void AdjustQuestReqItemCount( Quest const* pQuest, QuestStatusData& questStatusData );
|
||||||
|
|
||||||
bool IsCanDelayTeleport() const { return m_bCanDelayTeleport; }
|
|
||||||
void SetCanDelayTeleport(bool setting) { m_bCanDelayTeleport = setting; }
|
void SetCanDelayTeleport(bool setting) { m_bCanDelayTeleport = setting; }
|
||||||
bool IsHasDelayedTeleport() const { return m_bHasDelayedTeleport; }
|
bool IsHasDelayedTeleport() const
|
||||||
void SetDelayedTeleportFlag(bool setting) { m_bHasDelayedTeleport = setting; }
|
{
|
||||||
|
// we should not execute delayed teleports for now dead players but has been alive at teleport
|
||||||
|
// because we don't want player's ghost teleported from graveyard
|
||||||
|
return m_bHasDelayedTeleport && (isAlive() || !m_bHasBeenAliveAtDelayedTeleport);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool SetDelayedTeleportFlagIfCan()
|
||||||
|
{
|
||||||
|
m_bHasDelayedTeleport = m_bCanDelayTeleport;
|
||||||
|
m_bHasBeenAliveAtDelayedTeleport = isAlive();
|
||||||
|
return m_bHasDelayedTeleport;
|
||||||
|
}
|
||||||
|
|
||||||
void ScheduleDelayedOperation(uint32 operation)
|
void ScheduleDelayedOperation(uint32 operation)
|
||||||
{
|
{
|
||||||
|
|
@ -2634,6 +2644,7 @@ class MANGOS_DLL_SPEC Player : public Unit
|
||||||
uint32 m_DelayedOperations;
|
uint32 m_DelayedOperations;
|
||||||
bool m_bCanDelayTeleport;
|
bool m_bCanDelayTeleport;
|
||||||
bool m_bHasDelayedTeleport;
|
bool m_bHasDelayedTeleport;
|
||||||
|
bool m_bHasBeenAliveAtDelayedTeleport;
|
||||||
|
|
||||||
uint32 m_DetectInvTimer;
|
uint32 m_DetectInvTimer;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -876,7 +876,7 @@ void WorldSession::ExecuteOpcode( OpcodeHandler const& opHandle, WorldPacket* pa
|
||||||
|
|
||||||
//we should execute delayed teleports only for alive(!) players
|
//we should execute delayed teleports only for alive(!) players
|
||||||
//because we don't want player's ghost teleported from graveyard
|
//because we don't want player's ghost teleported from graveyard
|
||||||
if (_player->IsHasDelayedTeleport() && _player->isAlive())
|
if (_player->IsHasDelayedTeleport())
|
||||||
_player->TeleportTo(_player->m_teleport_dest, _player->m_teleport_options);
|
_player->TeleportTo(_player->m_teleport_dest, _player->m_teleport_options);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
#ifndef __REVISION_NR_H__
|
#ifndef __REVISION_NR_H__
|
||||||
#define __REVISION_NR_H__
|
#define __REVISION_NR_H__
|
||||||
#define REVISION_NR "10079"
|
#define REVISION_NR "10080"
|
||||||
#endif // __REVISION_NR_H__
|
#endif // __REVISION_NR_H__
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue