aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/game/Creature.cpp5
-rw-r--r--src/game/DBCStructure.h2
-rw-r--r--src/game/SpellAuras.cpp18
-rw-r--r--src/game/Unit.cpp15
-rw-r--r--src/game/Vehicle.cpp61
-rw-r--r--src/game/Vehicle.h3
6 files changed, 56 insertions, 48 deletions
diff --git a/src/game/Creature.cpp b/src/game/Creature.cpp
index 4ba8e66fc9f..3c90f4b3b62 100644
--- a/src/game/Creature.cpp
+++ b/src/game/Creature.cpp
@@ -1434,7 +1434,10 @@ bool Creature::CreateFromProto(uint32 guidlow, uint32 Entry, uint32 team, const
}
m_originalEntry = Entry;
- Object::_Create(guidlow, Entry, HIGHGUID_UNIT);
+ if(isVehicle())
+ Object::_Create(guidlow, Entry, HIGHGUID_VEHICLE);
+ else
+ Object::_Create(guidlow, Entry, HIGHGUID_UNIT);
if(!UpdateEntry(Entry, team, data))
return false;
diff --git a/src/game/DBCStructure.h b/src/game/DBCStructure.h
index 6862e0aa26d..a7433574162 100644
--- a/src/game/DBCStructure.h
+++ b/src/game/DBCStructure.h
@@ -1719,6 +1719,8 @@ struct VehicleSeatEntry
uint32 m_exitUISoundID; // 43
int32 m_uiSkin; // 44
uint32 m_flagsB; // 45
+
+ bool IsUsable() const { return m_flags & 0x2000000; }
};
struct WorldMapAreaEntry
diff --git a/src/game/SpellAuras.cpp b/src/game/SpellAuras.cpp
index 0c9acbec4b6..cc2d817dee3 100644
--- a/src/game/SpellAuras.cpp
+++ b/src/game/SpellAuras.cpp
@@ -6812,27 +6812,25 @@ void AuraEffect::HandleAuraControlVehicle(bool apply, bool Real, bool /*changeAm
return;
Unit *caster = GetCaster();
- if(!caster)
+ if(!caster || caster == m_target)
return;
- /*Vehicle *vehicle = dynamic_cast<Vehicle*>(m_target);
+ Vehicle *vehicle = dynamic_cast<Vehicle*>(m_target);
if (apply)
{
- if(caster->GetTypeId() == TYPEID_PLAYER)
- if(Pet *pet = ((Player*)caster)->GetPet())
- pet->Remove(PET_SAVE_AS_CURRENT);
- caster->EnterVehicle(vehicle);
+ //if(caster->GetTypeId() == TYPEID_PLAYER)
+ // if(Pet *pet = ((Player*)caster)->GetPet())
+ // pet->Remove(PET_SAVE_AS_CURRENT);
+ caster->EnterVehicle(vehicle, 0);
}
else
{
- SpellEntry const *spell = GetSpellProto();
-
// some SPELL_AURA_CONTROL_VEHICLE auras have a dummy effect on the player - remove them
- caster->RemoveAurasDueToSpell(spell->Id);
+ caster->RemoveAurasDueToSpell(GetId());
caster->ExitVehicle();
- }*/
+ }
}
void AuraEffect::HandleAuraConvertRune(bool apply, bool Real, bool /*changeAmount*/)
diff --git a/src/game/Unit.cpp b/src/game/Unit.cpp
index b0586b5c597..a583964560e 100644
--- a/src/game/Unit.cpp
+++ b/src/game/Unit.cpp
@@ -10652,8 +10652,8 @@ bool Unit::CanHaveThreatList() const
return false;
// vehicles can not have threat list
- if( ((Creature*)this)->isVehicle() )
- return false;
+ //if( ((Creature*)this)->isVehicle() )
+ // return false;
// pets can not have a threat list, unless they are controlled by a creature
if( ((Creature*)this)->isPet() && IS_PLAYER_GUID(((Pet*)this)->GetOwnerGUID()) )
@@ -13929,6 +13929,9 @@ void Unit::JumpTo(WorldObject *obj, float speedZ)
void Unit::EnterVehicle(Vehicle *vehicle, int8 seatId)
{
+ if(!isAlive() || this == vehicle)
+ return;
+
if(m_Vehicle)
{
if(m_Vehicle == vehicle)
@@ -14021,10 +14024,12 @@ void Unit::ExitVehicle()
BuildHeartBeatMsg(&data);
SendMessageToSet(&data, false);
- if(m_Vehicle->GetOwnerGUID() == GetGUID())
- m_Vehicle->Dismiss();
-
+ // This should be done before dismiss, because there may be some aura removal
+ Vehicle *vehicle = m_Vehicle;
m_Vehicle = NULL;
+
+ if(vehicle->GetOwnerGUID() == GetGUID())
+ vehicle->Dismiss();
}
void Unit::BuildMovementPacket(ByteBuffer *data) const
diff --git a/src/game/Vehicle.cpp b/src/game/Vehicle.cpp
index d05c7085bff..bfc87011761 100644
--- a/src/game/Vehicle.cpp
+++ b/src/game/Vehicle.cpp
@@ -26,7 +26,7 @@
#include "Chat.h"
-Vehicle::Vehicle() : Creature(), m_vehicleInfo(NULL)
+Vehicle::Vehicle() : Creature(), m_vehicleInfo(NULL), m_usableSeatNum(0)
{
m_summonMask |= SUMMON_MASK_VEHICLE;
m_updateFlag = (UPDATEFLAG_LOWGUID | UPDATEFLAG_HIGHGUID | UPDATEFLAG_LIVING | UPDATEFLAG_HAS_POSITION | UPDATEFLAG_VEHICLE);
@@ -90,31 +90,12 @@ void Vehicle::Update(uint32 diff)
// ModifyPower(POWER_ENERGY, 1);
}
-bool Vehicle::Create(uint32 guidlow, Map *map, uint32 phaseMask, uint32 Entry, uint32 vehicleId, uint32 team)
+bool Vehicle::Create(uint32 guidlow, Map *map, uint32 phaseMask, uint32 Entry, uint32 vehicleId, uint32 team, const CreatureData * data)
{
- //sLog.outError("create vehicle begin");
- SetMapId(map->GetId());
- SetInstanceId(map->GetInstanceId());
-
- Object::_Create(guidlow, Entry, HIGHGUID_VEHICLE);
-
- if(!InitEntry(Entry, team))
+ if(!Creature::Create(guidlow, map, phaseMask, Entry, team, data))
return false;
- m_defaultMovementType = IDLE_MOTION_TYPE;
-
SetVehicleId(vehicleId);
-
- SetUInt32Value(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPELLCLICK);
- SetFloatValue(UNIT_FIELD_HOVERHEIGHT, 1.0f);
-
- CreatureInfo const *ci = GetCreatureInfo();
- setFaction(team == ALLIANCE ? ci->faction_A : ci->faction_H);
- SetMaxHealth(ci->maxhealth);
- SelectLevel(ci);
- SetHealth(GetMaxHealth());
-
- //sLog.outError("create vehicle end");
return true;
}
@@ -143,16 +124,22 @@ void Vehicle::SetVehicleId(uint32 id)
RemoveAllPassengers();
m_Seats.clear();
+ m_usableSeatNum = 0;
for(uint32 i = 0; i < 8; ++i)
{
- uint32 seatId = m_vehicleInfo->m_seatID[i];
- if(seatId)
+ if(uint32 seatId = m_vehicleInfo->m_seatID[i])
if(VehicleSeatEntry const *veSeat = sVehicleSeatStore.LookupEntry(seatId))
+ {
m_Seats.insert(std::make_pair(i, VehicleSeat(veSeat)));
+ if(veSeat->IsUsable())
+ ++m_usableSeatNum;
+ }
}
assert(!m_Seats.empty());
+ if(m_usableSeatNum)
+ SetUInt32Value(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPELLCLICK);
}
bool Vehicle::HasEmptySeat(int8 seatId) const
@@ -166,7 +153,7 @@ int8 Vehicle::GetNextEmptySeat(int8 seatId, bool next) const
{
SeatMap::const_iterator seat = m_Seats.find(seatId);
if(seat == m_Seats.end()) return -1;
- while(seat->second.passenger)
+ while(seat->second.passenger || !seat->second.seatInfo->IsUsable())
{
if(next)
{
@@ -181,7 +168,7 @@ int8 Vehicle::GetNextEmptySeat(int8 seatId, bool next) const
--seat;
}
if(seat->first == seatId)
- return -1;
+ return -1; // no available seat
}
return seat->first;
}
@@ -206,7 +193,7 @@ bool Vehicle::AddPassenger(Unit *unit, int8 seatId)
if(seatId < 0) // no specific seat requirement
{
for(seat = m_Seats.begin(); seat != m_Seats.end(); ++seat)
- if(!seat->second.passenger)
+ if(!seat->second.passenger && seat->second.seatInfo->IsUsable())
break;
if(seat == m_Seats.end()) // no available seat
@@ -227,8 +214,14 @@ bool Vehicle::AddPassenger(Unit *unit, int8 seatId)
sLog.outDebug("Unit %s enter vehicle entry %u id %u dbguid %u", unit->GetName(), GetEntry(), m_vehicleInfo->m_ID, GetDBTableGUIDLow());
seat->second.passenger = unit;
+ if(seat->second.seatInfo->IsUsable())
+ {
+ assert(m_usableSeatNum);
+ --m_usableSeatNum;
+ if(!m_usableSeatNum)
+ RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPELLCLICK);
+ }
- //RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPELLCLICK);
//SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNK_24);
unit->AddUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT);
@@ -250,7 +243,7 @@ bool Vehicle::AddPassenger(Unit *unit, int8 seatId)
{
//ChatHandler(player).PSendSysMessage("Enter seat %u %u", veSeat->m_ID, seat->first);
- if(seat->first == 0)
+ if(seat->first == 0 && seat->second.seatInfo->IsUsable()) // not right
{
((Player*)unit)->SetCharm(this, true);
((Player*)unit)->SetViewpoint(this, true);
@@ -278,6 +271,12 @@ void Vehicle::RemovePassenger(Unit *unit)
if(seat->second.passenger == unit)
{
seat->second.passenger = NULL;
+ if(seat->second.seatInfo->IsUsable())
+ {
+ if(!m_usableSeatNum)
+ SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPELLCLICK);
+ ++m_usableSeatNum;
+ }
break;
}
}
@@ -288,7 +287,7 @@ void Vehicle::RemovePassenger(Unit *unit)
//SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPELLCLICK);
- if(unit->GetTypeId() == TYPEID_PLAYER && seat->first == 0)
+ if(unit->GetTypeId() == TYPEID_PLAYER && seat->first == 0 && seat->second.seatInfo->IsUsable())
{
((Player*)unit)->SetCharm(this, false);
((Player*)unit)->SetViewpoint(this, false);
@@ -337,7 +336,7 @@ bool Vehicle::LoadFromDB(uint32 guid, Map *map)
if (map->GetInstanceId() != 0) guid = objmgr.GenerateLowGuid(HIGHGUID_VEHICLE);
uint16 team = 0;
- if(!Create(guid,map,data->phaseMask,data->id,id,team))
+ if(!Create(guid,map,data->phaseMask,data->id,id,team,data))
return false;
Relocate(data->posX,data->posY,data->posZ,data->orientation);
diff --git a/src/game/Vehicle.h b/src/game/Vehicle.h
index 4ff7ec90c53..083033c7574 100644
--- a/src/game/Vehicle.h
+++ b/src/game/Vehicle.h
@@ -44,7 +44,7 @@ class Vehicle : public Creature
void AddToWorld();
void RemoveFromWorld();
- bool Create (uint32 guidlow, Map *map, uint32 phaseMask, uint32 Entry, uint32 vehicleId, uint32 team);
+ bool Create (uint32 guidlow, Map *map, uint32 phaseMask, uint32 Entry, uint32 vehicleId, uint32 team, const CreatureData * data = NULL);
void setDeathState(DeathState s); // overwrite virtual Creature::setDeathState and Unit::setDeathState
void Update(uint32 diff); // overwrite virtual Creature::Update and Unit::Update
@@ -64,6 +64,7 @@ class Vehicle : public Creature
SeatMap m_Seats;
protected:
VehicleEntry const *m_vehicleInfo;
+ uint32 m_usableSeatNum;
void RemoveAllPassengers();