diff options
-rw-r--r-- | sql/updates/world/2014_07_05_01_world_smart_scripts.sql | 19 | ||||
-rw-r--r-- | src/server/game/Entities/Object/Object.cpp | 48 | ||||
-rw-r--r-- | src/server/game/Spells/SpellEffects.cpp | 2 |
3 files changed, 54 insertions, 15 deletions
diff --git a/sql/updates/world/2014_07_05_01_world_smart_scripts.sql b/sql/updates/world/2014_07_05_01_world_smart_scripts.sql new file mode 100644 index 00000000000..ddd158c83a8 --- /dev/null +++ b/sql/updates/world/2014_07_05_01_world_smart_scripts.sql @@ -0,0 +1,19 @@ +UPDATE `smart_scripts` SET + `action_type`=11, `action_param1`=37903, `action_param2`=1, `comment`='Razaani Light Orb - Between 0-30% Health - Cast Trapping the Light: Kill Credit (No Repeat)' WHERE + `entryorguid`=20635 AND `source_type`=0 AND `id`=3 AND `link`=4; + +UPDATE `smart_scripts` SET + `action_type`=11, `action_param1`=37903, `action_param2`=1, `comment`='Razaani Light Orb - Mini - On Reached Point 1 - Cast Trapping the Light: Kill Credit (No Repeat)' WHERE + `entryorguid`=20771 AND `source_type`=0 AND `id`=3 AND `link`=4; + +UPDATE `smart_scripts` SET + `action_type`=11, `action_param1`=37903, `action_param2`=1, `comment`='Multi-Spectrum Light Trap Bunny - On Data Set 1 1 - Cast Trapping the Light: Kill Credit ' WHERE + `entryorguid`=21926 AND `source_type`=0 AND `id`=4 AND `link`=5; + +UPDATE `smart_scripts` SET + `action_type`=85, `action_param1`=37829, `action_param2`=1, `comment`='Scalewing Serpent - On Spellhit - Cast Ride the Lightning: Kill Credit' WHERE + `entryorguid`=20749 AND `source_type`=0 AND `id`=1 AND `link`=0; + +UPDATE `smart_scripts` SET + `action_type`=85, `action_param1`=43174, `action_param2`=1, `comment`='Proto-Drake - On Death - Cast Draconis Gastritis: Kill Credit' WHERE + `entryorguid`=23689 AND `source_type`=0 AND `id`=7 AND `link`=0; diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp index 38f1469f7bd..206a6c32c68 100644 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -2769,13 +2769,39 @@ void WorldObject::MovePosition(Position &pos, float dist, float angle) pos.SetOrientation(GetOrientation()); } +// @todo: replace with WorldObject::UpdateAllowedPositionZ +float NormalizeZforCollision(WorldObject* obj, float x, float y, float z) +{ + float ground = obj->GetMap()->GetHeight(obj->GetPhaseMask(), x, y, MAX_HEIGHT, true); + float floor = obj->GetMap()->GetHeight(obj->GetPhaseMask(), x, y, z + 2.0f, true); + float helper = fabs(ground - z) <= fabs(floor - z) ? ground : floor; + if (z > helper) // must be above ground + { + if (Unit* unit = obj->ToUnit()) + { + if (unit->CanFly()) + return z; + } + LiquidData liquid_status; + ZLiquidStatus res = obj->GetMap()->getLiquidStatus(x, y, z, MAP_ALL_LIQUIDS, &liquid_status); + if (res && liquid_status.level > helper) // water must be above ground + { + if (liquid_status.level > z) // z is underwater + return z; + else + return fabs(liquid_status.level - z) <= fabs(helper - z) ? liquid_status.level : helper; + } + } + return helper; +} + void WorldObject::MovePositionToFirstCollision(Position &pos, float dist, float angle) { angle += GetOrientation(); - float destx, desty, destz, ground, floor; - pos.m_positionZ += 2.0f; + float destx, desty, destz; destx = pos.m_positionX + dist * std::cos(angle); desty = pos.m_positionY + dist * std::sin(angle); + destz = NormalizeZforCollision(this, destx, desty, pos.GetPositionZ()); // Prevent invalid coordinates here, position is unchanged if (!Trinity::IsValidMapCoord(destx, desty)) @@ -2784,11 +2810,7 @@ void WorldObject::MovePositionToFirstCollision(Position &pos, float dist, float return; } - ground = GetMap()->GetHeight(GetPhaseMask(), destx, desty, MAX_HEIGHT, true); - floor = GetMap()->GetHeight(GetPhaseMask(), 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); + 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) @@ -2800,7 +2822,7 @@ void WorldObject::MovePositionToFirstCollision(Position &pos, float dist, float } // check dynamic collision - col = GetMap()->getObjectHitPos(GetPhaseMask(), pos.m_positionX, pos.m_positionY, pos.m_positionZ+0.5f, destx, desty, destz+0.5f, destx, desty, destz, -0.5f); + col = GetMap()->getObjectHitPos(GetPhaseMask(), pos.m_positionX, pos.m_positionY, pos.m_positionZ + 0.5f, destx, desty, destz + 0.5f, destx, desty, destz, -0.5f); // Collided with a gameobject if (col) @@ -2810,18 +2832,16 @@ void WorldObject::MovePositionToFirstCollision(Position &pos, float dist, float dist = sqrt((pos.m_positionX - destx)*(pos.m_positionX - destx) + (pos.m_positionY - desty)*(pos.m_positionY - desty)); } - float step = dist/10.0f; + float step = dist / 10.0f; for (uint8 j = 0; j < 10; ++j) { // do not allow too big z changes - if (fabs(pos.m_positionZ - destz) > 6) + if (fabs(pos.m_positionZ - destz) > 6.0f) { destx -= step * std::cos(angle); desty -= step * std::sin(angle); - ground = GetMap()->GetHeight(GetPhaseMask(), destx, desty, MAX_HEIGHT, true); - floor = GetMap()->GetHeight(GetPhaseMask(), destx, desty, pos.m_positionZ, true); - destz = fabs(ground - pos.m_positionZ) <= fabs(floor - pos.m_positionZ) ? ground : floor; + destz = NormalizeZforCollision(this, destx, desty, pos.GetPositionZ()); } // we have correct destz now else @@ -2833,7 +2853,7 @@ void WorldObject::MovePositionToFirstCollision(Position &pos, float dist, float Trinity::NormalizeMapCoord(pos.m_positionX); Trinity::NormalizeMapCoord(pos.m_positionY); - UpdateAllowedPositionZ(pos.m_positionX, pos.m_positionY, pos.m_positionZ); + pos.m_positionZ = NormalizeZforCollision(this, destx, desty, pos.GetPositionZ()); pos.SetOrientation(GetOrientation()); } diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index 98ee85dce84..9e55cb94ff0 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -4310,7 +4310,7 @@ void Spell::EffectLeap(SpellEffIndex /*effIndex*/) return; Position pos = destTarget->GetPosition(); - pos = unitTarget->GetFirstCollisionPosition(unitTarget->GetDistance(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ() + 2.0f), 0.0f); + pos = unitTarget->GetFirstCollisionPosition(unitTarget->GetDistance(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ()), 0.0f); unitTarget->NearTeleportTo(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), pos.GetOrientation(), unitTarget == m_caster); } |