Index: trunk/src/game/SpellEffects.cpp
===================================================================
--- trunk/src/game/SpellEffects.cpp (revision 221)
+++ trunk/src/game/SpellEffects.cpp (revision 222)
@@ -5502,5 +5502,52 @@
         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);
@@ -5513,5 +5560,5 @@
         ((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());*/
 }
 
Index: trunk/src/bindings/scripts/scripts/zone/black_temple/boss_shade_of_akama.cpp
===================================================================
--- trunk/src/bindings/scripts/scripts/zone/black_temple/boss_shade_of_akama.cpp (revision 117)
+++ trunk/src/bindings/scripts/scripts/zone/black_temple/boss_shade_of_akama.cpp (revision 222)
@@ -197,4 +197,5 @@
     void Reset()
     {
+        m_creature->setActive(true); // TODO: setActive(true, time);
         FindChannelers();
 
@@ -213,7 +214,7 @@
 				if(m_creature->isAlive())
 				{
-                Channeler->CastSpell(m_creature, SPELL_SHADE_SOUL_CHANNEL, true);
-                Channeler->CastSpell(m_creature, SPELL_SHADE_SOUL_CHANNEL_2, true);
-                Channeler->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
+                    Channeler->CastSpell(m_creature, SPELL_SHADE_SOUL_CHANNEL, true);
+                    Channeler->CastSpell(m_creature, SPELL_SHADE_SOUL_CHANNEL_2, true);
+                    Channeler->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
 				}
             }
