offline
Опыт:
94
Активность:
|
Спасибо, но проблема была не в этом =( (я в начале так и делал)
Я просто забыл инициализировать кеш =((((
Сидел пол дня делал и так, и сяк =((
В общем вышло вот что
Код:
scope st initializer Init
globals
private constant integer spellID = 'A000'
private constant integer dummyID = 'u000'
private constant string tEffect = "Abilities\\Spells\\Human\\ManaFlare\\ManaFlareBoltImpact.mdl"
private real Period = 0.05
private real Speed = 700
private real Distance = Speed * Period
private sTest Temp
private player stOwner
private unit array cUnit
private integer num = 0
endglobals
struct sTest
unit u
unit tu
unit dummy
real sin
real cos
real mc
real rc = 0
timer t
method onDestroy takes nothing returns nothing
set this.u = null
set this.tu = null
set this.t = null
set this.dummy = null
endmethod
method MoveAtan2 takes nothing returns real
local real x = GetUnitX (this.dummy )
local real y = GetUnitY (this.dummy )
local real dx = GetUnitX (this.tu ) - x
local real dy = GetUnitY (this.tu ) - y
return Atan2 (dy, dx )
endmethod
method MoveCos takes nothing returns real
return Distance * Cos (this.MoveAtan2() )
endmethod
method MoveSin takes nothing returns real
return Distance * Sin (this.MoveAtan2() )
endmethod
method MoveCount takes nothing returns real
local real x = GetUnitX (this.u )
local real y = GetUnitY (this.u )
local real dx = GetUnitX (this.tu ) - x
local real dy = GetUnitY (this.tu ) - y
return SquareRoot (dx * dx + dy * dy )/Distance
endmethod
endstruct
private function stCon takes nothing returns boolean
return GetSpellAbilityId()==spellID
endfunction
private function stFilter takes nothing returns boolean
return GetUnitState(GetFilterUnit(), UNIT_STATE_LIFE) > 0 and IsUnitEnemy(GetFilterUnit(), stOwner) and not GetStoredBoolean(udg_cache, I2S(U2I(GetFilterUnit())), "damaged")
endfunction
private function stTimer takes nothing returns nothing
local sTest s
local unit f
local group g = CreateGroup()
local integer ls = 0
set s = Temp
if s.rc >= s.mc then
call KillUnit(s.dummy)
call DestroyTimer(s.t)
call UnitDamageTarget(s.u, s.tu, 350, true, false, ATTACK_TYPE_HERO, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS)
call sTest.destroy(s)
loop
exitwhen ls >= num
call FlushStoredBoolean(udg_cache, I2S(U2I(cUnit[num])), "damaged")
set num = num - 1
endloop
else
set s.cos = s.MoveCos()
set s.sin = s.MoveSin()
call SetUnitX(s.dummy, GetUnitX(s.dummy) + s.cos)
call SetUnitY(s.dummy, GetUnitY(s.dummy) + s.sin)
call GroupEnumUnitsInRange(g, GetUnitX(s.dummy), GetUnitY(s.dummy), 350, Condition(function stFilter))
loop
set f = FirstOfGroup(g)
exitwhen f == null
call DestroyEffect(AddSpecialEffect(tEffect, GetUnitX(f), GetUnitY(f)))
call UnitDamageTarget(s.u, f, 100, true, false, ATTACK_TYPE_HERO, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS)
call StoreBoolean(udg_cache, I2S(U2I(f)), "damaged", true)
set num = num + 1
set cUnit[num] = f
call GroupRemoveUnit(g, f)
endloop
set s.rc = s.rc + 1
endif
call DestroyGroup(g)
set f = null
set g = null
endfunction
private function stMain takes nothing returns nothing
local sTest s = sTest.create()
set s.t = CreateTimer()
set s.u = GetTriggerUnit()
set s.tu = GetSpellTargetUnit()
set stOwner = GetOwningPlayer(s.u)
set s.cos = s.MoveCos()
set s.sin = s.MoveSin()
set s.dummy = CreateUnit(GetOwningPlayer(s.u), dummyID, GetUnitX(s.u), GetUnitY(s.u), GetUnitFacing(s.u))
call SetUnitPathing(s.dummy, false)
call PauseUnit(s.dummy, true)
call TimerStart(s.t, Period, true, function stTimer)
set s.mc = s.MoveCount()
set Temp = s
endfunction
private function Init takes nothing returns nothing
local trigger lt = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(lt, EVENT_PLAYER_UNIT_SPELL_CAST)
call TriggerAddCondition(lt, Condition(function stCon))
call TriggerAddAction(lt, function stMain)
call Preload(tEffect)
endfunction
endscope
Насколько кривой получился код? Как насчет утечек? Я только учусь так что ваша критика мне будет только на пользу.
"писал после изучения одной карты(а как еще разобраться что к чему=) ), так что код может быть похожим"
Отредактировано karaliti, 09.06.2009 в 03:37.
|