苦工 发表于 2011-12-15 02:28:11

仿Dota技能 屠夫 - 肉钩 (傻瓜移植版)

            
                1 - 本演示需1.24b以上魔兽版本
                2 - 为方便WEER移植已经写好注释
                3 - 支持多人同时释放
                4 - 需JassHelper插件支持(YDWE)
                5 - 仅供学习与娱乐
                6 - 100%排泄 90%高仿

                7 - 可以钩任何单位(友方单位不造成伤害)
                8 - 暂不支持伤害与属性挂钩
                9 - 可以根据自己需要任意修改

蛋疼学了下Zinc 发现结构体的概念一窍不通。 只能学学语法 写个不伦不类的东西




/*
//! zinc
library KuOfHook
{
   constanthashtable hx = InitHashtable();
   constantstring Effect =   /*ÌØЧ·¾¶¡ú¡ú¡ú¡ú¡ú*/"Objects\\Spawnmodels\\Human\\HumanBlood\\BloodElfSpellThiefBlood.mdl"   ;
   constantinteger HookAId =       'ewsp' ;                  //   ¹³×ÓÍ·²¿Âí¼×µ¥Î»Id
   constantinteger HookBid =      'e000' ;                  //   ¹³×ÓÂí¼×Id
   constantintegerSpellId =          'A000' ;                     //Èâ¹³¼¼ÄÜId
   constantreal SpeedA =                     0.03 ;                     //³ö¹³Òƶ¯ËÙ¶È 0.01Ϊ×î¿ì
   constantreal SpeedB =                     0.03 ;                     //ÊÕ¹³Òƶ¯ËÙ¶È 0.01 Ϊ×î¿ì
   constantreal SpeedSpare =                  45 ;                     //¹³×Ó¼ä¾à(»áÓ°ÏìËÙ¶È)
   constantinteger Distance =               28 ;                     //¹³×Ó³¤¶È
   constantreal Range =                              75 ;                     // ¹³×ÓÑ¡È¡·¶Î§
   constantreal Damage =                     100 ;                     // Ôì³ÉÉ˺¦

    functionSpell_Hook_TimerB()
    {
      unit Hook,Majia[],Target;
      real x,y,ang;
      integer i,t,Max,Loop=0;

      i = GetHandleId(GetExpiredTimer());
      t = LoadInteger(hx,i,500);
      Max = LoadInteger(hx,i,501);
      Hook = LoadUnitHandle(hx,i,Max+1);
      Target = LoadUnitHandle(hx,i,Max+2);
      ang = LoadReal(hx,i,Max+3);
      if(t>0)
      {
            Majia = LoadUnitHandle(hx,i,t);
            RemoveUnit(Majia);
            t -= 1;
            SaveInteger(hx,i,500,t);
            ang += 180;
            x = GetUnitX(Hook)+SpeedSpare*Cos(ang*bj_DEGTORAD);
            y = GetUnitY(Hook)+SpeedSpare*Sin(ang*bj_DEGTORAD);
            SetUnitX(Target,x);
            SetUnitY(Target,y);
            SetUnitX(Hook,x);
            SetUnitY(Hook,y);
      }
      else
      {
            PauseTimer(GetExpiredTimer());
            RemoveUnit(Hook);
            DestroyTimer(GetExpiredTimer());
            FlushChildHashtable(hx,i);
      }
      Hook = null;
      Target = null;
      i = 0;
      while(i>Max)
      {
            i += 1;
            Majia = null;
      }
    }

    function Spell_Hook_TimerA()
    {
      unit Hero,Hook,Majia[],Target;
      timer Timer ;
      real x,y,ang;
      integer i,i2,t,Max,Loop;
      group g,g2=CreateGroup() ;

      i = GetHandleId(GetExpiredTimer());
      Timer = LoadTimerHandle(hx,i,6);
      i2 = LoadInteger(hx,i,7);
      Hero = LoadUnitHandle(hx,i,1);
      Hook = LoadUnitHandle(hx,i,2);
      g = LoadGroupHandle(hx,i,3);
      ang = LoadReal(hx,i,4);
      t = LoadInteger(hx,i,5);

      if( t < Distance)
      {
            t += 1;
            SaveInteger(hx,i,5,t);
            x = GetUnitX(Hook)+SpeedSpare*Cos(ang*bj_DEGTORAD);
            y = GetUnitY(Hook)+SpeedSpare*Sin(ang*bj_DEGTORAD);
            Majia = CreateUnit(GetOwningPlayer(Hero),HookBid,0,0,ang);
            SetUnitX(Majia,x);
            SetUnitY(Majia,y);
            SaveUnitHandle(hx,i2,t,Majia);
            SetUnitX(Hook,x);
            SetUnitY(Hook,y);
             GroupEnumUnitsInRange(g2,x,y,Range,null);
             for(Target=FirstOfGroup(g2);Target!=null;Target=FirstOfGroup(g2))
             {
               if(GetUnitState(Target, UNIT_STATE_LIFE) > 0&&GetUnitTypeId(Target) != 'ewsp' &&Target!=Hero)
                {
                  GroupAddUnit(g,Target);
                }
                GroupRemoveUnit(g2,Target);
             }
             DestroyGroup(g2);
             if(IsUnitGroupEmptyBJ(g)!= true)
             {
                PauseTimer(GetExpiredTimer());
                Target = FirstOfGroup(g);
                if (IsUnitEnemy(Target, GetOwningPlayer(Hero)) == true)
                {
                  UnitDamageTarget( Hero, Target, Damage, true, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_DEATH, WEAPON_TYPE_WHOKNOWS );
                  DestroyEffect( AddSpecialEffectTarget( Effect , Target, "overhead") );
               }
                Max = t ;
                SaveInteger(hx,i2,501,Max);
                SaveInteger(hx,i2,500,t);
                SaveUnitHandle(hx,i2,Max+1,Hook);
                SaveUnitHandle(hx,i2,Max+2,Target);
                SaveReal(hx,i2,Max+3,ang);
                TimerStart(Timer,SpeedB,true,function   Spell_Hook_TimerB);
                DestroyGroup(g2);
                DestroyTimer(GetExpiredTimer());
                FlushChildHashtable(hx,i);
             }
      }
      else
      {
                PauseTimer(GetExpiredTimer());
                Max = t ;
                SaveInteger(hx,i2,501,Max);
                SaveInteger(hx,i2,500,t);
                SaveUnitHandle(hx,i2,Max+1,Hook);
                SaveReal(hx,i2,Max+3,ang);
                TimerStart(Timer,0.03,true,function   Spell_Hook_TimerB);
                DestroyGroup(g2);
                DestroyTimer(GetExpiredTimer());
                FlushChildHashtable(hx,i);
      }
      Hero = null;
      Hook = null;
      Target = null;
      g = null;
      g2 = null;
      Timer = null;
      i = 0;
      while (i>t)
      {
            i += 1;
            Majia = null;
      }
    }

    function Spell_Hook()
    {
      unit Hero = GetTriggerUnit(),Hook;
      location SpellLoc = GetSpellTargetLoc();
      timer t = CreateTimer(),t2= CreateTimer();
      integer i = GetHandleId(t),i2 = GetHandleId(t2);
      real x,y,ang;
      group g = CreateGroup();

      if(GetSpellAbilityId()==SpellId)
      {
      ang = bj_RADTODEG* Atan2(GetLocationY(SpellLoc)-GetUnitY(Hero),GetLocationX(SpellLoc)-GetUnitX(Hero) );
         x = GetUnitX(Hero)+60*Cos(ang*bj_DEGTORAD);
         y = GetUnitY(Hero)+60*Sin(ang*bj_DEGTORAD);
      Hook = CreateUnit(GetOwningPlayer(Hero),HookAId,x,y,ang);
         SetUnitPathing( Hook, false );
      SaveUnitHandle(hx,i,1,Hero);
      SaveUnitHandle(hx,i,2,Hook);
      SaveGroupHandle(hx,i,3,g);
      SaveReal(hx,i,4,ang);
      SaveInteger(hx,i,7,i2);
      SaveTimerHandle(hx,i,6,t2);
      TimerStart(t,SpeedA,true,function Spell_Hook_TimerA);
      }
      Hero = null;
      RemoveLocation(SpellLoc);
      SpellLoc= null;
      Hook = null;
      t = null;
      g = null;
      t2 = null;
    }
    function onInit()
    {
      trigger t= CreateTrigger();
      TriggerRegisterAnyUnitEventBJ( t, EVENT_PLAYER_UNIT_SPELL_EFFECT );
      TriggerAddCondition( t, function Spell_Hook);
      t = null;
    }
}
//! endzinc

破喉咙 发表于 2011-12-15 17:18:42

我有预感楼主即将出个J版的月神箭

xxx1852001 发表于 2015-9-1 12:43:31

我打不開 請問這要怎麼使用(我是用地圖編輯器開的

killimit 发表于 2017-12-16 13:21:36

lz好人一生平安
页: [1]
查看完整版本: 仿Dota技能 屠夫 - 肉钩 (傻瓜移植版)