XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Академия: форум для вопросов> Jass
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Закрытая тема
 
Doc

offline
Опыт: 63,163
Активность:
Утечки!
globals
  group array DGgroup
  boolean array isgroupcreated
  unit array glevie
  real array angle
endglobals

function DamageUnits takes unit u, real r, real damage returns nothing
  local integer i = S2I(SubString(I2S(GetHandleId(u)), 4, 7))
  local group g =CreateGroup()
  local unit tmp
  local real x =GetUnitX(u)
  local real y =GetUnitY(u)

  if isgroupcreated[i] == false then
    set DGgroup[i] = CreateGroup()
    set isgroupcreated[i] = true
  endif

  call GroupEnumUnitsInRange(g,x,y,r,null)
  loop
    set tmp=FirstOfGroup(g)
    exitwhen tmp==null
    if IsUnitInGroup(tmp, DGgroup[i]) == false and IsUnitEnemy(tmp,GetOwningPlayer(u)) and IsUnitVisible(tmp,GetOwningPlayer(u)) then
      if GetUnitState(tmp,UNIT_STATE_LIFE)>0 and IsUnitType(tmp,UNIT_TYPE_STRUCTURE)==false then
        call GroupAddUnit(DGgroup[i],tmp)
        call UnitDamageTarget(u,tmp,damage,true,true,ATTACK_TYPE_NORMAL,DAMAGE_TYPE_NORMAL,WEAPON_TYPE_METAL_HEAV​Y_SLICE)
        // я закомментил эту строчку, чтобы код нормально пропарсился. © swdn
        // call AddSpecialEffectTarget("Objects\\Spawnmodels\\Human\\HumanBlood\\BloodElfSpellThiefBlood.mdl&qu​ot;,tmp,"overhead")
      endif
    endif
    call GroupRemoveUnit(g,tmp)
  endloop

  call TriggerSleepAction(5.00)
  call GroupClear(DGgroup[i])
  call DestroyGroup(g)
  call DestroyGroup(DGgroup[i])
  set isgroupcreated[i] = false

  set g = null
  set tmp = null
  set u = null
endfunction


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

function GlevieOnTimer takes nothing returns nothing
  local timer tm = GetExpiredTimer()
  local integer tid = GetHandleId(tm)
  local integer ai = S2I(SubString(I2S(tid), 4, 7))
  local integer bi = S2I(SubString(I2S(tid + 1), 4, 7))
  local unit a = glevie[ai]
  local unit b = glevie[bi]
  local location aloc = GetUnitLoc(a)
  local location bloc = GetUnitLoc(b)
  local location al = Location(GetLocationX(aloc) + 70.00 * Cos((GetUnitFacing(a)) * bj_DEGTORAD), GetLocationY(aloc) + 70.00 * Sin((GetUnitFacing(a)) * bj_DEGTORAD))
  local location bl = Location(GetLocationX(bloc) + 70.00 * Cos((GetUnitFacing(b)) * bj_DEGTORAD), GetLocationY(bloc) + 70.00 * Sin((GetUnitFacing(b)) * bj_DEGTORAD))

  call SetUnitFacing(a, GetUnitFacing(a) + 10)
  call SetUnitFacing(b, GetUnitFacing(b) - 10)
  call SetUnitPositionLoc(a, al)
  call SetUnitPositionLoc(b, bl)

  set al = Location(GetLocationX(aloc) + 20.00 * Cos((angle[ai]) * bj_DEGTORAD), GetLocationY(aloc) + 20.00 * Sin((angle[ai]) * bj_DEGTORAD))
  set bl = Location(GetLocationX(bloc) + 20.00 * Cos((angle[ai]) * bj_DEGTORAD), GetLocationY(bloc) + 20.00 * Sin((angle[ai]) * bj_DEGTORAD))
  call SetUnitPositionLoc(a, al)
  call SetUnitPositionLoc(b, bl)
  call RemoveLocation(al)
  call RemoveLocation(bl)

  call EnumDestructablesCircle(70.00, aloc, function DestructKill)
  call EnumDestructablesCircle(70.00, bloc, function DestructKill)
  call DamageUnits(a, 150, 100)
  call DamageUnits(b, 150, 100)
  call RemoveLocation(aloc)
  call RemoveLocation(bloc)

  if GetUnitState(a, UNIT_STATE_LIFE) <= 0 or GetUnitState(b, UNIT_STATE_LIFE) <= 0 then
    call DestroyTimer(tm)
  endif

  set a = null
  set b = null
  set tm = null
  set aloc = null
  set bloc = null
  set al = null
  set bl = null
endfunction

