关灯
开启左侧

魔兽世界sf法师闪现技能补丁

  [复制链接]
admin实名认证 发表于 2016-4-19 23:00:12 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
 
Index: src/game/Map.cpp
===================================================================
--- src/game/Map.cpp        (revision 5463)
+++ src/game/Map.cpp        (working copy)
@@ -1166,6 +1166,87 @@
     }
}

+float Map::GetBlinkHeight(float x, float y, float z, bool pUseVmaps) const
+{
+    GridPair p = MaNGOS::ComputeGridPair(x, y);
+
+    int gx=(int)(32-x/SIZE_OF_GRIDS);
+    int gy=(int)(32-y/SIZE_OF_GRIDS);
+
+    float lx=MAP_RESOLUTION*(32 -x/SIZE_OF_GRIDS - gx);
+    float ly=MAP_RESOLUTION*(32 -y/SIZE_OF_GRIDS - gy);
+
+    const_cast<Map*>(this)->EnsureGridCreated(GridPair(63-gx,63-gy));
+
+    float mapHeight;
+    if(GridMaps[gx][gy])
+    {
+        float _mapheight = GridMaps[gx][gy]->Z[(int)(lx)][(int)(ly)];
+
+        if(z + 12 > _mapheight)
+            mapHeight = _mapheight;
+        else
+            mapHeight = VMAP_INVALID_HEIGHT_VALUE;
+    }
+    else
+        mapHeight = VMAP_INVALID_HEIGHT_VALUE;
+
+    float vmapHeight;
+    if(pUseVmaps)
+    {
+        VMAP::IVMapManager* vmgr = VMAP::VMapFactory::createOrGetVMapManager();
+        if(vmgr->isHeightCalcEnabled())
+        {
+            float zz = z;
+            float _vmapheight;
+            vmapHeight = vmgr->getHeight(GetId(), x, y, zz);
+            if(vmapHeight < -499)
+            {
+                zz = z + 12;
+                vmapHeight = vmgr->getHeight(GetId(), x, y, zz);
+            }
+            if(vmapHeight < -499)
+            {
+                zz = z - 12;
+                vmapHeight = vmgr->getHeight(GetId(), x, y, zz);
+            }
+            zz = z + 20;
+            _vmapheight = vmgr->getHeight(GetId(), x, y, zz);
+            if(_vmapheight > -499)
+                vmapHeight = _vmapheight;
+            zz = z + 30;
+            _vmapheight = vmgr->getHeight(GetId(), x, y, zz);
+            if(_vmapheight > -499)
+                vmapHeight = _vmapheight;
+            // sLog.outError("BlinkHeight VMAPS: %f - z = %f", vmapHeight, z);
+        }
+        else
+            vmapHeight = VMAP_INVALID_HEIGHT_VALUE;
+    }
+    else
+        vmapHeight = VMAP_INVALID_HEIGHT_VALUE;
+
+    if( vmapHeight > INVALID_HEIGHT )
+    {
+        if( mapHeight > INVALID_HEIGHT )
+        {
+            if(pUseVmaps)
+                return vmapHeight;
+            else
+                return mapHeight;
+        }
+        else
+            return vmapHeight;
+    }
+    else
+    {
+        if(!pUseVmaps)
+            return mapHeight;
+        else
+            return VMAP_INVALID_HEIGHT_VALUE;
+    }
+}
+
uint16 Map::GetAreaFlag(float x, float y ) const
{
     //local x,y coords
Index: src/game/Map.h
===================================================================
--- src/game/Map.h        (revision 5463)
+++ src/game/Map.h        (working copy)
@@ -171,6 +171,7 @@
         // some calls like isInWater should not use vmaps due to processor power
         // can return INVALID_HEIGHT if under z+2 z coord not found height
         float GetHeight(float x, float y, float z, bool pCheckVMap=true) const;
+        float GetBlinkHeight(float x, float y, float z, bool pCheckVMap=true) const;
         bool IsInWater(float x, float y, float z) const;    // does not use z pos. This is for future use

         uint16 GetAreaFlag(float x, float y ) const;
Index: src/game/Spell.cpp
===================================================================
--- src/game/Spell.cpp        (revision 5463)
+++ src/game/Spell.cpp        (working copy)
@@ -3287,16 +3287,25 @@
                 float dis = GetSpellRadius(sSpellRadiusStore.LookupEntry(m_spellInfo->EffectRadiusIndex));
                 float fx = m_caster->GetPositionX() + dis * cos(m_caster->GetOrientation());
                 float fy = m_caster->GetPositionY() + dis * sin(m_caster->GetOrientation());
+                float caster_pos_z = m_caster->GetPositionZ();
                 // teleport a bit above terrainlevel to avoid falling below it
-                float fz = MapManager::Instance().GetBaseMap(m_caster->GetMapId())->GetHeight(fx,fy,m_caster->GetPositionZ(),true);
-                if(fz <= INVALID_HEIGHT)                    // note: this also will prevent use effect in instances without vmaps height enabled
-                    return SPELL_FAILED_TRY_AGAIN;
-
-                float caster_pos_z = m_caster->GetPositionZ();
-                // Control the caster to not climb or drop when +-fz > 8
-                if(!(fz<=caster_pos_z+8 && fz>=caster_pos_z-8))
-                    return SPELL_FAILED_TRY_AGAIN;
-
+                float fz = MapManager::Instance().GetBaseMap(m_caster->GetMapId())->GetBlinkHeight(fx,fy,caster_pos_z,true);
+                float fz2 = MapManager::Instance().GetBaseMap(m_caster->GetMapId())->GetBlinkHeight(fx,fy,caster_pos_z,false);
+                float fz3 = MapManager::Instance().GetBaseMap(m_caster->GetMapId())->GetHeight(fx,fy,MAX_HEIGHT,false);
+               
+                if(fz > -499)
+                {
+                    if(fz > caster_pos_z + 12 || fz < caster_pos_z - 12)
+                    {
+                        return SPELL_FAILED_TRY_AGAIN;
+                    }
+                }
+                else
+                    if((fz2 > caster_pos_z + 12 || fz2 < caster_pos_z - 12) || (fz2 > caster_pos_z - 12 && fz2 < fz3))
+                    {
+                        return SPELL_FAILED_TRY_AGAIN;
+                    }
+
                 // not allow use this effect at battleground until battleground start
                 if(m_caster->GetTypeId()==TYPEID_PLAYER)
                     if(BattleGround const *bg = ((Player*)m_caster)->GetBattleGround())
Index: src/game/SpellEffects.cpp
===================================================================
--- src/game/SpellEffects.cpp        (revision 5463)
+++ src/game/SpellEffects.cpp        (working copy)
@@ -4272,24 +4272,25 @@
         float dis = GetSpellRadius(sSpellRadiusStore.LookupEntry(m_spellInfo->EffectRadiusIndex));

         // before caster
-        float fx,fy,fz;
-        unitTarget->GetClosePoint(fx,fy,fz,dis);
-        float ox,oy,oz;
-        unitTarget->GetPosition(ox,oy,oz);
-
-        float fx2,fy2,fz2;                                  // getObjectHitPos overwrite last args in any result case
-        if(VMAP::VMapFactory::createOrGetVMapManager()->getObjectHitPos(mapid, ox,oy,oz+0.5, fx,fy,oz+0.5,fx2,fy2,fz2, -0.5))
+        float fx = m_caster->GetPositionX() + dis * cos(m_caster->GetOrientation());
+        float fy = m_caster->GetPositionY() + dis * sin(m_caster->GetOrientation());
+        float caster_pos_z = m_caster->GetPositionZ();
+        float fz = MapManager::Instance().GetBaseMap(m_caster->GetMapId())->GetBlinkHeight(fx,fy,caster_pos_z,true);
+        float fz2 = MapManager::Instance().GetBaseMap(m_caster->GetMapId())->GetBlinkHeight(fx,fy,caster_pos_z,false);
+        float fz3 = MapManager::Instance().GetBaseMap(m_caster->GetMapId())->GetHeight(fx,fy,MAX_HEIGHT,false);
+        if(fz < fz3)
         {
-            fx = fx2;
-            fy = fy2;
-            fz = fz2;
+            if(fz2 > fz3)
+                fz = fz2;
+            else
+                fz = fz3;
+        }
+        else
             unitTarget->UpdateGroundPositionZ(fx,fy,fz);
-        }
-
         if(unitTarget->GetTypeId() == TYPEID_PLAYER)
