freest
offline
Опыт:
442Активность: |
Утечка в коде, или неправильный код.
В общем: сделал скилл как у Windrunner стрела в доте, летит создает спецэффект по за собой, на пути наносит урон, рубит деревья, в конце полета уничтожается и происходит взрыв в области, создаются дамми и стунит юнитов.
Когда использует первый игрок все нормально, но после 40-50 применений начинает лагать.
Когда использует другой игрок, создается спецэффект взрыва в центре карты с периодичностью в ~0,4 секунды, неважно куда летела стрела. Собстна код:
((код jass
globals
unit u endglobals function arrow_cond takes nothing returns boolean
return GetSpellAbilityId() == 'A00B' endfunction function FilterUnit takes nothing returns boolean
return IsPlayerEnemy(GetOwningPlayer(u) ,GetOwningPlayer(GetFilterUnit())) and GetWidgetLife(GetFilterUnit())>=0.405 and not IsUnitType(GetFilterUnit(),UNIT_TYPE_STRUCTURE) and not IsUnitType(GetFilterUnit(),UNIT_TYPE_MAGIC_IMMUNE)and not IsUnitType(GetFilterUnit(),UNIT_TYPE_FLYING) endfunction function arrow_damage takes nothing returns nothing
local integer lvl = GetUnitAbilityLevel(u, 'A00B') call DestroyEffect(AddSpecialEffectTarget("Abilities\\Spells\\Items\\AIfb\\AIfbSpecialArt.mdl", GetEnumUnit(), "overhead")) call UnitDamageTargetBJ( u, GetEnumUnit(), (10*I2R(lvl)), ATTACK_TYPE_MAGIC, DAMAGE_TYPE_FIRE ) call KillDestructable(GetEnumDestructable()) endfunction function arrow_explosion takes nothing returns nothing
local integer lvl = GetUnitAbilityLevel(u, 'A00B') local unit d = CreateUnit(GetOwningPlayer(u), 'h001', GetUnitX(GetEnumUnit()), GetUnitY(GetEnumUnit()), 0) call DestroyEffect(AddSpecialEffectTarget("Abilities\\Spells\\Other\\Incinerate\\FireLordDeathExplode.mdl", GetEnumUnit(), "origin")) call KillDestructable(GetEnumDestructable()) call UnitApplyTimedLife(d, 'BTLF', 1.5) call ShowUnitHide(d) call IssueTargetOrder(d, "thunderbolt", GetEnumUnit()) call UnitDamageTargetBJ( u, GetEnumUnit(), (100*I2R(lvl)), ATTACK_TYPE_MAGIC, DAMAGE_TYPE_FIRE ) set d = null endfunction function arrow_move takes nothing returns nothing
local integer i = GetHandleId(GetExpiredTimer()) local unit d = LoadUnitHandle(udg_h, i, 0) local real a = LoadReal(udg_h, i, 1) local real x2 = GetUnitX(d) + 40.00 * Cos(a*bj_DEGTORAD) local real y2 = GetUnitY(d) + 40.00 * Sin(a*bj_DEGTORAD) local real x = LoadReal(udg_h, i, 2) local real y = LoadReal(udg_h, i, 3) local real dist = SquareRoot((x2-x)*(x2-x)+(y2-y)*(y2-y)) local group g = CreateGroup() local group ge = CreateGroup() local effect e if d != null then call DestroyEffect(AddSpecialEffect("Environment\\NightElfBuildingFire\\ElfLargeBuildingFire2.mdl", x2, y2)) endif set u = LoadUnitHandle(udg_h, i, 4) call GroupEnumUnitsInRange(g, GetUnitX(d), GetUnitY(d), 150, Condition(function FilterUnit)) call ForGroup(g, function arrow_damage) call EnumDestructablesInCircleBJ(150, Location(x2,y2),(function arrow_damage)) if dist < 1800 then call SetUnitPosition(d, x2, y2) else call GroupEnumUnitsInRange(ge, GetUnitX(d), GetUnitY(d), 300, Condition(function FilterUnit)) call EnumDestructablesInCircleBJ(300, Location(x2,y2),(function arrow_explosion)) call ForGroup(ge, function arrow_explosion) set e = AddSpecialEffect("Objects\\Spawnmodels\\Other\\NeutralBuildingExplosion\\NeutralBuildingExplosion.mdl", GetUnitX(d), GetUnitY(d)) call RemoveUnit(d) call DestroyEffect(e) endif call DestroyGroup(g) call DestroyGroup(ge) set e = null set g = null set ge = null set d = null endfunction function arrow_act takes nothing returns nothing
local timer t = CreateTimer() local integer i = GetHandleId(t) local unit c = GetSpellAbilityUnit() local real cx = GetUnitX(c) local real cy = GetUnitY(c) local real tx = GetSpellTargetX() local real ty = GetSpellTargetY() call SaveUnitHandle(udg_h, i, 0, CreateUnit(GetOwningPlayer(c), 'h003',cx , cy, bj_RADTODEG*Atan2(ty-cy,tx-cx))) call SaveReal(udg_h, i, 1, bj_RADTODEG*Atan2(ty-cy,tx-cx)) call SaveReal(udg_h, i, 2, GetUnitX(GetSpellAbilityUnit())) call SaveReal(udg_h, i, 3, GetUnitY(GetSpellAbilityUnit())) call SaveUnitHandle(udg_h, i, 4, c) call TimerStart(t, 0.03125, true, function arrow_move) call DestroyEffect(AddSpecialEffect("Environment\\NightElfBuildingFire\\ElfLargeBuildingFire2.mdl", cx, cy)) set t = null set c = null endfunction function InitTrig_Arrow takes nothing returns nothing local trigger t = CreateTrigger() call TriggerRegisterAnyUnitEventBJ(t, EVENT_PLAYER_UNIT_SPELL_CAST) call TriggerAddCondition(t, Condition(function arrow_cond)) call TriggerAddAction(t, function arrow_act) endfunction )) Отредактировано freest, 18.02.2012 в 18:45. |
18.02.2012, 18:14 | #1
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
alpha
offline
Опыт:
7,387Активность: |
перенеси код нормально, тут спецсимволы какие-то, мусор всякий оформи как код jass согласно форматированию, если автоопределение не срабатывает как надо |
18.02.2012, 18:36 | #2
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Doc
offline
Опыт:
63,163Активность: |
gimme map. |
18.02.2012, 18:38 | #3
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
freest
offline
Опыт:
442Активность: |
alpha:
код и без того можно прочесть, спецсимволы вставлены всего в двух местах, в путях к спецэффектам. |
19.02.2012, 09:16 | #4
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Nerevar
I'll be back!
offline
Опыт:
18,352Активность: |
Судя по твоему коду,стрела будет наносить урон по каждому юниту не 2 раза(при полете 1 и при взрыве) а постоянно(при полете вокруг дпс и при взрыве) - так и оставлять или сделать чтобы 2 раза урон наносился?
Вот изменил код,чтобы наносило урон юниту 2 раза(при задевании и взрыве),также кое-что убрал,кое-что добавил,устранил утечки,должно работать^^
» Code
Отредактировано Nerevar, 19.02.2012 в 10:24. |
19.02.2012, 10:08 | #5
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
FLESHNIK
offline
Опыт:
384Активность: |
Таймер не удалил. |
19.02.2012, 11:25 | #6
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
MpW
offline
Опыт:
50,234Активность: |
freest,
еще группы можно было 1 раз создать, в начале действия, тут у тебя каждый раз создаются по-новому, потом удаляются, лучше так: создал ее, запомнил в хэше, и потом через каждые n-секунды по таймеру ты ее используешь таким образом: выделил всех юнитов в группу, скажем в группу g Код:
потом сделал нужные действия через ForGroup или просто обычным циклом (скажем дамаг даммикаст итд) затем эту можно просто очистить, а когда она не нужно уничтожать ее вместе с таймером насчет EnumDestructablesInCircleBJ была у меня такая тема, где не хотел использовать локалку [h3]Steal nerves добавил: » вот код Код:
Отредактировано Steal nerves, 20.02.2012 в 00:37. |
19.02.2012, 14:51 | #7
+1/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
freest
offline
Опыт:
442Активность: |
|
20.02.2012, 04:35 | #8
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|