Created
January 5, 2016 21:19
-
-
Save Asterc/c73e779ab52649f793dd to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp | |
index 815daed..afedd92 100644 | |
--- a/src/server/game/Spells/Spell.cpp | |
+++ b/src/server/game/Spells/Spell.cpp | |
@@ -1290,179 +1290,162 @@ void Spell::SelectImplicitCasterDestTargets(SpellEffIndex effIndex, SpellImplici | |
Map* map = m_caster->GetMap(); | |
uint32 mapid = m_caster->GetMapId(); | |
uint32 phasemask = m_caster->GetPhaseMask(); | |
- float destx, desty, destz, ground; | |
Position pos; | |
Position lastpos; | |
+ Position dest; | |
+ float ground; | |
pos = m_caster->GetPosition(); | |
- destx = pos.GetPositionX() + distance * cos(pos.GetOrientation()); | |
- desty = pos.GetPositionY() + distance * sin(pos.GetOrientation()); | |
+ dest.m_positionX = pos.GetPositionX() + distance * cos(pos.GetOrientation()); | |
+ dest.m_positionY = pos.GetPositionY() + distance * sin(pos.GetOrientation()); | |
ground = map->GetHeight(phasemask, pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ()); | |
if (!m_caster->HasUnitMovementFlag(MOVEMENTFLAG_FALLING) || (pos.GetPositionZ() - ground < 25.0f)) | |
{ | |
- float tstX, tstY, tstZ, prevX, prevY, prevZ; | |
- float tstZ1, tstZ2, tstZ3, destz1, destz2, destz3, srange, srange1, srange2, srange3; | |
+ Position tst; | |
+ Position prev; | |
+ float tsttZ1, tsttZ2, tsttZ3, destiz1, destiz2, destiz3, srange, srange1, srange2, srange3; | |
float maxtravelDistZ = 2.65f; | |
float overdistance = 0.0f; | |
float totalpath = 0.0f; | |
float beforewaterz = 0.0f; | |
const float step = 2.0f; | |
const uint8 numChecks = ceil(fabs(distance / step)); | |
- const float DELTA_X = (destx - pos.GetPositionX()) / numChecks; | |
- const float DELTA_Y = (desty - pos.GetPositionY()) / numChecks; | |
- int j = 1; | |
- for (; j < (numChecks + 1); j++) | |
+ const float DELTA_X = (dest.m_positionX - pos.GetPositionX()) / numChecks; | |
+ const float DELTA_Y = (dest.m_positionY - pos.GetPositionY()) / numChecks; | |
+ | |
+ for (int j = 1; j < (numChecks + 1); j++) | |
{ | |
- prevX = pos.GetPositionX() + (float(j - 1)*DELTA_X); | |
- prevY = pos.GetPositionY() + (float(j - 1)*DELTA_Y); | |
- tstX = pos.GetPositionX() + (float(j)*DELTA_X); | |
- tstY = pos.GetPositionY() + (float(j)*DELTA_Y); | |
+ prev.m_positionX = pos.GetPositionX() + (float(j - 1)*DELTA_X); | |
+ prev.m_positionY = pos.GetPositionY() + (float(j - 1)*DELTA_Y); | |
+ tst.m_positionX = pos.GetPositionX() + (float(j)*DELTA_X); | |
+ tst.m_positionY = pos.GetPositionY() + (float(j)*DELTA_Y); | |
if (j < 2) | |
- { | |
- prevZ = pos.GetPositionZ(); | |
- } | |
+ prev.m_positionZ = pos.GetPositionZ(); | |
else | |
- { | |
- prevZ = tstZ; | |
- } | |
+ prev.m_positionZ = tst.m_positionZ; | |
- tstZ = map->GetHeight(phasemask, tstX, tstY, prevZ + maxtravelDistZ, true); | |
- ground = tstZ; | |
+ tst.m_positionZ = map->GetHeight(phasemask, tst.m_positionX, tst.m_positionY, prev.m_positionZ + maxtravelDistZ, true); | |
+ ground = tst.m_positionZ; | |
if (!map->IsInWater(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ())) | |
{ | |
- if (map->IsInWater(tstX, tstY, tstZ)) | |
+ if (map->IsInWater(tst.m_positionX, tst.m_positionY, tst.m_positionZ)) | |
{ | |
- if (!(beforewaterz != 0.0f)) | |
- beforewaterz = prevZ; | |
- tstZ = beforewaterz; | |
- srange = sqrt((tstY - prevY)*(tstY - prevY) + (tstX - prevX)*(tstX - prevX)); | |
- //TC_LOG_ERROR("server", "(start was from land) step in water , number of cycle = %i , distance of step = %f, total path = %f, Z = %f", j, srange, totalpath, tstZ); | |
+ if (beforewaterz == 0.0f) | |
+ beforewaterz = prev.m_positionZ; | |
+ tst.m_positionZ = beforewaterz; | |
+ srange = sqrt((tst.m_positionY - prev.m_positionY)*(tst.m_positionY - prev.m_positionY) + (tst.m_positionX - prev.m_positionX)*(tst.m_positionX - prev.m_positionX)); | |
} | |
} | |
- else if (map->IsInWater(tstX, tstY, tstZ)) | |
+ else if (map->IsInWater(tst.m_positionX, tst.m_positionY, tst.m_positionZ)) | |
{ | |
- prevZ = pos.GetPositionZ(); | |
- tstZ = pos.GetPositionZ(); | |
- srange = sqrt((tstY - prevY)*(tstY - prevY) + (tstX - prevX)*(tstX - prevX)); | |
- //TC_LOG_ERROR("server", "(start in water) step in water, number of cycle = %i , distance of step = %f, total path = %f", j, srange, totalpath); | |
+ prev.m_positionZ = pos.GetPositionZ(); | |
+ tst.m_positionZ = pos.GetPositionZ(); | |
+ srange = sqrt((tst.m_positionY - prev.m_positionY)*(tst.m_positionY - prev.m_positionY) + (tst.m_positionX - prev.m_positionX)*(tst.m_positionX - prev.m_positionX)); | |
} | |
- if (!map->IsInWater(tstX, tstY, tstZ) && tstZ != beforewaterz) // second safety check z for blink way if on the ground | |
+ if (!map->IsInWater(tst.m_positionX, tst.m_positionY, tst.m_positionZ) && tst.m_positionZ != beforewaterz) // second safety check z for blink way if on the ground | |
{ | |
// highest available point | |
- tstZ1 = map->GetHeight(phasemask, tstX, tstY, prevZ + maxtravelDistZ, true, 25.0f); | |
+ tsttZ1 = map->GetHeight(phasemask, tst.m_positionX, tst.m_positionY, prev.m_positionZ + maxtravelDistZ, true, 25.0f); | |
// upper or floor | |
- tstZ2 = map->GetHeight(phasemask, tstX, tstY, prevZ, true, 25.0f); | |
+ tsttZ2 = map->GetHeight(phasemask, tst.m_positionX, tst.m_positionY, prev.m_positionZ, true, 25.0f); | |
//lower than floor | |
- tstZ3 = map->GetHeight(phasemask, tstX, tstY, prevZ - maxtravelDistZ / 2, true, 25.0f); | |
+ tsttZ3 = map->GetHeight(phasemask, tst.m_positionX, tst.m_positionY, prev.m_positionZ - maxtravelDistZ / 2, true, 25.0f); | |
//distance of rays, will select the shortest in 3D | |
- srange1 = sqrt((tstY - prevY)*(tstY - prevY) + (tstX - prevX)*(tstX - prevX) + (tstZ1 - prevZ)*(tstZ1 - prevZ)); | |
- //TC_LOG_ERROR("server", "step = %i, distance of ray1 = %f", j, srange1); | |
- srange2 = sqrt((tstY - prevY)*(tstY - prevY) + (tstX - prevX)*(tstX - prevX) + (tstZ2 - prevZ)*(tstZ2 - prevZ)); | |
- //TC_LOG_ERROR("server", "step = %i, distance of ray2 = %f", j, srange2); | |
- srange3 = sqrt((tstY - prevY)*(tstY - prevY) + (tstX - prevX)*(tstX - prevX) + (tstZ3 - prevZ)*(tstZ3 - prevZ)); | |
- //TC_LOG_ERROR("server", "step = %i, distance of ray3 = %f", j, srange3); | |
+ srange1 = sqrt((tst.m_positionY - prev.m_positionY)*(tst.m_positionY - prev.m_positionY) + (tst.m_positionX - prev.m_positionX)*(tst.m_positionX - prev.m_positionX) + (tsttZ1 - prev.m_positionZ)*(tsttZ1 - prev.m_positionZ)); | |
+ srange2 = sqrt((tst.m_positionY - prev.m_positionY)*(tst.m_positionY - prev.m_positionY) + (tst.m_positionX - prev.m_positionX)*(tst.m_positionX - prev.m_positionX) + (tsttZ2 - prev.m_positionZ)*(tsttZ2 - prev.m_positionZ)); | |
+ srange3 = sqrt((tst.m_positionY - prev.m_positionY)*(tst.m_positionY - prev.m_positionY) + (tst.m_positionX - prev.m_positionX)*(tst.m_positionX - prev.m_positionX) + (tsttZ3 - prev.m_positionZ)*(tsttZ3 - prev.m_positionZ)); | |
if (srange1 < srange2) | |
- tstZ = tstZ1; | |
+ tst.m_positionZ = tsttZ1; | |
else if (srange3 < srange2) | |
- tstZ = tstZ3; | |
+ tst.m_positionZ = tsttZ3; | |
else | |
- tstZ = tstZ2; | |
+ tst.m_positionZ = tsttZ2; | |
- srange = sqrt((tstY - prevY)*(tstY - prevY) + (tstX - prevX)*(tstX - prevX) + (tstZ - prevZ)*(tstZ - prevZ)); | |
- //TC_LOG_ERROR("server", "step on ground, number of cycle = %i , distance of step = %f, total path = %f", j, srange, totalpath); | |
+ srange = sqrt((tst.m_positionY - prev.m_positionY)*(tst.m_positionY - prev.m_positionY) + (tst.m_positionX - prev.m_positionX)*(tst.m_positionX - prev.m_positionX) + (tst.m_positionZ - prev.m_positionZ)*(tst.m_positionZ - prev.m_positionZ)); | |
} | |
- destx = tstX; | |
- desty = tstY; | |
- destz = tstZ; | |
+ dest.m_positionX = tst.m_positionX; | |
+ dest.m_positionY = tst.m_positionY; | |
+ dest.m_positionZ = tst.m_positionZ; | |
totalpath += srange; | |
if (totalpath > distance) | |
{ | |
overdistance = totalpath - distance; | |
- //TC_LOG_ERROR("server", "total path > than distance in 3D , need to move back a bit for save distance, total path = %f, overdistance = %f", totalpath, overdistance); | |
} | |
- bool col = VMAP::VMapFactory::createOrGetVMapManager()->getObjectHitPos(mapid, prevX, prevY, prevZ + 0.5f, tstX, tstY, tstZ + 0.5f, tstX, tstY, tstZ, -0.5f); | |
+ bool col = VMAP::VMapFactory::createOrGetVMapManager()->getObjectHitPos(mapid, prev.m_positionX, prev.m_positionY, prev.m_positionZ + 0.5f, tst.m_positionX, tst.m_positionY, tst.m_positionZ + 0.5f, tst.m_positionX, tst.m_positionY, tst.m_positionZ, -0.5f); | |
// check dynamic collision | |
- bool dcol = m_caster->GetMap()->getObjectHitPos(phasemask, prevX, prevY, prevZ + 0.5f, tstX, tstY, tstZ + 0.5f, tstX, tstY, tstZ, -0.5f); | |
+ bool dcol = m_caster->GetMap()->getObjectHitPos(phasemask, prev.m_positionX, prev.m_positionY, prev.m_positionZ + 0.5f, tst.m_positionX, tst.m_positionY, tst.m_positionZ + 0.5f, tst.m_positionX, tst.m_positionY, tst.m_positionZ, -0.5f); | |
// collision occured | |
- if (col || dcol || (overdistance > 0.0f && !map->IsInWater(tstX, tstY, ground)) || (fabs(prevZ - tstZ) > maxtravelDistZ && (tstZ > prevZ))) | |
+ if (col || dcol || (overdistance > 0.0f && !map->IsInWater(tst.m_positionX, tst.m_positionY, ground)) || (fabs(prev.m_positionZ - tst.m_positionZ) > maxtravelDistZ && (tst.m_positionZ > prev.m_positionZ))) | |
{ | |
if ((overdistance > 0.0f) && (overdistance < step)) | |
{ | |
- destx = prevX + overdistance * cos(pos.GetOrientation()); | |
- desty = prevY + overdistance * sin(pos.GetOrientation()); | |
- //TC_LOG_ERROR("server", "(collision) collision occured 1"); | |
+ dest.m_positionX = prev.m_positionX + overdistance * cos(pos.GetOrientation()); | |
+ dest.m_positionY = prev.m_positionY + overdistance * sin(pos.GetOrientation()); | |
} | |
else | |
{ | |
// move back a bit | |
- destx = tstX - (0.6 * cos(pos.GetOrientation())); | |
- desty = tstY - (0.6 * sin(pos.GetOrientation())); | |
- //TC_LOG_ERROR("server", "(collision) collision occured 2"); | |
+ dest.m_positionX = tst.m_positionX - (0.6 * cos(pos.GetOrientation())); | |
+ dest.m_positionY = tst.m_positionY - (0.6 * sin(pos.GetOrientation())); | |
} | |
// highest available point | |
- destz1 = map->GetHeight(phasemask, destx, desty, prevZ + maxtravelDistZ, true, 25.0f); | |
+ destiz1 = map->GetHeight(phasemask, dest.m_positionX, dest.m_positionY, prev.m_positionZ + maxtravelDistZ, true, 25.0f); | |
// upper or floor | |
- destz2 = map->GetHeight(phasemask, destx, desty, prevZ, true, 25.0f); | |
+ destiz2 = map->GetHeight(phasemask, dest.m_positionX, dest.m_positionY, prev.m_positionZ, true, 25.0f); | |
//lower than floor | |
- destz3 = map->GetHeight(phasemask, destx, desty, prevZ - maxtravelDistZ / 2, true, 25.0f); | |
+ destiz3 = map->GetHeight(phasemask, dest.m_positionX, dest.m_positionY, prev.m_positionZ - maxtravelDistZ / 2, true, 25.0f); | |
//distance of rays, will select the shortest in 3D | |
- srange1 = sqrt((desty - prevY)*(desty - prevY) + (destx - prevX)*(destx - prevX) + (destz1 - prevZ)*(destz1 - prevZ)); | |
- srange2 = sqrt((desty - prevY)*(desty - prevY) + (destx - prevX)*(destx - prevX) + (destz2 - prevZ)*(destz2 - prevZ)); | |
- srange3 = sqrt((desty - prevY)*(desty - prevY) + (destx - prevX)*(destx - prevX) + (destz3 - prevZ)*(destz3 - prevZ)); | |
+ srange1 = sqrt((dest.m_positionY - prev.m_positionY)*(dest.m_positionY - prev.m_positionY) + (dest.m_positionX - prev.m_positionX)*(dest.m_positionX - prev.m_positionX) + (destiz1 - prev.m_positionZ)*(destiz1 - prev.m_positionZ)); | |
+ srange2 = sqrt((dest.m_positionY - prev.m_positionY)*(dest.m_positionY - prev.m_positionY) + (dest.m_positionX - prev.m_positionX)*(dest.m_positionX - prev.m_positionX) + (destiz2 - prev.m_positionZ)*(destiz2 - prev.m_positionZ)); | |
+ srange3 = sqrt((dest.m_positionY - prev.m_positionY)*(dest.m_positionY - prev.m_positionY) + (dest.m_positionX - prev.m_positionX)*(dest.m_positionX - prev.m_positionX) + (destiz3 - prev.m_positionZ)*(destiz3 - prev.m_positionZ)); | |
if (srange1 < srange2) | |
- destz = destz1; | |
+ dest.m_positionZ = destiz1; | |
else if (srange3 < srange2) | |
- destz = destz3; | |
+ dest.m_positionZ = destiz3; | |
else | |
- destz = destz2; | |
- | |
- //TC_LOG_ERROR("server", "(collision) destZ rewrited in prevZ"); | |
+ dest.m_positionZ = destiz2; | |
break; | |
} | |
- // we have correct destz now | |
+ // we have correct dest.m_positionZ now | |
} | |
- //} | |
- lastpos.Relocate(destx, desty, destz + 0.5f, pos.GetOrientation()); | |
- dest = SpellDestination(lastpos); | |
+ lastpos.Relocate(dest.m_positionX, dest.m_positionY, dest.m_positionZ + 0.5f, pos.GetOrientation()); | |
+ dest = SpellDestination(lastpos)._position; | |
} | |
else | |
{ | |
float z = pos.GetPositionZ(); | |
- bool col = VMAP::VMapFactory::createOrGetVMapManager()->getObjectHitPos(mapid, pos.GetPositionX(), pos.GetPositionY(), z + 0.5f, destx, desty, z + 0.5f, destx, desty, z, -0.5f); | |
+ bool col = VMAP::VMapFactory::createOrGetVMapManager()->getObjectHitPos(mapid, pos.GetPositionX(), pos.GetPositionY(), z + 0.5f, dest.m_positionX, dest.m_positionY, z + 0.5f, dest.m_positionX, dest.m_positionY, z, -0.5f); | |
// check dynamic collision | |
- bool dcol = m_caster->GetMap()->getObjectHitPos(phasemask, pos.GetPositionX(), pos.GetPositionY(), z + 0.5f, destx, desty, z + 0.5f, destx, desty, z, -0.5f); | |
+ bool dcol = m_caster->GetMap()->getObjectHitPos(phasemask, pos.GetPositionX(), pos.GetPositionY(), z + 0.5f, dest.m_positionX, dest.m_positionY, z + 0.5f, dest.m_positionX, dest.m_positionY, z, -0.5f); | |
// collision occured | |
if (col || dcol) | |
{ | |
// move back a bit | |
- destx = destx - (0.6 * cos(pos.GetOrientation())); | |
- desty = desty - (0.6 * sin(pos.GetOrientation())); | |
+ dest.m_positionX = dest.m_positionX - (0.6 * cos(pos.GetOrientation())); | |
+ dest.m_positionY = dest.m_positionY - (0.6 * sin(pos.GetOrientation())); | |
} | |
- lastpos.Relocate(destx, desty, z, pos.GetOrientation()); | |
- dest = SpellDestination(lastpos); | |
- //float range = sqrt((desty - pos.GetPositionY())*(desty - pos.GetPositionY()) + (destx - pos.GetPositionX())*(destx - pos.GetPositionX())); | |
- //TC_LOG_ERROR("server", "Blink number 2, in falling but at a hight, distance of blink = %f", range); | |
+ lastpos.Relocate(dest.m_positionX, dest.m_positionY, z, pos.GetOrientation()); | |
+ dest = SpellDestination(lastpos)._position; | |
} | |
- | |
break; | |
} | |
default: |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment