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

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

Ответ
 
tgonta
Pixelated Sora Coder
offline
Опыт: 3,160
Активность:
Помогите настроить свой MUI-спелл
Снова здравствуйте. У меня теперь другая проблема.
Я несколькими юнитами сразу кастую спелл, код которого ниже.
Результат проверки хендлов на DEAD URL.
В чём может быть проблема и как её исправить?

Код:
function Trig_SandStorm_Conditions takes nothing returns boolean
     return GetSpellAbilityId() == 'A000'
endfunction

function SandStormEffectRemove takes nothing returns nothing
     local timer t = GetExpiredTimer()
     local timer t2 = LoadTimerHandle(udg_SandHeroHashtable,GetHandleId(t),3)
     local effect e = LoadEffectHandle(udg_SandHeroHashtable,GetHandleId(t),1)
     local unit caster = LoadUnitHandle(udg_SandHeroHashtable,GetHandleId(t),2)
     set udg_SandStormEnded[GetPlayerId(GetOwningPlayer(caster))] = true
     call BJDebugMsg("Unit Name: " + GetUnitName(caster))
     call BJDebugMsg("Unit Owner ID: " + I2S(GetPlayerId(GetOwningPlayer(caster))))
     call BJDebugMsg("Expired Timer Handle: " + I2S(GetHandleId(t)))
     call UnitRemoveAbility(caster,'A001')
     call UnitAddAbility(caster,'A000')
     call DestroyEffect(e)
     call PauseTimer(t2)
     call DestroyTimer(t)
     call DestroyTimer(t2)
     set e = null
     set t = null
endfunction

function SandStormGroupFilter takes nothing returns boolean
     local unit u = LoadUnitHandle(udg_SandHeroHashtable,GetHandleId(GetExpiredTimer()),2)
     local unit e = GetFilterUnit()
     if IsUnitEnemy(e,GetOwningPlayer(u)) then
         call UnitDamageTarget(u,e,50,true,false,ATTACK_TYPE_NORMAL,DAMAGE_TYPE_NORMAL,WEAPON_  TYPE_WHOKNOWS)
     endif
     set u = null
     set e = null
     return false
endfunction

function SandStormSpellRepeat takes nothing returns nothing
     local timer t = GetExpiredTimer()
     local unit caster = LoadUnitHandle(udg_SandHeroHashtable,GetHandleId(t),2)
     local group g = CreateGroup()
     call GroupEnumUnitsInRange(g,GetUnitX(caster),GetUnitY(caster),200,Filter(function SandStormGroupFilter))
     set g = null
     set t = null
     set caster = null
endfunction

function Trig_SandStorm_Actions takes nothing returns nothing
     local unit caster = GetSpellAbilityUnit()
     local effect e = AddSpecialEffectTarget("war3mapImported\\SandTornado.mdx",caster,"origin")
     local integer id = GetPlayerId(GetOwningPlayer(caster))
     local timer array st
     local timer array et
     set st[id] = CreateTimer() // Spell Timer
     set et[id] = CreateTimer() // Effect Timer
     set udg_SandHeroHashtable = InitHashtable()
     call SaveEffectHandle(udg_SandHeroHashtable,GetHandleId(et[id]),1,e)
     call SaveUnitHandle(udg_SandHeroHashtable,GetHandleId(st[id]),2,caster)
     call SaveUnitHandle(udg_SandHeroHashtable,GetHandleId(et[id]),2,caster)
     set udg_SandStormEnded[GetPlayerId(GetOwningPlayer(caster))] = false
     call TimerStart(st[id],1,true,function SandStormSpellRepeat)
     call TimerStart(et[id],udg_SandStormDur[GetUnitAbilityLevel(caster,'A000')],false,function SandStormEffectRemove)
     call BJDebugMsg("Source Timer Handle: " + I2S(GetHandleId(et[id])))
     call BJDebugMsg("Started an Effect timer with duration: " + I2S(udg_SandStormDur[GetUnitAbilityLevel(caster,'A000')]))
     call SaveTimerHandle(udg_SandHeroHashtable,GetHandleId(et[id]),3,st[id])
     call UnitRemoveAbility(caster,'A000')
     call UnitAddAbility(caster,'A001')
     set et[id] = null
     set caster = null
     set st[id] = null
     set e = null
endfunction

