找回密码
 点一下
查看: 2820|回复: 11

莫名创建了额外的单位(已解决)

[复制链接]
发表于 2011-7-19 08:51:28 | 显示全部楼层 |阅读模式
[jass]
globals
trigger gg_trg_OverwhelmingDisaster
hashtable udg_Hash = InitHashtable()
unit udg_u
endglobals

function Trig_OverwhelmingDisaster_Conditions takes nothing returns boolean
    if ( not ( GetSpellAbilityId() == 'A000' ) ) then
        return false
    endif
    return true
endfunction

function c2 takes nothing returns boolean
    return (IsPlayerEnemy(GetOwningPlayer(udg_u),GetOwningPlayer(GetFilterUnit())) == true)
endfunction

function c3 takes nothing returns boolean
    return (IsUnitAliveBJ(GetFilterUnit()) == true)
endfunction

function c1 takes nothing returns boolean
    return GetBooleanAnd(c2(),c3())
endfunction


function a1 takes nothing returns nothing
    call UnitDamageTarget(udg_u,GetEnumUnit(),75.00,true,false,ATTACK_TYPE_NORMAL,DAMAGE_TYPE_MAGIC,WEAPON_TYPE_WHOKNOWS)
endfunction

//球体坠落
function ball takes nothing returns nothing
    local timer t = GetExpiredTimer()
    local unit u = LoadUnitHandle(udg_Hash,GetHandleId(t),0)
    local unit u2 = LoadUnitHandle(udg_Hash,GetHandleId(t),4)
    local real r = LoadReal(udg_Hash,GetHandleId(t),1)
    local real r2 = LoadReal(udg_Hash,GetHandleId(t),2)
    local real r3 = LoadReal(udg_Hash,GetHandleId(t),3)
    local location l = GetUnitLoc(u)
    local location l2 = PolarProjectionBJ(l,(r/20),r3)
    local group g
    call SetUnitX(u,GetLocationX(l2))
    call SetUnitY(u,GetLocationY(l2))
    call SetUnitFlyHeight(u,(GetUnitFlyHeight(u)-25),0)
    set r2 = r2-(r/20)
    call SaveReal(udg_Hash,GetHandleId(t),2,r2)
    if r2 == 0 then
        call FlushChildHashtable(udg_Hash,GetHandleId(t))
        call DestroyTimer(t)
        set udg_u = u2
        set g = GetUnitsInRangeOfLocMatching(100,l2,Condition(function c1))
        call ForGroup(g,function a1)    
        call KillUnit(u)
        call DestroyGroup(g)
    endif
    call RemoveLocation(l)
    call RemoveLocation(l2)
endfunction

//能量球升高
function lift takes nothing returns nothing
    local timer t = GetExpiredTimer()
    local timer t2
    local unit u = LoadUnitHandle(udg_Hash,GetHandleId(t),0)
    local location l = GetUnitLoc(u)
    local location l2
    local location l3
    local integer i = 1
    local integer i2
    local group g
&#160;&#160;&#160;&#160;if GetUnitFlyHeight(u) < 500 then
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;call SetUnitFlyHeight(u,(GetUnitFlyHeight(u)+5),0)
&#160;&#160;&#160;&#160;else
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;set udg_u = u
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;set g = GetUnitsInRangeOfLocMatching(600,l,Condition(function c1))
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;if CountUnitsInGroup(g) > 0 then
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;set i2 = GetRandomInt(1,5)
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;loop
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;exitwhen i > i2
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;set t2 = CreateTimer()
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;call CreateNUnitsAtLoc(1,'e001',GetOwningPlayer(u),l,270)
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;set l2 = GetUnitLoc(GetLastCreatedUnit())
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;set l3 = GetUnitLoc(GroupPickRandomUnit(g))
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;call SaveUnitHandle(udg_Hash,GetHandleId(t2),0,GetLastCreatedUnit())
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;call SaveReal(udg_Hash,GetHandleId(t2),1,DistanceBetweenPoints(l2,l3))
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;call SaveReal(udg_Hash,GetHandleId(t2),2,DistanceBetweenPoints(l2,l3))
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;call SaveReal(udg_Hash,GetHandleId(t2),3,AngleBetweenPoints(l2,l3))
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;call SaveUnitHandle(udg_Hash,GetHandleId(t2),4,LoadUnitHandle(udg_Hash,GetHandleId(t),1))
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;call RemoveLocation(l2)
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;call RemoveLocation(l3)
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;call TimerStart(t2,0.01,true,function ball)
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;set i = i+1
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;endloop
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;set i = 1
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;set i2 = 5-i2
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;loop
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;exitwhen i > i2
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;set t = CreateTimer()
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;call CreateNUnitsAtLoc(1,'e002',GetOwningPlayer(u),l,270)
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;set l2 = GetUnitLoc(GetLastCreatedUnit())
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;set l3 = GetUnitLoc(GroupPickRandomUnit(g))
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;call SaveUnitHandle(udg_Hash,GetHandleId(t2),0,GetLastCreatedUnit())
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;call SaveReal(udg_Hash,GetHandleId(t2),1,DistanceBetweenPoints(l2,l3))
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;call SaveReal(udg_Hash,GetHandleId(t2),2,DistanceBetweenPoints(l2,l3))
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;call SaveReal(udg_Hash,GetHandleId(t2),3,AngleBetweenPoints(l2,l3))
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;call SaveUnitHandle(udg_Hash,GetHandleId(t2),4,LoadUnitHandle(udg_Hash,GetHandleId(t),1))
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;call RemoveLocation(l2)
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;call RemoveLocation(l3)
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;call TimerStart(t2,0.01,true,function ball)
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;set i = i+1
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;endloop
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;call DestroyGroup(g)
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;endif
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;call KillUnit(u)
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;call FlushChildHashtable(udg_Hash,GetHandleId(t))
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;call DestroyTimer(t)
&#160;&#160;&#160;&#160;endif&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
endfunction