function Trig_DeadlyGlavies_Actions takes nothing returns nothing
  local unit c = GetTriggerUnit()
  local location t = GetSpellTargetLoc()
  local location cl = GetUnitLoc(c)
  local real X = GetUnitX(c)
  local real Y = GetUnitY(c)
  local real A = bj_RADTODEG * Atan2(GetLocationY(t) - GetLocationY(cl), GetLocationX(t) - GetLocationX(cl))
  local location array loc
  local player pl = GetOwningPlayer(c)
  local unit a = CreateUnit(pl, 'h000', X, Y, A)
  local unit b = CreateUnit(pl, 'h000', X, Y, A)
  local timer tm = CreateTimer()
  local integer tid = GetHandleId(tm)
  local integer id1 = S2I(SubString(I2S(tid), 4, 7))
  local integer id2 = S2I(SubString(I2S(tid + 1), 4, 7))

  call UnitApplyTimedLife(a, 'Binf', 2.00)
  call UnitApplyTimedLife(b, 'Binf', 2.00)
  set angle[id1] = A
  set glevie[id1] = a
  set glevie[id2] = b
  call TimerStart(tm, 0.03, true, function GlevieOnTimer)

  set loc[1] = GetUnitLoc(a)
  set loc[0] = Location(GetLocationX(loc[1]) + 75.00 * Cos((A - 90) * bj_DEGTORAD), GetLocationY(loc[1]) + 75.00 * Sin((A - 90) * bj_DEGTORAD))
  call SetUnitPositionLoc(a, loc[0])
  call RemoveLocation(loc[0])
  call RemoveLocation(loc[1])

  set loc[1] = GetUnitLoc(b)
  set loc[0] = Location(GetLocationX(loc[1]) + 75.00 * Cos((A + 90) * bj_DEGTORAD), GetLocationY(loc[1]) + 75.00 * Sin((A + 90) * bj_DEGTORAD))
  call SetUnitPositionLoc(b, loc[0])

  call RemoveLocation(loc[0])
  call RemoveLocation(loc[1])
  call RemoveLocation(t)
  call RemoveLocation(cl)

  set c = null
  set ae = null
  set be = null
  set t = null
  set cl = null
  set loc[0] = null
  set loc[1] = null
  set pl = null
  set a = null
  set b = null
  set tm = null
endfunction

//===========================================================================
function InitTrig_DeadlyGlavies takes nothing returns nothing
    local trigger Gleive = CreateTrigger()
    local integer index
    set index = 0
    loop
        call TriggerRegisterPlayerUnitEvent(Gleive, Player(index), EVENT_PLAYER_UNIT_SPELL_EFFECT, null)
        set index = index + 1
        exitwhen index == bj_MAX_PLAYER_SLOTS
    endloop
    call TriggerAddAction( Gleive, function Trig_DeadlyGlavies_Actions )
    call TriggerAddCondition( Gleive, Condition(function DeadlyGlaviesConditions))
    set Gleive = null
endfunction
Пожалуйста помогите с утечками в этом спелле, не вижу их, хоть глаз выколи.
привел код в читабельный вид. © swdn

Отредактировано ShadoW DaemoN, 14.11.2009 в 21:29.
Старый 12.11.2009, 13:50
Enein
Silenced by ZlaYa1000
offline
Опыт: 43,453
Активность:
для начала приведи код в читабельный вид
Enein добавил:
ну а так я тут заметил локации, слипы, медленные проверки - избався от них
Старый 12.11.2009, 13:59
Doc

offline
Опыт: 63,163
Активность:
Читабельней не получится так уж криво копируется
Дело не в том что спелл тормозит во время применения, а после него
Можешь привести твою версию кода?
Старый 12.11.2009, 14:30
Enein
Silenced by ZlaYa1000
offline
Опыт: 43,453
Активность:
Можешь привести твою версию кода?
приведи код в читабельный вид
Старый 12.11.2009, 14:37
ScorpioT1000
Работаем
offline
Опыт: отключен
замени тупые табуляции нормальными пробелами ну сколько можно повторять, вас в школе не учат?
Старый 12.11.2009, 14:54
Doc

offline
Опыт: 63,163
Активность:
Привел код в читабельный вид. Надеюсь на вашу помощь
Старый 14.11.2009, 20:45
ShadoW DaemoN

offline
Опыт: 37,078
Активность:
В общем-то, я сделал ненужную работу, приведя код в первом посте в читабельный вид. Ведь если просто запостить сюда готовый оптимизированный вариант, то это будет не дело - автор оригинала просто скопирует его к себе и ничему не научится.
Весь плохой код, которые у тебя есть (локации, плохой пик по группе, TriggerSleepAction) легко можно убрать, прочитав вышеуказанную статью.
Старый 14.11.2009, 21:35
Закрытая тема

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы можете скачивать файлы

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 05:31.