Core/Vehicles: Add general immunities for several vehicles

+ some minor cleanup stylewise
Signed-off-by: click <[email protected]>
This commit is contained in:
Lopin
2011-05-31 15:14:55 +02:00
committed by click
parent 2d3f4687e5
commit 5254f3490b
2 changed files with 79 additions and 49 deletions
+71 -42
View File
@@ -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;
}
}
+8 -7
View File
@@ -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