//===========================================================================
function InitTrig_SandStorm takes nothing returns nothing
     set gg_trg_SandStorm = CreateTrigger()
     call TriggerRegisterAnyUnitEventBJ(gg_trg_SandStorm,EVENT_PLAYER_UNIT_SPELL_EFFECT)
     call TriggerAddCondition(gg_trg_SandStorm,Condition(function Trig_SandStorm_Conditions))
     call TriggerAddAction(gg_trg_SandStorm,function Trig_SandStorm_Actions)
endfunction
Старый 17.03.2010, 20:36
AlexKARASb
Learning cpp
offline
Опыт: 22,103
Активность:
tgonta, зачем вам создавать массив таймеров?
лок таймер обычный сделайте, лок. переменные для каждой ф-ции свои
Старый 17.03.2010, 20:43
tgonta
Pixelated Sora Coder
offline
Опыт: 3,160
Активность:
AlexKARASb,
Я пробовал с обычным лок. таймером, в том-то и дело, что результат что так что так один и тот же...
Цитата:
Сообщение от AlexKARASb
лок. переменные для каждой ф-ции свои

Поподробнее.
Старый 17.03.2010, 20:44
AlexKARASb
Learning cpp
offline
Опыт: 22,103
Активность:
Код:
local timer array st
local timer array et
set st[id] = CreateTimer() // Spell Timer
set et[id] = CreateTimer() // Effect Timer

заменить на
local timer st= CreateTimer()
local timer et= CreateTimer()

главное в МУИ ведь разные переменные, у вас они заключены в хеше, хеш у всех разный соответственно не нужны вам массивы таймеров

пару минут перепишу вам поподробнее
Старый 17.03.2010, 20:48
tgonta
Pixelated Sora Coder
offline
Опыт: 3,160
Активность:
Я переписал на локалтаймер без массива. И снова так же при одновременном касте.
Старый 17.03.2010, 20:54
AlexKARASb
Learning cpp
offline
Опыт: 22,103
Активность:
вот попробуйте
» раскрыть
Код:
function SandStormEffectRemove takes nothing returns nothing
     local timer t = GetExpiredTimer()
     local timer t2=LoadTimerHandle(udg_SandHeroHashtable,GetHandleId(t),3) 
     local effect e = LoadEffectHandle(udg_SandHeroHashtable,GetHandleId(t),1)
     local unit caster = LoadUnitHandle(udg_SandHeroHashtable,GetHandleId(t),2)
     set udg_SandStormEnded[GetPlayerId(GetOwningPlayer(caster))] = true
     call PauseTimer(t2)
     call UnitRemoveAbility(caster,'A001')
     call UnitAddAbility(caster,'A000')
     call DestroyEffect(e)
     call DestroyTimer(t)
     call DestroyTimer(t2)
     set e = null
     set t = null
     set t2=null
endfunction

function Trig_SandStorm_Actions takes nothing returns nothing
     local unit caster = GetSpellAbilityUnit()
     local effect e = AddSpecialEffectTarget("war3mapImported\\SandTornado.mdx",caster,"origin")
     local integer id = GetPlayerId(GetOwningPlayer(caster))
     local timer st=CreateTimer()
    local timer et=CreateTimer() 
     set udg_SandHeroHashtable=InitHashtable() 
     call SaveEffectHandle(udg_SandHeroHashtable,GetHandleId(et),1,e)
     call SaveUnitHandle(udg_SandHeroHashtable,GetHandleId(et),2,caster)
     call SaveTimerHandle(udg_SandHeroHashtable,GetHandleId(et),3,st)
     
     call SaveUnitHandle(udg_SandHeroHashtable,GetHandleId(st),2,caster)
     set udg_SandStormEnded[id] = false
     call TimerStart(st,1,true,function SandStormSpellRepeat)
     call TimerStart(et,udg_SandStormDur[GetUnitAbilityLevel(caster,'A000')],false,function SandStormEffectRemove)
     call UnitRemoveAbility(caster,'A000')
     call UnitAddAbility(caster,'A001')
     set et = null
     set caster = null
     set st = null
     set e = null
endfunction

сдесь я исправил только 2 потому что остальные ф-ции не нуждаются в исправлении

+если не выйдет, то вам еще помогут более опытные пользователи
Старый 17.03.2010, 20:58
tgonta
Pixelated Sora Coder
offline
Опыт: 3,160
Активность:
Не прокатило -_- Всё так же...
Старый 17.03.2010, 21:01
AlexKARASb
Learning cpp
offline
Опыт: 22,103
Активность:
вопрос теперь уже от меня =)
Код:
function SandStormGroupFilter takes nothing returns boolean
     local unit u = LoadUnitHandle(udg_SandHeroHashtable,GetHandleId(GetExpiredTimer()),2)

