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

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

Ответ
 
Manhun1

offline
Опыт: 5,042
Активность:
Баг в коде
function HeroDeath_con takes nothing returns boolean
    return GetUnitTypeId(GetDyingUnit()) == 'H004' or GetUnitTypeId(GetDyingUnit()) == 'H00D' or GetUnitTypeId(GetDyingUnit()) == 'H007'
endfunction

function ReviveHeros takes nothing returns nothing
    local timer t = GetExpiredTimer()
    local integer id = GetHandleId(t)
    local unit d = LoadUnitHandle(udg_hash, id, 0)
    local timerdialog ti = LoadTimerDialogHandle(udg_hash, id, 1)
    call DestroyTimerDialog(ti)
    call ReviveHero(d, GetRectCenterX(gg_rct_RevivHero), GetRectCenterY(gg_rct_RevivHero), true)
    if (GetLocalPlayer() == GetOwningPlayer(d)) then
        call PanCameraToTimed(GetRectCenterX(gg_rct_RevivHero), GetRectCenterY(gg_rct_RevivHero), 0.)
    endif
    call FlushChildHashtable(udg_hash, id)
    call DestroyTimer(t)
    set t = null
    set d = null
    set ti = null
endfunction

function HeroDeath_act takes nothing returns nothing
    local unit d = GetDyingUnit()
    local timer t = CreateTimer()
    local timerdialog ti = CreateTimerDialog(t)
    local integer id = GetHandleId(t)
    local real r = (I2R(GetHeroLevel(d)) * 10)
    if r > 120 then
        set r = 120
    endif
    ================================================== = 
    if GetOwningPlayer(d) == Player(0) then
        set udg_DeathTitel[1] = ( udg_DeathTitel[1] + 1 )
        call MultiboardSetItemValueBJ( udg_multytitle, 4, ( GetConvertedPlayerId(GetOwningPlayer(d)) + 1 ), I2S(udg_DeathTitel[1]))
    endif
    if GetOwningPlayer(d) == Player(1) then
        set udg_DeathTitel[2] = ( udg_DeathTitel[2] + 1 )
        call MultiboardSetItemValueBJ( udg_multytitle, 4, ( GetConvertedPlayerId(GetOwningPlayer(d)) + 1 ), I2S(udg_DeathTitel[2]))
    endif
    if GetOwningPlayer(d) == Player(2) then
        set udg_DeathTitel[3] = ( udg_DeathTitel[3] + 1 )
        call MultiboardSetItemValueBJ( udg_multytitle, 4, ( GetConvertedPlayerId(GetOwningPlayer(d)) + 1 ), I2S(udg_DeathTitel[3]))
    endif
    if GetOwningPlayer(d) == Player(3) then
        set udg_DeathTitel[4] = ( udg_DeathTitel[4] + 1 )
        call MultiboardSetItemValueBJ( udg_multytitle, 4, ( GetConvertedPlayerId(GetOwningPlayer(d)) + 1 ), I2S(udg_DeathTitel[4]))
    endif
    if GetOwningPlayer(d) == Player(4) then
        set udg_DeathTitel[5] = ( udg_DeathTitel[5] + 1 )
        call MultiboardSetItemValueBJ( udg_multytitle, 4, ( GetConvertedPlayerId(GetOwningPlayer(d)) + 1 ), I2S(udg_DeathTitel[5]))
    endif
    if GetOwningPlayer(d) == Player(5) then
        set udg_DeathTitel[6] = ( udg_DeathTitel[6] + 1 )
        call MultiboardSetItemValueBJ( udg_multytitle, 4, ( GetConvertedPlayerId(GetOwningPlayer(d)) + 1 ), I2S(udg_DeathTitel[6]))
    endif
    if GetOwningPlayer(d) == Player(6) then
        set udg_DeathTitel[7] = ( udg_DeathTitel[7] + 1 )
        call MultiboardSetItemValueBJ( udg_multytitle, 4, ( GetConvertedPlayerId(GetOwningPlayer(d)) + 1 ), I2S(udg_DeathTitel[7]))
    endif
    if GetOwningPlayer(d) == Player(7) then
        set udg_DeathTitel[8] = ( udg_DeathTitel[8] + 1 )
        call MultiboardSetItemValueBJ( udg_multytitle, 4, ( GetConvertedPlayerId(GetOwningPlayer(d)) + 1 ), I2S(udg_DeathTitel[8]))
    endif
    if GetOwningPlayer(d) == Player(8) then
        set udg_DeathTitel[9] = ( udg_DeathTitel[9] + 1 )
        call MultiboardSetItemValueBJ( udg_multytitle, 4, ( GetConvertedPlayerId(GetOwningPlayer(d)) + 1 ), I2S(udg_DeathTitel[9]))
    endif
    if GetOwningPlayer(d) == Player(9) then
        set udg_DeathTitel[10] = ( udg_DeathTitel[10] + 1 )
        call MultiboardSetItemValueBJ( udg_multytitle, 4, ( GetConvertedPlayerId(GetOwningPlayer(d)) + 1 ), I2S(udg_DeathTitel[10]))
    endif
    ================================================== = 
    if (GetLocalPlayer() == GetOwningPlayer(d)) then
        call TimerDialogDisplay(ti, true)
        call TimerDialogSetTitle(ti, "До воскрешения:")
        call SaveUnitHandle(udg_hash, id, 0, d)
        call SaveTimerDialogHandle(udg_hash, id, 1, ti)
        call TimerStart(t, r, false, function ReviveHeros)
    endif
    set t = null
    set d = null
    set ti = null
