*Update flame levi script. Allow player to shoot down pyrite container and refill the demolishers.

*Other script-related fixes.

--HG--
branch : trunk
This commit is contained in:
megamage
2009-08-28 11:26:20 -05:00
parent 9d28323a55
commit ab5f515f21
19 changed files with 241 additions and 164 deletions
+7 -3
View File
@@ -2161,7 +2161,8 @@ INSERT INTO `spell_script_target` (`entry`, `type`, `targetEntry`) VALUES
-- ULDUAR
-- --------
INSERT INTO creature_template (entry, vehicleid) VALUES
(32930, 312), # Kologarn
(32930, 338), # Kologarn
(32934, 380), # Right Arm
(33113, 340), # Flame Leviathan
(33114, 341), # Flame Leviathan Seat
(33214, 348) # Mechanolift 304-A
@@ -2192,12 +2193,14 @@ spell5 = VALUES(spell5),
spell6 = VALUES(spell6),
vehicleid = VALUES(vehicleid);
DELETE FROM `spell_script_target` WHERE `entry` IN (62427,62374,62399);
DELETE FROM `spell_script_target` WHERE `entry` IN (62427,62374,62399,62056,63985);
INSERT INTO `spell_script_target` (`entry`, `type`, `targetEntry`) VALUES
(62427, 1, 33109), # Load into Catapult
(62374, 1, 33060), # Pursued
(62374, 1, 33109),
(62399, 1, 33139); # Overload Circuit
(62399, 1, 33139), # Overload Circuit
(63985, 1, 32934), # Stone Grip
(62056, 1, 32934);
DELETE FROM `spell_linked_spell` WHERE `spell_trigger` IN (-62475,62427);
INSERT INTO `spell_linked_spell` (`spell_trigger`, `spell_effect`, `type`, `comment`) VALUES
@@ -2213,6 +2216,7 @@ INSERT INTO `npc_spellclick_spells` (`npc_entry`, `spell_id`, `quest_start`, `qu
update creature_template set spell1=62395, AIName = 'TurretAI', scriptname='' where entry = 33139;
update creature_template set spell1=62402 where entry = 33142;
update creature_template set ScriptName = 'boss_kologarn' where entry = 32930;
update creature_template set scriptname = "boss_flame_leviathan_safety_container" where entry = 33218;
-- --------
+13
View File
@@ -0,0 +1,13 @@
INSERT INTO creature_template (entry, vehicleid) VALUES
(32930, 338), # Kologarn
(32934, 380), # Right Arm
(33214, 348) # Mechanolift 304-A
ON DUPLICATE KEY UPDATE
vehicleid = VALUES(vehicleid);
DELETE FROM `spell_script_target` WHERE `entry` IN (62056,63985);
INSERT INTO `spell_script_target` (`entry`, `type`, `targetEntry`) VALUES
(63985, 1, 32934), # Stone Grip
(62056, 1, 32934);
update creature_template set scriptname = "boss_flame_leviathan_safety_container" where entry = 33218;
+5 -24
View File
@@ -70,12 +70,13 @@ void SummonList::DespawnAll()
else
{
erase(begin());
summon->SetVisibility(VISIBILITY_OFF);
if(summon->isSummon() && !summon->isPet())
if(summon->isSummon())
{
summon->DestroyForNearbyPlayers();
CAST_SUM(summon)->UnSummon();
}
else
summon->setDeathState(JUST_DIED);
summon->RemoveCorpse();
summon->DisappearAndDie();
}
}
}
@@ -163,26 +164,6 @@ Creature* ScriptedAI::DoSpawnCreature(uint32 uiId, float fX, float fY, float fZ,
return m_creature->SummonCreature(uiId, m_creature->GetPositionX()+fX, m_creature->GetPositionY()+fY, m_creature->GetPositionZ()+fZ, fAngle, (TempSummonType)uiType, uiDespawntime);
}
Creature *ScriptedAI::DoSummon(uint32 uiEntry, const float fPos[4], uint32 uiDespawntime, TempSummonType uiType)
{
return me->SummonCreature(uiEntry, fPos[0], fPos[1], fPos[2], fPos[3], uiType, uiDespawntime);
}
Creature *ScriptedAI::DoSummon(uint32 uiEntry, WorldObject* pGo, float fRadius, uint32 uiDespawntime, TempSummonType uiType)
{
float fX, fY, fZ;
pGo->GetGroundPointAroundUnit(fX, fY, fZ, fRadius * rand_norm(), rand_norm()*2*M_PI);
return me->SummonCreature(uiEntry, fX, fY, fZ, me->GetOrientation(), uiType, uiDespawntime);
}
Creature *ScriptedAI::DoSummonFlyer(uint32 uiEntry, WorldObject *obj, float _fZ, float fRadius, uint32 uiDespawntime, TempSummonType uiType)
{
float fX, fY, fZ;
obj->GetGroundPointAroundUnit(fX, fY, fZ, fRadius * rand_norm(), rand_norm()*2*M_PI);
return me->SummonCreature(uiEntry, fX, fY, fZ + _fZ, me->GetOrientation(), uiType, uiDespawntime);
}
Unit* ScriptedAI::SelectUnit(SelectAggroTarget target, uint32 uiPosition)
{
//ThreatList m_threatlist;
@@ -151,9 +151,6 @@ struct TRINITY_DLL_DECL ScriptedAI : public CreatureAI
//Spawns a creature relative to m_creature
Creature* DoSpawnCreature(uint32 uiId, float fX, float fY, float fZ, float fAngle, uint32 uiType, uint32 uiDespawntime);
Creature *DoSummon(uint32 uiEntry, const float fPos[4], uint32 uiDespawntime = 30000, TempSummonType uiType = TEMPSUMMON_CORPSE_TIMED_DESPAWN);
Creature *DoSummon(uint32 uiEntry, WorldObject *obj, float fRadius = 5.0f, uint32 uiDespawntime = 30000, TempSummonType uiType = TEMPSUMMON_CORPSE_TIMED_DESPAWN);
Creature *DoSummonFlyer(uint32 uiEntry, WorldObject *obj, float fZ, float fRadius = 5.0f, uint32 uiDespawntime = 30000, TempSummonType uiType = TEMPSUMMON_CORPSE_TIMED_DESPAWN);
//Selects a unit from the creature's current aggro list
Unit* SelectUnit(SelectAggroTarget target, uint32 uiPosition);
@@ -111,24 +111,6 @@ struct TRINITY_DLL_DECL boss_flame_leviathanAI : public BossAI
vehicle->InstallAllAccessories();
}
void JustSummoned(Creature *summon)
{
if(summon->GetEntry() == MOB_MECHANOLIFT)
{
summons.Summon(summon);
}
}
void SummonedCreatureDespawn(Creature *summon)
{
if(summon->GetEntry() == MOB_MECHANOLIFT)
{
summons.Despawn(summon);
//if(Creature* container = DoSummon(MOB_CONTAINER, summon, 0, 0))
// container->GetMotionMaster()->MovePoint(1, container->GetPositionX(), container->GetPositionY(), me->GetPositionZ());
}
}
void UpdateAI(const uint32 diff)
{
if (!me->isInCombat())
@@ -174,7 +156,7 @@ struct TRINITY_DLL_DECL boss_flame_leviathanAI : public BossAI
events.RepeatEvent(15000);
return;
case EVENT_SUMMON:
if(summons.size() < 10)
if(summons.size() < 15) // 4seat+1turret+10lift
if(Creature *lift = DoSummonFlyer(MOB_MECHANOLIFT, me, rand()%20 + 20, 50, 0))
lift->GetMotionMaster()->MoveRandom(100);
events.RepeatEvent(2000);
@@ -296,6 +278,32 @@ struct TRINITY_DLL_DECL boss_flame_leviathan_overload_deviceAI : public PassiveA
}
};
struct TRINITY_DLL_DECL boss_flame_leviathan_safety_containerAI : public PassiveAI
{
boss_flame_leviathan_safety_containerAI(Creature *c) : PassiveAI(c) {}
void MovementInform(uint32 type, uint32 id)
{
if(id == me->GetEntry())
{
if(Creature *liquid = DoSummon(MOB_LIQUID, me, 0))
liquid->CastSpell(liquid, 62494, true);
me->DisappearAndDie(); // this will relocate creature to sky
}
}
void UpdateAI(const uint32 diff)
{
if(!me->GetVehicle() && me->isSummon() && me->GetMotionMaster()->GetCurrentMovementGeneratorType() != POINT_MOTION_TYPE)
{
//me->AddUnitMovementFlag(MOVEMENTFLAG_FALLING);
me->RemoveUnitMovementFlag(MOVEMENTFLAG_WALK_MODE);
me->SendMovementFlagUpdate();
me->GetMotionMaster()->MovePoint(me->GetEntry(), me->GetPositionX(), me->GetPositionY(), 409.8f);
}
}
};
struct TRINITY_DLL_DECL spell_pool_of_tarAI : public TriggerAI
{
spell_pool_of_tarAI(Creature *c) : TriggerAI(c)
@@ -335,6 +343,11 @@ CreatureAI* GetAI_boss_flame_leviathan_overload_device(Creature* pCreature)
return new boss_flame_leviathan_overload_deviceAI (pCreature);
}
CreatureAI* GetAI_boss_flame_leviathan_safety_containerAI(Creature* pCreature)
{
return new boss_flame_leviathan_safety_containerAI(pCreature);
}
CreatureAI* GetAI_spell_pool_of_tar(Creature* pCreature)
{
return new spell_pool_of_tarAI (pCreature);
@@ -363,6 +376,11 @@ void AddSC_boss_flame_leviathan()
newscript->GetAI = &GetAI_boss_flame_leviathan_overload_device;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name="boss_flame_leviathan_safety_container";
newscript->GetAI = &GetAI_boss_flame_leviathan_safety_containerAI;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name="spell_pool_of_tar";
newscript->GetAI = &GetAI_spell_pool_of_tar;
@@ -35,12 +35,7 @@ struct TRINITY_DLL_DECL boss_kologarnAI : public BossAI
leftArm(NULL), rightArm(NULL)
{
assert(vehicle);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED);
}
void Reset()
{
_Reset();
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED);
}
@@ -58,6 +53,7 @@ struct TRINITY_DLL_DECL boss_kologarnAI : public BossAI
leftArm = apply ? CAST_CRE(who) : NULL;
else if(who->GetEntry() == 32934)
rightArm = apply ? CAST_CRE(who) : NULL;
who->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED);
}
void UpdateAI(const uint32 diff)
+14 -4
View File
@@ -46,6 +46,7 @@
#include "OutdoorPvPMgr.h"
#include "GameEventMgr.h"
#include "CreatureGroups.h"
#include "Vehicle.h"
// apply implementation of the singletons
#include "Policies/SingletonImp.h"
@@ -169,7 +170,7 @@ Creature::~Creature()
}
//if(m_uint32Values)
// sLog.outDetail("Deconstruct Creature Entry = %u", GetEntry());
// sLog.outError("Deconstruct Creature Entry = %u", GetEntry());
}
void Creature::AddToWorld()
@@ -183,6 +184,8 @@ void Creature::AddToWorld()
Unit::AddToWorld();
SearchFormationAndPath();
AIM_Initialize();
if(IsVehicle())
GetVehicleKit()->Install();
}
}
@@ -201,11 +204,12 @@ void Creature::RemoveFromWorld()
void Creature::DisappearAndDie()
{
//DestroyForNearbyPlayers();
SetVisibility(VISIBILITY_OFF);
ObjectAccessor::UpdateObjectVisibility(this);
DestroyForNearbyPlayers();
//SetVisibility(VISIBILITY_OFF);
//ObjectAccessor::UpdateObjectVisibility(this);
if(isAlive())
setDeathState(JUST_DIED);
RemoveCorpse();
}
void Creature::SearchFormationAndPath()
@@ -1804,6 +1808,8 @@ void Creature::setDeathState(DeathState s)
ResetPlayerDamageReq();
CreatureInfo const *cinfo = GetCreatureInfo();
AddUnitMovementFlag(MOVEMENTFLAG_WALK_MODE);
if(GetCreatureInfo()->InhabitType & INHABIT_AIR)
AddUnitMovementFlag(MOVEMENTFLAG_FLY_MODE + MOVEMENTFLAG_FLYING);
SetUInt32Value(UNIT_NPC_FLAGS, cinfo->npcflag);
clearUnitState(UNIT_STAT_ALL_STATE);
SetMeleeDamageSchool(SpellSchools(cinfo->dmgschool));
@@ -1811,6 +1817,7 @@ void Creature::setDeathState(DeathState s)
Motion_Initialize();
if(GetCreatureData() && GetPhaseMask() != GetCreatureData()->phaseMask)
SetPhaseMask(GetCreatureData()->phaseMask, false);
if(m_vehicleKit) m_vehicleKit->Reset();
Unit::setDeathState(ALIVE);
}
}
@@ -1827,7 +1834,10 @@ bool Creature::FallGround()
if (fabs(ground_Z - z) < 0.1f)
return false;
SetFlying(false);
RemoveUnitMovementFlag(MOVEMENTFLAG_WALK_MODE);
SendMovementFlagUpdate();
//AddUnitMovementFlag(MOVEMENTFLAG_FALLING);
GetMotionMaster()->MovePoint(EVENT_FALL_GROUND, x, y, ground_Z);
Unit::setDeathState(DEAD_FALLING);
return true;
+5 -54
View File
@@ -125,42 +125,6 @@ void CreatureAI::SelectNearestTarget(Unit *who)
}
}
void CreatureAI::SetGazeOn(Unit *target)
{
if(me->canAttack(target))
{
AttackStart(target);
me->SetReactState(REACT_PASSIVE);
}
}
bool CreatureAI::UpdateVictimWithGaze()
{
if(!me->isInCombat())
return false;
if(me->HasReactState(REACT_PASSIVE))
{
if(me->getVictim())
return true;
else
me->SetReactState(REACT_AGGRESSIVE);
}
if(Unit *victim = me->SelectVictim())
AttackStart(victim);
return me->getVictim();
}
bool CreatureAI::UpdateVictim()
{
if(!me->isInCombat())
return false;
if(Unit *victim = me->SelectVictim())
AttackStart(victim);
return me->getVictim();
}
bool CreatureAI::UpdateCombatState()
{
if(!me->isInCombat())
@@ -181,26 +145,13 @@ bool CreatureAI::UpdateCombatState()
return true;
}
bool CreatureAI::_EnterEvadeMode()
{
if(me->IsInEvadeMode() || !me->isAlive())
return false;
me->RemoveAllAuras();
me->DeleteThreatList();
me->CombatStop(true);
me->LoadCreaturesAddon();
me->SetLootRecipient(NULL);
me->ResetPlayerDamageReq();
return true;
}
void CreatureAI::EnterEvadeMode()
{
if(!_EnterEvadeMode())
return;
sLog.outDebug("Creature %u enters evade mode.", me->GetEntry());
if(!me->GetVehicle()) // otherwise me will be in evade mode forever
{
if(Unit *owner = me->GetCharmerOrOwner())
@@ -212,10 +163,10 @@ void CreatureAI::EnterEvadeMode()
me->GetMotionMaster()->MoveTargetedHome();
}
if(me->IsVehicle())
me->GetVehicleKit()->InstallAllAccessories();
Reset();
if(me->IsVehicle()) // use the same sequence of addtoworld, aireset may remove all summons!
me->GetVehicleKit()->Reset();
}
/*void CreatureAI::AttackedBy( Unit* attacker )
+8 -3
View File
@@ -75,6 +75,13 @@ class TRINITY_DLL_SPEC CreatureAI : public UnitAI
bool UpdateCombatState();
void SelectNearestTarget(Unit *who);
void SetGazeOn(Unit *target);
Creature *DoSummon(uint32 uiEntry, const Position fPos, uint32 uiDespawntime = 30000, TempSummonType uiType = TEMPSUMMON_CORPSE_TIMED_DESPAWN);
Creature *DoSummon(uint32 uiEntry, WorldObject *obj, float fRadius = 5.0f, uint32 uiDespawntime = 30000, TempSummonType uiType = TEMPSUMMON_CORPSE_TIMED_DESPAWN);
Creature *DoSummonFlyer(uint32 uiEntry, WorldObject *obj, float fZ, float fRadius = 5.0f, uint32 uiDespawntime = 30000, TempSummonType uiType = TEMPSUMMON_CORPSE_TIMED_DESPAWN);
public:
explicit CreatureAI(Creature *c) : UnitAI((Unit*)c), me(c), m_creature(c) {}
@@ -151,15 +158,13 @@ class TRINITY_DLL_SPEC CreatureAI : public UnitAI
//virtual bool IsVisible(Unit *) const { return false; }
// Called when victim entered water and creature can not enter water
virtual bool canReachByRangeAttack(Unit*) { return false; }
//virtual bool canReachByRangeAttack(Unit*) { return false; }
///== Fields =======================================
// Pointer to controlled by AI creature
//Creature* const m_creature;
void SetGazeOn(Unit *target);
virtual void PassengerBoarded(Unit *who, int8 seatId, bool apply) {}
protected:
+73
View File
@@ -20,6 +20,8 @@
#include "Common.h"
#include "Platform/Define.h"
#include "Creature.h"
#include "CreatureAI.h"
#define HEROIC(n,h) (HeroicMode ? h : n)
@@ -257,5 +259,76 @@ struct AISpellInfoType
TRINITY_DLL_SPEC AISpellInfoType * GetAISpellInfo(uint32 i);
inline void CreatureAI::SetGazeOn(Unit *target)
{
if(me->canAttack(target))
{
AttackStart(target);
me->SetReactState(REACT_PASSIVE);
}
}
inline bool CreatureAI::UpdateVictimWithGaze()
{
if(!me->isInCombat())
return false;
if(me->HasReactState(REACT_PASSIVE))
{
if(me->getVictim())
return true;
else
me->SetReactState(REACT_AGGRESSIVE);
}
if(Unit *victim = me->SelectVictim())
AttackStart(victim);
return me->getVictim();
}
inline bool CreatureAI::UpdateVictim()
{
if(!me->isInCombat())
return false;
if(Unit *victim = me->SelectVictim())
AttackStart(victim);
return me->getVictim();
}
inline bool CreatureAI::_EnterEvadeMode()
{
if(me->IsInEvadeMode() || !me->isAlive())
return false;
me->RemoveAllAuras();
me->DeleteThreatList();
me->CombatStop(true);
me->LoadCreaturesAddon();
me->SetLootRecipient(NULL);
me->ResetPlayerDamageReq();
return true;
}
inline Creature *CreatureAI::DoSummon(uint32 uiEntry, const Position fPos, uint32 uiDespawntime, TempSummonType uiType)
{
return me->SummonCreature(uiEntry, fPos[0], fPos[1], fPos[2], fPos[3], uiType, uiDespawntime);
}
inline Creature *CreatureAI::DoSummon(uint32 uiEntry, WorldObject* pGo, float fRadius, uint32 uiDespawntime, TempSummonType uiType)
{
float fX, fY, fZ;
pGo->GetGroundPointAroundUnit(fX, fY, fZ, fRadius * rand_norm(), rand_norm()*2*M_PI);
return me->SummonCreature(uiEntry, fX, fY, fZ, me->GetOrientation(), uiType, uiDespawntime);
}
inline Creature *CreatureAI::DoSummonFlyer(uint32 uiEntry, WorldObject *obj, float _fZ, float fRadius, uint32 uiDespawntime, TempSummonType uiType)
{
float fX, fY, fZ;
obj->GetGroundPointAroundUnit(fX, fY, fZ, fRadius * rand_norm(), rand_norm()*2*M_PI);
return me->SummonCreature(uiEntry, fX, fY, fZ + _fZ, me->GetOrientation(), uiType, uiDespawntime);
}
#endif
+1
View File
@@ -1033,6 +1033,7 @@ uint32 ObjectMgr::ChooseDisplayId(uint32 team, const CreatureInfo *cinfo, const
case 28511: // Eye of Acherus
case 33114: // Flame Leviathan Seat (model 24914 chair)
case 33167: // Salvaged Demolisher Mechanic Seat
case 33189: // Liquid Pryite
return cinfo->DisplayID_A[0];
case 33218: // Pyrite Safety Container
return cinfo->DisplayID_A[1];
+3
View File
@@ -80,7 +80,10 @@ void PointMovementGenerator<T>::MovementInform(T &unit)
template <> void PointMovementGenerator<Creature>::MovementInform(Creature &unit)
{
if(id == EVENT_FALL_GROUND)
{
unit.setDeathState(JUST_DIED);
unit.SetFlying(true);
}
unit.AI()->MovementInform(POINT_MOTION_TYPE, id);
}
+14 -7
View File
@@ -6600,7 +6600,9 @@ float tangent(float x)
if(x >= 100000.0f) return 100000.0f;
if(x <= 100000.0f) return -100000.0f;
return 0.0f;
}
}
#define DEBUG_TRAJ(a) //a
void Spell::SelectTrajTargets()
{
@@ -6623,24 +6625,25 @@ void Spell::SelectTrajTargets()
float b = tangent(m_targets.m_elevation);
float a = (dz - dist2d * b) / (dist2d * dist2d);
if(a > -0.0001f) a = 0;
//sLog.outError("Spell::SelectTrajTargets: a %f b %f", a, b);
DEBUG_TRAJ(sLog.outError("Spell::SelectTrajTargets: a %f b %f", a, b);)
float bestDist;
UnitList::const_iterator itr = unitList.begin();
for(; itr != unitList.end(); ++itr)
{
if(m_caster == *itr || m_caster->IsOnVehicle(*itr) || (*itr)->IsOnVehicle(m_caster))
if(m_caster == *itr || m_caster->IsOnVehicle(*itr) || (*itr)->GetVehicle())//(*itr)->IsOnVehicle(m_caster))
continue;
const float size = std::max((*itr)->GetObjectSize() * 0.7f, 1.0f); // 1/sqrt(3)
const float objDist2d = m_caster->GetExactDistance2d((*itr)->GetPositionX(), (*itr)->GetPositionY()) * cos(m_caster->GetRelativeAngle(*itr));
const float dz = (*itr)->GetPositionZ() - m_caster->GetPositionZ();
// TODO: all calculation should be based on src instead of m_caster
const float objDist2d = (*itr)->GetExactDistance2d(m_targets.m_srcX, m_targets.m_srcY) * cos(m_caster->GetRelativeAngle(*itr));
const float dz = (*itr)->GetPositionZ() - m_targets.m_srcZ;
//sLog.outError("Spell::SelectTrajTargets: check %u, dist between %f %f, height between %f %f.", (*itr)->GetEntry(), objDist2d - size, objDist2d + size, dz - size, dz + size);
DEBUG_TRAJ(sLog.outError("Spell::SelectTrajTargets: check %u, dist between %f %f, height between %f %f.", (*itr)->GetEntry(), objDist2d - size, objDist2d + size, dz - size, dz + size);)
float dist = objDist2d - size;
float height = dist * (a * dist + b);
//sLog.outError("Spell::SelectTrajTargets: dist %f, height %f.", dist, height);
DEBUG_TRAJ(sLog.outError("Spell::SelectTrajTargets: dist %f, height %f.", dist, height);)
if(height < dz + size && height > dz - size)
{
bestDist = dist > 0 ? dist : 0;
@@ -6648,6 +6651,7 @@ void Spell::SelectTrajTargets()
}
#define CHECK_DIST {\
DEBUG_TRAJ(sLog.outError("Spell::SelectTrajTargets: dist %f, height %f.", dist, height);)\
if(dist < objDist2d + size && dist > objDist2d - size)\
{ bestDist = dist; break; }\
}
@@ -6698,9 +6702,11 @@ void Spell::SelectTrajTargets()
float x = m_targets.m_srcX + cos(m_caster->GetOrientation()) * bestDist;
float y = m_targets.m_srcY + sin(m_caster->GetOrientation()) * bestDist;
float z = m_targets.m_srcZ + bestDist * (a * bestDist + b);
float distSq = (*itr)->GetExactDistSq(x, y, z);
float sizeSq = (*itr)->GetObjectSize();
sizeSq *= sizeSq;
DEBUG_TRAJ(sLog.outError("Initial %f %f %f %f %f", x, y, z, distSq, sizeSq);)
if(distSq > sizeSq)
{
float factor = 1 - sqrt(sizeSq / distSq);
@@ -6709,6 +6715,7 @@ void Spell::SelectTrajTargets()
z += factor * ((*itr)->GetPositionZ() - z);
distSq = (*itr)->GetExactDistSq(x, y, z);
DEBUG_TRAJ(sLog.outError("Initial %f %f %f %f %f", x, y, z, distSq, sizeSq);)
}
m_targets.setDestination(x, y, z);
+15 -3
View File
@@ -5295,11 +5295,23 @@ void Spell::EffectScriptEffect(uint32 effIndex)
return;
}
case 62428: // Load into Catapult
if(Unit *demolisher = m_caster->GetVehicleBase())
if(Vehicle *seat = m_caster->GetVehicleKit())
if(Unit *passenger = seat->GetPassenger(0))
if(Vehicle *seat = m_caster->GetVehicleKit())
if(Unit *passenger = seat->GetPassenger(0))
if(Unit *demolisher = m_caster->GetVehicleBase())
passenger->CastSpell(demolisher, damage, true);
return;
case 62482: // Grab Crate
if(unitTarget)
{
if(Vehicle *seat = m_caster->GetVehicleKit())
{
if(Creature *oldContainer = dynamic_cast<Creature*>(seat->GetPassenger(1)))
oldContainer->DisappearAndDie();
unitTarget->CastSpell(seat->GetBase(), 62473, true);
unitTarget->EnterVehicle(seat, 1);
}
}
return;
case 60123: // Lightwell
{
if (m_caster->GetTypeId() != TYPEID_UNIT || !((Creature*)m_caster)->isSummon())
+1 -1
View File
@@ -136,7 +136,7 @@ void HostilReference::updateOnlineStatus()
online = getTarget()->isInAccessiblePlaceFor(creature);
if(!online)
{
if(creature->AI()->canReachByRangeAttack(getTarget()))
if(creature->IsWithinCombatRange(getTarget(), creature->m_CombatDistance))
online = true; // not accessible but stays online
}
else
+6 -6
View File
@@ -98,10 +98,10 @@ inline float Traveller<Creature>::GetMoveDestinationTo(float x, float y, float z
float dy = y - GetPositionY();
float dz = z - GetPositionZ();
if(i_traveller.HasUnitMovementFlag(MOVEMENTFLAG_FLYING))
//if(i_traveller.HasUnitMovementFlag(MOVEMENTFLAG_FLYING))
return sqrt((dx*dx) + (dy*dy) + (dz*dz));
else //Walking on the ground
return sqrt((dx*dx) + (dy*dy));
//else //Walking on the ground
// return sqrt((dx*dx) + (dy*dy));
}
@@ -131,10 +131,10 @@ inline float Traveller<Player>::GetMoveDestinationTo(float x, float y, float z)
float dy = y - GetPositionY();
float dz = z - GetPositionZ();
if (i_traveller.isInFlight())
//if (i_traveller.isInFlight())
return sqrt((dx*dx) + (dy*dy) + (dz*dz));
else //Walking on the ground
return sqrt((dx*dx) + (dy*dy));
//else //Walking on the ground
// return sqrt((dx*dx) + (dy*dy));
}
template<>
+12 -5
View File
@@ -11149,7 +11149,6 @@ void Unit::setDeathState(DeathState s)
if (m_deathState != ALIVE && s == ALIVE)
{
//_ApplyAllAuraMods();
if(m_vehicleKit) m_vehicleKit->Reset();
// Reset display id on resurection - needed by corpse explosion to cleanup after display change
SetDisplayId(GetNativeDisplayId());
}
@@ -12164,8 +12163,6 @@ void Unit::AddToWorld()
assert(m_NotifyListPos < 0); //instance : crash
//m_NotifyListPos = -1;
SetToNotify();
if(IsVehicle())
GetVehicleKit()->Install();
}
}
@@ -14642,7 +14639,17 @@ void Unit::SetPhaseMask(uint32 newPhaseMask, bool update)
void Unit::KnockbackFrom(float x, float y, float speedXY, float speedZ)
{
if(GetTypeId() == TYPEID_UNIT)
Player *player = NULL;
if(GetTypeId() == TYPEID_PLAYER)
player = (Player*)this;
else
{
player = dynamic_cast<Player*>(GetCharmer());
if(player && player->m_mover != this)
player = NULL;
}
if(!player)
{
GetMotionMaster()->MoveKnockbackFrom(x, y, speedXY, speedZ);
}
@@ -14659,7 +14666,7 @@ void Unit::KnockbackFrom(float x, float y, float speedXY, float speedZ)
data << float(speedXY); // Horizontal speed
data << float(-speedZ); // Z Movement speed (vertical)
((Player*)this)->GetSession()->SendPacket(&data);
player->GetSession()->SendPacket(&data);
}
}
+22 -22
View File
@@ -81,7 +81,7 @@ void Vehicle::InstallAllAccessories()
switch(me->GetEntry())
{
//case 27850:InstallAccessory(27905,1);break;
case 28782:InstallAccessory(28768,0);break; // Acherus Deathcharger
case 28782:InstallAccessory(28768,0,false);break; // Acherus Deathcharger
case 28312:InstallAccessory(28319,7);break;
case 32627:InstallAccessory(32629,7);break;
case 32930:
@@ -101,28 +101,33 @@ void Vehicle::InstallAllAccessories()
InstallAccessory(33143,2); // Overload Control Device
InstallAccessory(33142,1); // Leviathan Defense Turret
break;
case 33214:InstallAccessory(33218,1);break;
case 33214:InstallAccessory(33218,1,false);break; // Mechanolift 304-A
}
}
void Vehicle::Uninstall()
{
sLog.outDebug("Vehicle::Uninstall %u", me->GetEntry());
for(SeatMap::iterator itr = m_Seats.begin(); itr != m_Seats.end(); ++itr)
if(Unit *passenger = itr->second.passenger)
if(passenger->HasUnitTypeMask(UNIT_MASK_ACCESSORY))
((TempSummon*)passenger)->UnSummon();
RemoveAllPassengers();
}
void Vehicle::Die()
{
sLog.outDebug("Vehicle::Die %u", me->GetEntry());
for(SeatMap::iterator itr = m_Seats.begin(); itr != m_Seats.end(); ++itr)
{
if(Unit *passenger = itr->second.passenger)
if(passenger->HasUnitTypeMask(UNIT_MASK_ACCESSORY))
passenger->setDeathState(JUST_DIED);
}
RemoveAllPassengers();
}
void Vehicle::Reset()
{
sLog.outDebug("Vehicle::Reset");
InstallAllAccessories();
if(m_usableSeatNum)
me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPELLCLICK);
@@ -130,6 +135,7 @@ void Vehicle::Reset()
void Vehicle::RemoveAllPassengers()
{
sLog.outDebug("Vehicle::RemoveAllPassengers");
for(SeatMap::iterator itr = m_Seats.begin(); itr != m_Seats.end(); ++itr)
if(Unit *passenger = itr->second.passenger)
{
@@ -185,7 +191,7 @@ int8 Vehicle::GetNextEmptySeat(int8 seatId, bool next) const
return seat->first;
}
void Vehicle::InstallAccessory(uint32 entry, int8 seatId)
void Vehicle::InstallAccessory(uint32 entry, int8 seatId, bool minion)
{
if(Unit *passenger = GetPassenger(seatId))
{
@@ -200,13 +206,15 @@ void Vehicle::InstallAccessory(uint32 entry, int8 seatId)
passenger->ExitVehicle(); // this should not happen
}
Creature *accessory = me->SummonCreature(entry, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 0, 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30000);
if(!accessory)
return;
accessory->AddUnitTypeMask(UNIT_MASK_ACCESSORY);
accessory->EnterVehicle(this, seatId);
// This is not good, we have to send update twice
accessory->SendMovementFlagUpdate();
//TODO: accessory should be minion
if(Creature *accessory = me->SummonCreature(entry, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 0, 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30000))
{
if(minion)
accessory->AddUnitTypeMask(UNIT_MASK_ACCESSORY);
accessory->EnterVehicle(this, seatId);
// This is not good, we have to send update twice
accessory->SendMovementFlagUpdate();
}
}
bool Vehicle::AddPassenger(Unit *unit, int8 seatId)
@@ -324,16 +332,8 @@ void Vehicle::RemovePassenger(Unit *unit)
void Vehicle::Dismiss()
{
for(SeatMap::iterator itr = m_Seats.begin(); itr != m_Seats.end(); ++itr)
{
if(Unit *passenger = itr->second.passenger)
if(passenger->GetTypeId() == TYPEID_UNIT && ((Creature*)passenger)->IsVehicle())
{
passenger->ExitVehicle();
passenger->GetVehicleKit()->Dismiss();
}
}
RemoveAllPassengers();
sLog.outDebug("Vehicle::Dismiss %u", me->GetEntry());
Uninstall();
me->SendObjectDeSpawnAnim(me->GetGUID());
me->CombatStop();
me->AddObjectToRemoveList();
+3 -4
View File
@@ -42,10 +42,11 @@ class TRINITY_DLL_SPEC Vehicle
void Install();
void Uninstall();
void Reset();
void Die();
void InstallAllAccessories();
Unit *GetBase() const { return me; }
VehicleEntry const *GetVehicleInfo() { return m_vehicleInfo; }
bool HasEmptySeat(int8 seatId) const;
@@ -54,17 +55,15 @@ class TRINITY_DLL_SPEC Vehicle
bool AddPassenger(Unit *passenger, int8 seatId = -1);
void RemovePassenger(Unit *passenger);
void RemoveAllPassengers();
void InstallAllAccessories();
void Dismiss();
SeatMap m_Seats;
Unit *GetBase() const { return me; }
protected:
Unit *me;
VehicleEntry const *m_vehicleInfo;
uint32 m_usableSeatNum;
void InstallAccessory(uint32 entry, int8 seatId);
void InstallAccessory(uint32 entry, int8 seatId, bool minion = true);
};
#endif