Сейчас 16:35:33 Четверг, 28 марта, 2024 год
[ x ] Главная ⇒ Форум ⇐ RSS Файлы Cтатьи Картинки В о й т и   или   з а р е г и с т р и р о в а т ь с я


[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: PUVer, SirNikolas, Ty3uK  
Форум о Warcraft 3 » Раздел для картостроителей » GUI / Jass » [Вопрос] Баг со спеллом (странно)
[Вопрос] Баг со спеллом
Mep3aB4uKДата: Воскресенье, 09 Октября 2011, 10:35:14 | Сообщение # 1
9 уровень
Группа: Проверенные
Сообщений: 1019
Награды: 0
Репутация: 135
Блокировки:
Сделал спелл типа ульт лича(шарик скачет от цели до цели), но по не понятной причине, после того как отдаю приказ(другому дамми) то 1(исполняющий снаряд) останавливается, а движение заданно тригерно.
Code
function Trig_Lich_Conditions takes nothing returns boolean
      return GetSpellAbilityId()=='A001'
endfunction

function FilterGroup takes nothing returns boolean
      return IsUnitEnemy(GetFilterUnit(),GetOwningPlayer(LoadUnitHandle(udg_H,GetHandleId(GetExpiredTimer()),1)))==true and GetFilterUnit()!=LoadUnitHandle(udg_H,GetHandleId(GetExpiredTimer()),2) and IsUnitType(GetFilterUnit(),UNIT_TYPE_FLYING)==false
endfunction

function LichGetMagic takes nothing returns nothing
local timer t=GetExpiredTimer()
local integer id=GetHandleId(t)
local unit u=LoadUnitHandle(udg_H,id,1)
local unit ut=LoadUnitHandle(udg_H,id,2)
local unit dummy=LoadUnitHandle(udg_H,id,3)
local real x2=GetWidgetX(ut)
local real y2=GetWidgetY(ut)
local real x1=GetWidgetX(dummy)
local real y1=GetWidgetY(dummy)
local real a=Atan2(y2-y1,x2-x1)
local group g
local unit e
local unit d
local integer i=LoadInteger(udg_H,id,5)
if DistanceBetweenCoords(x1,y1,x2,y2)<=30 then
set d=CreateUnit(GetOwningPlayer(u),'n000',x1,y1,bj_DEGTORAD)
call UnitApplyTimedLife(d,'BTLF',.3)
call SetUnitAbilityLevel(d,'A000',GetUnitAbilityLevel(u,'A001'))
call IssueTargetOrder(d,"entanglingroots",ut)
set g=CreateGroup()
call GroupEnumUnitsInRange(g,x1,y1,300.,function FilterGroup)
      set e=GroupPickRandomUnit(g)
      if i>0 then
          if e!=null then
              call SaveUnitHandle(udg_H,id,2,e)
              call SaveInteger(udg_H,id,5,i-1)
          else
              call SaveInteger(udg_H,id,5,0)
          endif
      else
      call RemoveUnit(dummy)
      call PauseTimer(t)
      call DestroyTimer(t)
      call FlushChildHashtable(udg_H,id)
      endif
call DestroyGroup(g)
else
      call SetUnitX(dummy,x1+18.*Cos(a))
      call SetUnitY(dummy,y1+18.*Sin(a))      
endif
set t=null
set u=null
set ut=null
set dummy=null
set g=null
set e=null
set d=null
endfunction

function Trig_Lich_Actions takes nothing returns nothing
local timer t=CreateTimer()
local integer id=GetHandleId(t)
local unit u=GetTriggerUnit()
local unit ut=GetSpellTargetUnit()
local unit dummy=CreateUnit(GetOwningPlayer(u),'n001',GetWidgetX(u),GetWidgetY(u),bj_DEGTORAD)
       call SaveUnitHandle(udg_H,id,1,u)
       call SaveUnitHandle(udg_H,id,2,ut)
       call SaveUnitHandle(udg_H,id,3,dummy)
       call SaveTimerHandle(udg_H,id,4,t)
       call SaveInteger(udg_H,id,5,5)
       call TimerStart(t,.03,true,function LichGetMagic)
set t=null
set u=null
set ut=null
set dummy=null
endfunction

//===========================================================================
function InitTrig_Lich takes nothing returns nothing
local trigger Lich=CreateTrigger()
local integer i
      set i=0
      loop
          exitwhen i==11
          call TriggerRegisterPlayerUnitEvent(Lich,Player(i),EVENT_PLAYER_UNIT_SPELL_EFFECT,null)
          set i=i+1
      endloop
      call TriggerAddCondition(Lich,Condition(function Trig_Lich_Conditions))
      call TriggerAddAction(Lich,function Trig_Lich_Actions)
endfunction



Сообщение отредактировал Mep3aB4uK - Воскресенье, 09 Октября 2011, 10:40:51
 

Ty3uKДата: Воскресенье, 09 Октября 2011, 10:42:44 | Сообщение # 2
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
Что не получается? И еще- имхо лучше юзать не дистанцию между координатами, а вычислять длину вектора и проверять ее

Добавлено (09 Октябрь 2011, 10:42:44)
---------------------------------------------
Убери фильтр в local filterfunc - это утечка


╭∩╮(︶︿︶)╭∩╮
"Ульта Тайда мне в жопу!" © k0fe1n
Статьи: MUI-1|MUI-2|Шрифт
Полезности: JASP|JNGP|Уголок библиотек
 

Mep3aB4uKДата: Воскресенье, 09 Октября 2011, 12:15:21 | Сообщение # 3
9 уровень
Группа: Проверенные
Сообщений: 1019
Награды: 0
Репутация: 135
Блокировки:
Quote (Ty3uK)
Что не получается?

Не получается закастовать на юнита магию(шарик который должен прыгать от цели до цели, останавливается), а без магии на цель он прыгает норм.

Добавлено (09 Октябрь 2011, 12:15:21)
---------------------------------------------

Quote (Ty3uK)
И еще- имхо лучше юзать не дистанцию между координатами

в данном случае и координат хватит
 

Ty3uKДата: Воскресенье, 09 Октября 2011, 12:34:32 | Сообщение # 4
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
Ладно, дело твое. Но фильтр убери в локалку- утечка

╭∩╮(︶︿︶)╭∩╮
"Ульта Тайда мне в жопу!" © k0fe1n
Статьи: MUI-1|MUI-2|Шрифт
Полезности: JASP|JNGP|Уголок библиотек
 

lawsonДата: Воскресенье, 09 Октября 2011, 14:27:21 | Сообщение # 5
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
TimedLife там не нужен нову можно кастовать моментально, поэтому после приказа на каст сразу удаляй даммика.
Quote (Mep3aB4uK)
set d=CreateUnit(GetOwningPlayer(u),'n000',x1,y1,bj_DEGTORAD)


Добавлено (09 Октябрь 2011, 14:23:20)
---------------------------------------------
Слушай а период на движение не слишком маленький? Сделай .1 или .2 это уже будет нормально.

Добавлено (09 Октябрь 2011, 14:24:22)
---------------------------------------------

Quote (Mep3aB4uK)
call GroupEnumUnitsInRange(g,x1,y1,300.,function FilterGroup)

ФИльтр пиши не в локалку а сразу в функцию по пику юнитов.

Добавлено (09 Октябрь 2011, 14:27:21)
---------------------------------------------
Хмм тока проснулся в коде ни чего не разобрать, а ты по пробуй задать ему естественное движение (если скорость не слишком большая). Я спел лича так делал (я тогда еще не знал про moving system)


Nic nie wiem bo mam chuj.
редактирую посты! ВСЕ!


Сообщение отредактировал lawson - Воскресенье, 09 Октября 2011, 14:23:31
 

Ty3uKДата: Воскресенье, 09 Октября 2011, 14:46:43 | Сообщение # 6
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
Сразу в функцию, это как? О.о фильтр- это утечка, ее надо уничтожать через call DestroyFilter()

╭∩╮(︶︿︶)╭∩╮
"Ульта Тайда мне в жопу!" © k0fe1n
Статьи: MUI-1|MUI-2|Шрифт
Полезности: JASP|JNGP|Уголок библиотек
 

lawsonДата: Воскресенье, 09 Октября 2011, 14:53:15 | Сообщение # 7
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
Quote (Ty3uK)
Сразу в функцию, это как?

call GroupEnumbUnitsInRange(group, x, y, range, function filter)
Во первых в его случае, здесь пишеться boolexpr ,сразу написаный в функции по пику он не вызывает утечки.


Nic nie wiem bo mam chuj.
редактирую посты! ВСЕ!


Сообщение отредактировал lawson - Воскресенье, 09 Октября 2011, 14:59:41
 

Ty3uKДата: Воскресенье, 09 Октября 2011, 14:54:59 | Сообщение # 8
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
А нельзя, уже сказал- это утечка :)

╭∩╮(︶︿︶)╭∩╮
"Ульта Тайда мне в жопу!" © k0fe1n
Статьи: MUI-1|MUI-2|Шрифт
Полезности: JASP|JNGP|Уголок библиотек
 

lawsonДата: Воскресенье, 09 Октября 2011, 14:56:51 | Сообщение # 9
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
Quote (Ty3uK)
А нельзя, уже сказал- это утечка

Блин дай мне поесть нормально!
В случае когда надо вернуть true false используеться boolexpr ,написаный сразу в функции он не вызывает утечки. Говорили на счет этого, уже.
В данном случае Mep3aB4uK, прав не надо заганять фильтр в перменную и удалять потом.


Nic nie wiem bo mam chuj.
редактирую посты! ВСЕ!


Сообщение отредактировал lawson - Воскресенье, 09 Октября 2011, 15:01:21
 

Ty3uKДата: Воскресенье, 09 Октября 2011, 14:59:20 | Сообщение # 10
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
Приятного аппетита. Ну я в любом случае перестраховываюсь и удаляю все фильтры ^_^

╭∩╮(︶︿︶)╭∩╮
"Ульта Тайда мне в жопу!" © k0fe1n
Статьи: MUI-1|MUI-2|Шрифт
Полезности: JASP|JNGP|Уголок библиотек
 