endfunction

function InitTrig_HeroRevive takes nothing returns nothing
    local trigger t = CreateTrigger()
    call TriggerRegisterAnyUnitEventBJ(t, EVENT_PLAYER_UNIT_DEATH)
    call TriggerAddCondition(t, Condition(function HeroDeath_con))
    call TriggerAddAction(t, function HeroDeath_act)
    set t = null
endfunction
Вообщем когда умирает герой игрока 2 и тд, у них пишет соединение разорвано...

Отредактировано ShadoW DaemoN, 18.07.2011 в 16:09.
Старый 18.07.2011, 14:45
Elf_Stratigo

offline
Опыт: 4,699
Активность:
локальный запуск таймера недопустим
возможно и локальная работа с хеш-таблицами тоже невозможна
Старый 18.07.2011, 14:54
Manhun1

offline
Опыт: 5,042
Активность:
Все возможно все работает, проблема не в этом...
Старый 18.07.2011, 14:54
Elf_Stratigo

offline
Опыт: 4,699
Активность:
не веришь чтоли?! =D
закомментируй блок работы с локальным игроком и убедись
Старый 18.07.2011, 15:04
Manhun1

offline
Опыт: 5,042
Активность:
Локальные таймеры я сотню раз использовал, не скажу что на игроков, и все работало без перебойно
Старый 18.07.2011, 15:07
prog

offline
Опыт: 32,865
Активность:
подумай над тем локально ли выполнится ф-ция ReviveHeros и сделай выводы
Старый 18.07.2011, 15:44
Manhun1

offline
Опыт: 5,042
Активность:
Кто ни будь может исправить?
Старый 18.07.2011, 16:18
Doc

