Core/Vehicles:
- Grab correct npc entry from npc_spellclick_spells in case of player vehicle. Fixes DB errors added in my previous changeset - Allow aura's with SPELL_AURA_CONTROL_VEHICLE to stack if there are enough free seats, even if spellIds are identical. - Fix a possible infinite loop. Thanks to manuel for spotting
This commit is contained in:
1 parent
aa2455b586
commit
683cea9e83
11 files changed
+75
-26
No files matched your search
@@ -11694,7 +11694,7 @@ void Unit::Mount(uint32 mount, uint32 VehicleId, uint32 creatureEntry)
|
||||
|
||||
if (VehicleId)
|
||||
{
|
||||
if (CreateVehicleKit(VehicleId))
|
||||
if (CreateVehicleKit(VehicleId, creatureEntry))
|
||||
{
|
||||
GetVehicleKit()->Reset();
|
||||
|
||||
@@ -11708,7 +11708,7 @@ void Unit::Mount(uint32 mount, uint32 VehicleId, uint32 creatureEntry)
|
||||
plr->GetSession()->SendPacket(&data);
|
||||
|
||||
// mounts can also have accessories
|
||||
GetVehicleKit()->InstallAllAccessories(creatureEntry);
|
||||
GetVehicleKit()->InstallAllAccessories();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -15683,13 +15683,13 @@ void Unit::RestoreFaction()
|
||||
}
|
||||
}
|
||||
|
||||
bool Unit::CreateVehicleKit(uint32 id)
|
||||
bool Unit::CreateVehicleKit(uint32 id, uint32 creatureEntry)
|
||||
{
|
||||
VehicleEntry const *vehInfo = sVehicleStore.LookupEntry(id);
|
||||
if (!vehInfo)
|
||||
return false;
|
||||
|
||||
m_vehicleKit = new Vehicle(this, vehInfo);
|
||||
m_vehicleKit = new Vehicle(this, vehInfo, creatureEntry);
|
||||
m_updateFlag |= UPDATEFLAG_VEHICLE;
|
||||
m_unitTypeMask |= UNIT_MASK_VEHICLE;
|
||||
return true;
|
||||
@@ -16459,7 +16459,7 @@ bool Unit::CheckPlayerCondition(Player* pPlayer)
|
||||
bool Unit::HandleSpellClick(Unit* clicker, int8 seatId)
|
||||
{
|
||||
bool success = false;
|
||||
uint32 spellClickEntry = GetTypeId() == TYPEID_UNIT ? GetEntry() : GetUInt32Value(UNIT_FIELD_MOUNTDISPLAYID);
|
||||
uint32 spellClickEntry = GetVehicleKit() ? GetVehicleKit()->m_creatureEntry : GetEntry();
|
||||
SpellClickInfoMapBounds clickPair = sObjectMgr->GetSpellClickInfoMapBounds(spellClickEntry);
|
||||
for (SpellClickInfoMap::const_iterator itr = clickPair.first; itr != clickPair.second; ++itr)
|
||||
{
|
||||
@@ -16477,7 +16477,7 @@ bool Unit::HandleSpellClick(Unit* clicker, int8 seatId)
|
||||
uint8 i = 0;
|
||||
bool valid = false;
|
||||
while (i < MAX_SPELL_EFFECTS && !valid)
|
||||
if (spellEntry->EffectApplyAuraName[i] == SPELL_AURA_CONTROL_VEHICLE)
|
||||
if (spellEntry->EffectApplyAuraName[i++] == SPELL_AURA_CONTROL_VEHICLE)
|
||||
valid = true;
|
||||
|
||||
if (!valid)
|
||||
@@ -16486,10 +16486,21 @@ bool Unit::HandleSpellClick(Unit* clicker, int8 seatId)
|
||||
return false;
|
||||
}
|
||||
|
||||
caster->CastCustomSpell(itr->second.spellId, SpellValueMod(SPELLVALUE_BASE_POINT0+i), seatId+1, target, true, NULL, NULL, origCasterGUID);
|
||||
if (IsInMap(caster))
|
||||
caster->CastCustomSpell(itr->second.spellId, SpellValueMod(SPELLVALUE_BASE_POINT0+i), seatId+1, target, true, NULL, NULL, origCasterGUID);
|
||||
else // This can happen during Player::_LoadAuras
|
||||
{
|
||||
int32 bp0 = seatId;
|
||||
Aura::TryCreate(spellEntry, this, clicker, &bp0, NULL, origCasterGUID);
|
||||
}
|
||||
}
|
||||
else
|
||||
caster->CastSpell(target, spellEntry, true, NULL, NULL, origCasterGUID);
|
||||
{
|
||||
if (IsInMap(caster))
|
||||
caster->CastSpell(target, spellEntry, true, NULL, NULL, origCasterGUID);
|
||||
else
|
||||
Aura::TryCreate(spellEntry, this, clicker, NULL, NULL, origCasterGUID);
|
||||
}
|
||||
|
||||
success = true;
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user