//施放技能
function Trig_OverwhelmingDisaster_Actions takes nothing returns nothing
&#160;&#160;&#160;&#160;local unit u = GetTriggerUnit()
&#160;&#160;&#160;&#160;local location l = GetUnitLoc(u)
&#160;&#160;&#160;&#160;local timer t = CreateTimer()
&#160;&#160;&#160;&#160;call CreateNUnitsAtLoc(1,'e000',GetOwningPlayer(u),l,270)
&#160;&#160;&#160;&#160;call RemoveLocation(l)
&#160;&#160;&#160;&#160;call SaveUnitHandle(udg_Hash,GetHandleId(t),0,GetLastCreatedUnit())
&#160;&#160;&#160;&#160;call SaveUnitHandle(udg_Hash,GetHandleId(t),1,u)
&#160;&#160;&#160;&#160;call TimerStart(t,0.01,true,function lift)
endfunction
//===========================================================================
function InitTrig_OverwhelmingDisaster takes nothing returns nothing
&#160;&#160;&#160;&#160;set gg_trg_OverwhelmingDisaster = CreateTrigger(&#160;&#160;)
&#160;&#160;&#160;&#160;call TriggerRegisterAnyUnitEventBJ( gg_trg_OverwhelmingDisaster, EVENT_PLAYER_UNIT_SPELL_EFFECT )
&#160;&#160;&#160;&#160;call TriggerAddCondition( gg_trg_OverwhelmingDisaster, Condition( function Trig_OverwhelmingDisaster_Conditions ) )
&#160;&#160;&#160;&#160;call TriggerAddAction( gg_trg_OverwhelmingDisaster, function Trig_OverwhelmingDisaster_Actions )
endfunction
[/jass]

我猜是lift那出错了,运行时会创建出很多e001和e002(而且不被记到哈希表中),这是为什么呢
发表于 2011-7-19 09:45:01 | 显示全部楼层
你的哈希表初始化在哪里。。
回复

使用道具 举报

 楼主| 发表于 2011-7-19 09:55:15 | 显示全部楼层
初始化了.....忘记贴上来,已更改
回复

使用道具 举报

发表于 2011-7-19 09:59:56 | 显示全部楼层
我看不懂JASS,你教我
回复

使用道具 举报

 楼主| 发表于 2011-7-19 10:05:04 | 显示全部楼层
骗人......你上次明明显露了自己制作的jass
回复

使用道具 举报

发表于 2011-7-19 10:41:30 | 显示全部楼层
你总要说清楚这些代码是用来干什么的啊~~
不然我们怎么知道哪些单位是“额外”的??

最直接就是放地图~
回复

使用道具 举报

 楼主| 发表于 2011-7-19 11:20:52 | 显示全部楼层
好吧,地图在此 xx.w3x (21 KB, 下载次数: 14)
会创建超过5个的额外e001和e002.....且不进行位移
回复

使用道具 举报

发表于 2011-7-19 18:49:17 | 显示全部楼层

xxx.w3x

22 KB, 下载次数: 10

回复

使用道具 举报

 楼主| 发表于 2011-7-19 20:48:56 | 显示全部楼层
被解决了阿......虽然似乎和我的原意不一样....
回复

使用道具 举报

发表于 2011-7-19 20:53:02 | 显示全部楼层
其实是偶无聊改着玩的
出错原因在这
95.            set i2 = 5-i2

96.            loop

97.                exitwhen i > i2

98.                set t = CreateTimer()

99.                call CreateNUnitsAtLoc(1,'e002',GetOwningPlayer(u),l,270)
回复

使用道具 举报

 楼主| 发表于 2011-7-19 21:06:41 | 显示全部楼层
啊啊啊,我最近一直很粗心呢,你是好人,送张好人卡给你咯
谢啦
回复

使用道具 举报

发表于 2011-9-3 10:12:20 | 显示全部楼层
牛牛牛牛呀








同仁堂祛斑霜好不好49207.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-4 04:06 , Processed in 0.122585 second(s), 22 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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