offline
Опыт: 63,163
Активность:
Омфг вот ты головой подумай: есть код, причина десинка, есть GetLocalPlayer() в коде. Но виноват не GetLocalPlayer()? Что за бред? И зачем запускать таймер локально?
Doc добавил:
facepalm, тебе сложно вынести старт таймера и сохранение хендла за иф?
Старый 18.07.2011, 16:19
DotaMaster666
Silenced by GadenbIsh
offline
Опыт: 1,259
Активность:
» Индийский код из палаты мер и весов
    if GetOwningPlayer(d) == Player(0) then
        set udg_DeathTitel[1] = ( udg_DeathTitel[1] + 1 )
        call MultiboardSetItemValueBJ( udg_multytitle, 4, ( GetConvertedPlayerId(GetOwningPlayer(d)) + 1 ), I2S(udg_DeathTitel[1]))
    endif
    if GetOwningPlayer(d) == Player(1) then
        set udg_DeathTitel[2] = ( udg_DeathTitel[2] + 1 )
        call MultiboardSetItemValueBJ( udg_multytitle, 4, ( GetConvertedPlayerId(GetOwningPlayer(d)) + 1 ), I2S(udg_DeathTitel[2]))
    endif
    if GetOwningPlayer(d) == Player(2) then
        set udg_DeathTitel[3] = ( udg_DeathTitel[3] + 1 )
        call MultiboardSetItemValueBJ( udg_multytitle, 4, ( GetConvertedPlayerId(GetOwningPlayer(d)) + 1 ), I2S(udg_DeathTitel[3]))
    endif
    if GetOwningPlayer(d) == Player(3) then
        set udg_DeathTitel[4] = ( udg_DeathTitel[4] + 1 )
        call MultiboardSetItemValueBJ( udg_multytitle, 4, ( GetConvertedPlayerId(GetOwningPlayer(d)) + 1 ), I2S(udg_DeathTitel[4]))
    endif
    if GetOwningPlayer(d) == Player(4) then
        set udg_DeathTitel[5] = ( udg_DeathTitel[5] + 1 )
        call MultiboardSetItemValueBJ( udg_multytitle, 4, ( GetConvertedPlayerId(GetOwningPlayer(d)) + 1 ), I2S(udg_DeathTitel[5]))
    endif
    if GetOwningPlayer(d) == Player(5) then
        set udg_DeathTitel[6] = ( udg_DeathTitel[6] + 1 )
        call MultiboardSetItemValueBJ( udg_multytitle, 4, ( GetConvertedPlayerId(GetOwningPlayer(d)) + 1 ), I2S(udg_DeathTitel[6]))
    endif
    if GetOwningPlayer(d) == Player(6) then
        set udg_DeathTitel[7] = ( udg_DeathTitel[7] + 1 )
        call MultiboardSetItemValueBJ( udg_multytitle, 4, ( GetConvertedPlayerId(GetOwningPlayer(d)) + 1 ), I2S(udg_DeathTitel[7]))
    endif
    if GetOwningPlayer(d) == Player(7) then
        set udg_DeathTitel[8] = ( udg_DeathTitel[8] + 1 )
        call MultiboardSetItemValueBJ( udg_multytitle, 4, ( GetConvertedPlayerId(GetOwningPlayer(d)) + 1 ), I2S(udg_DeathTitel[8]))
    endif
    if GetOwningPlayer(d) == Player(8) then
        set udg_DeathTitel[9] = ( udg_DeathTitel[9] + 1 )
        call MultiboardSetItemValueBJ( udg_multytitle, 4, ( GetConvertedPlayerId(GetOwningPlayer(d)) + 1 ), I2S(udg_DeathTitel[9]))
    endif
    if GetOwningPlayer(d) == Player(9) then
        set udg_DeathTitel[10] = ( udg_DeathTitel[10] + 1 )
        call MultiboardSetItemValueBJ( udg_multytitle, 4, ( GetConvertedPlayerId(GetOwningPlayer(d)) + 1 ), I2S(udg_DeathTitel[10]))
    endif
Старый 18.07.2011, 23:25
DKbru

offline
Опыт: 1,407
Активность:
DotaMaster666, лучше так по-моему,
local integer p=GetPlayerId(GetOwningPlayer(d))
set udg_DeathTitel[p] = udg_DeathTitel[p] + 1 
call MultiboardSetItemValueBJ( udg_multytitle, 4, GetPlayerId(GetOwningPlayer(d))+1,  I2S(udg_DeathTitel[p]))
Manhun1, лучше, если нужно, показывать локально таймер в мультиборде, а не делать локальные таймеры
Старый 19.07.2011, 00:25
DotaMaster666
Silenced by GadenbIsh
offline
Опыт: 1,259
Активность:
DKbru,
лучше так по-моему
Я крайне редко раздаю кому то звание Капитана Очевидность, но именно тот случай.
Старый 21.07.2011, 11:36
Ответ

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

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

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

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



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