找回密码
 点一下
查看: 3221|回复: 28

【90%高仿Dota技能】 巫妖 - 连环霜冻(纯Jass傻瓜移植版)

[复制链接]
发表于 2011-12-2 03:19:02 | 显示全部楼层 |阅读模式
1 - 解决了第一次移动弹射球到目标跟下次弹射的衔接
2 - 弹射下次目标不重复

3 - 解决了用单位 - 伤害目标函数导致目标死亡出现不了效果的问题
4 - 因弹射中途目标单位死亡导致弹射球移动到地图中心点的Bug
    设置一个备用目标。如果备用目标死亡那么就人品问题了(此问题尚未完美解决)

5 - 如何移植在模板中有清晰注释
6 - 需要1.24B以上魔兽版本
7 - 需要YDWE1.20以上编辑器
8 - 支持多人同时施法
9 - 100%排泄 90%高仿

未命名.gif


[jass]
library SDXX
globals
    hashtable hx = InitHashtable()
endglobals
function Distance takes real  x1,real x2,real y1, real  y2 returns real
    local real s
    local real dx = x2 - x1
    local real dy = y2 - y1
    set s = SquareRoot(dx*dx+dy*dy)
    return s
endfunction
function fzq takes real y1,real y2,real x1,real x2 returns real
    local real s =(bj_RADTODEG* Atan2(y1-y2,x1-x2 ))
    return s
endfunction
   
function zbX takes real xx,real xxx,real xxxx returns real
    local real x
    set x = xx+xxx*Cos(xxxx*bj_DEGTORAD)
    return x
endfunction
function zbY takes real xx,real xxx,real xxxx returns real
    local real y
    set y = xx+xxx*Sin(xxxx*bj_DEGTORAD)
    return y
endfunction
function Hero_Bn_Skill_R2 takes nothing returns nothing
    local integer i = GetHandleId(GetExpiredTimer())
    local unit Hero = LoadUnitHandle(hx,i,1)
    local unit u =  LoadUnitHandle(hx,i,2)
    local unit majia = LoadUnitHandle(hx,i,3)
    local boolean Boo = LoadBoolean(hx,i,5)
    local boolean Booo = LoadBoolean(hx,i,6)
    local integer C = LoadInteger(hx,i,7)
    local unit beiyong = LoadUnitHandle(hx,i,8)
    local integer i2 = 0
    local real x
    local real y
    local real s
    local group g = CreateGroup()
    local group g2 = CreateGroup()
    local location d = GetUnitLoc(u)
    local unit xm
    local unit majia2
   
    if C == 7 /*这里的7为最大弹射次数*/ then
    call PauseTimer(GetExpiredTimer())
    call RemoveUnit(majia)
    call FlushChildHashtable(hx,i)
    call DestroyTimer(GetExpiredTimer())
    else
    if  Boo == false then
        if IsUnitAliveBJ(u) == true then
        set s =
fzq(GetUnitY(u),GetUnitY(majia),GetUnitX(u),GetUnitX(majia))
        set x = zbX(GetUnitX(majia),13,s)//这里的13为冰霜球一开始飞行的移动速度
        set y = zbY(GetUnitY(majia),13,s)//如上
        call SetUnitX(majia,x)
        call SetUnitY(majia,y)
        if
Distance(GetUnitX(majia),GetUnitX(u),GetUnitY(majia),GetUnitY(u))<=10  
then
            set Boo = true
            call SaveBoolean(hx,i,5,Boo)
        endif
        else
        set C = 7
        endif
    else
        if Booo == false then
            set C = C +1
            call SaveInteger(hx,i,7,C)
            set majia2 = CreateUnit(GetOwningPlayer(Hero),/*这里的e000改为释放技能马甲ID*/'e000',GetUnitX(u),GetUnitY(u),0)
             call UnitApplyTimedLife( majia2, 'BHwe', 2.00 )
             call IssueTargetOrder( majia2, "frostnova", u )
            set g =  GetUnitsInRangeOfLocAll(600,d)//这里的600为弹射选取单位的范围
            call GroupRemoveUnit(g,u)
            loop
                set xm = FirstOfGroup(g)
                exitwhen xm == null
                if IsUnitType(xm, UNIT_TYPE_STRUCTURE) == false /*
            */and IsUnitEnemy(xm, GetOwningPlayer(Hero)) == true /*
            */ and IsUnitAliveBJ(xm) == true  then
                        call GroupAddUnit(g2,xm)
                endif
                call GroupRemoveUnit(g,xm)
            endloop
            
            
            if CountUnitsInGroup(g2) == 0  then
                set C = 7
            else
                set u = GroupPickRandomUnit(g2)
                call SaveUnitHandle(hx,i,2,u)
                call GroupRemoveUnit(g2,u)
                set beiyong = GroupPickRandomUnit(g2)
                call SaveUnitHandle(hx,i,8,beiyong)
                set Booo = true
                call SaveBoolean(hx,i,6,Booo)
            endif
            
        else
            if IsUnitAliveBJ(u) == true then
                set s =
fzq(GetUnitY(u),GetUnitY(majia),GetUnitX(u),GetUnitX(majia))
                set x = zbX(GetUnitX(majia),13,s) //这里的13为冰霜球弹射的时候的移动速度
                set y = zbY(GetUnitY(majia),13,s)//如上
                call SetUnitX(majia,x)
                call SetUnitY(majia,y)
                if
Distance(GetUnitX(majia),GetUnitX(u),GetUnitY(majia),GetUnitY(u))<=10
then
                    set Booo = false
                endif
            else
                if IsUnitAliveBJ(beiyong) == true then
                    set u = beiyong
                    call SaveUnitHandle(hx,i,2,u)
                else
                    set C = 7
                endif
            endif
            call SaveBoolean(hx,i,6,Booo)
        endif
    endif
    endif
    call SaveInteger(hx,i,7,C)
    call DestroyGroup(g2)
    call DestroyGroup(g)
     call RemoveLocation(d)
    set Hero = null
    set majia = null
    set u = null
    set majia2 = null
    set g = null
    set g2 = null
    set d = null
    set xm = null
    set beiyong = null
   
endfunction
function Hero_Bv_Skill_R takes unit Hero  returns nothing
    local unit u = GetSpellTargetUnit()
    local unit majia =
CreateUnit(GetOwningPlayer(Hero),/*这里的e001改为冰霜球马甲ID*/'e001',GetUnitX(Hero),GetUnitY(Hero),0)
    local timer t  = CreateTimer()
    local integer i = GetHandleId(t)
   
    call SaveUnitHandle(hx,i,1,Hero)
    call SaveUnitHandle(hx,i,2,u)
    call SaveUnitHandle(hx,i,3,majia)
    call TimerStart(t,0.03,true,function Hero_Bn_Skill_R2)
   
    set u = null
    set majia = null
    set Hero = null
   
endfunction

endlibrary
[/jass]

[通魔]米波 - 连环霜冻(纯Jass傻瓜移植版).w3x (23 KB, 下载次数: 216)

评分

参与人数 1威望 +31 收起 理由
uoer + 31 加分!少年加油(尽管是Jass吧)

查看全部评分

发表于 2011-12-2 12:20:23 | 显示全部楼层
   其实我想吐槽用马甲+T也能做出来这样的效果  而且相当简单  相当简单。。。


唉。。突然发现自己天真了呢。。
回复

使用道具 举报

发表于 2011-12-2 12:29:37 | 显示全部楼层
难道是风暴之锤?看见目标单位头上闪了一个buff,没看清是啥……
其实用马甲+T能做出这样的效果,不过一点也不简单 真不简单……
回复

使用道具 举报

发表于 2011-12-2 12:33:14 | 显示全部楼层
   因为那个球体没有死亡动画我就收回了我简单的说法。

  在DotA里边这个是用睡眠做的。

  我的思路是  召唤一个马甲 设置给他5点蓝(随便你设定) 然后每次释放技能少一点。
