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

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

Закрытая тема
 
4go10_frank

offline
Опыт: 2,089
Активность:
Где ошибка?
Каждые 0.1 секунды код должен выбирать всех юнитов у которых есть такой то предмет и создавать в том месте где они находятся спецэффект, а через 2 секунды этот эффект должен удаляться. Но так как руки у меня кривые и в джасе я лол то эффект остается до конца игры

Кто шарит в джасе? исправьте чтоб работало плиз

Код:
function Trig_Engine_Copy_Func001001002001 takes nothing returns boolean
    return ( UnitHasItemOfTypeBJ(GetFilterUnit(), 'I008') == true )
endfunction

function Trig_Engine_Copy_Func001001002002 takes nothing returns boolean
    return ( IsUnitAliveBJ(GetFilterUnit()) == true )
endfunction

function Trig_Engine_Copy_Func001001002 takes nothing returns boolean
    return GetBooleanAnd( Trig_Engine_Copy_Func001001002001(), Trig_Engine_Copy_Func001001002002() )
endfunction

function Firing takes location n returns nothing
    local effect e
    local integer a
    call AddSpecialEffectLocBJ( n, "Abilities\\Spells\\Undead\\PlagueCloud\\PlagueCloudCaster.mdl" )
    set e = (GetLastCreatedEffectBJ())
    call TriggerSleepAction( 2.00 )
    call DestroyEffectBJ( e )
endfunction

function Trig_Engine_Copy_Func001A takes nothing returns nothing
    local location pos = (GetUnitLoc(GetEnumUnit()))
    call Firing(pos)
    set pos = null
endfunction

function Trig_Engine_Copy_Actions takes nothing returns nothing
    call ForGroupBJ( GetUnitsInRectMatching(GetPlayableMapRect(), Condition(function Trig_Engine_Copy_Func001001002)), function Trig_Engine_Copy_Func001A )
endfunction

//===========================================================================
function InitTrig_Engine_Copy takes nothing returns nothing
    set gg_trg_Engine_Copy = CreateTrigger(  )
    call TriggerRegisterTimerEventPeriodic( gg_trg_Engine_Copy, 0.10 )
    call TriggerAddAction( gg_trg_Engine_Copy, function Trig_Engine_Copy_Actions )
endfunction

Отредактировано DFlyer, 11.05.2008 в 16:42.
Старый 11.05.2008, 16:28
J
expert
offline
Опыт: 48,447
Активность:
Код:
function Engine_Filter takes nothing returns nothing
    local unit u = GetFilterUnit()
    if (GetInventoryIndexOfItemTypeBJ(u, 'I008') > 0) and (GetUnitState(u, UNIT_STATE_LIFE) > 0) then
        call DestroyEffect(AddSpecialEffect("Abilities\\Spells\\Undead\\PlagueCloud\\PlagueCloudCaster.mdl", GetUnitX(u), GetUnitY(u)))
    endif
    set u = null
endfunction

function Engine_Actions takes nothing returns nothing
    local group g = CreateGroup()
    call GroupEnumUnitsInRect(g, bj_mapInitialPlayableArea, Condition(function Engine_Filter))
    call DestroyGroup()
    set g = null
endfunction

function InitTrig_Engine_Copy takes nothing returns nothing
    set gg_trg_Engine_Copy = CreateTrigger()
    call TriggerRegisterTimerEvent(gg_trg_Engine_Copy, 0.1, true)
    call TriggerAddAction(gg_trg_Engine_Copy, function Engine_Actions)
endfunction


Jon добавил:
хотя на подобное создание и удаление эффектов каждый эффект реагирует поразному, скажи если будет не так работать, добаволю таймер

Отредактировано Jon, 12.05.2008 в 09:02.
Старый 12.05.2008, 08:29
ShadoW DaemoN

offline
Опыт: 37,078
Активность:
Jon, проблема в том, что если этот эффект (зеленого облака) удалять сразу при создании, то его не будет видно (по крайней мере, у меня на макс. настройках так и есть).
Как один из возможных вариантов (но не лучший) - создавать дамми и аттачить на него эффект:
Код:
globals
    group    gr = CreateGroup()
    boolexpr bx = null
endglobals

function Engine_Filter takes nothing returns boolean
    local unit u = GetFilterUnit()
    local unit d = null
    if GetInventoryIndexOfItemTypeBJ(u, 'I008') > 0 and GetWidgetLife(u) > .405 then
        set d = CreateUnit(GetOwningPlayer(u), 'e000', GetUnitX(u), GetUnitY(u), 0) // dummy-unit
        call UnitApplyTimedLife(d, 0, .01)
        call AddSpecialEffectTarget("Abilities\\Spells\\Undead\\PlagueCloud\\PlagueCloudCaster.mdl", d, "chest")
        set d = null
    endif
    set u = null
    return false
endfunction

function Engine_Actions takes nothing returns nothing
    call GroupEnumUnitsInRect(gr, bj_mapInitialPlayableArea, bx)
endfunction

function InitTrig_Engine_Copy takes nothing returns nothing
    local timer t = CreateTimer()
    set bx = Condition(Engine_Filter)
    call TimerStart(t, .1, true, function Engine_Actions)
    set t = null
endfunction

По-хорошему здесь лучше добавить к предмету пустую способность с визуальным эффектом-"шлейфом".
Старый 12.05.2008, 08:58
4go10_frank

offline
Опыт: 2,089
Активность:
А я потом попробовал создавать не даммика а сразу юнита с моделькой спецэффекта и применять к нему ApplyLifeTimer на 2 секунды. Но даже если в конце функции дописывать RemoveUnit и RemoveLocation то через 5 минут все равно будет затруднительно дотянуться до кнопки "Меню". Наверное команда ApplyLifeTimer создает свою переменную, но как ее удалить я не знаю. Помогите разобраться, Джассеры, если такие еще не перевелись :)

ShadoW DaemoN, спасибо, я так и сделал (к предмету добавил способность)
Старый 12.05.2008, 15:40
ShadoW DaemoN

offline
Опыт: 37,078
Активность:
4go10_frank, чтобы юнит удалялся быстрее методом UnitApplyTimedLife, необходимо поставить ему тип - "Не разлагается". Тогда каждый юнит будет находиться в памяти 5 сек (2 сек лайфтайм + 3 сек служебное). И еще - при использовании этой функции применять RemoveUnit не нужно.

Большинство переменных handle-типа (юниты, точки, таймеры, etc.) следует обнулять после необходимых действий. То есть:
Код:
// выделяем переменные под хранение дескрипторов
local unit     u = GetSpellAbilityUnit() // функция возвращает ссылку на юнит
local location l = GetSpellTargetLoc()   // функция возвращает ссылку на точку и создает ее копию
// ...
// удаляем точку, т.к. в дальнейшем (если не удалим) она останется в памяти
call RemoveLocation(l)
// очищаем переменные
set l = null
set u = null
Старый 12.05.2008, 16:55
4go10_frank

offline
Опыт: 2,089
Активность:
Большое спасибо :) вроде разобрался во всём, JASS действительно рулез. Думаю тему можно закрывать.
Старый 12.05.2008, 18:32
Закрытая тема

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

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

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

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



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