aboutsummaryrefslogtreecommitdiff
path: root/src/game/SpellEffects.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/game/SpellEffects.cpp')
-rw-r--r--src/game/SpellEffects.cpp51
1 files changed, 49 insertions, 2 deletions
diff --git a/src/game/SpellEffects.cpp b/src/game/SpellEffects.cpp
index 7b093b1922e..190b8aa021f 100644
--- a/src/game/SpellEffects.cpp
+++ b/src/game/SpellEffects.cpp
@@ -5501,7 +5501,54 @@ void Spell::EffectMomentMove(uint32 i)
if(!m_targets.HasDest())
return;
- uint32 mapid = unitTarget->GetMapId();
+ uint32 mapid = m_caster->GetMapId();
+ float dis = GetSpellRadius(sSpellRadiusStore.LookupEntry(m_spellInfo->EffectRadiusIndex[i]));
+
+ // src point
+ float *fx = new float[11], *fy = new float[11], *fz = new float[11];
+ unitTarget->GetPosition(fx[0], fy[0], fz[0]);
+
+ float orientation = unitTarget->GetOrientation(), itr_i, step = dis / 10.0, fx2, fy2, fz2, ground, floor;
+ int itr_j = 1, last_valid = 0;
+ bool hit = false;
+
+ for (itr_i = step; itr_i <= dis; itr_i += step)
+ {
+ fx[itr_j] = fx[0] + itr_i * cos(orientation);
+ fy[itr_j] = fy[0] + itr_i * sin(orientation);
+ ground = MapManager::Instance().GetMap(mapid, unitTarget)->GetHeight(fx[itr_j], fy[itr_j], MAX_HEIGHT, true);
+ floor = MapManager::Instance().GetMap(mapid, unitTarget)->GetHeight(fx[itr_j], fy[itr_j], fz[last_valid], true);
+ fz[itr_j] = fabs(ground - fz[last_valid]) <= fabs(floor - fz[last_valid]) ? ground : floor;
+ if (fabs(fz[itr_j] - fz[0]) <= 6.0)
+ {
+ if (VMAP::VMapFactory::createOrGetVMapManager()->getObjectHitPos(mapid, fx[last_valid], fy[last_valid], fz[last_valid] + 0.5, fx[itr_j], fy[itr_j], fz[itr_j] + 0.5, fx2, fy2, fz2, -0.5))
+ {
+ hit = true;
+ fx[itr_j] = fx2 - 0.6 * cos(orientation);
+ fy[itr_j] = fy2 - 0.6 * sin(orientation);
+ ground = MapManager::Instance().GetMap(mapid, unitTarget)->GetHeight(fx[itr_j], fy[itr_j], MAX_HEIGHT, true);
+ floor = MapManager::Instance().GetMap(mapid, unitTarget)->GetHeight(fx[itr_j], fy[itr_j], fz[last_valid], true);
+ float tempz = fabs(ground - fz[last_valid]) <= fabs(floor - fz[last_valid]) ? ground : floor;
+ fz[itr_j] = fabs(tempz - fz[last_valid]) <= fabs(fz2 - fz[last_valid]) ? tempz : fz2;
+ break;
+ }
+ else
+ last_valid = itr_j;
+ }
+ itr_j++;
+ }
+ if (hit == false)
+ itr_j = last_valid;
+
+
+ if (unitTarget->GetTypeId() == TYPEID_PLAYER)
+ ((Player*)unitTarget)->TeleportTo(mapid, fx[itr_j], fy[itr_j], fz[itr_j] + 0.07531, orientation, TELE_TO_NOT_LEAVE_COMBAT | TELE_TO_NOT_UNSUMMON_PET | (unitTarget == m_caster ? TELE_TO_SPELL : 0));
+ else
+ MapManager::Instance().GetMap(mapid, unitTarget)->CreatureRelocation((Creature*)unitTarget, fx[itr_j], fy[itr_j], fz[itr_j] + 0.07531, orientation);
+
+ delete [] fx; delete [] fy; delete [] fz;
+
+/* uint32 mapid = unitTarget->GetMapId();
float ox,oy,oz;
unitTarget->GetPosition(ox,oy,oz);
@@ -5512,7 +5559,7 @@ void Spell::EffectMomentMove(uint32 i)
if(unitTarget->GetTypeId() == TYPEID_PLAYER)
((Player*)unitTarget)->TeleportTo(mapid, fx, fy, fz, unitTarget->GetOrientation(), TELE_TO_NOT_LEAVE_COMBAT | TELE_TO_NOT_UNSUMMON_PET | (unitTarget==m_caster ? TELE_TO_SPELL : 0));
else
- MapManager::Instance().GetMap(mapid, unitTarget)->CreatureRelocation((Creature*)unitTarget, fx, fy, fz, unitTarget->GetOrientation());
+ MapManager::Instance().GetMap(mapid, unitTarget)->CreatureRelocation((Creature*)unitTarget, fx, fy, fz, unitTarget->GetOrientation());*/
}
void Spell::EffectReputation(uint32 i)