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

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

Ответ
 
Kenshi245

offline
Опыт: 2,252
Активность:
Скилл массовой атаки, при первом юзании жесткий лаг.
Старый 11.04.2008, 21:54
adic3x

offline
Опыт: 108,439
Активность:
насколько я помню теже близы после прелоода добавляют фцию прелоадЕнд
Старый 12.04.2008, 10:09
Kenshi245

offline
Опыт: 2,252
Активность:
native PreloadEnd takes real timeout returns nothing
тока что они делает не понятно
Старый 12.04.2008, 11:38
adic3x

offline
Опыт: 108,439
Активность:
насколько я помню прелоадит в течение тимеоут сек
Старый 12.04.2008, 11:46
Kenshi245

offline
Опыт: 2,252
Активность:
А что она там прелоадит, если единственное, что там можно задать ето время?
Старый 12.04.2008, 12:44
FellGuard
Losyash
offline
Опыт: 39,547
Активность:
функции Preload("str") последовательно формируют список того, что нужно прелоадить, а собственно PreloadEnd(sec) запускает последователный прелоад из этого списка. Вот стандратный прелоадер из архива (см.аттач), запускается файлик функцией native Preloader(string filename)
Прикрепленные файлы
Тип файла: rar HumanMelee.rar (1.1 Кбайт, 16 просмотров )
Старый 12.04.2008, 14:34
Kenshi245

offline
Опыт: 2,252
Активность:
А через что его открывать? Там какой-то pld файл.
Старый 12.04.2008, 15:47
Vadim

offline
Опыт: 603
Активность:
Kenshi245, блокнотом.
Старый 12.04.2008, 16:35
Kenshi245

offline
Опыт: 2,252
Активность:
Короче есть скрипт скилла rejuvenation, который каждую секунду регенит хп, так вот в нем есть баг если много раз скастовать его на чара, то получится овербафф из-за того что не удаляются старые таймеры, и я не знаю как этого избежать. Вот скрипт:

Код:
// ### Rejuvenation Spell ###
function Spell_Rejuvenation_Tick takes nothing returns nothing
    local timer timerA = GetExpiredTimer()
    local unit unitA = I2U(GetStoredInteger(udg_Game_Cache, I2S(H2I(timerA)), "Rej_A"))
    local unit unitB = I2U(GetStoredInteger(udg_Game_Cache, I2S(H2I(timerA)), "Rej_B"))
    local integer pID = GetPlayerId(GetOwningPlayer(unitA))
    local real healingA = GetUnitAbilityLevel(unitA,'A00U')*25+udg_Hpw[pID]*GetRandomReal(0.25,0.75)
    if GetUnitAbilityLevel(unitB, 'B00L') > 0 then //Если есть бафф то:
    call TextTargetA(unitB,healingA,2,false) // Полечить
    else
    call DestroyTimer(timerA) 
    call FlushStoredMission(udg_Game_Cache, I2S(H2I(timerA)))
    endif
    set timerA = null
    set unitA = null
    set unitB = null
endfunction

function Spell_Rejuvenation_Actions takes nothing returns nothing
    local timer timerA = CreateTimer()
    local unit unitA = GetTriggerUnit()
    local unit unitB = GetSpellTargetUnit()
    call StoreInteger(udg_Game_Cache, I2S(H2I(timerA)), "Rej_A", H2I(unitA))
    call StoreInteger(udg_Game_Cache, I2S(H2I(timerA)), "Rej_B", H2I(unitB))
    call TimerStart(timerA, 1, true, function Spell_Rejuvenation_Tick)
    set timerA = null
    set unitA = null
    set unitB = null
endfunction
Старый 12.04.2008, 21:34
J
expert
offline
Опыт: 48,447
Активность:
Цитата:
call DestroyTimer(timerA)
call FlushStoredMission(udg_Game_Cache, I2S(H2I(timerA)))

угадай где здесь Ашибка
Старый 12.04.2008, 21:47
Kenshi245

