Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[12105] Implement abstract classes for transporter
This includes class TransportBase as helper class for transporter And class TransportInfo has helper class for passengers on a transporter Signed-off-by: Schmoozerd <schmoozerd@scriptdev2.com>
- Loading branch information
1 parent
5bb227c
commit fab94fa
Showing
7 changed files
with
303 additions
and
3 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,161 @@ | ||
/* | ||
* Copyright (C) 2005-2012 MaNGOS <http://getmangos.com/> | ||
* | ||
* This program is free software; you can redistribute it and/or modify | ||
* it under the terms of the GNU General Public License as published by | ||
* the Free Software Foundation; either version 2 of the License, or | ||
* (at your option) any later version. | ||
* | ||
* This program is distributed in the hope that it will be useful, | ||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
* GNU General Public License for more details. | ||
* | ||
* You should have received a copy of the GNU General Public License | ||
* along with this program; if not, write to the Free Software | ||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
*/ | ||
|
||
/** | ||
* @addtogroup TransportSystem | ||
* @{ | ||
* | ||
* @file TransportSystem.cpp | ||
* This file contains the code needed for MaNGOS to provide abstract support for transported entities | ||
* Currently implemented | ||
* - Calculating between local and global coords | ||
* | ||
*/ | ||
|
||
#include "TransportSystem.h" | ||
#include "Unit.h" | ||
#include "Vehicle.h" | ||
#include "MapManager.h" | ||
|
||
/* **************************************** TransportBase ****************************************/ | ||
|
||
TransportBase::TransportBase(WorldObject* owner) : | ||
m_owner(owner), | ||
m_lastPosition(owner->GetPositionX(), owner->GetPositionY(), owner->GetPositionZ(), owner->GetOrientation()), | ||
m_sinO(sin(m_lastPosition.o)), | ||
m_cosO(cos(m_lastPosition.o)), | ||
m_updatePositionsTimer(500) | ||
{ | ||
MANGOS_ASSERT(m_owner); | ||
} | ||
|
||
TransportBase::~TransportBase() | ||
{ | ||
MANGOS_ASSERT(m_passengers.size() == 0); | ||
} | ||
|
||
// Update every now and then (after some change of transporter's position) | ||
// This is used to calculate global positions (which don't have to be exact, they are only required for some server-side calculations | ||
void TransportBase::Update(uint32 diff) | ||
{ | ||
if (m_updatePositionsTimer < diff) | ||
{ | ||
if (fabs(m_owner->GetPositionX() - m_lastPosition.x) + | ||
fabs(m_owner->GetPositionY() - m_lastPosition.y) + | ||
fabs(m_owner->GetPositionZ() - m_lastPosition.z) > 1.0f || | ||
MapManager::NormalizeOrientation(m_owner->GetOrientation() - m_lastPosition.o) > 0.01f) | ||
UpdateGlobalPositions(); | ||
|
||
m_updatePositionsTimer = 500; | ||
} | ||
else | ||
m_updatePositionsTimer -= diff; | ||
} | ||
|
||
// Update the global positions of all passengers | ||
void TransportBase::UpdateGlobalPositions() | ||
{ | ||
Position pos(m_owner->GetPositionX(), m_owner->GetPositionY(), | ||
m_owner->GetPositionZ(), m_owner->GetOrientation()); | ||
|
||
// Calculate new direction multipliers | ||
if (MapManager::NormalizeOrientation(pos.o - m_lastPosition.o) > 0.01f) | ||
{ | ||
m_sinO = sin(pos.o); | ||
m_cosO = cos(pos.o); | ||
} | ||
|
||
// Update global positions | ||
for (PassengerMap::const_iterator itr = m_passengers.begin(); itr != m_passengers.end(); ++itr) | ||
UpdateGlobalPositionOf(itr->first, itr->second->GetLocalPositionX(), itr->second->GetLocalPositionY(), | ||
itr->second->GetLocalPositionZ(), itr->second->GetLocalOrientation()); | ||
|
||
m_lastPosition = pos; | ||
} | ||
|
||
// Update the global position of a passenger | ||
void TransportBase::UpdateGlobalPositionOf(WorldObject* passenger, float lx, float ly, float lz, float lo) const | ||
{ | ||
float gx, gy, gz, go; | ||
CalculateGlobalPositionOf(lx, ly, lz, lo, gx, gy, gz, go); | ||
|
||
if (passenger->GetTypeId() == TYPEID_PLAYER || passenger->GetTypeId() == TYPEID_UNIT) | ||
{ | ||
if (passenger->GetTypeId() == TYPEID_PLAYER) | ||
{ | ||
m_owner->GetMap()->PlayerRelocation((Player*)passenger, gx, gy, gz, go); | ||
} | ||
else | ||
m_owner->GetMap()->CreatureRelocation((Creature*)passenger, gx, gy, gz, go); | ||
|
||
//// If passenger is vehicle | ||
//if (((Unit*)passenger)->IsVehicle()) | ||
// ((Unit*)passenger)->GetVehicleInfo()->UpdateGlobalPositions(); | ||
} | ||
// ToDo: Add gameobject relocation | ||
// ToDo: Add passenger relocation for MO transports | ||
} | ||
|
||
// This rotates the vector (lx, ly) by transporter->orientation | ||
void TransportBase::RotateLocalPosition(float lx, float ly, float& rx, float& ry) const | ||
{ | ||
rx = lx * m_cosO - ly * m_sinO; | ||
ry = lx * m_sinO + ly * m_cosO; | ||
} | ||
|
||
// This rotates the vector (rx, ry) by -transporter->orientation | ||
void TransportBase::NormalizeRotatedPosition(float rx, float ry, float& lx, float& ly) const | ||
{ | ||
lx = rx * -m_cosO - ry * -m_sinO; | ||
ly = rx * -m_sinO + ry * -m_cosO; | ||
} | ||
|
||
// Calculate a global position of local positions based on this transporter | ||
void TransportBase::CalculateGlobalPositionOf(float lx, float ly, float lz, float lo, float& gx, float& gy, float& gz, float& go) const | ||
{ | ||
RotateLocalPosition(lx, ly, gx, gy); | ||
gx += m_owner->GetPositionX(); | ||
gy += m_owner->GetPositionY(); | ||
|
||
gz = lz + m_owner->GetPositionZ(); | ||
go = MapManager::NormalizeOrientation(lo + m_owner->GetOrientation()); | ||
} | ||
|
||
/* **************************************** TransportInfo ****************************************/ | ||
|
||
TransportInfo::TransportInfo(WorldObject* owner, TransportBase* transport, float lx, float ly, float lz, float lo, uint8 seat) : | ||
m_owner(owner), | ||
m_transport(transport), | ||
m_localPosition(lx, ly, lz, lo), | ||
m_seat(seat) | ||
{ | ||
MANGOS_ASSERT(owner && m_transport); | ||
} | ||
|
||
void TransportInfo::SetLocalPosition(float lx, float ly, float lz, float lo) | ||
{ | ||
m_localPosition.x = lx; | ||
m_localPosition.y = ly; | ||
m_localPosition.z = lz; | ||
m_localPosition.o = lo; | ||
|
||
// Update global position | ||
m_transport->UpdateGlobalPositionOf(m_owner, lx, ly, lz, lo); | ||
} | ||
|
||
/*! @} */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,122 @@ | ||
/* | ||
* Copyright (C) 2005-2012 MaNGOS <http://getmangos.com/> | ||
* | ||
* This program is free software; you can redistribute it and/or modify | ||
* it under the terms of the GNU General Public License as published by | ||
* the Free Software Foundation; either version 2 of the License, or | ||
* (at your option) any later version. | ||
* | ||
* This program is distributed in the hope that it will be useful, | ||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
* GNU General Public License for more details. | ||
* | ||
* You should have received a copy of the GNU General Public License | ||
* along with this program; if not, write to the Free Software | ||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
*/ | ||
|
||
/** | ||
* @addtogroup TransportSystem to provide abstract support for transported entities | ||
* The Transport System in MaNGOS consists of these files: | ||
* - TransportSystem.h to provide the basic classes TransportBase and TransportInfo | ||
* - TransportSystem.cpp which implements these classes | ||
* - Vehicle.h as a vehicle is a transporter it will inherit itr transporter-information from TransportBase | ||
* - Transports.h to implement the MOTransporter (subclas of gameobject) - Remains TODO | ||
* as well of | ||
* - impacts to various files | ||
* | ||
* @{ | ||
* | ||
* @file TransportSystem.h | ||
* This file contains the headers for base clases needed for MaNGOS to handle passengers on transports | ||
* | ||
*/ | ||
|
||
#ifndef _TRANSPORT_SYSTEM_H | ||
#define _TRANSPORT_SYSTEM_H | ||
|
||
#include "Common.h" | ||
#include "Object.h" | ||
|
||
class TransportInfo; | ||
|
||
typedef UNORDERED_MAP < WorldObject* /*passenger*/, TransportInfo* /*passengerInfo*/ > PassengerMap; | ||
|
||
/** | ||
* A class to provide basic support for each transporter. This includes | ||
* - Storing a list of passengers | ||
* - Providing helper for calculating between local and global coordinates | ||
*/ | ||
|
||
class TransportBase | ||
{ | ||
public: | ||
explicit TransportBase(WorldObject* owner); | ||
~TransportBase(); | ||
|
||
void Update(uint32 diff); | ||
void UpdateGlobalPositions(); | ||
void UpdateGlobalPositionOf(WorldObject* passenger, float lx, float ly, float lz, float lo) const; | ||
|
||
WorldObject* GetOwner() const { return m_owner; } | ||
|
||
// Helper functions to calculate positions | ||
void RotateLocalPosition(float lx, float ly, float& rx, float& ry) const; | ||
void NormalizeRotatedPosition(float rx, float ry, float& lx, float& ly) const; | ||
|
||
void CalculateGlobalPositionOf(float lx, float ly, float lz, float lo, float& gx, float& gy, float& gz, float& go) const; | ||
|
||
protected: | ||
WorldObject* m_owner; ///< The transporting unit | ||
PassengerMap m_passengers; ///< List of passengers and their transport-information | ||
|
||
// Helpers to speedup position calculations | ||
Position m_lastPosition; | ||
float m_sinO, m_cosO; | ||
uint32 m_updatePositionsTimer; ///< Timer that is used to trigger updates for global coordinate calculations | ||
}; | ||
|
||
/** | ||
* A class to provide basic information for each transported passenger. This includes | ||
* - local positions | ||
* - Accessors to get the transporter | ||
*/ | ||
|
||
class TransportInfo | ||
{ | ||
public: | ||
explicit TransportInfo(WorldObject* owner, TransportBase* transport, float lx, float ly, float lz, float lo, uint8 seat); | ||
|
||
void SetLocalPosition(float lx, float ly, float lz, float lo); | ||
|
||
// Accessors | ||
WorldObject* GetTransport() const { return m_transport->GetOwner(); } | ||
ObjectGuid GetTransportGuid() const { return m_transport->GetOwner()->GetObjectGuid(); } | ||
|
||
// Required for chain-updating (passenger on transporter on transporter) | ||
bool IsOnVehicle() const { return m_transport->GetOwner()->GetTypeId() == TYPEID_PLAYER || m_transport->GetOwner()->GetTypeId() == TYPEID_UNIT; } | ||
|
||
// Get local position and seat | ||
uint8 GetTransportSeat() const { return m_seat; } | ||
float GetLocalOrientation() const { return m_localPosition.o; } | ||
float GetLocalPositionX() const { return m_localPosition.x; } | ||
float GetLocalPositionY() const { return m_localPosition.y; } | ||
float GetLocalPositionZ() const { return m_localPosition.z; } | ||
void GetLocalPosition(float& lx, float& ly, float& lz, float& lo) const | ||
{ | ||
lx = m_localPosition.x; | ||
ly = m_localPosition.y; | ||
lz = m_localPosition.z; | ||
lo = m_localPosition.o; | ||
} | ||
|
||
private: | ||
WorldObject* m_owner; ///< Passenger | ||
TransportBase* m_transport; ///< Transporter | ||
Position m_localPosition; | ||
uint8 m_seat; | ||
}; | ||
|
||
#endif | ||
/*! @} */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,4 +1,4 @@ | ||
#ifndef __REVISION_NR_H__ | ||
#define __REVISION_NR_H__ | ||
#define REVISION_NR "12104" | ||
#define REVISION_NR "12105" | ||
#endif // __REVISION_NR_H__ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
fab94fa
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Interesting rework of recent Shauren implementation of the on-transport moving... Only, I hope you know that it's pretty rough hack, and the transport moving realized is by "submap" moving? As I recall, a description of the mechanics, published in the last 2 years at least 3 times. Although, of course, the implementation of this type of traffic is very complicated...
fab94fa
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
false, false, maybe, depends.
fab94fa
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
o
fab94fa
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The map files for transports exist in game files for one purpose: to display a special loading screen during teleport. These maps have no terrain files for pathfinding (adt, wdt, wmo) - only the GameObject model (.m2) exists, but the map (not transport) is not linked to it in any way.
fab94fa
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@Shauren, m2 sufficient for create vmo and LOS/etc calculating (only pathfinding currently impossible). over a year ago i make simple realization of submap moving, works (but without dynamic_vmaps many other problems appears). but in current stage of mangos development no sence in this method...
fab94fa
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@rsa, while I agree that my implementation for this movement is not the best out there, I don't see the need for creating such complicated (as you stated in your first comment) thing as submap.
fab94fa
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@Shauren, i'm agree - this is challenging, maybe just the way (like yours) is much more effective. But without submaps you can not fully emulate blizz sniffs :) Also, in my opinion, the solution to this problem is very interesting ...
fab94fa
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
there is no submap.
fab94fa
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@rsa, actually you do get data like in sniffs on tc, we pay very much attention to that detail. If you believe that it's still not possible, I'll ask which part cannot be done fully blizzlike (which packet, where in that packet)