diff options
Diffstat (limited to 'src')
26 files changed, 243 insertions, 308 deletions
diff --git a/src/bindings/scripts/scripts/northrend/naxxramas/boss_gluth.cpp b/src/bindings/scripts/scripts/northrend/naxxramas/boss_gluth.cpp index d9f49b44ed9..9028d92639a 100644 --- a/src/bindings/scripts/scripts/northrend/naxxramas/boss_gluth.cpp +++ b/src/bindings/scripts/scripts/northrend/naxxramas/boss_gluth.cpp @@ -25,7 +25,7 @@ #define MOB_ZOMBIE 16360 -const float PosSummon[3][4] = +const Position PosSummon[3] = { {3267.9, -3172.1, 297.42, 0.94}, {3253.2, -3132.3, 297.42, 0}, diff --git a/src/bindings/scripts/scripts/northrend/naxxramas/boss_gothik.cpp b/src/bindings/scripts/scripts/northrend/naxxramas/boss_gothik.cpp index 1b9aac9743d..53482bd963f 100644 --- a/src/bindings/scripts/scripts/northrend/naxxramas/boss_gothik.cpp +++ b/src/bindings/scripts/scripts/northrend/naxxramas/boss_gothik.cpp @@ -82,14 +82,14 @@ enum Events #define POS_LIVE 3 #define POS_DEAD 5 -const float PosSummonLive[POS_LIVE][4] = +const Position PosSummonLive[POS_LIVE] = { {2669.7, -3430.9, 268.56, 1.6}, {2692.0, -3430.9, 268.56, 1.6}, {2714.1, -3430.9, 268.56, 1.6}, }; -const float PosSummonDead[POS_DEAD][4] = +const Position PosSummonDead[POS_DEAD] = { {2725.1, -3310.0, 268.85, 3.4}, {2699.3, -3322.8, 268.60, 3.3}, diff --git a/src/bindings/scripts/scripts/northrend/naxxramas/boss_kelthuzad.cpp b/src/bindings/scripts/scripts/northrend/naxxramas/boss_kelthuzad.cpp index aeff698335c..bf0f0b24606 100644 --- a/src/bindings/scripts/scripts/northrend/naxxramas/boss_kelthuzad.cpp +++ b/src/bindings/scripts/scripts/northrend/naxxramas/boss_kelthuzad.cpp @@ -83,7 +83,7 @@ enum Event #define MOB_WEAVER 16429 // Soul Weavers #define MOB_ICECROWN 16441 // Guardians of Icecrown -float Pos[12][4] = +const Position Pos[12] = { {3783.272705, -5062.697266, 143.711203,3.617599},//LEFT_FAR {3730.291260, -5027.239258,143.956909,4.461900},//LEFT_MIDDLE diff --git a/src/bindings/scripts/scripts/northrend/naxxramas/boss_sapphiron.cpp b/src/bindings/scripts/scripts/northrend/naxxramas/boss_sapphiron.cpp index 635d064ce65..9813fddcd6a 100644 --- a/src/bindings/scripts/scripts/northrend/naxxramas/boss_sapphiron.cpp +++ b/src/bindings/scripts/scripts/northrend/naxxramas/boss_sapphiron.cpp @@ -368,7 +368,7 @@ struct TRINITY_DLL_DECL boss_sapphironAI : public BossAI if (GameObject* pGo = GameObject::GetGameObject(*me, itr->second)) { if (pGo->IsInBetween(me, target, 2.0f) - && me->GetExactDistance2d(target->GetPositionX(), target->GetPositionY()) - me->GetExactDistance2d(pGo->GetPositionX(), pGo->GetPositionY()) < 5.0f) + && me->GetExactDist2d(target->GetPositionX(), target->GetPositionY()) - me->GetExactDist2d(pGo->GetPositionX(), pGo->GetPositionY()) < 5.0f) { target->ApplySpellImmune(0, IMMUNITY_ID, SPELL_FROST_EXPLOSION, true); targets.push_back(target); diff --git a/src/game/Creature.cpp b/src/game/Creature.cpp index e5f99c5f871..40507387226 100644 --- a/src/game/Creature.cpp +++ b/src/game/Creature.cpp @@ -2212,7 +2212,7 @@ bool Creature::canCreatureAttack(Unit const *pVictim, bool force) const if(Unit *unit = GetCharmerOrOwner()) return pVictim->IsWithinDist(unit, dist); else - return pVictim->IsWithinDist3d(mHome_X, mHome_Y, mHome_Z, dist); + return pVictim->IsInDist(&m_homePosition, dist); } CreatureDataAddon const* Creature::GetCreatureAddon() const diff --git a/src/game/Creature.h b/src/game/Creature.h index 6035d3da6aa..6991e598d2b 100644 --- a/src/game/Creature.h +++ b/src/game/Creature.h @@ -690,8 +690,9 @@ class TRINITY_DLL_SPEC Creature : public Unit return m_charmInfo->GetCharmSpell(pos)->GetAction(); } - void SetHomePosition(float x, float y, float z, float ori) { mHome_X = x; mHome_Y = y; mHome_Z = z; mHome_O = ori;} - void GetHomePosition(float &x, float &y, float &z, float &ori) { x = mHome_X; y = mHome_Y; z = mHome_Z; ori = mHome_O; } + void SetHomePosition(float x, float y, float z, float o) { m_homePosition.Relocate(x, y, z, o); } + void SetHomePosition(const Position &pos) { m_homePosition.Relocate(pos);} + void GetHomePosition(float &x, float &y, float &z, float &ori) { m_homePosition.GetPosition(x, y, z, ori); } uint32 GetGlobalCooldown() const { return m_GlobalCooldown; } @@ -766,10 +767,7 @@ class TRINITY_DLL_SPEC Creature : public Unit SpellSchoolMask m_meleeDamageSchoolMask; uint32 m_originalEntry; - float mHome_X; - float mHome_Y; - float mHome_Z; - float mHome_O; + Position m_homePosition; bool DisableReputationGain; diff --git a/src/game/CreatureAI.h b/src/game/CreatureAI.h index 7a3fb9137c2..76aaa834756 100644 --- a/src/game/CreatureAI.h +++ b/src/game/CreatureAI.h @@ -78,7 +78,7 @@ class TRINITY_DLL_SPEC CreatureAI : public UnitAI void SetGazeOn(Unit *target); - Creature *DoSummon(uint32 uiEntry, const Position fPos, uint32 uiDespawntime = 30000, TempSummonType uiType = TEMPSUMMON_CORPSE_TIMED_DESPAWN); + Creature *DoSummon(uint32 uiEntry, const Position &pos, 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); diff --git a/src/game/CreatureAIImpl.h b/src/game/CreatureAIImpl.h index c687f04dad9..d143daa288c 100644 --- a/src/game/CreatureAIImpl.h +++ b/src/game/CreatureAIImpl.h @@ -311,9 +311,25 @@ inline bool CreatureAI::_EnterEvadeMode() return true; } -inline Creature *CreatureAI::DoSummon(uint32 uiEntry, const Position fPos, uint32 uiDespawntime, TempSummonType uiType) +inline void UnitAI::DoCast(Unit* victim, uint32 spellId, bool triggered) { - return me->SummonCreature(uiEntry, fPos[0], fPos[1], fPos[2], fPos[3], uiType, uiDespawntime); + if(!victim || me->hasUnitState(UNIT_STAT_CASTING) && !triggered) + return; + + me->CastSpell(victim, spellId, triggered); +} + +inline void UnitAI::DoCastAOE(uint32 spellId, bool triggered) +{ + if(!triggered && me->hasUnitState(UNIT_STAT_CASTING)) + return; + + me->CastSpell((Unit*)NULL, spellId, triggered); +} + +inline Creature *CreatureAI::DoSummon(uint32 uiEntry, const Position &pos, uint32 uiDespawntime, TempSummonType uiType) +{ + return me->SummonCreature(uiEntry, pos, uiType, uiDespawntime); } inline Creature *CreatureAI::DoSummon(uint32 uiEntry, WorldObject* pGo, float fRadius, uint32 uiDespawntime, TempSummonType uiType) diff --git a/src/game/CreatureAIRegistry.cpp b/src/game/CreatureAIRegistry.cpp index f951e5a66f0..67c1f857a56 100644 --- a/src/game/CreatureAIRegistry.cpp +++ b/src/game/CreatureAIRegistry.cpp @@ -31,7 +31,7 @@ #include "WaypointMovementGenerator.h" #include "CreatureAIFactory.h" -#include "CreatureAIImpl.h" +//#include "CreatureAIImpl.h" namespace AIRegistry { void Initialize() diff --git a/src/game/CreatureEventAI.cpp b/src/game/CreatureEventAI.cpp index fbd8816565d..b7795dc3927 100644 --- a/src/game/CreatureEventAI.cpp +++ b/src/game/CreatureEventAI.cpp @@ -516,9 +516,9 @@ void CreatureEventAI::ProcessAction(CreatureEventAI_Action const& action, uint32 Creature* pCreature = NULL; if (action.summon.duration) - pCreature = m_creature->SummonCreature(action.summon.creatureId, 0.0f, 0.0f, 0.0f, 0.0f, 0, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, action.summon.duration); + pCreature = m_creature->SummonCreature(action.summon.creatureId, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, action.summon.duration); else - pCreature = m_creature->SummonCreature(action.summon.creatureId, 0.0f, 0.0f, 0.0f, 0.0f, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 0); + pCreature = m_creature->SummonCreature(action.summon.creatureId, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 0); if (!pCreature) sLog.outErrorDb( "CreatureEventAI: failed to spawn creature %u. Spawn event %d is on creature %d", action.summon.creatureId, EventId, m_creature->GetEntry()); diff --git a/src/game/Debugcmds.cpp b/src/game/Debugcmds.cpp index c86632cf72e..97f90e33af4 100644 --- a/src/game/Debugcmds.cpp +++ b/src/game/Debugcmds.cpp @@ -774,7 +774,7 @@ bool ChatHandler::HandleDebugSpawnVehicle(const char* args) m_session->GetPlayer()->GetClosePoint(x, y, z, m_session->GetPlayer()->GetObjectSize()); if(!i) - return m_session->GetPlayer()->SummonCreature(entry, x, y, z, o, 0); + return m_session->GetPlayer()->SummonCreature(entry, x, y, z, o); uint32 id = (uint32)atoi(i); diff --git a/src/game/Level2.cpp b/src/game/Level2.cpp index bd09c69af08..9e613de3acc 100644 --- a/src/game/Level2.cpp +++ b/src/game/Level2.cpp @@ -4138,14 +4138,11 @@ bool ChatHandler::HandleTempAddSpwCommand(const char* args) Player *chr = m_session->GetPlayer(); - float x = chr->GetPositionX(); - float y = chr->GetPositionY(); - float z = chr->GetPositionZ(); - float ang = chr->GetOrientation(); - uint32 id = atoi(charID); + if(!id) + return false; - chr->SummonCreature(id,x,y,z,ang,0,TEMPSUMMON_CORPSE_DESPAWN,120); + chr->SummonCreature(id, *chr, TEMPSUMMON_CORPSE_DESPAWN, 120); return true; } diff --git a/src/game/Map.h b/src/game/Map.h index 2ef300a4af6..c9484e78101 100644 --- a/src/game/Map.h +++ b/src/game/Map.h @@ -50,6 +50,7 @@ class Player; class CreatureGroup; struct ScriptInfo; struct ScriptAction; +struct Position; typedef ACE_RW_Thread_Mutex GridRWLock; @@ -441,7 +442,7 @@ class MANGOS_DLL_SPEC Map : public GridRefManager<NGridType>, public MaNGOS::Obj double rand_chance() { return mtRand.randExc(100.0); } #endif - TempSummon *SummonCreature(uint32 entry, float x, float y, float z, float angle = 0, uint32 vehId = 0, SummonPropertiesEntry const *properties = NULL, uint32 duration = 0, Unit *summoner = NULL); + TempSummon *SummonCreature(uint32 entry, const Position &pos, SummonPropertiesEntry const *properties = NULL, uint32 duration = 0, Unit *summoner = NULL, uint32 vehId = 0); Creature* GetCreature(uint64 guid); GameObject* GetGameObject(uint64 guid); DynamicObject* GetDynamicObject(uint64 guid); diff --git a/src/game/MapManager.h b/src/game/MapManager.h index 118a057c9af..896cc515e4a 100644 --- a/src/game/MapManager.h +++ b/src/game/MapManager.h @@ -104,7 +104,7 @@ class MANGOS_DLL_DECL MapManager : public MaNGOS::Singleton<MapManager, MaNGOS:: static bool IsValidMapCoord(WorldLocation const& loc) { - return IsValidMapCoord(loc.mapid,loc.coord_x,loc.coord_y,loc.coord_z,loc.orientation); + return IsValidMapCoord(loc.GetMapId(), loc.GetPositionX(), loc.GetPositionY(), loc.GetPositionZ(), loc.GetOrientation()); } void DoDelayedMovesAndRemoves(); diff --git a/src/game/MovementHandler.cpp b/src/game/MovementHandler.cpp index 48a84a0cded..40be00327f5 100644 --- a/src/game/MovementHandler.cpp +++ b/src/game/MovementHandler.cpp @@ -50,15 +50,15 @@ void WorldSession::HandleMoveWorldportAckOpcode() WorldLocation &loc = GetPlayer()->GetTeleportDest(); // possible errors in the coordinate validity check - if(!MapManager::IsValidMapCoord(loc.mapid, loc.coord_x, loc.coord_y, loc.coord_z, loc.orientation)) + if(!MapManager::IsValidMapCoord(loc)) { LogoutPlayer(false); return; } // get the destination map entry, not the current one, this will fix homebind and reset greeting - MapEntry const* mEntry = sMapStore.LookupEntry(loc.mapid); - InstanceTemplate const* mInstance = objmgr.GetInstanceTemplate(loc.mapid); + MapEntry const* mEntry = sMapStore.LookupEntry(loc.GetMapId()); + InstanceTemplate const* mInstance = objmgr.GetInstanceTemplate(loc.GetMapId()); // reset instance validity, except if going to an instance inside an instance if(GetPlayer()->m_InstanceValid == false && !mInstance) @@ -70,22 +70,22 @@ void WorldSession::HandleMoveWorldportAckOpcode() assert(oldMap); if(GetPlayer()->IsInWorld()) { - sLog.outCrash("Player is still in world when teleported out of map %u! to new map %u", oldMap->GetId(), loc.mapid); + sLog.outCrash("Player is still in world when teleported out of map %u! to new map %u", oldMap->GetId(), loc.GetMapId()); oldMap->Remove(GetPlayer(), false); } // relocate the player to the teleport destination - Map * newMap = MapManager::Instance().CreateMap(loc.mapid, GetPlayer(), 0); + Map * newMap = MapManager::Instance().CreateMap(loc.GetMapId(), GetPlayer(), 0); // the CanEnter checks are done in TeleporTo but conditions may change // while the player is in transit, for example the map may get full if (!newMap || !newMap->CanEnter(GetPlayer())) { - sLog.outError("Map %d could not be created for player %d, porting player to homebind", loc.mapid, GetPlayer()->GetGUIDLow()); + sLog.outError("Map %d could not be created for player %d, porting player to homebind", loc.GetMapId(), GetPlayer()->GetGUIDLow()); GetPlayer()->TeleportTo(GetPlayer()->m_homebindMapId, GetPlayer()->m_homebindX, GetPlayer()->m_homebindY, GetPlayer()->m_homebindZ, GetPlayer()->GetOrientation()); return; } else - GetPlayer()->Relocate(loc.coord_x, loc.coord_y, loc.coord_z, loc.orientation); + GetPlayer()->Relocate(&loc); GetPlayer()->ResetMap(); GetPlayer()->SetMap(newMap); @@ -93,7 +93,7 @@ void WorldSession::HandleMoveWorldportAckOpcode() GetPlayer()->SendInitialPacketsBeforeAddToMap(); if(!GetPlayer()->GetMap()->Add(GetPlayer())) { - sLog.outError("WORLD: failed to teleport player %s (%d) to map %d because of unknown reason!", GetPlayer()->GetName(), GetPlayer()->GetGUIDLow(), loc.mapid); + sLog.outError("WORLD: failed to teleport player %s (%d) to map %d because of unknown reason!", GetPlayer()->GetName(), GetPlayer()->GetGUIDLow(), loc.GetMapId()); GetPlayer()->ResetMap(); GetPlayer()->SetMap(oldMap); GetPlayer()->TeleportTo(GetPlayer()->m_homebindMapId, GetPlayer()->m_homebindX, GetPlayer()->m_homebindY, GetPlayer()->m_homebindZ, GetPlayer()->GetOrientation()); @@ -202,7 +202,7 @@ void WorldSession::HandleMoveTeleportAck(WorldPacket& recv_data) WorldLocation const& dest = plMover->GetTeleportDest(); - plMover->SetPosition(dest.coord_x, dest.coord_y, dest.coord_z, dest.orientation, true); + plMover->SetPosition(dest, true); uint32 newzone, newarea; plMover->GetZoneAndAreaId(newzone, newarea); diff --git a/src/game/Object.cpp b/src/game/Object.cpp index 45ffbc36c4e..7d365b35710 100644 --- a/src/game/Object.cpp +++ b/src/game/Object.cpp @@ -1079,9 +1079,16 @@ bool Object::PrintIndexError(uint32 index, bool set) const return false; } +bool Position::IsInLine(const Unit * const target, float distance, float width) const +{ + if(!HasInArc(M_PI, target) || !target->IsWithinDist3d(m_positionX, m_positionY, m_positionZ, distance)) return false; + width += target->GetObjectSize(); + float angle = GetRelativeAngle(target); + return abs(sin(angle)) * GetExactDist2d(target->GetPositionX(), target->GetPositionY()) < width; +} + WorldObject::WorldObject() - : m_mapId(0), m_InstanceId(0), m_phaseMask(PHASEMASK_NORMAL), - m_positionX(0.0f), m_positionY(0.0f), m_positionZ(0.0f), m_orientation(0.0f), m_currMap(NULL) + : WorldLocation(), m_InstanceId(0), m_phaseMask(PHASEMASK_NORMAL), m_currMap(NULL) , m_zoneScript(NULL) , m_isActive(false), m_isWorldObject(false) , m_name("") @@ -1159,74 +1166,6 @@ InstanceData* WorldObject::GetInstanceData() Map *map = GetMap(); return map->IsDungeon() ? ((InstanceMap*)map)->GetInstanceData() : NULL; } - //slow -float WorldObject::GetDistance(const WorldObject* obj) const -{ - float dx = GetPositionX() - obj->GetPositionX(); - float dy = GetPositionY() - obj->GetPositionY(); - float dz = GetPositionZ() - obj->GetPositionZ(); - float sizefactor = GetObjectSize() + obj->GetObjectSize(); - float dist = sqrt((dx*dx) + (dy*dy) + (dz*dz)) - sizefactor; - return ( dist > 0 ? dist : 0); -} - -float WorldObject::GetDistance2d(float x, float y) const -{ - float dx = GetPositionX() - x; - float dy = GetPositionY() - y; - float sizefactor = GetObjectSize(); - float dist = sqrt((dx*dx) + (dy*dy)) - sizefactor; - return ( dist > 0 ? dist : 0); -} - -float WorldObject::GetExactDistance2d(const float x, const float y) const -{ - float dx = GetPositionX() - x; - float dy = GetPositionY() - y; - return sqrt((dx*dx) + (dy*dy)); -} - -float WorldObject::GetDistance(float x, float y, float z) const -{ - float dx = GetPositionX() - x; - float dy = GetPositionY() - y; - float dz = GetPositionZ() - z; - float sizefactor = GetObjectSize(); - float dist = sqrt((dx*dx) + (dy*dy) + (dz*dz)) - sizefactor; - return ( dist > 0 ? dist : 0); -} - -float WorldObject::GetExactDistSq(float x, float y, float z) const -{ - float dx = GetPositionX() - x; - float dy = GetPositionY() - y; - float dz = GetPositionZ() - z; - return dx*dx + dy*dy + dz*dz; -} - -float WorldObject::GetDistance2dSq(float x, float y) const -{ - float dx = GetPositionX() - x; - float dy = GetPositionY() - y; - return dx*dx + dy*dy; -} - -float WorldObject::GetExactDistSq(const WorldObject *obj) const -{ - float dx = GetPositionX() - obj->GetPositionX(); - float dy = GetPositionY() - obj->GetPositionY(); - float dz = GetPositionZ() - obj->GetPositionZ(); - return dx*dx + dy*dy + dz*dz; -} - -float WorldObject::GetDistance2d(const WorldObject* obj) const -{ - float dx = GetPositionX() - obj->GetPositionX(); - float dy = GetPositionY() - obj->GetPositionY(); - float sizefactor = GetObjectSize() + obj->GetObjectSize(); - float dist = sqrt((dx*dx) + (dy*dy)) - sizefactor; - return ( dist > 0 ? dist : 0); -} float WorldObject::GetDistanceZ(const WorldObject* obj) const { @@ -1236,29 +1175,6 @@ float WorldObject::GetDistanceZ(const WorldObject* obj) const return ( dist > 0 ? dist : 0); } -bool WorldObject::IsWithinDist3d(float x, float y, float z, float dist2compare) const -{ - float dx = GetPositionX() - x; - float dy = GetPositionY() - y; - float dz = GetPositionZ() - z; - float distsq = dx*dx + dy*dy + dz*dz; - - float maxdist = dist2compare + GetObjectSize(); - - return distsq < maxdist * maxdist; -} - -bool WorldObject::IsWithinDist2d(float x, float y, float dist2compare) const -{ - float dx = GetPositionX() - x; - float dy = GetPositionY() - y; - float distsq = dx*dx + dy*dy; - - float maxdist = dist2compare + GetObjectSize(); - - return distsq < maxdist * maxdist; -} - bool WorldObject::_IsWithinDist(WorldObject const* obj, float dist2compare, bool is3D) const { float dx = GetPositionX() - obj->GetPositionX(); @@ -1380,14 +1296,14 @@ bool WorldObject::IsInRange3d(float x, float y, float z, float minRange, float m return distsq < maxdist * maxdist; } -float WorldObject::GetAngle(const WorldObject* obj) const +float Position::GetAngle(const Position *obj) const { if(!obj) return 0; return GetAngle( obj->GetPositionX(), obj->GetPositionY() ); } // Return angle in range 0..2*pi -float WorldObject::GetAngle( const float x, const float y ) const +float Position::GetAngle( const float x, const float y ) const { float dx = x - GetPositionX(); float dy = y - GetPositionY(); @@ -1397,7 +1313,7 @@ float WorldObject::GetAngle( const float x, const float y ) const return ang; } -void WorldObject::GetSinCos(const float x, const float y, float &vsin, float &vcos) +void Position::GetSinCos(const float x, const float y, float &vsin, float &vcos) const { float dx = GetPositionX() - x; float dy = GetPositionY() - y; @@ -1416,14 +1332,12 @@ void WorldObject::GetSinCos(const float x, const float y, float &vsin, float &vc } } -bool WorldObject::HasInArc(const float arcangle, const WorldObject* obj) const +bool Position::HasInArc(float arc, const Position *obj) const { // always have self in arc if(obj == this) return true; - float arc = arcangle; - // move arc to range 0.. 2*pi while( arc >= 2.0f * M_PI ) arc -= 2.0f * M_PI; @@ -1465,7 +1379,7 @@ bool WorldObject::IsInBetween(const WorldObject *obj1, const WorldObject *obj2, size = GetObjectSize() / 2; float angle = obj1->GetAngle(this) - obj1->GetAngle(obj2); - return abs(sin(angle)) * GetExactDistance2d(obj1->GetPositionX(), obj1->GetPositionY()) < size; + return abs(sin(angle)) * GetExactDist2d(obj1->GetPositionX(), obj1->GetPositionY()) < size; } void WorldObject::GetRandomPoint( float x, float y, float z, float distance, float &rand_x, float &rand_y, float &rand_z) const @@ -1498,7 +1412,7 @@ void WorldObject::UpdateGroundPositionZ(float x, float y, float &z) const z = new_z+ 0.05f; // just to be sure that we are not a few pixel under the surface } -bool WorldObject::IsPositionValid() const +bool Position::IsPositionValid() const { return Trinity::IsValidMapCoord(m_positionX,m_positionY,m_positionZ,m_orientation); } @@ -1754,7 +1668,7 @@ void WorldObject::AddObjectToRemoveList() map->AddObjectToRemoveList(this); } -TempSummon *Map::SummonCreature(uint32 entry, float x, float y, float z, float angle, uint32 vehId, SummonPropertiesEntry const *properties, uint32 duration, Unit *summoner) +TempSummon *Map::SummonCreature(uint32 entry, const Position &pos, SummonPropertiesEntry const *properties, uint32 duration, Unit *summoner, uint32 vehId) { uint32 mask = UNIT_MASK_SUMMON; if(properties) @@ -1805,13 +1719,13 @@ TempSummon *Map::SummonCreature(uint32 entry, float x, float y, float z, float a default: return NULL; } - if(!summon->Create(objmgr.GenerateLowGuid(HIGHGUID_UNIT), this, phase, entry, vehId, team, x, y, z, angle)) + if(!summon->Create(objmgr.GenerateLowGuid(HIGHGUID_UNIT), this, phase, entry, vehId, team, pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), pos.GetOrientation())) { delete summon; return NULL; } - summon->SetHomePosition(x, y, z, angle); + summon->SetHomePosition(pos); summon->InitStats(duration); Add((Creature*)summon); @@ -1833,22 +1747,18 @@ void WorldObject::SetZoneScript() } } -TempSummon* WorldObject::SummonCreature(uint32 entry, float x, float y, float z, float ang, uint32 vehId, TempSummonType spwtype, uint32 duration) +TempSummon* WorldObject::SummonCreature(uint32 entry, const Position &pos, TempSummonType spwtype, uint32 duration, uint32 vehId) const { - Map *map = FindMap(); - if(!map) - return NULL; - - if (x == 0.0f && y == 0.0f && z == 0.0f) - GetClosePoint(x, y, z, GetObjectSize()); - - TempSummon *pCreature = map->SummonCreature(entry, x, y, z, ang, vehId, NULL, duration, isType(TYPEMASK_UNIT) ? (Unit*)this : NULL); - if(!pCreature) - return NULL; - - pCreature->SetTempSummonType(spwtype); + if(Map *map = FindMap()) + { + if(TempSummon *summon = map->SummonCreature(entry, pos, NULL, duration, isType(TYPEMASK_UNIT) ? (Unit*)this : NULL)) + { + summon->SetTempSummonType(spwtype); + return summon; + } + } - return pCreature; + return NULL; } Pet* Player::SummonPet(uint32 entry, float x, float y, float z, float ang, PetType petType, uint32 duration) diff --git a/src/game/Object.h b/src/game/Object.h index d46d6a45479..af4b6eb5301 100644 --- a/src/game/Object.h +++ b/src/game/Object.h @@ -105,24 +105,10 @@ class TempSummon; class Vehicle; class CreatureAI; class ZoneScript; +class Unit; typedef UNORDERED_MAP<Player*, UpdateData> UpdateDataMapType; -struct WorldLocation -{ - uint32 mapid; - float coord_x; - float coord_y; - float coord_z; - float orientation; - explicit WorldLocation(uint32 _mapid = 0, float _x = 0, float _y = 0, float _z = 0, float _o = 0) - : mapid(_mapid), coord_x(_x), coord_y(_y), coord_z(_z), orientation(_o) {} - WorldLocation(WorldLocation const &loc) - : mapid(loc.mapid), coord_x(loc.coord_x), coord_y(loc.coord_y), coord_z(loc.coord_z), orientation(loc.orientation) {} -}; - -typedef float Position[4]; - class TRINITY_DLL_SPEC Object { public: @@ -364,53 +350,101 @@ class TRINITY_DLL_SPEC Object Object& operator=(Object const&); // prevent generation assigment operator }; -class TRINITY_DLL_SPEC WorldObject : public Object +struct TRINITY_DLL_SPEC Position +{ + float m_positionX; + float m_positionY; + float m_positionZ; + float m_orientation; + + void Relocate(float x, float y) + { m_positionX = x; m_positionY = y;} + void Relocate(float x, float y, float z) + { m_positionX = x; m_positionY = y; m_positionZ = z; } + void Relocate(float x, float y, float z, float orientation) + { m_positionX = x; m_positionY = y; m_positionZ = z; m_orientation = orientation; } + void Relocate(const Position &pos) + { m_positionX = pos.m_positionX; m_positionY = pos.m_positionY; m_positionZ = pos.m_positionZ; m_orientation = pos.m_orientation; } + void Relocate(const Position *pos) + { m_positionX = pos->m_positionX; m_positionY = pos->m_positionY; m_positionZ = pos->m_positionZ; m_orientation = pos->m_orientation; } + void SetOrientation(float orientation) + { m_orientation = orientation; } + + float GetPositionX() const { return m_positionX; } + float GetPositionY() const { return m_positionY; } + float GetPositionZ() const { return m_positionZ; } + float GetOrientation() const { return m_orientation; } + + void GetPosition(float &x, float &y) const + { x = m_positionX; y = m_positionY; } + void GetPosition(float &x, float &y, float &z) const + { x = m_positionX; y = m_positionY; z = m_positionZ; } + void GetPosition(float &x, float &y, float &z, float &o) const + { x = m_positionX; y = m_positionY; z = m_positionZ; o = m_orientation; } + void GetPosition(Position *pos) const + { pos->Relocate(m_positionX, m_positionY, m_positionZ, m_orientation); } + + bool IsPositionValid() const; + + float GetExactDist2dSq(float x, float y) const + { float dx = m_positionX - x; float dy = m_positionY - y; return dx*dx + dy*dy; } + float GetExactDist2d(const float x, const float y) const + { return sqrt(GetExactDist2dSq(x, y)); } + float GetExactDist2dSq(const Position *pos) const + { float dx = m_positionX - pos->m_positionX; float dy = m_positionY - pos->m_positionY; return dx*dx + dy*dy; } + float GetExactDist2d(const Position *pos) const + { return sqrt(GetExactDist2dSq(pos)); } + float GetExactDistSq(float x, float y, float z) const + { float dz = m_positionZ - z; return GetExactDist2dSq(x, y) + dz*dz; } + float GetExactDist(float x, float y, float z) const + { return sqrt(GetExactDistSq(x, y, z)); } + float GetExactDistSq(const Position *pos) const + { float dx = m_positionX - pos->m_positionX; float dy = m_positionY - pos->m_positionY; float dz = m_positionZ - pos->m_positionZ; return dx*dx + dy*dy + dz*dz; } + float GetExactDist(const Position *pos) const + { return sqrt(GetExactDistSq(pos)); } + + float GetAngle(const Position *pos) const; + float GetAngle(float x, float y) const; + float GetRelativeAngle(const Position *pos) const { return GetAngle(pos) - m_orientation; } + void GetSinCos(float x, float y, float &vsin, float &vcos) const; + + bool IsInDist2d(float x, float y, float dist) const + { return GetExactDist2dSq(x, y) < dist * dist; } + bool IsInDist2d(const Position *pos, float dist) const + { return GetExactDist2dSq(pos) < dist * dist; } + bool IsInDist(float x, float y, float z, float dist) const + { return GetExactDistSq(x, y, z) < dist * dist; } + bool IsInDist(const Position *pos, float dist) const + { return GetExactDistSq(pos) < dist * dist; } + bool HasInArc(float arcangle, const Position *pos) const; + bool IsInLine(const Unit *target, float distance, float width) const; +}; + +class WorldLocation : public Position { public: - virtual ~WorldObject(); + explicit WorldLocation(uint32 _mapid = 0, float _x = 0, float _y = 0, float _z = 0, float _o = 0) + : m_mapId(_mapid) { Relocate(_x, _y, _z, _o); } + WorldLocation(const WorldLocation &loc) + : m_mapId(loc.GetMapId()) { Relocate(&loc); } - virtual void Update ( uint32 /*time_diff*/ ) { } + //void GetPosition(const WorldLocation &loc) const + // { loc.mapid = GetMapId(); Position::GetPosition(loc.coord_x, loc.coord_y, loc.coord_z); loc.orientation = GetOrientation(); } + uint32 GetMapId() const { return m_mapId; } - void _Create( uint32 guidlow, HighGuid guidhigh, uint32 phaseMask); + protected: + uint32 m_mapId; +}; - void Relocate(WorldObject *obj) - { - m_positionX = obj->GetPositionX(); - m_positionY = obj->GetPositionY(); - m_positionZ = obj->GetPositionZ(); - m_orientation = obj->GetOrientation(); - } +class TRINITY_DLL_SPEC WorldObject : public Object, public WorldLocation +{ + public: + virtual ~WorldObject(); - void Relocate(float x, float y, float z, float orientation) - { - m_positionX = x; - m_positionY = y; - m_positionZ = z; - m_orientation = orientation; - } + virtual void Update ( uint32 /*time_diff*/ ) { } - void Relocate(float x, float y, float z) - { - m_positionX = x; - m_positionY = y; - m_positionZ = z; - } + void _Create( uint32 guidlow, HighGuid guidhigh, uint32 phaseMask); - void Relocate(Position pos) - { m_positionX = pos[0]; m_positionY = pos[1]; m_positionZ = pos[2]; m_orientation = pos[3]; } - - void SetOrientation(float orientation) { m_orientation = orientation; } - - float GetPositionX( ) const { return m_positionX; } - float GetPositionY( ) const { return m_positionY; } - float GetPositionZ( ) const { return m_positionZ; } - void GetPosition( float &x, float &y, float &z ) const - { x = m_positionX; y = m_positionY; z = m_positionZ; } - void GetPosition( WorldLocation &loc ) const - { loc.mapid = GetMapId(); GetPosition(loc.coord_x, loc.coord_y, loc.coord_z); loc.orientation = GetOrientation(); } - void GetPosition(Position pos) const - { pos[0] = m_positionX; pos[1] = m_positionY; pos[2] = m_positionZ; pos[3] = m_orientation; } - float GetOrientation( ) const { return m_orientation; } void GetNearPoint2D( float &x, float &y, float distance, float absAngle) const; void GetNearPoint( WorldObject const* searcher, float &x, float &y, float &z, float searcher_size, float distance2d,float absAngle) const; void GetClosePoint(float &x, float &y, float &z, float size, float distance2d = 0, float angle = 0) const @@ -434,12 +468,10 @@ class TRINITY_DLL_SPEC WorldObject : public Object { return ( m_valuesCount > UNIT_FIELD_COMBATREACH ) ? m_floatValues[UNIT_FIELD_COMBATREACH] : DEFAULT_WORLD_OBJECT_SIZE; } - bool IsPositionValid() const; void UpdateGroundPositionZ(float x, float y, float &z) const; void GetRandomPoint( float x, float y, float z, float distance, float &rand_x, float &rand_y, float &rand_z ) const; - uint32 GetMapId() const { return m_mapId; } uint32 GetInstanceId() const { return m_InstanceId; } virtual void SetPhaseMask(uint32 newPhaseMask, bool update); @@ -458,21 +490,24 @@ class TRINITY_DLL_SPEC WorldObject : public Object virtual const char* GetNameForLocaleIdx(int32 /*locale_idx*/) const { return GetName(); } - float GetDistance( const WorldObject* obj ) const; - float GetDistance(float x, float y, float z) const; - float GetDistance2dSq(float x, float y) const; - float GetExactDistSq(float x, float y, float z) const; - float GetExactDistSq(const WorldObject *obj) const; - float GetDistance2d(const WorldObject* obj) const; - float GetDistance2d(float x, float y) const; - float GetExactDistance2d(const float x, const float y) const; + float GetDistance( const WorldObject* obj ) const + { return GetExactDist(obj) + GetObjectSize() + obj->GetObjectSize(); } + float GetDistance(float x, float y, float z) const + { return GetExactDist(x, y, z) + GetObjectSize(); } + float GetDistance2d(const WorldObject* obj) const + { return GetExactDist2d(obj) + GetObjectSize() + obj->GetObjectSize(); } + float GetDistance2d(float x, float y) const + { return GetExactDist2d(x, y) + GetObjectSize(); } float GetDistanceZ(const WorldObject* obj) const; + bool IsInMap(const WorldObject* obj) const { return IsInWorld() && obj->IsInWorld() && (GetMap() == obj->GetMap()) && InSamePhase(obj); } - bool IsWithinDist3d(float x, float y, float z, float dist2compare) const; - bool IsWithinDist2d(float x, float y, float dist2compare) const; + bool IsWithinDist3d(float x, float y, float z, float dist) const + { return IsInDist(x, y, z, dist + GetObjectSize()); } + bool IsWithinDist2d(float x, float y, float dist) const + { return IsInDist2d(x, y, dist + GetObjectSize()); } bool _IsWithinDist(WorldObject const* obj, float dist2compare, bool is3D) const; bool IsWithinDist(WorldObject const* obj, float dist2compare, bool is3D = true) const // use only if you will sure about placing both object at same map @@ -490,11 +525,6 @@ class TRINITY_DLL_SPEC WorldObject : public Object bool IsInRange2d(float x, float y, float minRange, float maxRange) const; bool IsInRange3d(float x, float y, float z, float minRange, float maxRange) const; - float GetAngle( const WorldObject* obj ) const; - float GetAngle( const float x, const float y ) const; - float GetRelativeAngle(const WorldObject *obj) const { return GetAngle(obj) - GetOrientation(); } - void GetSinCos(const float x, const float y, float &vsin, float &vcos); - bool HasInArc( const float arcangle, const WorldObject* obj ) const; bool IsInBetween(const WorldObject *obj1, const WorldObject *obj2, float size = 0) const; virtual void CleanupsBeforeDelete(); // used in destructor or explicitly before mass creature delete to remove cross-references to already deleted units @@ -542,10 +572,16 @@ class TRINITY_DLL_SPEC WorldObject : public Object void SetZoneScript(); ZoneScript * GetZoneScript() const { return m_zoneScript; } - TempSummon* SummonCreature(uint32 id, float x, float y, float z, float ang = 0, uint32 vehId = 0, TempSummonType spwtype = TEMPSUMMON_MANUAL_DESPAWN, uint32 despwtime = 0); + TempSummon* SummonCreature(uint32 id, const Position &pos, TempSummonType spwtype = TEMPSUMMON_MANUAL_DESPAWN, uint32 despwtime = 0, uint32 vehId = 0) const; TempSummon* SummonCreature(uint32 id, float x, float y, float z, float ang = 0, TempSummonType spwtype = TEMPSUMMON_MANUAL_DESPAWN, uint32 despwtime = 0) - { - return SummonCreature(id, x, y, z, ang, 0, spwtype, despwtime); + { + if(!x && !y && !z) + { + GetClosePoint(x, y, z, GetObjectSize()); + ang = GetOrientation(); + } + Position pos = {x, y, z, ang}; + return SummonCreature(id, pos, spwtype, despwtime, 0); } 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); @@ -589,14 +625,9 @@ class TRINITY_DLL_SPEC WorldObject : public Object private: Map * m_currMap; //current object's Map location - uint32 m_mapId; // object at map with map_id + //uint32 m_mapId; // object at map with map_id uint32 m_InstanceId; // in map copy with instance id uint32 m_phaseMask; // in area phase state - - float m_positionX; - float m_positionY; - float m_positionZ; - float m_orientation; }; #endif diff --git a/src/game/Player.cpp b/src/game/Player.cpp index df122d1f96e..3522e70392f 100644 --- a/src/game/Player.cpp +++ b/src/game/Player.cpp @@ -1760,10 +1760,10 @@ bool Player::TeleportTo(uint32 mapid, float x, float y, float z, float orientati if(!GetSession()->PlayerLogout()) { Position oldPos; - GetPosition(oldPos); + GetPosition(&oldPos); Relocate(x, y, z, orientation); SendTeleportAckMsg(); - Relocate(oldPos); + Relocate(&oldPos); } } else @@ -14835,8 +14835,8 @@ bool Player::LoadFromDB( uint32 guid, SqlQueryHolder *holder ) { // Do not look for instance if bg not found const WorldLocation& _loc = GetBattleGroundEntryPoint(); - mapId = _loc.mapid; instanceId = 0; - Relocate(_loc.coord_x, _loc.coord_y, _loc.coord_z, _loc.orientation); + mapId = _loc.GetMapId(); instanceId = 0; + Relocate(&_loc); // We are not in BG anymore m_bgData.bgInstanceID = 0; @@ -16313,13 +16313,13 @@ void Player::SaveToDB() } else { - ss << GetTeleportDest().mapid << ", " + ss << GetTeleportDest().GetMapId() << ", " << (uint32)0 << ", " << (uint32)GetDifficulty() << ", " - << finiteAlways(GetTeleportDest().coord_x) << ", " - << finiteAlways(GetTeleportDest().coord_y) << ", " - << finiteAlways(GetTeleportDest().coord_z) << ", " - << finiteAlways(GetTeleportDest().orientation) << ", '"; + << finiteAlways(GetTeleportDest().GetPositionX()) << ", " + << finiteAlways(GetTeleportDest().GetPositionY()) << ", " + << finiteAlways(GetTeleportDest().GetPositionZ()) << ", " + << finiteAlways(GetTeleportDest().GetOrientation()) << ", '"; } uint16 i; @@ -21701,8 +21701,8 @@ void Player::_SaveBGData() { /* guid, bgInstanceID, bgTeam, x, y, z, o, map, taxi[0], taxi[1], mountSpell */ CharacterDatabase.PExecute("INSERT INTO character_battleground_data VALUES ('%u', '%u', '%u', '%f', '%f', '%f', '%f', '%u', '%u', '%u', '%u')", - GetGUIDLow(), m_bgData.bgInstanceID, m_bgData.bgTeam, m_bgData.joinPos.coord_x, m_bgData.joinPos.coord_y, m_bgData.joinPos.coord_z, - m_bgData.joinPos.orientation, m_bgData.joinPos.mapid, m_bgData.taxiPath[0], m_bgData.taxiPath[1], m_bgData.mountSpell); + GetGUIDLow(), m_bgData.bgInstanceID, m_bgData.bgTeam, m_bgData.joinPos.GetPositionX(), m_bgData.joinPos.GetPositionY(), m_bgData.joinPos.GetPositionZ(), + m_bgData.joinPos.GetOrientation(), m_bgData.joinPos.GetMapId(), m_bgData.taxiPath[0], m_bgData.taxiPath[1], m_bgData.mountSpell); } } diff --git a/src/game/Player.h b/src/game/Player.h index 75a9953a77f..657d4632b0d 100644 --- a/src/game/Player.h +++ b/src/game/Player.h @@ -946,7 +946,7 @@ class MANGOS_DLL_SPEC Player : public Unit bool TeleportTo(WorldLocation const &loc, uint32 options = 0) { - return TeleportTo(loc.mapid, loc.coord_x, loc.coord_y, loc.coord_z, loc.orientation, options); + return TeleportTo(loc.GetMapId(), loc.GetPositionX(), loc.GetPositionY(), loc.GetPositionZ(), loc.GetOrientation(), options); } bool TeleportToBGEntryPoint(); @@ -1729,6 +1729,7 @@ class MANGOS_DLL_SPEC Player : public Unit void SendResetInstanceFailed(uint32 reason, uint32 MapId); void SendResetFailedNotify(uint32 mapid); + bool SetPosition(const Position &pos, bool teleport = false) { return SetPosition(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), pos.GetOrientation(), teleport); } bool SetPosition(float x, float y, float z, float orientation, bool teleport = false); void UpdateUnderwaterState( Map * m, float x, float y, float z ); diff --git a/src/game/Spell.cpp b/src/game/Spell.cpp index 5ead8c6fe92..848f7e6e02c 100644 --- a/src/game/Spell.cpp +++ b/src/game/Spell.cpp @@ -6636,7 +6636,7 @@ void Spell::SelectTrajTargets() const float size = std::max((*itr)->GetObjectSize() * 0.7f, 1.0f); // 1/sqrt(3) // 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 objDist2d = (*itr)->GetExactDist2d(m_targets.m_srcX, m_targets.m_srcY) * cos(m_caster->GetRelativeAngle(*itr)); const float dz = (*itr)->GetPositionZ() - m_targets.m_srcZ; 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);) diff --git a/src/game/Spell.h b/src/game/Spell.h index c9018ee7b53..b6aab83bea8 100644 --- a/src/game/Spell.h +++ b/src/game/Spell.h @@ -637,8 +637,8 @@ class Spell void SpellDamageWeaponDmg(uint32 i); void SpellDamageHeal(uint32 i); - void GetSummonPosition(uint32 i, float &x, float &y, float &z, float radius = 0.0f, uint32 count = 0); - void SummonGuardian (uint32 entry, SummonPropertiesEntry const *properties); + void GetSummonPosition(uint32 i, Position &pos, float radius = 0.0f, uint32 count = 0); + void SummonGuardian(uint32 i, uint32 entry, SummonPropertiesEntry const *properties); SpellCastResult CanOpenLock(uint32 effIndex, uint32 lockid, SkillType& skillid, int32& reqSkillValue, int32& skillValue); // ------------------------------------------- @@ -756,11 +756,11 @@ namespace Trinity i_data->push_back(target); break; case PUSH_IN_LINE: - if(i_source->isInLine(target, i_radius, i_source->GetObjectSize())) + if(i_source->IsInLine(target, i_radius, i_source->GetObjectSize())) i_data->push_back(target); break; case PUSH_IN_THIN_LINE: - if(i_source->isInLine(target, i_radius, 0)) + if(i_source->IsInLine(target, i_radius, 0)) i_data->push_back(target); break; } diff --git a/src/game/SpellEffects.cpp b/src/game/SpellEffects.cpp index 1bf992f366d..5fa12a92eca 100644 --- a/src/game/SpellEffects.cpp +++ b/src/game/SpellEffects.cpp @@ -2325,7 +2325,7 @@ void Spell::EffectJump(uint32 i) speedZ = float(m_spellInfo->EffectMiscValueB[i])/10; else speedZ = 10.0f; - float speedXY = m_caster->GetExactDistance2d(x, y) * 10.0f / speedZ; + float speedXY = m_caster->GetExactDist2d(x, y) * 10.0f / speedZ; m_caster->GetMotionMaster()->MoveJump(x, y, z, speedXY, speedZ); } @@ -3390,8 +3390,8 @@ void Spell::EffectSummonType(uint32 i) if(Player* modOwner = m_originalCaster->GetSpellModOwner()) modOwner->ApplySpellMod(m_spellInfo->Id, SPELLMOD_DURATION, duration); - float x, y, z; - GetSummonPosition(i, x, y, z); + Position pos; + GetSummonPosition(i, pos); /*//totem must be at same Z in case swimming caster and etc. if( fabs( z - m_caster->GetPositionZ() ) > 5 ) @@ -3420,7 +3420,7 @@ void Spell::EffectSummonType(uint32 i) default: if (properties->Flags & 512) { - SummonGuardian(entry, properties); + SummonGuardian(i, entry, properties); break; } switch(properties->Type) @@ -3428,16 +3428,16 @@ void Spell::EffectSummonType(uint32 i) case SUMMON_TYPE_PET: case SUMMON_TYPE_GUARDIAN: case SUMMON_TYPE_MINION: - SummonGuardian(entry, properties); + SummonGuardian(i, entry, properties); break; case SUMMON_TYPE_VEHICLE: case SUMMON_TYPE_VEHICLE2: if(m_originalCaster) - summon = m_caster->GetMap()->SummonCreature(entry, x, y, z, m_caster->GetOrientation(), 0, properties, duration, m_originalCaster); + summon = m_caster->GetMap()->SummonCreature(entry, pos, properties, duration, m_originalCaster); break; case SUMMON_TYPE_TOTEM: { - summon = m_caster->GetMap()->SummonCreature(entry, x, y, z, m_caster->GetOrientation(), 0, properties, duration, m_originalCaster); + summon = m_caster->GetMap()->SummonCreature(entry, pos, properties, duration, m_originalCaster); if(!summon || !summon->isTotem()) return; @@ -3465,7 +3465,7 @@ void Spell::EffectSummonType(uint32 i) } case SUMMON_TYPE_MINIPET: { - summon = m_caster->GetMap()->SummonCreature(entry, x, y, z, m_caster->GetOrientation(), 0, properties, duration, m_originalCaster); + summon = m_caster->GetMap()->SummonCreature(entry, pos, properties, duration, m_originalCaster); if(!summon || !summon->HasUnitTypeMask(UNIT_MASK_MINION)) return; @@ -3492,12 +3492,11 @@ void Spell::EffectSummonType(uint32 i) for(uint32 count = 0; count < amount; ++count) { - float px, py, pz; - GetSummonPosition(i, px, py, pz, radius, count); + GetSummonPosition(i, pos, radius, count); TempSummonType summonType = (duration == 0) ? TEMPSUMMON_DEAD_DESPAWN : TEMPSUMMON_TIMED_DESPAWN; - TempSummon * summon = m_originalCaster->SummonCreature(entry,px,py,pz,m_caster->GetOrientation(),summonType,duration); + TempSummon * summon = m_originalCaster->SummonCreature(entry, pos, summonType, duration); if (!summon) continue; if (properties->Category == SUMMON_CATEGORY_ALLY) @@ -3512,16 +3511,16 @@ void Spell::EffectSummonType(uint32 i) }//switch break; case SUMMON_CATEGORY_PET: - SummonGuardian(entry, properties); + SummonGuardian(i, entry, properties); break; case SUMMON_CATEGORY_PUPPET: - summon = m_caster->GetMap()->SummonCreature(entry, x, y, z, m_caster->GetOrientation(), 0, properties, duration, m_originalCaster); + summon = m_caster->GetMap()->SummonCreature(entry, pos, properties, duration, m_originalCaster); break; case SUMMON_CATEGORY_VEHICLE: { float x, y, z; m_caster->GetClosePoint(x, y, z, DEFAULT_WORLD_OBJECT_SIZE); - summon = m_caster->GetMap()->SummonCreature(entry, x, y, z, m_caster->GetOrientation(), 0, properties, duration, m_caster); + summon = m_caster->GetMap()->SummonCreature(entry, pos, properties, duration, m_caster); if(!summon || !summon->IsVehicle()) return; @@ -4132,7 +4131,7 @@ void Spell::EffectSummonPet(uint32 i) { SummonPropertiesEntry const *properties = sSummonPropertiesStore.LookupEntry(67); if(properties) - SummonGuardian(petentry, properties); + SummonGuardian(i, petentry, properties); return; } @@ -6955,14 +6954,15 @@ void Spell::EffectWMORepair(uint32 /*i*/) gameObjTarget->Rebuild(); } -void Spell::SummonGuardian(uint32 entry, SummonPropertiesEntry const *properties) +void Spell::SummonGuardian(uint32 i, uint32 entry, SummonPropertiesEntry const *properties) { Unit *caster = m_originalCaster; - if(caster && caster->GetTypeId() == TYPEID_UNIT && ((Creature*)caster)->isTotem()) - caster = ((Totem*)caster)->GetOwner(); if(!caster) return; + if(caster->isTotem()) + caster = ((Totem*)caster)->GetOwner(); + // in another case summon new uint32 level = caster->getLevel(); @@ -6995,10 +6995,10 @@ void Spell::SummonGuardian(uint32 entry, SummonPropertiesEntry const *properties for(uint32 count = 0; count < amount; ++count) { - float px, py, pz; - GetSummonPosition(0, px, py, pz, radius, count); + Position pos; + GetSummonPosition(i, pos, radius, count); - TempSummon *summon = map->SummonCreature(entry, px, py, pz, m_caster->GetOrientation(), 0, properties, duration, caster); + TempSummon *summon = map->SummonCreature(entry, pos, properties, duration, caster); if(!summon) return; if(summon->HasUnitTypeMask(UNIT_MASK_GUARDIAN)) @@ -7012,17 +7012,13 @@ void Spell::SummonGuardian(uint32 entry, SummonPropertiesEntry const *properties } } -void Spell::GetSummonPosition(uint32 i, float &x, float &y, float &z, float radius, uint32 count) +void Spell::GetSummonPosition(uint32 i, Position &pos, float radius, uint32 count) { if (m_targets.m_targetMask & TARGET_FLAG_DEST_LOCATION) { // Summon 1 unit in dest location if (count == 0) - { - x = m_targets.m_destX; - y = m_targets.m_destY; - z = m_targets.m_destZ; - } + pos.Relocate(m_targets.m_destX, m_targets.m_destY, m_targets.m_destZ, m_caster->GetOrientation()); // Summon in random point all other units if location present else { @@ -7031,23 +7027,33 @@ void Spell::GetSummonPosition(uint32 i, float &x, float &y, float &z, float radi { case TARGET_MINION: case TARGET_DEST_CASTER_RANDOM: + { + float x, y, z; m_caster->GetGroundPointAroundUnit(x, y, z, radius * rand_norm(), rand_norm()*2*M_PI); + pos.Relocate(x, y, z, m_caster->GetOrientation()); break; + } case TARGET_DEST_DEST_RANDOM: case TARGET_DEST_TARGET_RANDOM: + { + float x, y, z; m_caster->GetRandomPoint(m_targets.m_destX,m_targets.m_destY,m_targets.m_destZ,radius,x,y,z); + pos.Relocate(x, y, z, m_caster->GetOrientation()); break; + } default: - x = m_targets.m_destX; - y = m_targets.m_destY; - z = m_targets.m_destZ; + pos.Relocate(m_targets.m_destX, m_targets.m_destY, m_targets.m_destZ, m_caster->GetOrientation()); break; } } } // Summon if dest location not present near caster else + { + float x, y, z; m_caster->GetClosePoint(x,y,z,3.0f); + pos.Relocate(x, y, z, m_caster->GetOrientation()); + } } void Spell::EffectRenamePet(uint32 /*eff_idx*/) diff --git a/src/game/Unit.cpp b/src/game/Unit.cpp index d85c67720ce..29bb1c5bcad 100644 --- a/src/game/Unit.cpp +++ b/src/game/Unit.cpp @@ -3479,14 +3479,6 @@ bool Unit::isInBackInMap(Unit const* target, float distance, float arc) const return IsWithinDistInMap(target, distance) && !HasInArc( 2 * M_PI - arc, target ); } -bool Unit::isInLine(Unit const* target, float distance, float width) const -{ - if(!HasInArc(M_PI, target) || !IsWithinDistInMap(target, distance)) return false; - width += target->GetObjectSize(); - float angle = GetRelativeAngle(target); - return abs(sin(angle)) * GetExactDistance2d(target->GetPositionX(), target->GetPositionY()) < width; -} - bool Unit::isInAccessiblePlaceFor(Creature const* c) const { if(IsInWater()) @@ -14682,7 +14674,7 @@ void Unit::JumpTo(WorldObject *obj, float speedZ) { float x, y, z; obj->GetContactPoint(this, x, y, z); - float speedXY = GetExactDistance2d(x, y) * 10.0f / speedZ; + float speedXY = GetExactDist2d(x, y) * 10.0f / speedZ; GetMotionMaster()->MoveJump(x, y, z, speedXY, speedZ); } diff --git a/src/game/Unit.h b/src/game/Unit.h index 18c578376c6..5ede0e3f848 100644 --- a/src/game/Unit.h +++ b/src/game/Unit.h @@ -1597,7 +1597,6 @@ class TRINITY_DLL_SPEC Unit : public WorldObject bool isInFrontInMap(Unit const* target,float distance, float arc = M_PI) const; void SetInFront(Unit const* target); bool isInBackInMap(Unit const* target, float distance, float arc = M_PI) const; - bool isInLine(Unit const* target, float distance, float width) const; // Visibility system UnitVisibility GetVisibility() const { return m_Visibility; } diff --git a/src/game/UnitAI.cpp b/src/game/UnitAI.cpp index 50936bff001..d0a013393ba 100644 --- a/src/game/UnitAI.cpp +++ b/src/game/UnitAI.cpp @@ -275,22 +275,6 @@ void UnitAI::DoCast(uint32 spellId) me->CastSpell(target, spellId, false); } -void UnitAI::DoCast(Unit* victim, uint32 spellId, bool triggered) -{ - if(!victim || me->hasUnitState(UNIT_STAT_CASTING) && !triggered) - return; - - me->CastSpell(victim, spellId, triggered); -} - -void UnitAI::DoCastAOE(uint32 spellId, bool triggered) -{ - if(!triggered && me->hasUnitState(UNIT_STAT_CASTING)) - return; - - me->CastSpell((Unit*)NULL, spellId, triggered); -} - #define UPDATE_TARGET(a) {if(AIInfo->target<a) AIInfo->target=a;} void UnitAI::FillAISpellInfo() diff --git a/src/game/Vehicle.cpp b/src/game/Vehicle.cpp index a81c6bb6629..510214c5a23 100644 --- a/src/game/Vehicle.cpp +++ b/src/game/Vehicle.cpp @@ -207,7 +207,7 @@ void Vehicle::InstallAccessory(uint32 entry, int8 seatId, bool minion) } //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(Creature *accessory = me->SummonCreature(entry, *me, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30000)) { if(minion) accessory->AddUnitTypeMask(UNIT_MASK_ACCESSORY); |