mirror of
https://github.com/mangosfour/server.git
synced 2025-12-14 16:37:01 +00:00
[7798] More Player::ActivateTaxiPathTo use improvements
* Provide more explicit way about spell that cast taxi flight if any * Remove incorrect states instead error reporting in case non-taximaster flight start (cast/script) * Remove mount_id arg from ActivateTaxiPathTo and implement support for 0 mount_id case (spell 32474) * Implement spell 32474 (except finilize part) * Provided Player::ActivateTaxiPathTo(uint32 taxi_path_id) function version for simplify one node to node paths use by id.
This commit is contained in:
parent
3989212ad1
commit
666b6f798e
7 changed files with 85 additions and 45 deletions
|
|
@ -16707,34 +16707,13 @@ void Player::HandleStealthedUnitsDetection()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Player::ActivateTaxiPathTo(std::vector<uint32> const& nodes, uint32 mount_id, Creature* npc)
|
bool Player::ActivateTaxiPathTo(std::vector<uint32> const& nodes, Creature* npc /*= NULL*/, uint32 spellid /*= 0*/)
|
||||||
{
|
{
|
||||||
if(nodes.size() < 2)
|
if(nodes.size() < 2)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
// not let cheating with start flight mounted
|
|
||||||
if(IsMounted())
|
|
||||||
{
|
|
||||||
WorldPacket data(SMSG_ACTIVATETAXIREPLY, 4);
|
|
||||||
data << uint32(ERR_TAXIPLAYERALREADYMOUNTED);
|
|
||||||
GetSession()->SendPacket(&data);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( m_ShapeShiftFormSpellId && m_form != FORM_BATTLESTANCE && m_form != FORM_BERSERKERSTANCE && m_form != FORM_DEFENSIVESTANCE && m_form != FORM_SHADOW )
|
|
||||||
{
|
|
||||||
WorldPacket data(SMSG_ACTIVATETAXIREPLY, 4);
|
|
||||||
data << uint32(ERR_TAXIPLAYERSHAPESHIFTED);
|
|
||||||
GetSession()->SendPacket(&data);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// not let cheating with start flight in time of logout process || if casting not finished || while in combat || if not use Spell's with EffectSendTaxi
|
// not let cheating with start flight in time of logout process || if casting not finished || while in combat || if not use Spell's with EffectSendTaxi
|
||||||
if(GetSession()->isLogingOut() ||
|
if(GetSession()->isLogingOut() || isInCombat())
|
||||||
(!m_currentSpells[CURRENT_GENERIC_SPELL] ||
|
|
||||||
m_currentSpells[CURRENT_GENERIC_SPELL]->m_spellInfo->Effect[0] != SPELL_EFFECT_SEND_TAXI)&&
|
|
||||||
IsNonMeleeSpellCasted(false) ||
|
|
||||||
isInCombat())
|
|
||||||
{
|
{
|
||||||
WorldPacket data(SMSG_ACTIVATETAXIREPLY, 4);
|
WorldPacket data(SMSG_ACTIVATETAXIREPLY, 4);
|
||||||
data << uint32(ERR_TAXIPLAYERBUSY);
|
data << uint32(ERR_TAXIPLAYERBUSY);
|
||||||
|
|
@ -16745,6 +16724,52 @@ bool Player::ActivateTaxiPathTo(std::vector<uint32> const& nodes, uint32 mount_i
|
||||||
if(HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE))
|
if(HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
// taximaster case
|
||||||
|
if(npc)
|
||||||
|
{
|
||||||
|
// not let cheating with start flight mounted
|
||||||
|
if(IsMounted())
|
||||||
|
{
|
||||||
|
WorldPacket data(SMSG_ACTIVATETAXIREPLY, 4);
|
||||||
|
data << uint32(ERR_TAXIPLAYERALREADYMOUNTED);
|
||||||
|
GetSession()->SendPacket(&data);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( m_ShapeShiftFormSpellId && m_form != FORM_BATTLESTANCE && m_form != FORM_BERSERKERSTANCE && m_form != FORM_DEFENSIVESTANCE && m_form != FORM_SHADOW )
|
||||||
|
{
|
||||||
|
WorldPacket data(SMSG_ACTIVATETAXIREPLY, 4);
|
||||||
|
data << uint32(ERR_TAXIPLAYERSHAPESHIFTED);
|
||||||
|
GetSession()->SendPacket(&data);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// not let cheating with start flight in time of logout process || if casting not finished || while in combat || if not use Spell's with EffectSendTaxi
|
||||||
|
if(IsNonMeleeSpellCasted(false))
|
||||||
|
{
|
||||||
|
WorldPacket data(SMSG_ACTIVATETAXIREPLY, 4);
|
||||||
|
data << uint32(ERR_TAXIPLAYERBUSY);
|
||||||
|
GetSession()->SendPacket(&data);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// cast case or scripted call case
|
||||||
|
else
|
||||||
|
{
|
||||||
|
RemoveSpellsCausingAura(SPELL_AURA_MOUNTED);
|
||||||
|
|
||||||
|
if( m_ShapeShiftFormSpellId && m_form != FORM_BATTLESTANCE && m_form != FORM_BERSERKERSTANCE && m_form != FORM_DEFENSIVESTANCE && m_form != FORM_SHADOW )
|
||||||
|
RemoveAurasDueToSpell(m_ShapeShiftFormSpellId);
|
||||||
|
|
||||||
|
if(m_currentSpells[CURRENT_GENERIC_SPELL] && m_currentSpells[CURRENT_GENERIC_SPELL]->m_spellInfo->Id != spellid)
|
||||||
|
InterruptSpell(CURRENT_GENERIC_SPELL,false);
|
||||||
|
|
||||||
|
InterruptSpell(CURRENT_AUTOREPEAT_SPELL,false);
|
||||||
|
|
||||||
|
if(m_currentSpells[CURRENT_CHANNELED_SPELL] && m_currentSpells[CURRENT_CHANNELED_SPELL]->m_spellInfo->Id != spellid)
|
||||||
|
InterruptSpell(CURRENT_CHANNELED_SPELL,true);
|
||||||
|
}
|
||||||
|
|
||||||
uint32 sourcenode = nodes[0];
|
uint32 sourcenode = nodes[0];
|
||||||
|
|
||||||
// starting node too far away (cheat?)
|
// starting node too far away (cheat?)
|
||||||
|
|
@ -16773,7 +16798,7 @@ bool Player::ActivateTaxiPathTo(std::vector<uint32> const& nodes, uint32 mount_i
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// node must have pos if not spell case (npc!=0)
|
// node must have pos if not spell case (npc!=0)
|
||||||
else if(npc)
|
else if(!spellid)
|
||||||
{
|
{
|
||||||
WorldPacket data(SMSG_ACTIVATETAXIREPLY, 4);
|
WorldPacket data(SMSG_ACTIVATETAXIREPLY, 4);
|
||||||
data << uint32(ERR_TAXIUNSPECIFIEDSERVERERROR);
|
data << uint32(ERR_TAXIUNSPECIFIEDSERVERERROR);
|
||||||
|
|
@ -16825,10 +16850,9 @@ bool Player::ActivateTaxiPathTo(std::vector<uint32> const& nodes, uint32 mount_i
|
||||||
prevnode = lastnode;
|
prevnode = lastnode;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!mount_id) // if not provide then attempt use default, allow seelct alt team mount creature model but for proper team in spell case.
|
uint16 mount_id = objmgr.GetTaxiMount(sourcenode, GetTeam(), spellid != 0);
|
||||||
mount_id = objmgr.GetTaxiMount(sourcenode, GetTeam(), npc == NULL);
|
|
||||||
|
|
||||||
if (mount_id == 0 || sourcepath == 0)
|
if (mount_id == 0 && spellid == 0 || sourcepath == 0)
|
||||||
{
|
{
|
||||||
WorldPacket data(SMSG_ACTIVATETAXIREPLY, 4);
|
WorldPacket data(SMSG_ACTIVATETAXIREPLY, 4);
|
||||||
data << uint32(ERR_TAXIUNSPECIFIEDSERVERERROR);
|
data << uint32(ERR_TAXIUNSPECIFIEDSERVERERROR);
|
||||||
|
|
@ -16870,6 +16894,21 @@ bool Player::ActivateTaxiPathTo(std::vector<uint32> const& nodes, uint32 mount_i
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Player::ActivateTaxiPathTo( uint32 taxi_path_id, uint32 spellid /*= 0*/ )
|
||||||
|
{
|
||||||
|
TaxiPathEntry const* entry = sTaxiPathStore.LookupEntry(taxi_path_id);
|
||||||
|
if(!entry)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
std::vector<uint32> nodes;
|
||||||
|
|
||||||
|
nodes.resize(2);
|
||||||
|
nodes[0] = entry->from;
|
||||||
|
nodes[1] = entry->to;
|
||||||
|
|
||||||
|
return ActivateTaxiPathTo(nodes,NULL,spellid);
|
||||||
|
}
|
||||||
|
|
||||||
void Player::ProhibitSpellScholl(SpellSchoolMask idSchoolMask, uint32 unTimeMs )
|
void Player::ProhibitSpellScholl(SpellSchoolMask idSchoolMask, uint32 unTimeMs )
|
||||||
{
|
{
|
||||||
// last check 2.0.10
|
// last check 2.0.10
|
||||||
|
|
|
||||||
|
|
@ -887,7 +887,8 @@ class MANGOS_DLL_SPEC Player : public Unit
|
||||||
|
|
||||||
PlayerTaxi m_taxi;
|
PlayerTaxi m_taxi;
|
||||||
void InitTaxiNodesForLevel() { m_taxi.InitTaxiNodesForLevel(getRace(), getClass(), getLevel()); }
|
void InitTaxiNodesForLevel() { m_taxi.InitTaxiNodesForLevel(getRace(), getClass(), getLevel()); }
|
||||||
bool ActivateTaxiPathTo(std::vector<uint32> const& nodes, uint32 mount_id = 0 , Creature* npc = NULL);
|
bool ActivateTaxiPathTo(std::vector<uint32> const& nodes, Creature* npc = NULL, uint32 spellid = 0);
|
||||||
|
bool ActivateTaxiPathTo(uint32 taxi_path_id, uint32 spellid = 0);
|
||||||
// mount_id can be used in scripting calls
|
// mount_id can be used in scripting calls
|
||||||
bool isAcceptTickets() const { return GetSession()->GetSecurity() >= SEC_GAMEMASTER && (m_ExtraFlags & PLAYER_EXTRA_GM_ACCEPT_TICKETS); }
|
bool isAcceptTickets() const { return GetSession()->GetSecurity() >= SEC_GAMEMASTER && (m_ExtraFlags & PLAYER_EXTRA_GM_ACCEPT_TICKETS); }
|
||||||
void SetAcceptTicket(bool on) { if(on) m_ExtraFlags |= PLAYER_EXTRA_GM_ACCEPT_TICKETS; else m_ExtraFlags &= ~PLAYER_EXTRA_GM_ACCEPT_TICKETS; }
|
void SetAcceptTicket(bool on) { if(on) m_ExtraFlags |= PLAYER_EXTRA_GM_ACCEPT_TICKETS; else m_ExtraFlags &= ~PLAYER_EXTRA_GM_ACCEPT_TICKETS; }
|
||||||
|
|
|
||||||
|
|
@ -194,7 +194,7 @@ pAuraHandler AuraHandler[TOTAL_AURAS]=
|
||||||
&Aura::HandleRangedAmmoHaste, //141 SPELL_AURA_MOD_RANGED_AMMO_HASTE
|
&Aura::HandleRangedAmmoHaste, //141 SPELL_AURA_MOD_RANGED_AMMO_HASTE
|
||||||
&Aura::HandleAuraModBaseResistancePCT, //142 SPELL_AURA_MOD_BASE_RESISTANCE_PCT
|
&Aura::HandleAuraModBaseResistancePCT, //142 SPELL_AURA_MOD_BASE_RESISTANCE_PCT
|
||||||
&Aura::HandleAuraModResistanceExclusive, //143 SPELL_AURA_MOD_RESISTANCE_EXCLUSIVE
|
&Aura::HandleAuraModResistanceExclusive, //143 SPELL_AURA_MOD_RESISTANCE_EXCLUSIVE
|
||||||
&Aura::HandleNoImmediateEffect, //144 SPELL_AURA_SAFE_FALL implemented in WorldSession::HandleMovementOpcodes
|
&Aura::HandleAuraSafeFall, //144 SPELL_AURA_SAFE_FALL implemented in WorldSession::HandleMovementOpcodes
|
||||||
&Aura::HandleAuraModPetTalentsPoints, //145 SPELL_AURA_MOD_PET_TALENT_POINTS
|
&Aura::HandleAuraModPetTalentsPoints, //145 SPELL_AURA_MOD_PET_TALENT_POINTS
|
||||||
&Aura::HandleNoImmediateEffect, //146 SPELL_AURA_ALLOW_TAME_PET_TYPE
|
&Aura::HandleNoImmediateEffect, //146 SPELL_AURA_ALLOW_TAME_PET_TYPE
|
||||||
&Aura::HandleNULL, //147 SPELL_AURA_ADD_CREATURE_IMMUNITY
|
&Aura::HandleNULL, //147 SPELL_AURA_ADD_CREATURE_IMMUNITY
|
||||||
|
|
@ -6830,3 +6830,12 @@ void Aura::UnregisterSingleCastAura()
|
||||||
m_isSingleTargetAura = false;
|
m_isSingleTargetAura = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Aura::HandleAuraSafeFall( bool Apply, bool Real )
|
||||||
|
{
|
||||||
|
// implemented in WorldSession::HandleMovementOpcodes
|
||||||
|
|
||||||
|
// only special case
|
||||||
|
if(Apply && Real && GetId()==32474 && m_target->GetTypeId()==TYPEID_PLAYER)
|
||||||
|
((Player*)m_target)->ActivateTaxiPathTo(506,GetId());
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -104,6 +104,7 @@ class MANGOS_DLL_SPEC Aura
|
||||||
void HandlePeriodicTriggerSpellWithValue(bool apply, bool Real);
|
void HandlePeriodicTriggerSpellWithValue(bool apply, bool Real);
|
||||||
void HandlePeriodicEnergize(bool Apply, bool Real);
|
void HandlePeriodicEnergize(bool Apply, bool Real);
|
||||||
void HandleAuraModResistanceExclusive(bool Apply, bool Real);
|
void HandleAuraModResistanceExclusive(bool Apply, bool Real);
|
||||||
|
void HandleAuraSafeFall(bool Apply, bool Real);
|
||||||
void HandleAuraModPetTalentsPoints(bool Apply, bool Real);
|
void HandleAuraModPetTalentsPoints(bool Apply, bool Real);
|
||||||
void HandleModStealth(bool Apply, bool Real);
|
void HandleModStealth(bool Apply, bool Real);
|
||||||
void HandleInvisibility(bool Apply, bool Real);
|
void HandleInvisibility(bool Apply, bool Real);
|
||||||
|
|
|
||||||
|
|
@ -6041,18 +6041,7 @@ void Spell::EffectSendTaxi(uint32 i)
|
||||||
if(!unitTarget || unitTarget->GetTypeId() != TYPEID_PLAYER)
|
if(!unitTarget || unitTarget->GetTypeId() != TYPEID_PLAYER)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
TaxiPathEntry const* entry = sTaxiPathStore.LookupEntry(m_spellInfo->EffectMiscValue[i]);
|
((Player*)unitTarget)->ActivateTaxiPathTo(m_spellInfo->EffectMiscValue[i],m_spellInfo->Id);
|
||||||
if(!entry)
|
|
||||||
return;
|
|
||||||
|
|
||||||
std::vector<uint32> nodes;
|
|
||||||
|
|
||||||
nodes.resize(2);
|
|
||||||
nodes[0] = entry->from;
|
|
||||||
nodes[1] = entry->to;
|
|
||||||
|
|
||||||
((Player*)unitTarget)->ActivateTaxiPathTo(nodes);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Spell::EffectPlayerPull(uint32 i)
|
void Spell::EffectPlayerPull(uint32 i)
|
||||||
|
|
|
||||||
|
|
@ -126,7 +126,8 @@ void WorldSession::SendDoFlight( uint16 MountId, uint32 path, uint32 pathNode )
|
||||||
while(GetPlayer()->GetMotionMaster()->GetCurrentMovementGeneratorType()==FLIGHT_MOTION_TYPE)
|
while(GetPlayer()->GetMotionMaster()->GetCurrentMovementGeneratorType()==FLIGHT_MOTION_TYPE)
|
||||||
GetPlayer()->GetMotionMaster()->MovementExpired(false);
|
GetPlayer()->GetMotionMaster()->MovementExpired(false);
|
||||||
|
|
||||||
GetPlayer()->Mount( MountId );
|
if (MountId)
|
||||||
|
GetPlayer()->Mount( MountId );
|
||||||
GetPlayer()->GetMotionMaster()->MoveTaxiFlight(path,pathNode);
|
GetPlayer()->GetMotionMaster()->MoveTaxiFlight(path,pathNode);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -188,7 +189,7 @@ void WorldSession::HandleActivateTaxiFarOpcode ( WorldPacket & recv_data )
|
||||||
|
|
||||||
sLog.outDebug( "WORLD: Received CMSG_ACTIVATETAXIEXPRESS from %d to %d" ,nodes.front(),nodes.back());
|
sLog.outDebug( "WORLD: Received CMSG_ACTIVATETAXIEXPRESS from %d to %d" ,nodes.front(),nodes.back());
|
||||||
|
|
||||||
GetPlayer()->ActivateTaxiPathTo(nodes, 0, npc);
|
GetPlayer()->ActivateTaxiPathTo(nodes, npc);
|
||||||
}
|
}
|
||||||
|
|
||||||
void WorldSession::HandleTaxiNextDestinationOpcode(WorldPacket& /*recv_data*/)
|
void WorldSession::HandleTaxiNextDestinationOpcode(WorldPacket& /*recv_data*/)
|
||||||
|
|
@ -273,5 +274,5 @@ void WorldSession::HandleActivateTaxiOpcode( WorldPacket & recv_data )
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
GetPlayer()->ActivateTaxiPathTo(nodes, 0, npc);
|
GetPlayer()->ActivateTaxiPathTo(nodes, npc);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
#ifndef __REVISION_NR_H__
|
#ifndef __REVISION_NR_H__
|
||||||
#define __REVISION_NR_H__
|
#define __REVISION_NR_H__
|
||||||
#define REVISION_NR "7797"
|
#define REVISION_NR "7798"
|
||||||
#endif // __REVISION_NR_H__
|
#endif // __REVISION_NR_H__
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue