[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>
This commit is contained in:
kid10 2012-08-21 01:18:50 +02:00 committed by Antz
parent 48670fda6f
commit c00c314639
7 changed files with 301 additions and 19 deletions

View file

@ -78,6 +78,7 @@ typedef UNORDERED_MAP<Player*, UpdateData> UpdateDataMapType;
struct Position
{
Position() : x(0.0f), y(0.0f), z(0.0f), o(0.0f) {}
Position(float _x, float _y, float _z, float _o) : x(_x), y(_y), z(_z), o(_o) {}
float x, y, z, o;
};

View file

@ -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);
}
/*! @} */

122
src/game/TransportSystem.h Normal file
View file

@ -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
/*! @} */

View file

@ -1,4 +1,4 @@
#ifndef __REVISION_NR_H__
#define __REVISION_NR_H__
#define REVISION_NR "0145"
#define REVISION_NR "12105"
#endif // __REVISION_NR_H__

View file

@ -483,6 +483,7 @@
<ClCompile Include="..\..\src\game\Spell.cpp" />
<ClCompile Include="..\..\src\game\SpellAuras.cpp" />
<ClCompile Include="..\..\src\game\SQLStorages.cpp" />
<ClCompile Include="..\..\src\game\TransportSystem.cpp" />
<ClCompile Include="..\..\src\game\UnitAuraProcHandler.cpp" />
<ClCompile Include="..\..\src\game\SpellEffects.cpp" />
<ClCompile Include="..\..\src\game\SpellHandler.cpp" />
@ -659,6 +660,7 @@
<ClInclude Include="..\..\src\game\Totem.h" />
<ClInclude Include="..\..\src\game\TotemAI.h" />
<ClInclude Include="..\..\src\game\Transports.h" />
<ClInclude Include="..\..\src\game\TransportSystem.h" />
<ClInclude Include="..\..\src\game\Unit.h" />
<ClInclude Include="..\..\src\game\UnitEvents.h" />
<ClInclude Include="..\..\src\game\UpdateData.h" />

View file

@ -496,9 +496,6 @@
<ClCompile Include="..\..\src\game\Camera.cpp">
<Filter>Object</Filter>
</ClCompile>
<ClCompile Include="..\..\src\game\DBCStructure.cpp">
<Filter>Server</Filter>
</ClCompile>
<ClCompile Include="..\..\src\game\UnitAuraProcHandler.cpp">
<Filter>World/Handlers</Filter>
</ClCompile>
@ -544,8 +541,8 @@
<ClCompile Include="..\..\src\game\CreatureLinkingMgr.cpp">
<Filter>World/Handlers</Filter>
</ClCompile>
<ClCompile Include="..\..\src\game\DB2Stores.cpp">
<Filter>Server</Filter>
<ClCompile Include="..\..\src\game\TransportSystem.cpp">
<Filter>Object</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
@ -1006,9 +1003,6 @@
<ClInclude Include="..\..\src\game\vmap\WorldModel.h">
<Filter>vmaps</Filter>
</ClInclude>
<ClInclude Include="..\..\src\game\movement\MovementStructures.h">
<Filter>Movement</Filter>
</ClInclude>
<ClInclude Include="..\..\src\game\movement\MoveSpline.h">
<Filter>Movement</Filter>
</ClInclude>
@ -1036,14 +1030,8 @@
<ClInclude Include="..\..\src\game\CreatureLinkingMgr.h">
<Filter>World/Handlers</Filter>
</ClInclude>
<ClInclude Include="..\..\src\game\DB2fmt.h">
<Filter>Server</Filter>
</ClInclude>
<ClInclude Include="..\..\src\game\DB2Stores.h">
<Filter>Server</Filter>
</ClInclude>
<ClInclude Include="..\..\src\game\DB2Structure.h">
<Filter>Server</Filter>
<ClInclude Include="..\..\src\game\TransportSystem.h">
<Filter>Object</Filter>
</ClInclude>
</ItemGroup>
</Project>

View file

@ -1014,6 +1014,14 @@
RelativePath="..\..\src\game\Transports.h"
>
</File>
<File
RelativePath="..\..\src\game\TransportSystem.cpp"
>
</File>
<File
RelativePath="..\..\src\game\TransportSystem.h"
>
</File>
<File
RelativePath="..\..\src\game\UnitAuraProcHandler.cpp"
>