任意单位接受伤害来自是马甲的时候  创建单位组再丢个暗影突袭 。
任意单位接受伤害带有Buff为xx而且来源为马甲  给他丢一本霜之新星的书然后命令本体打他一下
回复

使用道具 举报

发表于 2011-12-2 12:34:32 | 显示全部楼层
想试试 但是手头WE已经被删了怎么办。。
回复

使用道具 举报

发表于 2011-12-2 13:21:14 | 显示全部楼层
    不用试了呗
回复

使用道具 举报

发表于 2011-12-2 13:24:34 | 显示全部楼层
不要死亡动画其实很简单啊……
任意单位死亡,单位类型是……,删除单位
于是单位不播放动画的凭空消失了……

不了解这个技能,所以不试了……
嘛,了解了也不试~
回复

使用道具 举报

发表于 2011-12-2 13:32:13 | 显示全部楼层
话说。。弹射目标意外身亡这一点……有木有人用DOTA测试下呢。。

然后调用普通成员不用包含库文件吗……我第一次知道。。[s:166]

另外LS们想多了。。。英雄技能是通魔(基本是常见设置),马甲的技能是霜冻新星
LZ的截图估计是实际地图里截的,所以与移植版的有些不同~
额。。。T真的很难做吗?哪个部分难做?求LS们指点~
话说。。漠漠说的球体是什么?
        

我挑了一些小刺,希望LZ不要介意~
因为LZ说了是移植版啦~如果是教学那也无所谓了,移植的话个人认为应该将效率啥的尽量提升到最大,而教学的话倒只要一个明确的思路即可~

哈希表的初始化最好说明下放在脚本里初始化一个就够了,不然如果有别的移植也要初始化的话。。感觉会浪费不少时间

我忘了DOTA里的冰弹弹射次数是否会随着技能等级的变化而变化,如果会的话那么需要做些小的调整~

LZ用了些BJ,这本身没什么问题,只是IsUnitAliveBJ这个。。。效率实在……
如果将其打回原形的话就是
[jass]GetUnitState(whichUnit, UNIT_STATE_LIFE) <= 0[/jass]
这个东西啦。。为何不直接用而要多进行两次不必要的调用?

然后,GetUnitsInRangeOfLocAll也与上面的理由相同,因为filter的布尔式是null,完全没必要使用这个BJ来降低效率,另外这个函数采用的是点,需要后续排泄,所以替换成坐标的话应该效率更高~

嘛。。如果LZ是从移植时方便新人学习这方面考虑的话。。
个人认为还是不需要这样子的,那些BJ和CJ的理解难度的差异应该只有参数数量的差异,的确参数少便于理解,但是个人认为参数数量差造成的理解难度对于真心想学J的同学来说不会成为太大的问题,所以……
        

不过由于我这边已经很晚了所以只是大致看了下,有什么说错了请见谅~
当然,也请务必纠正~
回复

使用道具 举报

 楼主| 发表于 2011-12-2 13:49:34 | 显示全部楼层

回 7楼(chyj4747) 的帖子

chyj4747:话说。。弹射目标意外身亡这一点……有木有人用DOTA测试下呢。。

然后调用普通成员不用包含库文件吗……我第一次知道。。[s:166]

另外LS们想多了。。。英雄技能是通魔(基本是常见设置),马甲的技能是霜冻新星
....... (2011-12-02 13:32)
谢谢指导。 其实GetUnitsInRangeOfLocAll这个我也找不到其他可用的函数。 一篇紫色就这个红色的。。IsUnitAliveBJ的话。。 习惯了。。。其实T GUI上面都有说明是判断生命值 不过太懒了就懒得动了
回复

使用道具 举报