offline
Опыт: 2,252
Активность:
Да, ошибка, надо местами поменять, только всеравно овербафф не убирает((
Старый 12.04.2008, 23:16
J
expert
offline
Опыт: 48,447
Активность:
я с бафами плохо умею работать, возможно тут чето изза самово бафа, короче смысл таймера в лечении пока держится баф, а баф держится определеное время что казано в РО, а нельзя просто выполнить таймер n ое число раз и уничтожить?
Старый 12.04.2008, 23:25
Kenshi245

offline
Опыт: 2,252
Активность:
Это не уберет овербафф. Короче смотри, при юзании спелла создается таймер, который тикает каждую секунду, НО если баффнуть еще раз, то создастся второй, третий и так можно создавать до бесконечности, а так, как бафф не слетает то и тики тоже не перестанут идти. Первое о чем я подумал - это сделать проверку на наличие на чаре бафа - если есть - таймер не создаем, если нет - создаем, но тогда всплывает другой недочет, то что если на чара кинут rejuvenation большего лвл чем уже есть на нем, то скрипт забьет и ничего не будет делать, и в результате на юните будет висеть бафф большого лвл, а тикать будет по копейкам, ибо работает старый таймер со старым баффом.
Старый 12.04.2008, 23:55
J
expert
offline
Опыт: 48,447
Активность:
подобные проблемы, если через кеш, решаются подобным способом:
Код:
function Spell_Rejuvenation_Tick takes nothing returns nothing
    local timer timerA = GetExpiredTimer()
    local unit unitA = I2U(GetStoredInteger(udg_Game_Cache, I2S(H2I(timerA)), "Rej_A"))
    local unit unitB = I2U(GetStoredInteger(udg_Game_Cache, I2S(H2I(timerA)), "Rej_B"))
    local integer pID = GetPlayerId(GetOwningPlayer(unitA))
    local real healingA = GetUnitAbilityLevel(unitA,'A00U')*25+udg_Hpw[pID]*GetRandomReal(0.25,0.75)
    local integer time = GetStoredInteger(udg_Game_Cache, I2S(H2I(unitB)), "time")
    if time > 0 then
        call StoreInteger(udg_Game_Cache, I2S(H2I(unitB)), "time", time-1)
        call TextTargetA(unitB,healingA,2,false)
    else
        call FlushStoredMission(udg_Game_Cache, I2S(H2I(timerA)))
        call FlushStoredMission(udg_Game_Cache, I2S(H2I(unitB))+"Rejuvenation") //Добовляем к хендлу юнита строку чтобы этот спел не мешался при работе других подобных спелов
        call DestroyTimer(timerA)
    endif
    set timerA = null
    set unitA = null
    set unitB = null
endfunction

function Spell_Rejuvenation_Actions takes nothing returns nothing
    local timer timerA
    local unit unitA = GetSpellAbilityUnit()
    local unit unitB = GetSpellTargetUnit()
    if GetStoredInteger(udg_Game_Cache, I2S(H2I(unitB)), "time") == 0 then
        set timerA = CreateTimer()
        call StoreInteger(udg_Game_Cache, I2S(H2I(timerA)), "Rej_A", H2I(unitA))
        call StoreInteger(udg_Game_Cache, I2S(H2I(timerA)), "Rej_B", H2I(unitB))
        call TimerStart(timerA, 1, true, function Spell_Rejuvenation_Tick)
    endif
    call StoreInteger(udg_Game_Cache, I2S(H2I(unitB))+"Rejuvenation", "time", 20)
    set timerA = null
    set unitA = null
    set unitB = null
endfunction
Старый 13.04.2008, 09:24
Kenshi245

offline
Опыт: 2,252
Активность:
А нельзя сделать так, чтобы он просто удалял старые таймеры, предписанные этому юниту?
Старый 13.04.2008, 12:20
J
expert
offline
Опыт: 48,447
Активность:
Kenshi245 ну тогда прийдется таймер юниту сопоставлять, а таймеру сопостовлять время, легче просто юниту атачить время и все...
Старый 13.04.2008, 12:22
Toadcop

offline
Опыт: 54,313
Активность:
Цитата:
call DestroyTimer(timerA)
call FlushStoredMission(udg_Game_Cache, I2S(H2I(timerA)))

угадай где здесь Ашибка
ха лол =) а угадай что здесь не будет ошибкм =) хочеш можеш проверить.
Старый 13.04.2008, 15:26
J
expert
offline
Опыт: 48,447
Активность:
а ну да, я перепутал, ошибка была бы если бы было так

call DestroyTimer(GetExpiredTimer())
call FlushStoredMission(udg_Game_Cache, I2S(H2I(GetExpiredTimer())))


нда пох
Старый 13.04.2008, 15:38
Ответ

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

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

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

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



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