*Allow spells to summon vehicles.
--HG-- branch : trunk
This commit is contained in:
@@ -1621,6 +1621,43 @@ Creature* WorldObject::SummonCreature(uint32 id, float x, float y, float z, floa
|
|||||||
return pCreature;
|
return pCreature;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Vehicle* WorldObject::SummonVehicle(uint32 entry, float x, float y, float z, float ang)
|
||||||
|
{
|
||||||
|
CreatureInfo const *ci = objmgr.GetCreatureTemplate(entry);
|
||||||
|
if(!ci)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
uint32 id = ci->spells[7]; //temp store id here
|
||||||
|
VehicleEntry const *ve = sVehicleStore.LookupEntry(id);
|
||||||
|
if(!ve)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
Vehicle *v = new Vehicle;
|
||||||
|
Map *map = GetMap();
|
||||||
|
uint32 team = 0;
|
||||||
|
if (GetTypeId()==TYPEID_PLAYER)
|
||||||
|
team = ((Player*)this)->GetTeam();
|
||||||
|
if(!v->Create(objmgr.GenerateLowGuid(HIGHGUID_VEHICLE), map, entry, id, team))
|
||||||
|
{
|
||||||
|
delete v;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
v->Relocate(x, y, z, ang);
|
||||||
|
|
||||||
|
if(!v->IsPositionValid())
|
||||||
|
{
|
||||||
|
sLog.outError("ERROR: Vehicle (guidlow %d, entry %d) not created. Suggested coordinates isn't valid (X: %f Y: %f)",
|
||||||
|
v->GetGUIDLow(), v->GetEntry(), v->GetPositionX(), v->GetPositionY());
|
||||||
|
delete v;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
map->Add((Creature*)v);
|
||||||
|
|
||||||
|
return v;
|
||||||
|
}
|
||||||
|
|
||||||
Pet* Player::SummonPet(uint32 entry, float x, float y, float z, float ang, PetType petType, uint32 duration)
|
Pet* Player::SummonPet(uint32 entry, float x, float y, float z, float ang, PetType petType, uint32 duration)
|
||||||
{
|
{
|
||||||
Pet* pet = new Pet(petType);
|
Pet* pet = new Pet(petType);
|
||||||
|
|||||||
+4
-2
@@ -104,6 +104,7 @@ class Player;
|
|||||||
class UpdateMask;
|
class UpdateMask;
|
||||||
class InstanceData;
|
class InstanceData;
|
||||||
class GameObject;
|
class GameObject;
|
||||||
|
class Vehicle;
|
||||||
|
|
||||||
typedef UNORDERED_MAP<Player*, UpdateData> UpdateDataMapType;
|
typedef UNORDERED_MAP<Player*, UpdateData> UpdateDataMapType;
|
||||||
|
|
||||||
@@ -498,9 +499,10 @@ class TRINITY_DLL_SPEC WorldObject : public Object
|
|||||||
|
|
||||||
Map * GetMap() const;
|
Map * GetMap() const;
|
||||||
Map const* GetBaseMap() const;
|
Map const* GetBaseMap() const;
|
||||||
Creature* SummonCreature(uint32 id, float x, float y, float z, float ang,TempSummonType spwtype,uint32 despwtime);
|
Creature* SummonCreature(uint32 id, float x, float y, float z, float ang,TempSummonType spwtype,uint32 despwtime);
|
||||||
|
Vehicle* SummonVehicle(uint32 entry, float x, float y, float z, float ang);
|
||||||
GameObject* SummonGameObject(uint32 entry, float x, float y, float z, float ang, float rotation0, float rotation1, float rotation2, float rotation3, uint32 respawnTime);
|
GameObject* SummonGameObject(uint32 entry, float x, float y, float z, float ang, float rotation0, float rotation1, float rotation2, float rotation3, uint32 respawnTime);
|
||||||
Creature* SummonTrigger(float x, float y, float z, float ang, uint32 dur, CreatureAI* (*GetAI)(Creature*) = NULL);
|
Creature* SummonTrigger(float x, float y, float z, float ang, uint32 dur, CreatureAI* (*GetAI)(Creature*) = NULL);
|
||||||
bool isActiveObject() const { return m_isActive; }
|
bool isActiveObject() const { return m_isActive; }
|
||||||
void setActive(bool isActiveObject);
|
void setActive(bool isActiveObject);
|
||||||
void SetWorldObject(bool apply);
|
void SetWorldObject(bool apply);
|
||||||
|
|||||||
+15
-3
@@ -4158,9 +4158,6 @@ SpellCastResult Spell::CheckCast(bool strict)
|
|||||||
{
|
{
|
||||||
switch(m_spellInfo->EffectMiscValueB[i])
|
switch(m_spellInfo->EffectMiscValueB[i])
|
||||||
{
|
{
|
||||||
case SUMMON_TYPE_POSESSED:
|
|
||||||
case SUMMON_TYPE_RACE_CONTROLLER:
|
|
||||||
case SUMMON_TYPE_STEAM_TONK:
|
|
||||||
case SUMMON_TYPE_DEMON:
|
case SUMMON_TYPE_DEMON:
|
||||||
case SUMMON_TYPE_SUMMON:
|
case SUMMON_TYPE_SUMMON:
|
||||||
{
|
{
|
||||||
@@ -4172,6 +4169,21 @@ SpellCastResult Spell::CheckCast(bool strict)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
SummonPropertiesEntry const *SummonProperties = sSummonPropertiesStore.LookupEntry(m_spellInfo->EffectMiscValueB[i]);
|
||||||
|
if(!SummonProperties)
|
||||||
|
break;
|
||||||
|
switch(SummonProperties->Group)
|
||||||
|
{
|
||||||
|
case SUMMON_TYPE_POSSESSED:
|
||||||
|
{
|
||||||
|
if(m_caster->GetPetGUID())
|
||||||
|
return SPELL_FAILED_ALREADY_HAVE_SUMMON;
|
||||||
|
|
||||||
|
if(m_caster->GetCharmGUID())
|
||||||
|
return SPELL_FAILED_ALREADY_HAVE_CHARM;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
// Not used for summon?
|
// Not used for summon?
|
||||||
|
|||||||
@@ -277,6 +277,7 @@ class Spell
|
|||||||
void EffectPickPocket(uint32 i);
|
void EffectPickPocket(uint32 i);
|
||||||
void EffectAddFarsight(uint32 i);
|
void EffectAddFarsight(uint32 i);
|
||||||
void EffectSummonPossessed(uint32 i);
|
void EffectSummonPossessed(uint32 i);
|
||||||
|
void EffectSummonVehicle(uint32 i);
|
||||||
void EffectSummonWild(uint32 i);
|
void EffectSummonWild(uint32 i);
|
||||||
void EffectSummonGuardian(uint32 i);
|
void EffectSummonGuardian(uint32 i);
|
||||||
void EffectHealMechanical(uint32 i);
|
void EffectHealMechanical(uint32 i);
|
||||||
|
|||||||
@@ -60,6 +60,7 @@
|
|||||||
#include "GridNotifiersImpl.h"
|
#include "GridNotifiersImpl.h"
|
||||||
#include "SkillDiscovery.h"
|
#include "SkillDiscovery.h"
|
||||||
#include "Formulas.h"
|
#include "Formulas.h"
|
||||||
|
#include "Vehicle.h"
|
||||||
|
|
||||||
pEffect SpellEffects[TOTAL_SPELL_EFFECTS]=
|
pEffect SpellEffects[TOTAL_SPELL_EFFECTS]=
|
||||||
{
|
{
|
||||||
@@ -3366,6 +3367,7 @@ void Spell::EffectSummonType(uint32 i)
|
|||||||
EffectSummonPossessed(i);
|
EffectSummonPossessed(i);
|
||||||
break;
|
break;
|
||||||
case SUMMON_TYPE_VEHICLE:
|
case SUMMON_TYPE_VEHICLE:
|
||||||
|
EffectSummonVehicle(i);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -6776,6 +6778,19 @@ void Spell::EffectSummonPossessed(uint32 i)
|
|||||||
pet->SetCharmedOrPossessedBy(m_caster, true);
|
pet->SetCharmedOrPossessedBy(m_caster, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Spell::EffectSummonVehicle(uint32 i)
|
||||||
|
{
|
||||||
|
uint32 entry = m_spellInfo->EffectMiscValue[i];
|
||||||
|
if(!entry)
|
||||||
|
return;
|
||||||
|
|
||||||
|
float x, y, z;
|
||||||
|
m_caster->GetClosePoint(x, y, z, DEFAULT_WORLD_OBJECT_SIZE);
|
||||||
|
Vehicle *vehicle = m_caster->SummonVehicle(entry, x, y, z, m_caster->GetOrientation());
|
||||||
|
|
||||||
|
vehicle->SetUInt32Value(UNIT_CREATED_BY_SPELL, m_spellInfo->Id);
|
||||||
|
}
|
||||||
|
|
||||||
void Spell::EffectRenamePet(uint32 /*eff_idx*/)
|
void Spell::EffectRenamePet(uint32 /*eff_idx*/)
|
||||||
{
|
{
|
||||||
if (!unitTarget || unitTarget->GetTypeId() != TYPEID_UNIT ||
|
if (!unitTarget || unitTarget->GetTypeId() != TYPEID_UNIT ||
|
||||||
|
|||||||
+7
-8
@@ -4379,14 +4379,13 @@ void Unit::RemoveAura(AuraMap::iterator &i, AuraRemoveMode mode)
|
|||||||
{
|
{
|
||||||
for(int i = 0; i < 3; ++i)
|
for(int i = 0; i < 3; ++i)
|
||||||
{
|
{
|
||||||
if(AurSpellInfo->Effect[i] == SPELL_EFFECT_SUMMON &&
|
if(AurSpellInfo->Effect[i] == SPELL_EFFECT_SUMMON)
|
||||||
(AurSpellInfo->EffectMiscValueB[i] == SUMMON_TYPE_POSESSED ||
|
if(SummonPropertiesEntry const *SummonProperties = sSummonPropertiesStore.LookupEntry(AurSpellInfo->EffectMiscValueB[i]))
|
||||||
AurSpellInfo->EffectMiscValueB[i] == SUMMON_TYPE_RACE_CONTROLLER ||
|
if(SummonProperties->Group == SUMMON_TYPE_POSSESSED)
|
||||||
AurSpellInfo->EffectMiscValueB[i] == SUMMON_TYPE_STEAM_TONK))
|
{
|
||||||
{
|
((Player*)caster)->StopCastingCharm();
|
||||||
((Player*)caster)->StopCastingCharm();
|
break;
|
||||||
break;
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user