发表于 2011-12-2 14:15:25 | 显示全部楼层
苦工: 谢谢指导。 其实GetUnitsInRangeOfLocAll这个我也找不到其他可用的函数。 一篇紫色就这个红色的。。IsUnitAliveBJ的话。。 习惯了。。。其实T GUI上面都有说明是判断生命值 不过太懒了就懒得动了   (2011-12-02 13:49)
[jass]set g =  GetUnitsInRangeOfLocAll(600,d)
call GroupRemoveUnit(g,u)[/jass]
就是上面这两句吧~
g应该是个单位组没错吧,然后d是单位位置
可以这么写
[jass]call GroupEnumUnitInRange(g, GetUnitX(u), GetUnitY(u), 600, null)
call GroupRemoveUnit(g,u)[/jass]
LZ去function list看下GetUnitsInRangeOfLocAll调用的函数就知道了~
不过。。。我没试过……所以,万一错了,麻烦LZ来纠正~

PS:null应该跟returns nothing不一样吧……太晚了我就不测了,很早以前老狼写过一个优化ForGroup的写法,用的是GroupEnumUnitInRange并将里面的布尔式返回nothing,如果两者是一样的那么就矛盾了……因为BJ函数里写的是条件为空,返回单位组,于是该加入的单位全加好了,而老狼那个写法在函数运行完之后单位并不会真正加入该单位组

嘛。。没有条件和条件无返回值(等于返回false)应该是不同的吧~
回复

使用道具 举报

发表于 2011-12-2 16:41:21 | 显示全部楼层
[jass]
function IsUnitAliveBJ takes unit whichUnit returns boolean
    return not IsUnitDeadBJ(whichUnit)
endfunction
[/jass]


[jass]
function IsUnitDeadBJ takes unit whichUnit returns boolean
    return GetUnitState(whichUnit, UNIT_STATE_LIFE) <= 0
endfunction
[/jass]


路程真遠
回复

使用道具 举报

发表于 2011-12-2 21:15:12 | 显示全部楼层
还是有点不明白……
弹射下次目标不重复是什么意思?
用单位 - 伤害目标函数导致目标死亡出现不了效果是什么问题?
弹射中途目标单位死亡应该是弹尸体还是继续直线移动?
回复

使用道具 举报

发表于 2011-12-2 22:20:24 | 显示全部楼层
lo:还是有点不明白……
弹射下次目标不重复是什么意思?
用单位 - 伤害目标函数导致目标死亡出现不了效果是什么问题?
弹射中途目标单位死亡应该是弹尸体还是继续直线移动? (2011-12-02 21:15)
弹射下次目标不重复就是不会一直弹一个单位……
DOTA的冰弹是如果弹射目标身亡则消失……
另外对首个目标有0.01的睡眠
回复

使用道具 举报

发表于 2011-12-3 07:40:31 | 显示全部楼层
目标闪烁或者被龙卷风了之类的,冰球也消失么
回复

使用道具 举报

发表于 2011-12-3 07:43:30 | 显示全部楼层
嘛,不想那么多了,猫咪又没打算做……
回复

使用道具 举报

发表于 2011-12-3 23:38:04 | 显示全部楼层
我发现这个技能用T来做的话会简化会简化5倍以上。
回复

使用道具 举报

发表于 2011-12-3 23:53:30 | 显示全部楼层
10235724429:我发现这个技能用T来做的话会简化会简化5倍以上。 (2011-12-03 23:38)
这LS就不要考虑了。。。
T不管怎样效率都不及J的,最多跟J相等
如果LS说的是看起来简洁……我觉得是LS还不习惯J而已
J的可读性也比T要强很多
回复

使用道具 举报

发表于 2011-12-4 06:32:18 | 显示全部楼层
   说真的。

   用Jass做技能的话。

   效率能比T高多少
回复

使用道具 举报

发表于 2011-12-4 12:14:39 | 显示全部楼层
迫切的想学J却发现自己连T都没完全弄懂的少年。。路过。。
回复

使用道具 举报

发表于 2011-12-4 23:05:41 | 显示全部楼层
uoer:   说真的。

   用Jass做技能的话。

   效率能比T高多少 (2011-12-04 06:32)
单就常规技能来说的话。。2-4倍左右……如果以前某大大的研究没有问题的话~
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 点一下

本版积分规则

Archiver|移动端|小黑屋|地精研究院

GMT+8, 2024-12-23 17:02 , Processed in 0.431678 second(s), 25 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表