Как правильно записывать переменные в хеш? В чём тут ошибка? Первый триггер:
Code
function Bm01 takes nothing returns nothing local timer t = GetExpiredTimer() local integer i = GetHandleId(t) local location Point_spell = LoadLocationHandle(udg_Data,i,1) local destructable Tree = GetEnumDestructable() local location Point_Tree = GetDestructableLoc(Tree) local lightning Line call AddLightningLoc( "DRAM", Point_spell, Point_Tree ) set Line = GetLastCreatedLightningBJ() call SaveLightningHandle(udg_Data,i,2,Line) call SaveDestructableHandle(udg_Data,i,3,Tree) call EnableTrigger( gg_trg_Bm2 ) endfunction
function Trig_Bm1_Actions takes nothing returns nothing local timer t = CreateTimer() local integer i = GetHandleId(t) local unit Hero = GetSpellAbilityUnit() local location Point_spell = GetSpellTargetLoc() call SaveUnitHandle(udg_Data,i,0,Hero) call SaveLocationHandle(udg_Data,i,1,Point_spell) call EnumDestructablesInCircleBJ( 600.00, Point_spell, function Bm01 ) endfunction
Второй триггер:
Code
function Trig_Bm2_Actions takes nothing returns nothing local timer t = GetExpiredTimer() local integer i = GetHandleId(t) local unit Hero = LoadUnitHandle(udg_Data,i,0) local location Point_spell = LoadLocationHandle(udg_Data,i,1) local destructable Tree = LoadDestructableHandle(udg_Data,i,3) local lightning Line = LoadLightningHandle(udg_Data,i,2) if ( RectContainsUnit(RectFromLoc(Point_spell, GetDestructableLoc(Tree)), GroupPickRandomUnit(GetUnitsOfPlayerAll(Player(0)))) == true ) then call UnitDamageTargetBJ( Hero, Hero, 100.00, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_NORMAL ) call DestroyLightningBJ( Line ) call DisableTrigger( gg_trg_Bm2 ) else endif endfunction
Сообщение отредактировал Titans - Пятница, 29 Апреля 2011, 17:45:21
CreateTimer() - а дальше? почему не активируешь его? Где call TimerStart()? А так все правильно записал в хеш. Только есть несколько не нужных перменных типа integer i, да и BJ ну в общем исполнение триггера не очень.
Nic nie wiem bo mam chuj. редактирую посты! ВСЕ!
Сообщение отредактировал lawson - Пятница, 29 Апреля 2011, 21:23:46
CreateTimer() - а дальше? почему не активируешь его? Где call TimerStart()?
Я думал таймер нужен для записи переменной в хеш, но прочитав статью я зашёл в тупик, у меня получилось вот так:
Code
call SaveUnitHandle(udg_Data,GetHandleId(Hero),0,Hero) local unit Hero = LoadUnitHandle(udg_Data,GetHandleId(Hero),0)
И когда триггер пытается присвоить переменную из хеша, то это вызывает ошибку, типо необъявлена переменая "Hero" в этом куске "GetHandleId(Hero)". И что делать?
Quote (DragoN)
что за ужасы?
Что вы имели ввиду? (BJ?)
Quote (lawson)
да и BJ
Quote (FkoFF)
много бж функций
Что такое BJ(Blizzard Jass) и чем отличаются к примеру такие действия?
Code
set Line = GetLastCreatedLightningBJ() set Line = GetLastCreatedLightning()
Сообщение отредактировал Titans - Суббота, 30 Апреля 2011, 12:26:43
И когда триггер пытается присвоить переменную из хеша, то это вызывает ошибку, типо необъявлена переменая "Hero" в этом куске "GetHandleId(Hero)". И что делать?
Ты пытаешься сначала добавить переменную Hero в хеш а потом объявляешь ее надо наоборот сначала объявить переменную а потом добавлять ее в хеш. Вот тебе триггер пример. local timer t = CreateTrimer() local unit u = GetTriggerUnit() call TimerStart(t, 2, false, function TimerFunction) call SaveUnitHandle(hash, GetHandleId(t), 0, u) set t = null set u = null Функция TimerFunction должна стоять выше функциии где создаеться таймер или в нестандартном коде. Вот так и создаеться таймер и записываються в хеш переменные.
Я не знаю как точно это объяснить, BJ - это функции которые перед действием исполняют еще ряд функция которые в них прописаны, и их не желательно использовать так как большинство из них вызывают утечки а большинство вообще бесмысленные типа твоего GetLastCreatedLightningBJ(). Я примерно объяснил.
Добавлено (30-04-2011, 13:36) --------------------------------------------- Вообще не читай статьи учись по примерам, скачай наработку Dreii по воскрешению героев там хорошо показано как использовать хеш в таймерах.
Nic nie wiem bo mam chuj. редактирую посты! ВСЕ!
Сообщение отредактировал lawson - Суббота, 30 Апреля 2011, 13:39:05
lawson а если мне не нужен таймер, то обязательно его создавать? Ну создал я таймер и всё равно не хочет он загружать переменные из хеша, в игре ноль эмоций.
Сообщение отредактировал Titans - Суббота, 30 Апреля 2011, 14:04:55
SirNikolas, способность которая создаёт линии от находящихся поблизости деревьев в указанною точку и при прохождении через эти линии наносился урон проходящему. Это всё я зделал, я хотел заменить глобалки на локалки и воспользовался для этого хешем, а он не хочет сохранять переменные или загружать.
Сообщение отредактировал Titans - Суббота, 30 Апреля 2011, 14:54:48
А как мне перенести перемнные через хеш в другой триггер? Я остановился на таком варианте: Первый триггер
Code
function Bm01 takes nothing returns nothing local unit Hero = GetSpellAbilityUnit() local location Point_spell = GetSpellTargetLoc() local destructable Tree = GetEnumDestructable() local lightning Line call AddLightningLoc( "DRAM", Point_spell, GetDestructableLoc(Tree) ) set Line = GetLastCreatedLightningBJ() call SaveUnitHandle(udg_Data,GetHandleId(Hero),0,Hero) call SaveLocationHandle(udg_Data,GetHandleId(Point_spell),1,Point_spell) call SaveLightningHandle(udg_Data,GetHandleId(Line),2,Line) call SaveDestructableHandle(udg_Data,GetHandleId(Tree),3,Tree) call EnableTrigger( gg_trg_Bm2 ) set Hero = null set Point_spell = null set Tree = null set Line = null endfunction
function Trig_Bm1_Actions takes nothing returns nothing call EnumDestructablesInCircleBJ( 600.00, GetSpellTargetLoc(), function Bm01 ) endfunction
Второй триггер
Code
function Trig_Bm2_Actions takes nothing returns nothing local unit Hero = local location Point_spell = local destructable Tree = local lightning Line = call UnitDamageTargetBJ( Hero, Hero, 100.00, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_NORMAL ) if ( RectContainsUnit(RectFromLoc(Point_spell, GetDestructableLoc(Tree)), GroupPickRandomUnit(GetUnitsOfPlayerAll(Player(0)))) == true ) then call UnitDamageTargetBJ( Hero, Hero, 100.00, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_NORMAL ) call DestroyLightningBJ( Line ) call DisableTrigger( gg_trg_Bm2 ) else endif set Hero = null set Point_spell = null set Tree = null set Line = null endfunction
Сообщение отредактировал Titans - Суббота, 30 Апреля 2011, 19:00:36
Есть задержка между запусками триггеров? Если нет, то используй глобальные переменные. Если есть, то скачай JassCraft и набери в function list "Load". Там будет целый список функций с указанием принимаемых аргументов. Сохранять значения нужно с помощью пяти указанных выше функций (все, что не является boolean, integer, real и string, прогоняем через SaveAgentHandle), загружать - с помощью найденных тобой. Потом нужно еще сделать FlushChildHashtable, чтобы очистить хэш.
И зачем? Если я так зделаю то в результате получю, что если создалось 2-е и больше линий то при вхождении на 1-ю линию урон нанесётся и она исчезнет, а вот при вхождении на 2-ю линию нечего не будет происходить.