diff options
Diffstat (limited to 'src')
-rwxr-xr-x | src/server/game/Entities/Vehicle/Vehicle.cpp | 113 | ||||
-rwxr-xr-x | src/server/game/Entities/Vehicle/Vehicle.h | 15 |
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 |