aboutsummaryrefslogtreecommitdiff
path: root/src/game/Vehicle.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/game/Vehicle.cpp')
-rw-r--r--src/game/Vehicle.cpp47
1 files changed, 46 insertions, 1 deletions
diff --git a/src/game/Vehicle.cpp b/src/game/Vehicle.cpp
index a8c8d5fa785..50236430bbe 100644
--- a/src/game/Vehicle.cpp
+++ b/src/game/Vehicle.cpp
@@ -15,6 +15,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
+
#include "Common.h"
#include "Log.h"
#include "ObjectMgr.h"
@@ -22,8 +23,10 @@
#include "Unit.h"
#include "Util.h"
#include "WorldPacket.h"
+
#include "CreatureAI.h"
#include "ZoneScript.h"
+
Vehicle::Vehicle(Unit *unit, VehicleEntry const *vehInfo) : me(unit), m_vehicleInfo(vehInfo), m_usableSeatNum(0)
{
for(uint32 i = 0; i < 8; ++i)
@@ -34,15 +37,17 @@ Vehicle::Vehicle(Unit *unit, VehicleEntry const *vehInfo) : me(unit), m_vehicleI
m_Seats.insert(std::make_pair(i, VehicleSeat(veSeat)));
if(veSeat->IsUsable())
++m_usableSeatNum;
- }
+ }
}
assert(!m_Seats.empty());
}
+
Vehicle::~Vehicle()
{
for(SeatMap::const_iterator itr = m_Seats.begin(); itr != m_Seats.end(); ++itr)
assert(!itr->second.passenger);
}
+
void Vehicle::Install()
{
if(Creature *cre = dynamic_cast<Creature*>(me))
@@ -63,11 +68,14 @@ void Vehicle::Install()
{
if(!cre->m_spells[i])
continue;
+
SpellEntry const *spellInfo = sSpellStore.LookupEntry(cre->m_spells[i]);
if(!spellInfo)
continue;
+
if(spellInfo->powerType == POWER_MANA)
break;
+
if(spellInfo->powerType == POWER_ENERGY)
{
me->setPowerType(POWER_ENERGY);
@@ -77,8 +85,10 @@ void Vehicle::Install()
}
}
}
+
Reset();
}
+
void Vehicle::InstallAllAccessories()
{
switch(me->GetEntry())
@@ -107,6 +117,7 @@ void Vehicle::InstallAllAccessories()
case 33214:InstallAccessory(33218,1,false);break; // Mechanolift 304-A
}
}
+
void Vehicle::Uninstall()
{
sLog.outDebug("Vehicle::Uninstall %u", me->GetEntry());
@@ -116,6 +127,7 @@ void Vehicle::Uninstall()
((TempSummon*)passenger)->UnSummon();
RemoveAllPassengers();
}
+
void Vehicle::Die()
{
sLog.outDebug("Vehicle::Die %u", me->GetEntry());
@@ -125,6 +137,7 @@ void Vehicle::Die()
passenger->setDeathState(JUST_DIED);
RemoveAllPassengers();
}
+
void Vehicle::Reset()
{
sLog.outDebug("Vehicle::Reset");
@@ -132,6 +145,7 @@ void Vehicle::Reset()
if(m_usableSeatNum)
me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPELLCLICK);
}
+
void Vehicle::RemoveAllPassengers()
{
sLog.outDebug("Vehicle::RemoveAllPassengers");
@@ -151,18 +165,21 @@ void Vehicle::RemoveAllPassengers()
}
}
}
+
bool Vehicle::HasEmptySeat(int8 seatId) const
{
SeatMap::const_iterator seat = m_Seats.find(seatId);
if(seat == m_Seats.end()) return false;
return !seat->second.passenger;
}
+
Unit *Vehicle::GetPassenger(int8 seatId) const
{
SeatMap::const_iterator seat = m_Seats.find(seatId);
if(seat == m_Seats.end()) return NULL;
return seat->second.passenger;
}
+
int8 Vehicle::GetNextEmptySeat(int8 seatId, bool next) const
{
SeatMap::const_iterator seat = m_Seats.find(seatId);
@@ -186,6 +203,7 @@ int8 Vehicle::GetNextEmptySeat(int8 seatId, bool next) const
}
return seat->first;
}
+
void Vehicle::InstallAccessory(uint32 entry, int8 seatId, bool minion)
{
if(Unit *passenger = GetPassenger(seatId))
@@ -200,6 +218,7 @@ void Vehicle::InstallAccessory(uint32 entry, int8 seatId, bool minion)
}
passenger->ExitVehicle(); // this should not happen
}
+
//TODO: accessory should be minion
if(Creature *accessory = me->SummonCreature(entry, *me, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30000))
{
@@ -210,16 +229,19 @@ void Vehicle::InstallAccessory(uint32 entry, int8 seatId, bool minion)
accessory->SendMovementFlagUpdate();
}
}
+
bool Vehicle::AddPassenger(Unit *unit, int8 seatId)
{
if(unit->GetVehicle() != this)
return false;
+
SeatMap::iterator seat;
if(seatId < 0) // no specific seat requirement
{
for(seat = m_Seats.begin(); seat != m_Seats.end(); ++seat)
if(!seat->second.passenger && seat->second.seatInfo->IsUsable())
break;
+
if(seat == m_Seats.end()) // no available seat
return false;
}
@@ -228,11 +250,15 @@ bool Vehicle::AddPassenger(Unit *unit, int8 seatId)
seat = m_Seats.find(seatId);
if(seat == m_Seats.end())
return false;
+
if(seat->second.passenger)
seat->second.passenger->ExitVehicle();
+
assert(!seat->second.passenger);
}
+
sLog.outDebug("Unit %s enter vehicle entry %u id %u dbguid %u seat %d", unit->GetName(), me->GetEntry(), m_vehicleInfo->m_ID, me->GetGUIDLow(), (int32)seat->first);
+
seat->second.passenger = unit;
if(seat->second.seatInfo->IsUsable())
{
@@ -241,9 +267,12 @@ bool Vehicle::AddPassenger(Unit *unit, int8 seatId)
if(!m_usableSeatNum)
me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPELLCLICK);
}
+
if(seat->second.seatInfo->m_flags && !(seat->second.seatInfo->m_flags & 0x400))
unit->addUnitState(UNIT_STAT_ONVEHICLE);
+
//SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PLAYER_CONTROLLED);
+
unit->AddUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT);
VehicleSeatEntry const *veSeat = seat->second.seatInfo;
unit->m_movementInfo.t_x = veSeat->m_attachmentOffsetX;
@@ -252,9 +281,11 @@ bool Vehicle::AddPassenger(Unit *unit, int8 seatId)
unit->m_movementInfo.t_o = 0;
unit->m_movementInfo.t_time = 0; // 1 for player
unit->m_movementInfo.t_seat = seat->first;
+
if(unit->GetTypeId() == TYPEID_PLAYER && seat->first == 0 && seat->second.seatInfo->m_flags & 0x800) // not right
if (!me->SetCharmedBy(unit, CHARM_TYPE_VEHICLE))
assert(false);
+
if(me->GetTypeId() == TYPEID_UNIT)
{
if(me->IsInWorld())
@@ -263,24 +294,32 @@ bool Vehicle::AddPassenger(Unit *unit, int8 seatId)
// move self = move all passengers
me->GetMap()->CreatureRelocation((Creature*)me, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation());
}
+
if(((Creature*)me)->IsAIEnabled)
((Creature*)me)->AI()->PassengerBoarded(unit, seat->first, true);
}
+
//if(unit->GetTypeId() == TYPEID_PLAYER)
// ((Player*)unit)->SendTeleportAckMsg();
//unit->SendMovementFlagUpdate();
+
return true;
}
+
void Vehicle::RemovePassenger(Unit *unit)
{
if(unit->GetVehicle() != this)
return;
+
SeatMap::iterator seat;
for(seat = m_Seats.begin(); seat != m_Seats.end(); ++seat)
if(seat->second.passenger == unit)
break;
+
assert(seat != m_Seats.end());
+
sLog.outDebug("Unit %s exit vehicle entry %u id %u dbguid %u seat %d", unit->GetName(), me->GetEntry(), m_vehicleInfo->m_ID, me->GetGUIDLow(), (int32)seat->first);
+
seat->second.passenger = NULL;
if(seat->second.seatInfo->IsUsable())
{
@@ -288,15 +327,21 @@ void Vehicle::RemovePassenger(Unit *unit)
me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPELLCLICK);
++m_usableSeatNum;
}
+
unit->clearUnitState(UNIT_STAT_ONVEHICLE);
+
//SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPELLCLICK);
+
if(unit->GetTypeId() == TYPEID_PLAYER && seat->first == 0 && seat->second.seatInfo->m_flags & 0x800)
me->RemoveCharmedBy(unit);
+
if(me->GetTypeId() == TYPEID_UNIT && ((Creature*)me)->IsAIEnabled)
((Creature*)me)->AI()->PassengerBoarded(unit, seat->first, false);
+
// only for flyable vehicles?
//CastSpell(this, 45472, true); // Parachute
}
+
void Vehicle::Dismiss()
{
sLog.outDebug("Vehicle::Dismiss %u", me->GetEntry());