diff options
| author | QAston <none@none> | 2010-07-21 02:06:51 +0200 |
|---|---|---|
| committer | QAston <none@none> | 2010-07-21 02:06:51 +0200 |
| commit | dd89c54c6ec903f491d7acdec00685b20bcfe1c4 (patch) | |
| tree | ca88b380d3ddbcf6fd91263fd9d623af0593fcd3 /src/server/game/Entities/Object | |
| parent | 1944cd17a1b71a23e6597d28a06de04186184c69 (diff) | |
*Move target handling of TARGET_DEST_CASTER_FRONT_LEAP out of SPELL_EFFECT_LEAP handler, this fixes spells with SPELL_EFFECT_LEAP using other target types.
--HG--
branch : trunk
Diffstat (limited to 'src/server/game/Entities/Object')
| -rw-r--r-- | src/server/game/Entities/Object/Object.cpp | 50 | ||||
| -rw-r--r-- | src/server/game/Entities/Object/Object.h | 6 |
2 files changed, 56 insertions, 0 deletions
diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp index fe4b8673b8f..88396fda4c9 100644 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -2223,6 +2223,56 @@ void WorldObject::MovePosition(Position &pos, float dist, float angle) pos.m_orientation = m_orientation; } +void WorldObject::MovePositionToFirstCollision(Position &pos, float dist, float angle) +{ + angle += m_orientation; + float destx, desty, destz, ground, floor; + + destx = pos.m_positionX + dist * cos(angle); + desty = pos.m_positionY + dist * sin(angle); + ground = GetMap()->GetHeight(destx, desty, MAX_HEIGHT, true); + floor = GetMap()->GetHeight(destx, desty, pos.m_positionZ, true); + destz = fabs(ground - pos.m_positionZ) <= fabs(floor - pos.m_positionZ) ? ground : floor; + + bool col = VMAP::VMapFactory::createOrGetVMapManager()->getObjectHitPos(GetMapId(),pos.m_positionX,pos.m_positionY,pos.m_positionZ+0.5f,destx,desty,destz+0.5f,destx,desty,destz,-0.5f); + + // collision occured + if (col) + { + // move back a bit + destx -= CONTACT_DISTANCE * cos(angle); + desty -= CONTACT_DISTANCE * sin(angle); + dist = sqrt((pos.m_positionX - destx)*(pos.m_positionX - destx) + (pos.m_positionY - desty)*(pos.m_positionY - desty)); + } + + float step = dist/10.0f; + + int j = 0; + for (j; j < 10; j++) + { + // do not allow too big z changes + if (fabs(pos.m_positionZ - destz) > 6) + { + destx -= step * cos(angle); + desty -= step * sin(angle); + ground = GetMap()->GetHeight(destx, desty, MAX_HEIGHT, true); + floor = GetMap()->GetHeight(destx, desty, pos.m_positionZ, true); + destz = fabs(ground - pos.m_positionZ) <= fabs(floor - pos.m_positionZ) ? ground : floor; + } + // we have correct destz now + else + { + pos.Relocate(destx, desty, destz); + break; + } + } + + Trinity::NormalizeMapCoord(pos.m_positionX); + Trinity::NormalizeMapCoord(pos.m_positionY); + UpdateGroundPositionZ(pos.m_positionX, pos.m_positionY, pos.m_positionZ); + pos.m_orientation = m_orientation; +} + void WorldObject::SetPhaseMask(uint32 newPhaseMask, bool update) { m_phaseMask = newPhaseMask; diff --git a/src/server/game/Entities/Object/Object.h b/src/server/game/Entities/Object/Object.h index ad7d0c072ab..0129e30b952 100644 --- a/src/server/game/Entities/Object/Object.h +++ b/src/server/game/Entities/Object/Object.h @@ -487,6 +487,12 @@ class WorldObject : public Object, public WorldLocation GetPosition(&pos); MovePosition(pos, dist, angle); } + void MovePositionToFirstCollision(Position &pos, float dist, float angle); + void GetFirstCollisionPosition(Position &pos, float dist, float angle) + { + GetPosition(&pos); + MovePositionToFirstCollision(pos, dist, angle); + } void GetRandomNearPosition(Position &pos, float radius) { GetPosition(&pos); |
