diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/bindings/scripts/scripts/zone/black_temple/boss_shade_of_akama.cpp | 7 | ||||
| -rw-r--r-- | src/game/SpellEffects.cpp | 51 |
2 files changed, 53 insertions, 5 deletions
diff --git a/src/bindings/scripts/scripts/zone/black_temple/boss_shade_of_akama.cpp b/src/bindings/scripts/scripts/zone/black_temple/boss_shade_of_akama.cpp index 0d846c956bb..9c1d50950dc 100644 --- a/src/bindings/scripts/scripts/zone/black_temple/boss_shade_of_akama.cpp +++ b/src/bindings/scripts/scripts/zone/black_temple/boss_shade_of_akama.cpp @@ -196,6 +196,7 @@ struct TRINITY_DLL_DECL boss_shade_of_akamaAI : public ScriptedAI void Reset() { + m_creature->setActive(true); // TODO: setActive(true, time); FindChannelers(); if(!Channelers.empty()) @@ -212,9 +213,9 @@ struct TRINITY_DLL_DECL boss_shade_of_akamaAI : public ScriptedAI } 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); } } } 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) |
