Advertisement
Guest User

NPC on Transport MaNGOS

a guest
Jul 22nd, 2010
475
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 26.20 KB | None | 0 0
  1. --- a/src/game/GridNotifiers.cpp
  2. +++ b/src/game/GridNotifiers.cpp
  3. @@ -42,18 +42,18 @@ VisibleNotifier::Notify()
  4.      Player& player = *i_camera.GetOwner();
  5.      // at this moment i_clientGUIDs have guids that not iterate at grid level checks
  6.      // but exist one case when this possible and object not out of range: transports
  7. -    if(Transport* transport = player.GetTransport())
  8. -    {
  9. -        for(Transport::PlayerSet::const_iterator itr = transport->GetPassengers().begin();itr!=transport->GetPassengers().end();++itr)
  10. -        {
  11. -            if (i_clientGUIDs.find((*itr)->GetGUID()) != i_clientGUIDs.end())
  12. -            {
  13. -                // ignore far sight case
  14. -                (*itr)->UpdateVisibilityOf(*itr, &player);
  15. -                player.UpdateVisibilityOf(&player, *itr, i_data, i_visibleNow);
  16. -                i_clientGUIDs.erase((*itr)->GetGUID());
  17. -            }
  18. -        }
  19. +    if(Transport* transport = player.GetTransport())
  20. +    {
  21. +        for(Transport::PlayerSet::const_iterator itr = transport->GetPlayerPassengers().begin();itr!=transport->GetPlayerPassengers().end();++itr)
  22. +        {
  23. +            if (i_clientGUIDs.find((*itr)->GetGUID()) != i_clientGUIDs.end())
  24. +            {
  25. +                // ignore far sight case
  26. +                (*itr)->UpdateVisibilityOf(*itr, &player);
  27. +                player.UpdateVisibilityOf(&player, *itr, i_data, i_visibleNow);
  28. +                i_clientGUIDs.erase((*itr)->GetGUID());
  29. +            }
  30. +        }
  31.      }
  32.  
  33.      // generate outOfRange for not iterate objects
  34.  
  35. --- a/src/game/Level2.cpp
  36. +++ b/src/game/Level2.cpp
  37. @@ -37,6 +37,7 @@
  38.  #include "GMTicketMgr.h"
  39.  #include "WaypointManager.h"
  40.  #include "Util.h"
  41. +#include "Transports.h"
  42.  #include <cctype>
  43.  #include <iostream>
  44.  #include <fstream>
  45. @@ -1113,6 +1114,18 @@ bool ChatHandler::HandleNpcAddCommand(co
  46.          return false;
  47.      }
  48.  
  49. +    if (chr->GetTransport())
  50. +    {
  51. +        pCreature->SetTransport(chr->GetTransport());
  52. +        pCreature->m_movementInfo.SetTransportData(ObjectGuid(HIGHGUID_MO_TRANSPORT, chr->GetTransport()->GetGUID()), chr->GetTransOffsetX(), chr->GetTransOffsetY(), chr->GetTransOffsetZ(), chr->GetTransOffsetO(), 0, -1);
  53. +        map->CreatureRelocation(pCreature, chr->GetTransport()->GetPositionX() + chr->GetTransOffsetX(), chr->GetTransport()->GetPositionY() + chr->GetTransOffsetY(), chr->GetTransport()->GetPositionZ() + chr->GetTransOffsetZ(), chr->GetTransOffsetO());
  54. +        chr->GetTransport()->AddCreaturePassenger(pCreature);
  55. +        pCreature->SaveToDB(map->GetId(), (1 << map->GetSpawnMode()), chr->GetPhaseMaskForSpawn());
  56. +        pCreature->AIM_Initialize();
  57. +        map->Add(pCreature);
  58. +        return true;
  59. +    }
  60. +
  61.      pCreature->Relocate(x,y,z,o);
  62.  
  63.      if (!pCreature->IsPositionValid())
  64.  
  65. --- a/src/game/Map.cpp
  66. +++ b/src/game/Map.cpp
  67. @@ -1361,7 +1361,7 @@ void Map::SendInitSelf( Player * player
  68.      // build other passengers at transport also (they always visible and marked as visible and will not send at visibility update at add to map
  69.      if(Transport* transport = player->GetTransport())
  70.      {
  71. -        for(Transport::PlayerSet::const_iterator itr = transport->GetPassengers().begin();itr!=transport->GetPassengers().end();++itr)
  72. +        for(Transport::PlayerSet::const_iterator itr = transport->GetPlayerPassengers().begin();itr!=transport->GetPlayerPassengers().end();++itr)
  73.          {
  74.              if(player!=(*itr) && player->HaveAtClient(*itr))
  75.              {
  76.  
  77. --- a/src/game/ObjectMgr.cpp
  78. +++ b/src/game/ObjectMgr.cpp
  79. @@ -1097,9 +1097,9 @@ void ObjectMgr::LoadCreatures()
  80.      uint32 count = 0;
  81.      //                                                0              1   2    3
  82.      QueryResult *result = WorldDatabase.Query("SELECT creature.guid, id, map, modelid,"
  83. -    //   4             5           6           7           8            9              10         11
  84. -        "equipment_id, position_x, position_y, position_z, orientation, spawntimesecs, spawndist, currentwaypoint,"
  85. -    //   12         13       14          15            16         17         18     19
  86. +    //   4             5           6           7           8            9        10       11       12       13         14             15         16
  87. +        "equipment_id, position_x, position_y, position_z, orientation, trans_x, trans_y, trans_z, trans_o, transguid, spawntimesecs, spawndist, currentwaypoint,"
  88. +    //   17         18       19          20            21         22         23     24
  89.          "curhealth, curmana, DeathState, MovementType, spawnMask, phaseMask, event, pool_entry "
  90.          "FROM creature LEFT OUTER JOIN game_event_creature ON creature.guid = game_event_creature.guid "
  91.          "LEFT OUTER JOIN pool_creature ON creature.guid = pool_creature.guid");
  92. @@ -1158,17 +1158,22 @@ void ObjectMgr::LoadCreatures()
  93.          data.posY           = fields[ 6].GetFloat();
  94.          data.posZ           = fields[ 7].GetFloat();
  95.          data.orientation    = fields[ 8].GetFloat();
  96. -        data.spawntimesecs  = fields[ 9].GetUInt32();
  97. -        data.spawndist      = fields[10].GetFloat();
  98. -        data.currentwaypoint= fields[11].GetUInt32();
  99. -        data.curhealth      = fields[12].GetUInt32();
  100. -        data.curmana        = fields[13].GetUInt32();
  101. -        data.is_dead        = fields[14].GetBool();
  102. -        data.movementType   = fields[15].GetUInt8();
  103. -        data.spawnMask      = fields[16].GetUInt8();
  104. -        data.phaseMask      = fields[17].GetUInt16();
  105. -        int16 gameEvent     = fields[18].GetInt16();
  106. -        int16 PoolId        = fields[19].GetInt16();
  107. +        data.trans_x        = fields[ 9].GetFloat();
  108. +        data.trans_y        = fields[10].GetFloat();
  109. +        data.trans_z        = fields[11].GetFloat();
  110. +        data.trans_o        = fields[12].GetFloat();
  111. +        data.transguid      = fields[13].GetUInt32();
  112. +        data.spawntimesecs  = fields[14].GetUInt32();
  113. +        data.spawndist      = fields[15].GetFloat();
  114. +        data.currentwaypoint= fields[16].GetUInt32();
  115. +        data.curhealth      = fields[17].GetUInt32();
  116. +        data.curmana        = fields[18].GetUInt32();
  117. +        data.is_dead        = fields[19].GetBool();
  118. +        data.movementType   = fields[20].GetUInt8();
  119. +        data.spawnMask      = fields[21].GetUInt8();
  120. +        data.phaseMask      = fields[22].GetUInt16();
  121. +        int16 gameEvent     = fields[23].GetInt16();
  122. +        int16 PoolId        = fields[24].GetInt16();
  123.  
  124.          MapEntry const* mapEntry = sMapStore.LookupEntry(data.mapid);
  125.          if(!mapEntry)
  126.  
  127. --- a/src/game/Creature.h
  128. +++ b/src/game/Creature.h
  129. @@ -196,6 +196,11 @@ struct CreatureData
  130.      float posY;
  131.      float posZ;
  132.      float orientation;
  133. +    float trans_x;
  134. +    float trans_y;
  135. +    float trans_z;
  136. +    float trans_o;
  137. +    uint32 transguid;
  138.      uint32 spawntimesecs;
  139.      float spawndist;
  140.      uint32 currentwaypoint;
  141.  
  142. --- a/src/game/Player.h
  143. +++ b/src/game/Player.h
  144. @@ -2221,17 +2221,6 @@ class MANGOS_DLL_SPEC Player : public Un
  145.  
  146.          ObjectGuid const& GetFarSightGuid() const { return GetGuidValue(PLAYER_FARSIGHT); }
  147.  
  148. -        // Transports
  149. -        Transport * GetTransport() const { return m_transport; }
  150. -        void SetTransport(Transport * t) { m_transport = t; }
  151. -
  152. -        float GetTransOffsetX() const { return m_movementInfo.GetTransportPos()->x; }
  153. -        float GetTransOffsetY() const { return m_movementInfo.GetTransportPos()->y; }
  154. -        float GetTransOffsetZ() const { return m_movementInfo.GetTransportPos()->z; }
  155. -        float GetTransOffsetO() const { return m_movementInfo.GetTransportPos()->o; }
  156. -        uint32 GetTransTime() const { return m_movementInfo.GetTransportTime(); }
  157. -        int8 GetTransSeat() const { return m_movementInfo.GetTransportSeat(); }
  158. -
  159.          uint32 GetSaveTimer() const { return m_nextSave; }
  160.          void   SetSaveTimer(uint32 timer) { m_nextSave = timer; }
  161.  
  162. @@ -2555,10 +2544,6 @@ class MANGOS_DLL_SPEC Player : public Un
  163.          float m_rest_bonus;
  164.          RestType rest_type;
  165.          ////////////////////Rest System/////////////////////
  166. -
  167. -        // Transports
  168. -        Transport * m_transport;
  169. -
  170.          uint32 m_resetTalentsCost;
  171.          time_t m_resetTalentsTime;
  172.          uint32 m_usedTalentCount;
  173.  
  174. --- a/src/game/Unit.h
  175. +++ b/src/game/Unit.h
  176. @@ -35,6 +35,7 @@
  177.  #include "Path.h"
  178.  #include "WorldPacket.h"
  179.  #include "Timer.h"
  180. +#include "Transports.h"
  181.  #include <list>
  182.  
  183.  enum SpellInterruptFlags
  184. @@ -1415,6 +1416,16 @@ class MANGOS_DLL_SPEC Unit : public Worl
  185.  
  186.          void NearTeleportTo(float x, float y, float z, float orientation, bool casting = false);
  187.  
  188. +        Transport* GetTransport() const { return m_transport; }
  189. +        void SetTransport(Transport* t) { m_transport = t; }
  190. +
  191. +        float GetTransOffsetX() const { return m_movementInfo.GetTransportPos()->x; }
  192. +        float GetTransOffsetY() const { return m_movementInfo.GetTransportPos()->y; }
  193. +        float GetTransOffsetZ() const { return m_movementInfo.GetTransportPos()->z; }
  194. +        float GetTransOffsetO() const { return m_movementInfo.GetTransportPos()->o; }
  195. +        uint32 GetTransTime() const { return m_movementInfo.GetTransportTime(); }
  196. +        int8 GetTransSeat() const { return m_movementInfo.GetTransportSeat(); }
  197. +
  198.          void MonsterMove(float x, float y, float z, uint32 transitTime);
  199.          void MonsterMoveWithSpeed(float x, float y, float z, uint32 transitTime = 0);
  200.  
  201. @@ -1962,6 +1973,8 @@ class MANGOS_DLL_SPEC Unit : public Worl
  202.  
  203.          GuardianPetList m_guardianPets;
  204.  
  205. +        Transport* m_transport;
  206. +
  207.          uint64 m_TotemSlot[MAX_TOTEM_SLOT];
  208.  };
  209.  
  210.  
  211. --- a/src/game/Creature.cpp
  212. +++ b/src/game/Creature.cpp
  213. @@ -136,6 +136,11 @@ Creature::~Creature()
  214.  {
  215.      CleanupsBeforeDelete();
  216.  
  217. +    if (GetTransport())
  218. +    {
  219. +        GetTransport()->RemoveCreaturePassenger(this);
  220. +    }
  221. +
  222.      m_vendorItemCounts.clear();
  223.  
  224.      delete i_AI;
  225. @@ -924,6 +929,7 @@ void Creature::SaveToDB(uint32 mapid, ui
  226.      CreatureData& data = sObjectMgr.NewOrExistCreatureData(m_DBTableGuid);
  227.  
  228.      uint32 displayId = GetNativeDisplayId();
  229. +    uint32 transGUID = (GetTransport()) ? GetTransport()->GetGUID() : 0;
  230.  
  231.      // check if it's a custom model and if not, use 0 for displayId
  232.      CreatureInfo const *cinfo = GetCreatureInfo();
  233. @@ -966,6 +972,11 @@ void Creature::SaveToDB(uint32 mapid, ui
  234.      data.posY = GetPositionY();
  235.      data.posZ = GetPositionZ();
  236.      data.orientation = GetOrientation();
  237. +    data.trans_x = GetTransOffsetX();
  238. +    data.trans_y = GetTransOffsetY();
  239. +    data.trans_y = GetTransOffsetZ();
  240. +    data.trans_o = GetTransOffsetO();
  241. +    data.transguid = transGUID;
  242.      data.spawntimesecs = m_respawnDelay;
  243.      // prevent add data integrity problems
  244.      data.spawndist = GetDefaultMovementType()==IDLE_MOTION_TYPE ? 0 : m_respawnradius;
  245. @@ -996,6 +1007,11 @@ void Creature::SaveToDB(uint32 mapid, ui
  246.          << GetPositionY() << ","
  247.          << GetPositionZ() << ","
  248.          << GetOrientation() << ","
  249. +        << GetTransOffsetX() << ","
  250. +        << GetTransOffsetY() << ","
  251. +        << GetTransOffsetZ() << ","
  252. +        << GetTransOffsetO() << ","
  253. +        << transGUID << ","
  254.          << m_respawnDelay << ","                            //respawn time
  255.          << (float) m_respawnradius << ","                   //spawn distance (float)
  256.          << (uint32) (0) << ","                              //currentwaypoint
  257. @@ -1164,7 +1180,32 @@ bool Creature::LoadFromDB(uint32 guid, M
  258.      if(!Create(guid, map, data->phaseMask, data->id, team, data))
  259.          return false;
  260.  
  261. -    Relocate(data->posX, data->posY, data->posZ, data->orientation);
  262. +    if (data->transguid > 0)
  263. +    {
  264. +        m_movementInfo.SetTransportData(ObjectGuid(HIGHGUID_MO_TRANSPORT, data->transguid), data->trans_x, data->trans_y, data->trans_z, data->trans_o, 0, -1);
  265. +        for (MapManager::TransportSet::const_iterator iter = sMapMgr.m_Transports.begin(); iter != sMapMgr.m_Transports.end(); ++iter)
  266. +        {
  267. +            if( (*iter)->GetGUIDLow() == data->transguid)
  268. +            {
  269. +                SetTransport(*iter);
  270. +                GetTransport()->AddCreaturePassenger(this);
  271. +                SetLocationMapId(GetTransport()->GetMapId());
  272. +                Relocate(GetTransport()->GetPositionX() + data->trans_x, GetTransport()->GetPositionY() + data->trans_y, GetTransport()->GetPositionZ() + data->trans_z, data->trans_o);
  273. +                break;
  274. +            }
  275. +        }
  276. +    }
  277. +    else if (GetTransport())
  278. +    {
  279. +        m_movementInfo.SetTransportData(ObjectGuid(HIGHGUID_MO_TRANSPORT, GetTransport()->GetGUID()), GetTransOffsetX(), GetTransOffsetY(), GetTransOffsetZ(), GetTransOffsetO(), 0, -1);
  280. +        GetTransport()->AddCreaturePassenger(this);
  281. +        SetLocationMapId(GetTransport()->GetMapId());
  282. +        Relocate(GetTransport()->GetPositionX() + GetTransOffsetX(), GetTransport()->GetPositionY() + GetTransOffsetY(), GetTransport()->GetPositionZ() + GetTransOffsetZ(), GetTransOffsetO());
  283. +    }
  284. +    else
  285. +    {
  286. +        Relocate(data->posX, data->posY, data->posZ, data->orientation);
  287. +    }
  288.  
  289.      if(!IsPositionValid())
  290.      {
  291.  
  292. --- a/src/game/Transports.cpp
  293. +++ b/src/game/Transports.cpp
  294. @@ -23,6 +23,7 @@
  295.  #include "ObjectMgr.h"
  296.  #include "ObjectGuid.h"
  297.  #include "Path.h"
  298. +#include "Unit.h"
  299.  
  300.  #include "WorldPacket.h"
  301.  #include "DBCStores.h"
  302. @@ -431,7 +432,7 @@ void Transport::TeleportTransport(uint32
  303.      Map const* oldMap = GetMap();
  304.      Relocate(x, y, z);
  305.  
  306. -    for(PlayerSet::iterator itr = m_passengers.begin(); itr != m_passengers.end();)
  307. +    for(PlayerSet::iterator itr = m_player_passengers.begin(); itr != m_player_passengers.end();)
  308.      {
  309.          PlayerSet::iterator it2 = itr;
  310.          ++itr;
  311. @@ -439,7 +440,7 @@ void Transport::TeleportTransport(uint32
  312.          Player *plr = *it2;
  313.          if(!plr)
  314.          {
  315. -            m_passengers.erase(it2);
  316. +            m_player_passengers.erase(it2);
  317.              continue;
  318.          }
  319.  
  320. @@ -458,6 +459,19 @@ void Transport::TeleportTransport(uint32
  321.      //player far teleport would try to create same instance, but we need it NOW for transport...
  322.      //correct me if I'm wrong O.o
  323.      Map * newMap = sMapMgr.CreateMap(newMapid, this);
  324. +    for (CreatureSet::iterator itr = m_creature_passengers.begin(); itr != m_creature_passengers.end(); ++itr)
  325. +    {
  326. +        if(!(*itr))
  327. +        {
  328. +            m_creature_passengers.erase(itr);
  329. +            continue;
  330. +        }
  331. +
  332. +        (*itr)->RemoveFromWorld();
  333. +        (*itr)->SetMap(newMap);
  334. +        newMap->CreatureRelocation(*itr, GetPositionX() + x, GetPositionY() + y, GetPositionZ() + z, (*itr)->GetOrientation());
  335. +        newMap->Add(*itr);
  336. +    }
  337.      SetMap(newMap);
  338.  
  339.      if(oldMap != newMap)
  340. @@ -467,23 +481,66 @@ void Transport::TeleportTransport(uint32
  341.      }
  342.  }
  343.  
  344. -bool Transport::AddPassenger(Player* passenger)
  345. +bool Transport::AddPlayerPassenger(Player* passenger)
  346.  {
  347. -    if (m_passengers.find(passenger) == m_passengers.end())
  348. -    {
  349. -        DETAIL_LOG("Player %s boarded transport %s.", passenger->GetName(), GetName());
  350. -        m_passengers.insert(passenger);
  351. -    }
  352. +    if (m_player_passengers.find(passenger) != m_player_passengers.end())
  353. +        return false;
  354. +
  355. +    m_player_passengers.insert(passenger);
  356. +
  357. +    DEBUG_LOG("Player %s boarded transport %s.", passenger->GetName(), GetName());
  358. +
  359.      return true;
  360.  }
  361.  
  362. -bool Transport::RemovePassenger(Player* passenger)
  363. +bool Transport::AddCreaturePassenger(Creature* passenger)
  364.  {
  365. -    if (m_passengers.erase(passenger))
  366. -        DETAIL_LOG("Player %s removed from transport %s.", passenger->GetName(), GetName());
  367. +    if (m_creature_passengers.find(passenger) != m_creature_passengers.end())
  368. +        return false;
  369. +
  370. +    m_creature_passengers.insert(passenger);
  371. +
  372. +    DEBUG_LOG("Creature %s boarded transport %s.", passenger->GetName(), GetName());
  373. +
  374.      return true;
  375.  }
  376.  
  377. +bool Transport::RemovePlayerPassenger(Player* passenger)
  378. +{
  379. +    if (!m_player_passengers.erase(passenger))
  380. +        return false;
  381. +
  382. +    DEBUG_LOG("Player %s removed from transport %s.", passenger->GetName(), GetName());
  383. +
  384. +    return true;
  385. +}
  386. +
  387. +bool Transport::RemoveCreaturePassenger(Creature* passenger)
  388. +{
  389. +    if (!m_creature_passengers.erase(passenger))
  390. +        return false;
  391. +
  392. +    DEBUG_LOG("Creature %s removed from transport %s.", passenger->GetName(), GetName());
  393. +
  394. +    return true;
  395. +}
  396. +
  397. +void Transport::BuildCreateUpdateBlockForPlayer(UpdateData* data, Player* target)
  398. +{
  399. +    for (CreatureSet::const_iterator itr = m_creature_passengers.begin(); itr != m_creature_passengers.end(); ++itr)
  400. +    {
  401. +        if (!(*itr))
  402. +        {
  403. +            m_creature_passengers.erase(itr);
  404. +            continue;
  405. +        }
  406. +
  407. +        (*itr)->BuildCreateUpdateBlockForPlayer(data, target);
  408. +    }
  409. +
  410. +    Object::BuildCreateUpdateBlockForPlayer(data, target);
  411. +}
  412. +
  413.  void Transport::Update(uint32 /*p_time*/)
  414.  {
  415.      if (m_WayPoints.size() <= 1)
  416. @@ -519,6 +576,17 @@ void Transport::Update(uint32 /*p_time*/
  417.          }
  418.          */
  419.  
  420. +        for (CreatureSet::const_iterator itr = m_creature_passengers.begin(); itr != m_creature_passengers.end(); itr++)
  421. +        {
  422. +            if (!(*itr))
  423. +            {
  424. +                m_creature_passengers.erase(itr);
  425. +                continue;
  426. +            }
  427. +
  428. +            (*itr)->GetMap()->CreatureRelocation(*itr, m_curr->second.x + (*itr)->GetTransOffsetX(), m_curr->second.y + (*itr)->GetTransOffsetY(), m_curr->second.z + (*itr)->GetTransOffsetZ(), (*itr)->GetTransOffsetO());
  429. +        }
  430. +
  431.          m_nextNodeTime = m_curr->first;
  432.  
  433.          if (m_curr == m_WayPoints.begin())
  434.  
  435. --- a/src/game/Transports.h
  436. +++ b/src/game/Transports.h
  437. @@ -33,11 +33,18 @@ class Transport : public GameObject
  438.          bool Create(uint32 guidlow, uint32 mapid, float x, float y, float z, float ang, uint32 animprogress, uint32 dynflags);
  439.          bool GenerateWaypoints(uint32 pathid, std::set<uint32> &mapids);
  440.          void Update(uint32 p_time);
  441. -        bool AddPassenger(Player* passenger);
  442. -        bool RemovePassenger(Player* passenger);
  443. +        bool AddPlayerPassenger(Player* passenger);
  444. +        bool AddCreaturePassenger(Creature* passenger);
  445. +        bool RemovePlayerPassenger(Player* passenger);
  446. +        bool RemoveCreaturePassenger(Creature* passenger);
  447.  
  448.          typedef std::set<Player*> PlayerSet;
  449. -        PlayerSet const& GetPassengers() const { return m_passengers; }
  450. +        typedef std::set<Creature*> CreatureSet;
  451. +
  452. +        PlayerSet const& GetPlayerPassengers() const { return m_player_passengers; }
  453. +        CreatureSet const& GetCreaturePassengers() const { return m_creature_passengers; }
  454. +
  455. +        void BuildCreateUpdateBlockForPlayer(UpdateData* data, Player* target);
  456.  
  457.      private:
  458.          struct WayPoint
  459. @@ -65,7 +72,8 @@ class Transport : public GameObject
  460.          uint32 m_pathTime;
  461.          uint32 m_timer;
  462.  
  463. -        PlayerSet m_passengers;
  464. +        PlayerSet m_player_passengers;
  465. +        CreatureSet m_creature_passengers;
  466.  
  467.      public:
  468.          WayPointMap m_WayPoints;
  469.  
  470. --- a/src/game/Unit.cpp
  471. +++ b/src/game/Unit.cpp
  472. @@ -48,6 +48,7 @@
  473.  #include "Traveller.h"
  474.  #include "VMapFactory.h"
  475.  #include "MovementGenerator.h"
  476. +#include "Transports.h"
  477.  
  478.  #include <math.h>
  479.  #include <stdarg.h>
  480. @@ -230,6 +231,8 @@ Unit::Unit()
  481.      m_CombatTimer = 0;
  482.      m_lastManaUseTimer = 0;
  483.  
  484. +    m_transport = NULL;
  485. +
  486.      //m_victimThreat = 0.0f;
  487.      for (int i = 0; i < MAX_SPELL_SCHOOL; ++i)
  488.          m_threatModifier[i] = 1.0f;
  489. @@ -344,8 +347,13 @@ void Unit::SendMonsterMove(float NewPosX
  490.  
  491.      float moveTime = (float)Time;
  492.  
  493. -    WorldPacket data( SMSG_MONSTER_MOVE, (41 + GetPackGUID().size()) );
  494. +    WorldPacket data( (m_transport) ? SMSG_MONSTER_MOVE_TRANSPORT : SMSG_MONSTER_MOVE, (41 + GetPackGUID().size()) );
  495.      data << GetPackGUID();
  496. +    if (m_transport)
  497. +    {
  498. +        data.appendPackGUID(m_transport->GetGUID());
  499. +        data << uint8(0);
  500. +    }
  501.      data << uint8(0);                                       // new in 3.1 bool, used to toggle MOVEFLAG2_UNK4 = 0x0040 on client side
  502.      data << GetPositionX() << GetPositionY() << GetPositionZ();
  503.      data << uint32(getMSTime());
  504. @@ -377,7 +385,14 @@ void Unit::SendMonsterMove(float NewPosX
  505.      data << uint32(flags);                                  // splineflags
  506.      data << uint32(moveTime);                               // Time in between points
  507.      data << uint32(1);                                      // 1 single waypoint
  508. -    data << NewPosX << NewPosY << NewPosZ;                  // the single waypoint Point B
  509. +    if (m_transport)
  510. +    {
  511. +        data << m_movementInfo.GetTransportPos()->x << m_movementInfo.GetTransportPos()->y << m_movementInfo.GetTransportPos()->z;
  512. +    }
  513. +    else
  514. +    {
  515. +        data << NewPosX << NewPosY << NewPosZ;                  // the single waypoint Point B
  516. +    }
  517.  
  518.      va_end(vargs);
  519.  
  520.  
  521. --- a/src/game/MovementHandler.cpp
  522. +++ b/src/game/MovementHandler.cpp
  523. @@ -266,24 +266,24 @@ void WorldSession::HandleMovementOpcodes
  524.          }
  525.  
  526.          // if we boarded a transport, add us to it
  527. -        if (plMover && !plMover->m_transport)
  528. +       if (plMover && !plMover->GetTransport())
  529.          {
  530.              // elevators also cause the client to send MOVEFLAG_ONTRANSPORT - just unmount if the guid can be found in the transport list
  531.              for (MapManager::TransportSet::const_iterator iter = sMapMgr.m_Transports.begin(); iter != sMapMgr.m_Transports.end(); ++iter)
  532.              {
  533.                  if ((*iter)->GetObjectGuid() == movementInfo.GetTransportGuid())
  534.                  {
  535. -                    plMover->m_transport = (*iter);
  536. -                    (*iter)->AddPassenger(plMover);
  537. +                   plMover->SetTransport(*iter);
  538. +                    (*iter)->AddPlayerPassenger(plMover);
  539.                      break;
  540.                  }
  541.              }
  542.          }
  543.      }
  544. -    else if (plMover && plMover->m_transport)               // if we were on a transport, leave
  545. +   else if (plMover && plMover->GetTransport())               // if we were on a transport, leave
  546.      {
  547. -        plMover->m_transport->RemovePassenger(plMover);
  548. -        plMover->m_transport = NULL;
  549. +       plMover->GetTransport()->RemovePlayerPassenger(plMover);
  550. +       plMover->SetTransport(NULL);
  551.          movementInfo.ClearTransportData();
  552.      }
  553.  
  554.  
  555. --- a/src/game/Player.cpp
  556. +++ b/src/game/Player.cpp
  557. @@ -407,8 +407,6 @@ UpdateMask Player::updateVisualBits;
  558.  
  559.  Player::Player (WorldSession *session): Unit(), m_achievementMgr(this), m_reputationMgr(this), m_mover(this), m_camera(this)
  560.  {
  561. -    m_transport = 0;
  562. -
  563.      m_speakTime = 0;
  564.      m_speakCount = 0;
  565.  
  566. @@ -621,9 +619,9 @@ Player::~Player ()
  567.  
  568.      delete PlayerTalkClass;
  569.  
  570. -    if (m_transport)
  571. -    {
  572. -        m_transport->RemovePassenger(this);
  573. +    if (GetTransport())
  574. +    {
  575. +        GetTransport()->RemovePlayerPassenger(this);
  576.      }
  577.  
  578.      for(size_t x = 0; x < ItemSetEff.size(); x++)
  579. @@ -1749,10 +1747,10 @@ bool Player::TeleportTo(uint32 mapid, fl
  580.      }
  581.  
  582.      // if we were on a transport, leave
  583. -    if (!(options & TELE_TO_NOT_LEAVE_TRANSPORT) && m_transport)
  584. -    {
  585. -        m_transport->RemovePassenger(this);
  586. -        m_transport = NULL;
  587. +    if (!(options & TELE_TO_NOT_LEAVE_TRANSPORT) && GetTransport())
  588. +    {
  589. +        GetTransport()->RemovePlayerPassenger(this);
  590. +        SetTransport(NULL);
  591.          m_movementInfo.ClearTransportData();
  592.      }
  593.  
  594. @@ -1769,7 +1767,7 @@ bool Player::TeleportTo(uint32 mapid, fl
  595.      // reset movement flags at teleport, because player will continue move with these flags after teleport
  596.      m_movementInfo.SetMovementFlags(MOVEFLAG_NONE);
  597.  
  598. -    if ((GetMapId() == mapid) && (!m_transport))
  599. +    if ((GetMapId() == mapid) && !GetTransport())
  600.      {
  601.          //lets reset far teleport flag if it wasn't reset during chained teleports
  602.          SetSemaphoreTeleportFar(false);
  603. @@ -1877,15 +1875,15 @@ bool Player::TeleportTo(uint32 mapid, fl
  604.                  // send transfer packets
  605.                  WorldPacket data(SMSG_TRANSFER_PENDING, (4+4+4));
  606.                  data << uint32(mapid);
  607. -                if (m_transport)
  608. -                {
  609. -                    data << uint32(m_transport->GetEntry());
  610. +                if (GetTransport())
  611. +                {
  612. +                    data << uint32(GetTransport()->GetEntry());
  613.                      data << uint32(GetMapId());
  614.                  }
  615.                  GetSession()->SendPacket(&data);
  616.  
  617.                  data.Initialize(SMSG_NEW_WORLD, (20));
  618. -                if (m_transport)
  619. +                if (GetTransport())
  620.                  {
  621.                      data << uint32(mapid);
  622.                      data << float(m_movementInfo.GetTransportPos()->x);
  623. @@ -1915,7 +1913,7 @@ bool Player::TeleportTo(uint32 mapid, fl
  624.              float final_z = z;
  625.              float final_o = orientation;
  626.  
  627. -            if (m_transport)
  628. +            if (GetTransport())
  629.              {
  630.                  final_x += m_movementInfo.GetTransportPos()->x;
  631.                  final_y += m_movementInfo.GetTransportPos()->y;
  632. @@ -15201,14 +15199,14 @@ bool Player::LoadFromDB( uint32 guid, Sq
  633.                      break;
  634.                  }
  635.  
  636. -                m_transport = *iter;
  637. -                m_transport->AddPassenger(this);
  638. -                SetLocationMapId(m_transport->GetMapId());
  639. -                break;
  640. -            }
  641. -        }
  642. -
  643. -        if(!m_transport)
  644. +                SetTransport(*iter);
  645. +                GetTransport()->AddPlayerPassenger(this);
  646. +                SetLocationMapId(GetTransport()->GetMapId());
  647. +                break;
  648. +            }
  649. +        }
  650. +
  651. +        if(!GetTransport())
  652.          {
  653.              sLog.outError("Player (guidlow %d) have problems with transport guid (%u). Teleport to default race/class locations.",
  654.                  guid,transGUID);
  655. @@ -16736,8 +16734,8 @@ void Player::SaveToDB()
  656.      ss << finiteAlways(m_movementInfo.GetTransportPos()->y) << ", ";
  657.      ss << finiteAlways(m_movementInfo.GetTransportPos()->z) << ", ";
  658.      ss << finiteAlways(m_movementInfo.GetTransportPos()->o) << ", ";
  659. -    if (m_transport)
  660. -        ss << m_transport->GetGUIDLow();
  661. +    if (GetTransport())
  662. +        ss << GetTransport()->GetGUIDLow();
  663.      else
  664.          ss << "0";
  665.      ss << ", ";
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement