|
|
|
|
[Вопрос] Баг со спеллом
|
|
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 - это утечка
|
|
|
|
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
Блокировки:
| Ладно, дело твое. Но фильтр убери в локалку- утечка
|
|
|
|
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()
|
|
|
|
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
Блокировки:
| А нельзя, уже сказал- это утечка
|
|
|
|
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
Блокировки:
| Приятного аппетита. Ну я в любом случае перестраховываюсь и удаляю все фильтры
|
|
|
|
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
Блокировки:
| Бульэкспры в бж удаляются, если что
|
|
|
|
|
|
|
|
|
|
|