разве так можно ставить парент ключ?, ну то-есть GetHandleId(GetExpiredTimer()) это ж вроде бы не таймер, а фильтр; или же я ошибаюсь
Старый 17.03.2010, 21:04
tgonta
Pixelated Sora Coder
offline
Опыт: 3,160
Активность:
AlexKARASb,
Фильтр можно использовать как форгруп, но оно исправно пашет.
Старый 17.03.2010, 21:13
AlexKARASb
Learning cpp
offline
Опыт: 22,103
Активность:
» раскрыть
Код:
function SandStormGroupFilter takes nothing returns boolean
     local unit u = LoadUnitHandle(udg_SandHeroHashtable,GetHandleId(GetExpiredTimer()),2)
     local unit e = GetFilterUnit()
     if IsUnitEnemy(e,GetOwningPlayer(u)) then
         call UnitDamageTarget(u,e,50,true,false,ATTACK_TYPE_NORMAL,DAMAGE_TYPE_NORMAL,WEAPON_    TYPE_WHOKNOWS)
     endif
     set u = null
     set e = null
     return false
endfunction

попробуйте вернуть значение unit'a u перед манипуляциями; тоесть перед ифЮнитВраг поставить call BJDebugMsg("Unit Name: " + GetUnitName(u))
просто очень сомнительна эта связка при фильтре гетэксптаймер
Старый 17.03.2010, 21:32
tgonta
Pixelated Sora Coder
offline
Опыт: 3,160
Активность:
AlexKARASb,
Но оно дамажит... о_О
Хоть при из юнит враг ничего не возвращается в имени.
Старый 17.03.2010, 21:36
DioD

offline
Опыт: 45,134
Активность:
хеш таблицы нельзя создавать каждый раз, они должны быть в единственном числе и одна на всю карту.
Старый 17.03.2010, 22:21
AlexKARASb
Learning cpp
offline
Опыт: 22,103
Активность:
tgonta,
if udg_SandHeroHashtable == null then
set udg_SandHeroHashtable = InitHashtable()
endif
вместо просто инита
то что сказал диод =)
Старый 17.03.2010, 22:28
tgonta
Pixelated Sora Coder
offline
Опыт: 3,160
Активность:
DioD, AlexKARASb,
Спасибо, подействовало!

tgonta добавил:
function SandStormGroupFilter takes nothing returns boolean
local unit u = LoadUnitHandle(udg_SandHeroHashtable,GetHandleId(GetExpiredTimer()),2)

хех... юнит не вытаскивается =( Как его правильно залоадать?
Старый 17.03.2010, 23:01
XOR

offline
Опыт: 38,159
Активность:
а ты хэш инициализировал, записывал юнита?
Старый 17.03.2010, 23:04
tgonta
Pixelated Sora Coder
offline
Опыт: 3,160
Активность:
XimikS,
Да. Записывал. Но экспайред таймер походу в фильтер-функциях не ловит :{

tgonta добавил:
Тему закройте, всё ловится, это я туплю.
Старый 17.03.2010, 23:24
AlexKARASb
Learning cpp
offline
Опыт: 22,103
Активность:
tgonta,
как вариант глобалка юнит массив, присваиваеш в actions ей значение кастера с [id] то-есть для каждого плеера свое

globals
unit array U
endglobals

function Trig_SandStorm_Actions takes nothing returns nothing
local unit caster = GetSpellAbilityUnit()
set U[id]=caster

и потом используй
но это как вариант
Мне тоже интересно как из хеша загрузить в фильтр юнита
Старый 17.03.2010, 23:24
tgonta
Pixelated Sora Coder
offline
Опыт: 3,160
Активность:
AlexKARASb,
Всё грузится через экспиредтаймер, там ловица реакция на событие :)
Старый 17.03.2010, 23:42
Mr_ILYAS
Kicked by XimikS
offline
Опыт: 492
Активность:
Diod +1
одна глобальная хеш таблица и всё
главное чистить категорию после завершения скила или чего-либо
call FlushChildHashtable(udg_Hash,имя категории)
Старый 17.03.2010, 23:58
Ответ

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

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

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

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



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