aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rwxr-xr-xsrc/server/game/Entities/Vehicle/Vehicle.cpp113
-rwxr-xr-xsrc/server/game/Entities/Vehicle/Vehicle.h15
2 files changed, 79 insertions, 49 deletions
diff --git a/src/server/game/Entities/Vehicle/Vehicle.cpp b/src/server/game/Entities/Vehicle/Vehicle.cpp
index 71a9ad17f61..7c7a98d5bbd 100755
--- a/src/server/game/Entities/Vehicle/Vehicle.cpp
+++ b/src/server/game/Entities/Vehicle/Vehicle.cpp
@@ -27,13 +27,12 @@
#include "CreatureAI.h"
#include "ZoneScript.h"
-Vehicle::Vehicle(Unit *unit, VehicleEntry const *vehInfo, uint32 creatureEntry)
-: me(unit), m_vehicleInfo(vehInfo), m_usableSeatNum(0), m_bonusHP(0), m_creatureEntry(creatureEntry)
+Vehicle::Vehicle(Unit* unit, VehicleEntry const* vehInfo, uint32 creatureEntry) : me(unit), m_vehicleInfo(vehInfo), m_usableSeatNum(0), m_bonusHP(0), m_creatureEntry(creatureEntry)
{
for (uint32 i = 0; i < MAX_VEHICLE_SEATS; ++i)
{
if (uint32 seatId = m_vehicleInfo->m_seatID[i])
- if (VehicleSeatEntry const *veSeat = sVehicleSeatStore.LookupEntry(seatId))
+ if (VehicleSeatEntry const* veSeat = sVehicleSeatStore.LookupEntry(seatId))
{
m_Seats.insert(std::make_pair(i, VehicleSeat(veSeat)));
if (veSeat->CanEnterOrExit())
@@ -41,28 +40,6 @@ Vehicle::Vehicle(Unit *unit, VehicleEntry const *vehInfo, uint32 creatureEntry)
}
}
- // HACKY WAY, We must found a more generic way to handle this
- // Set inmunities since db ones are rewritten with player's ones
- switch (GetVehicleInfo()->m_ID)
- {
- case 160:
- me->SetControlled(true, UNIT_STAT_ROOT);
- me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_KNOCK_BACK, true);
- me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_KNOCK_BACK_DEST, true);
- case 158:
- me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_HEAL, true);
- me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_FEAR, true);
- me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_PERIODIC_HEAL, true);
- me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_STUN, true);
- me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_ROOT, true);
- me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_DECREASE_SPEED, true);
- me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_CONFUSE, true);
- me->ApplySpellImmune(0, IMMUNITY_ID, 49560, true); // Death Grip jump effect
- break;
- default:
- break;
- }
-
InitMovementInfoForBase();
}
@@ -74,7 +51,7 @@ Vehicle::~Vehicle()
void Vehicle::Install()
{
- if (Creature *pCreature = me->ToCreature())
+ if (Creature* creature = me->ToCreature())
{
switch (m_vehicleInfo->m_powerType)
{
@@ -93,10 +70,10 @@ void Vehicle::Install()
default:
for (uint32 i = 0; i < MAX_SPELL_VEHICLE; ++i)
{
- if (!pCreature->m_spells[i])
+ if (!creature->m_spells[i])
continue;
- SpellEntry const *spellInfo = sSpellStore.LookupEntry(pCreature->m_spells[i]);
+ SpellEntry const* spellInfo = sSpellStore.LookupEntry(creature->m_spells[i]);
if (!spellInfo)
continue;
@@ -151,6 +128,7 @@ void Vehicle::Reset(bool evading /*= false*/)
}
else
{
+ ApplyAllImmunities();
InstallAllAccessories(evading);
if (m_usableSeatNum)
me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPELLCLICK);
@@ -160,6 +138,59 @@ void Vehicle::Reset(bool evading /*= false*/)
sScriptMgr->OnReset(this);
}
+void Vehicle::ApplyAllImmunities()
+{
+ // This couldn't be done in DB, because Vehicle's immunities are overriden by Player's ones
+
+ // Vehicles should be immune on Knockback, Deathgrip ...
+ me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_KNOCK_BACK, true);
+ me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_KNOCK_BACK_DEST, true);
+ me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_GRIP, true);
+
+ // ... Fear, Snare, Root, Stun ...
+ me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_FEAR, true);
+ me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_SNARE, true);
+ me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_ROOT, true);
+ me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_STUN, true);
+ me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_STUN, true);
+ me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_DISORIENTED, true);
+ me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_CONFUSE, true);
+
+ // Mechanical units & vehicles ( which are not Bosses, they have own immunities in DB ) should be also immune on healing ( exceptions in switch below )
+ if (me->ToCreature() && me->ToCreature()->GetCreatureInfo()->type == CREATURE_TYPE_MECHANICAL && !me->ToCreature()->isWorldBoss())
+ {
+ // Heal & dispel ...
+ me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_HEAL, true);
+ me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_PERIODIC_HEAL, true);
+
+ // ... Shield & Immunity grant spells ...
+ me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_SCHOOL_IMMUNITY, true);
+ me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_UNATTACKABLE, true);
+ me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_SCHOOL_ABSORB, true);
+ me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_SHIELD, true);
+ me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_IMMUNE_SHIELD , true);
+
+ // ... Resistance, Split damage, Speed Increase, ...
+ me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_DAMAGE_SHIELD, true);
+ me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_SPLIT_DAMAGE_PCT, true);
+ me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_RESISTANCE, true);
+ me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_STAT, true);
+ me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN, true);
+ me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_INCREASE_SPEED, true);
+ }
+
+ // Different immunities for vehicles goes below
+ switch (GetVehicleInfo()->m_ID)
+ {
+ case 160:
+ me->SetControlled(true, UNIT_STAT_ROOT);
+ me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_DECREASE_SPEED, true);
+ break;
+ default:
+ break;
+ }
+}
+
void Vehicle::RemoveAllPassengers()
{
sLog->outDebug(LOG_FILTER_VEHICLES, "Vehicle::RemoveAllPassengers. Entry: %u, GuidLow: %u", m_creatureEntry, me->GetGUIDLow());
@@ -184,7 +215,7 @@ bool Vehicle::HasEmptySeat(int8 seatId) const
return !seat->second.passenger;
}
-Unit *Vehicle::GetPassenger(int8 seatId) const
+Unit* Vehicle::GetPassenger(int8 seatId) const
{
SeatMap::const_iterator seat = m_Seats.find(seatId);
if (seat == m_Seats.end())
@@ -241,7 +272,7 @@ void Vehicle::InstallAccessory(uint32 entry, int8 seatId, bool minion, uint8 typ
passenger->ExitVehicle(); // this should not happen
}
- if (TempSummon *accessory = me->SummonCreature(entry, *me, TempSummonType(type), summonTime))
+ if (TempSummon* accessory = me->SummonCreature(entry, *me, TempSummonType(type), summonTime))
{
if (minion)
accessory->AddUnitTypeMask(UNIT_MASK_ACCESSORY);
@@ -268,7 +299,7 @@ void Vehicle::InstallAccessory(uint32 entry, int8 seatId, bool minion, uint8 typ
}
}
-bool Vehicle::AddPassenger(Unit *unit, int8 seatId)
+bool Vehicle::AddPassenger(Unit* unit, int8 seatId)
{
if (unit->GetVehicle() != this)
return false;
@@ -320,7 +351,7 @@ bool Vehicle::AddPassenger(Unit *unit, int8 seatId)
unit->AddUnitState(UNIT_STAT_ONVEHICLE);
unit->AddUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT);
- VehicleSeatEntry const *veSeat = seat->second.seatInfo;
+ VehicleSeatEntry const* veSeat = seat->second.seatInfo;
unit->m_movementInfo.t_pos.m_positionX = veSeat->m_attachmentOffsetX;
unit->m_movementInfo.t_pos.m_positionY = veSeat->m_attachmentOffsetY;
unit->m_movementInfo.t_pos.m_positionZ = veSeat->m_attachmentOffsetZ;
@@ -336,10 +367,10 @@ bool Vehicle::AddPassenger(Unit *unit, int8 seatId)
ASSERT(false);
// hack: should be done by aura system
- if (VehicleScalingInfo const *scalingInfo = sObjectMgr->GetVehicleScalingInfo(m_vehicleInfo->m_ID))
+ if (VehicleScalingInfo const* scalingInfo = sObjectMgr->GetVehicleScalingInfo(m_vehicleInfo->m_ID))
{
- Player *plr = unit->ToPlayer();
- float averageItemLevel = plr->GetAverageItemLevel();
+ Player* player = unit->ToPlayer();
+ float averageItemLevel = player->GetAverageItemLevel();
if (averageItemLevel < scalingInfo->baseItemLevel)
averageItemLevel = scalingInfo->baseItemLevel;
averageItemLevel -= scalingInfo->baseItemLevel;
@@ -374,7 +405,7 @@ bool Vehicle::AddPassenger(Unit *unit, int8 seatId)
return true;
}
-void Vehicle::RemovePassenger(Unit *unit)
+void Vehicle::RemovePassenger(Unit* unit)
{
if (unit->GetVehicle() != this)
return;
@@ -399,9 +430,7 @@ void Vehicle::RemovePassenger(Unit *unit)
unit->ClearUnitState(UNIT_STAT_ONVEHICLE);
- if (me->GetTypeId() == TYPEID_UNIT
- && unit->GetTypeId() == TYPEID_PLAYER
- && seat->first == 0 && seat->second.seatInfo->m_flags & VEHICLE_SEAT_FLAG_CAN_CONTROL)
+ if (me->GetTypeId() == TYPEID_UNIT && unit->GetTypeId() == TYPEID_PLAYER && seat->first == 0 && seat->second.seatInfo->m_flags & VEHICLE_SEAT_FLAG_CAN_CONTROL)
{
me->RemoveCharmedBy(unit);
@@ -434,12 +463,12 @@ void Vehicle::RemovePassenger(Unit *unit)
void Vehicle::RelocatePassengers(float x, float y, float z, float ang)
{
- Map *map = me->GetMap();
+ Map* map = me->GetMap();
ASSERT(map != NULL);
// not sure that absolute position calculation is correct, it must depend on vehicle orientation and pitch angle
for (SeatMap::const_iterator itr = m_Seats.begin(); itr != m_Seats.end(); ++itr)
- if (Unit *passenger = ObjectAccessor::GetUnit(*GetBase(), itr->second.passenger))
+ if (Unit* passenger = ObjectAccessor::GetUnit(*GetBase(), itr->second.passenger))
{
ASSERT(passenger->IsInWorld());
ASSERT(passenger->IsOnVehicle(GetBase()));
@@ -508,4 +537,4 @@ uint8 Vehicle::GetAvailableSeatCount() const
++ret;
return ret;
-} \ No newline at end of file
+}
diff --git a/src/server/game/Entities/Vehicle/Vehicle.h b/src/server/game/Entities/Vehicle/Vehicle.h
index 65bbd206399..06b009ddc4d 100755
--- a/src/server/game/Entities/Vehicle/Vehicle.h
+++ b/src/server/game/Entities/Vehicle/Vehicle.h
@@ -113,24 +113,25 @@ class Vehicle
friend class WorldSession;
public:
- explicit Vehicle(Unit *unit, VehicleEntry const *vehInfo, uint32 creatureEntry);
+ explicit Vehicle(Unit* unit, VehicleEntry const* vehInfo, uint32 creatureEntry);
virtual ~Vehicle();
void Install();
void Uninstall();
void Reset(bool evading = false);
void InstallAllAccessories(bool evading);
+ void ApplyAllImmunities();
- Unit *GetBase() const { return me; }
- VehicleEntry const *GetVehicleInfo() const { return m_vehicleInfo; }
+ Unit* GetBase() const { return me; }
+ VehicleEntry const* GetVehicleInfo() const { return m_vehicleInfo; }
uint32 const& GetCreatureEntry() const { return m_creatureEntry; }
bool HasEmptySeat(int8 seatId) const;
- Unit *GetPassenger(int8 seatId) const;
+ Unit* GetPassenger(int8 seatId) const;
int8 GetNextEmptySeat(int8 seatId, bool next) const;
uint8 GetAvailableSeatCount() const;
- bool AddPassenger(Unit *passenger, int8 seatId = -1);
+ bool AddPassenger(Unit* passenger, int8 seatId = -1);
void EjectPassenger(Unit* passenger, Unit* controller);
void RemovePassenger(Unit *passenger);
void RelocatePassengers(float x, float y, float z, float ang);
@@ -149,8 +150,8 @@ class Vehicle
void InitMovementInfoForBase();
protected:
- Unit *me;
- VehicleEntry const *m_vehicleInfo;
+ Unit* me;
+ VehicleEntry const* m_vehicleInfo;
uint32 m_usableSeatNum; // Number of seats that match VehicleSeatEntry::UsableByPlayer, used for proper display flags
uint32 m_bonusHP;
uint32 m_creatureEntry; // Can be different than me->GetBase()->GetEntry() in case of players