-            ((Player*)unitTarget)->TeleportTo(mapid, fx, fy, fz, unitTarget->GetOrientation(), false);
+            ((Player*)unitTarget)->TeleportTo(mapid, fx, fy, fz + 1, unitTarget->GetOrientation(), false);
         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 + 1, unitTarget->GetOrientation());
     }
}
 
VIP介绍
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 最佳新人

    注册账号后积极发帖的会员
  • 活跃会员

    经常参与各类话题的讨论,发帖内容较有主见
  • 热心会员

    经常帮助其他会员答疑
  • 推广达人

    积极宣传本站,为本站带来更多注册会员
  • 宣传达人

    积极宣传本站,为本站带来更多的用户访问量
  • 灌水之王

    经常在论坛发帖,且发帖量较大
  • 突出贡献

    长期对论坛的繁荣而不断努力,或多次提出建设性意见
  • 优秀版主

    活跃且尽责职守的版主
  • 荣誉管理

    曾经为论坛做出突出贡献目前已离职的版主
  • 论坛元老

    为论坛做出突出贡献的会员

0关注

5粉丝

3421帖子

排行榜
作者专栏

QQ交流群&&微信订阅号

QQ交流群

微信订阅号

吾爱尚玩资源基地永久域名:

Www.523Play.Com

在线管理员QQ:1589479632

邮箱:Email@523play.com

QQ交流群:558936238

Copyright   ©2015-2116  吾爱尚玩资源基地|523play.comPowered by©523Pplay.Com技术支持:吾爱尚玩资源基地