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

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

Закрытая тема
 
Velociraptor
В пространстве и времени
offline
Опыт: 14,801
Активность:
Где накосячил в коде?
Врубаю триг - после сохранения карты в редакторе она не запускается. Вырубаю - после сохранения всё ок. Собственно что не так, уже полчаса бьюсь? Подозреваю, что где-то затупил с хэш-таблицами, но че-то не вижу, где ( башка вообще уже плохо варит после стольких обработанных в джасс тригов
Это, собственно, последний вариант, в нём уже вторую хэш-таблицу подключил в попытках заставить триг работать
Спелл дефолтный сайленс на время на основе пламени обречённости, триг делает "добавку" - с периодичностью раз в секунду лечит цель

Код:
function Trig_Euphoria_JASS_Conditions takes nothing returns boolean
    if ( not ( GetSpellAbilityId() == 'A0X9' ) ) then
        return false
    endif
    return true
endfunction

function EuphoriaTicks takes nothing returns nothing
local timer t=GetExpiredTimer()
local unit u=LoadUnitHandle(udg_Hash,GetHandleId(t),2)
local unit u2=LoadUnitHandle(udg_Hash2,GetHandleId(t2),4)
local integer i=LoadInteger(udg_Hash,GetHandleId(t),3)
set udg_unit = u
set udg_unit2 = u2
set i=i+1
call SaveInteger(udg_Hash,GetHandleId(t),3,i)
if(i<8)then
call SetUnitLifeBJ( udg_unit, ( GetUnitStateSwap(UNIT_STATE_LIFE, udg_unit) + ( 20.00 * I2R(GetUnitAbilityLevelSwapped('A0X9', udg_unit2 )) ) ) )
else
call DestroyTimer(t)
call FlushChildHashtable(udg_Hash,GetHandleId(t)) 
call FlushChildHashtable(udg_Hash2,GetHandleId(t2))
endif
set t=null
set u=null
set u2=null
endfunction

function Trig_Euphoria_JASS_Actions takes nothing returns nothing
local timer t = CreateTimer()
local unit u = GetSpellTargetUnit()
local unit u2 = GetTriggerUnit()
local integer i=0
call SaveUnitHandle(udg_Hash,GetHandleId(t),2,u)
call SaveUnitHandle(udg_Hash2,GetHandleId(t2),4,u2)
call SaveInteger(udg_Hash,GetHandleId(t),3,i)
call TimerStart(t,1,true,function EuphoriaTicks)
set t=null
set u=null
set u2=null
endfunction


//===========================================================================
function InitTrig_Euphoria_JASS takes nothing returns nothing
    set gg_trg_Euphoria_JASS = CreateTrigger(  )
    set udg_Hash=InitHashtable()
    set udg_Hash2=InitHashtable()
    call TriggerRegisterAnyUnitEventBJ( gg_trg_Euphoria_JASS, EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddCondition( gg_trg_Euphoria_JASS, Condition( function Trig_Euphoria_JASS_Conditions ) )
    call TriggerAddAction( gg_trg_Euphoria_JASS, function Trig_Euphoria_JASS_Actions )
endfunction
Старый 01.10.2011, 16:05
Praudmur
в поисках идей...
offline
Опыт: 3,604
Активность:
call TriggerAddCondition( gg_trg_Euphoria_JASS, Condition( function Trig_Euphoria_JASS_Conditions ) )
инициируй таблицы в отдельном триггере при старте карты
насчёт оптимизации - юзай не SetUnitLifeBJ, a SetUnitState
Старый 01.10.2011, 16:12
Velociraptor
В пространстве и времени
offline
Опыт: 14,801
Активность:
Praudmur, ок, спс, но я не про оптимизацию сейчас, а про то, чтобы триг вообще работал
Старый 01.10.2011, 16:15
Praudmur
в поисках идей...
offline
Опыт: 3,604
Активность:
И кстати я не заметил нигде локалки t2
call FlushChildHashtable(udg_Hash2,GetHandleId(t2))
Praudmur добавил:
Ещё косяк - ты удаляешь таймер, а потом ссылаешься на него
(P.S. вроде это косяк ^_^)
call DestroyTimer(t)
call FlushChildHashtable(udg_Hash,GetHandleId(t))
Praudmur добавил:
И всё-таки поработай над оптимизацией - не все локалки обнуляешь
Старый 01.10.2011, 16:20
Velociraptor
В пространстве и времени
offline
Опыт: 14,801
Активность:
Цитата:
Сообщение от Praudmur
И всё-таки поработай над оптимизацией - не все локалки обнуляешь

А какие не обнуляю? Целочисленную же вроде обнулять и не надо, нет? А юнитов и таймер исправно разрушаю.

В остальном спс - пофиксил, код работает.
Старый 01.10.2011, 16:27
Амбидекстрия
Silenced by ScorpioT1000
offline
Опыт: 8,237
Активность:
Velociraptor:
call SaveUnitHandle(udg_Hash2,GetHandleId(t2),4,u2)
Velociraptor:
call FlushChildHashtable(udg_Hash2,GetHandleId(t2))
Velociraptor:
local unit u2=LoadUnitHandle(udg_Hash2,GetHandleId(t2),4)
кстати да, что за неведомая переменная t2?
Старый 01.10.2011, 16:30
Praudmur
в поисках идей...
offline
Опыт: 3,604
Активность:
я целочисленные обнуляю, хотя на 100% и не уверен, надо ли. Но думаю, что надо, хотя это и не так критично
Старый 01.10.2011, 16:30
Амбидекстрия
Silenced by ScorpioT1000
offline
Опыт: 8,237
Активность:
оп неуспел обновить страницу...
Старый 01.10.2011, 16:30
Nerevar
I'll be back!
offline
Опыт: 18,352
Активность:
Думаю так лучше будет
function Trig_Euphoria_JASS_Conditions takes nothing returns boolean
return  GetSpellAbilityId() == 'A0X9'
endfunction

function EuphoriaTicks takes nothing returns nothing
local timer t=GetExpiredTimer()
local unit u=LoadUnitHandle(udg_Hash,GetHandleId(t),0)
local unit u2=LoadUnitHandle(udg_Hash2,GetHandleId(t),1)
call SaveInteger(udg_Hash,GetHandleId(t),2,LoadInteger(udg_Hash,GetHandleId(t),2)+1)
if i<8 then
call SetUnitState(u,UNIT_STATE_LIFE, GetUnitState(u,UNIT_STATE_LIFE) + 20.*GetUnitAbilityLevel('A0X9', u))//и проверял ты уровень абилы у цели каста,хотя должен у кастера
else
call PauseTimer(t)//т.к. таймер периодический,его сначала надо остановить
call FlushChildHashtable(udg_Hash,GetHandleId(t)) 
call DestroyTimer(t)
endif
set t=null
set u=null
set u2=null
endfunction

function Trig_Euphoria_JASS_Actions takes nothing returns nothing
local timer t = CreateTimer()
local unit u = GetSpellTargetUnit()
local unit u2 = GetTriggerUnit()
call SaveUnitHandle(udg_Hash,GetHandleId(t),0,u)
call SaveUnitHandle(udg_Hash2,GetHandleId(t),1,u2)//откуда взялось т2 непонятно
call SaveInteger(udg_Hash,GetHandleId(t),2,0)//что мешает напрямую сохранять?
call TimerStart(t,1,true,function EuphoriaTicks)
set t=null
set u=null
set u2=null
endfunction


//===========================================================================
function InitTrig_Euphoria_JASS takes nothing returns nothing
    set gg_trg_Euphoria_JASS = CreateTrigger(  )
    set udg_Hash=InitHashtable()
    call TriggerRegisterAnyUnitEventBJ( gg_trg_Euphoria_JASS, EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddCondition( gg_trg_Euphoria_JASS, Condition( function Trig_Euphoria_JASS_Conditions ) )
    call TriggerAddAction( gg_trg_Euphoria_JASS, function Trig_Euphoria_JASS_Actions )
endfunction
Старый 01.10.2011, 16:37
The Requiem

offline
Опыт: 2,766
Активность:
А почему бы еще триггер не сделать локальным?
Старый 01.10.2011, 16:39
Velociraptor
В пространстве и времени
offline
Опыт: 14,801
Активность:
Praudmur, я вроде где-то читал, что целочисленные обнулять не надо. Хотелось бы окончательно прояснить этот вопрос и тему можно крыть. Код уже работает, проблема была в "t2".
Ну и таймера сейчас поставлю паузу перед разрушением (а если не поставить, в чём разница? Но от меня не убудет - поставлю)
Старый 01.10.2011, 16:41
16GB
GhostOne User
offline
Опыт: 60,317
Активность:
во первых смысл 2-ой хэш таблицы вообще.
вот
» fast code

function Trig_Euphoria_JASS_Conditions takes nothing returns boolean
return GetSpellAbilityId() == 'A0X9'
endfunction

function EuphoriaTicks takes nothing returns nothing
local timer t=GetExpiredTimer()
local integer id = GetHandleId(t)
local unit u=LoadUnitHandle(udg_Hash,id,2)
local unit u2=LoadUnitHandle(udg_Hash,id,4)
local integer i=LoadInteger(udg_Hash,id,3)+1
call SaveInteger(udg_Hash,id,3,i)
if(i<8)then
call SetUnitState(u,UNIT_STATE_LIFE,GetUnitState(u,UNIT_STATE_LIFE)+20.* GetUnitAbilityLevel(u2,'A0X9'))
else
call DestroyTimer(t)
call FlushChildHashtable(udg_Hash,id) 
endif
set t=null
set u=null
set u2=null
endfunction

function Trig_Euphoria_JASS_Actions takes nothing returns nothing
local timer t = CreateTimer()
local integer id = GetHandleId(t)
local unit u = GetSpellTargetUnit()
local unit u2 = GetTriggerUnit()
call SaveUnitHandle(udg_Hash,id,2,u)
call SaveUnitHandle(udg_Hash,id,4,u2)
call TimerStart(t,1,true,function EuphoriaTicks)
set t=null
set u=null
set u2=null
endfunction
Старый 01.10.2011, 16:45
Velociraptor
В пространстве и времени
offline
Опыт: 14,801
Активность:
16GB, я вторую поставил, когда не смог разобраться с одной, а так, согласен, не нужна
Сейчас уже обратно переделывать мало смысла
Лучше про целочисленные скажи - нужно их, по-твоему, обнулять?
Старый 01.10.2011, 16:48
16GB
GhostOne User
offline
Опыт: 60,317
Активность:
нет конечно
курите статью J, об утечках
Старый 01.10.2011, 16:49
Velociraptor
В пространстве и времени
offline
Опыт: 14,801
Активность:
16GB, ок, ну вот там я мб тогда и прочёл
значит, тему можно крыть

Velociraptor добавил:
Nerevar

Цитата:
и проверял ты уровень абилы у цели каста


Нет, там всё норм - только что протестировал спелл
Я вообще всё, что сделал в изначальном коде - заменил t2 на t и на всякий пожарный перед уничтожением таймера впихнул его паузу
Старый 01.10.2011, 17:02
Закрытая тема

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

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

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

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



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