lawsonДата: Воскресенье, 09 Октября 2011, 15:03:21 | Сообщение # 11
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
Ty3uK, да, когда ты пишешь фильт в локальную переменную то да ее удалять надо на то и Destrou существует, но когда функия фильтра записана сразу в функции пика юнитов то тогда она не вызывает утечки.

Nic nie wiem bo mam chuj.
редактирую посты! ВСЕ!
 

SirNikolasДата: Воскресенье, 30 Октября 2011, 17:28:12 | Сообщение # 12
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
Quote (lawson)
да, когда ты пишешь фильтр в локальную переменную, то да, ее удалять надо, на то и Destroy существует, но когда функция фильтра записана сразу в функции пика юнитов, то тогда она не вызывает утечки.
Бред. Если что-либо требует удаления, то оно требует удаления всегда. В настоящее время еще не пришли к окончательному ответу, обязательно ли нужно уничтожать boolexpr'ы, так что лучше перестраховаться и делать Destroy.


 

Ty3uKДата: Воскресенье, 30 Октября 2011, 17:55:10 | Сообщение # 13
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
Бульэкспры в бж удаляются, если что :)

╭∩╮(︶︿︶)╭∩╮
"Ульта Тайда мне в жопу!" © k0fe1n
Статьи: MUI-1|MUI-2|Шрифт
Полезности: JASP|JNGP|Уголок библиотек
 

Форум о Warcraft 3 » Раздел для картостроителей » GUI / Jass » [Вопрос] Баг со спеллом (странно)
  • Страница 1 из 1
  • 1
Поиск:

Copyright © 2006 - 2024 Warcraft3FT.info При копировании материалов c сайта ставьте, пожалуйста, активную обратную ссылку на нас • Design by gReeB04ki ©
Хостинг от uCoz