Сейчас 19:51:07 Понедельник, 29 апреля, 2024 год
[ x ] Главная ⇒ Форум ⇐ RSS Файлы Cтатьи Картинки В о й т и   или   з а р е г и с т р и р о в а т ь с я


[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: PUVer, SirNikolas, Ty3uK  
Форум о Warcraft 3 » Раздел для картостроителей » GUI / Jass » [Вопрос] Время до воскрешения в leaderboard
[Вопрос] Время до воскрешения в leaderboard
RedRomkaДата: Суббота, 12 Мая 2012, 15:13:26 | Сообщение # 1
2 уровень
Группа: Пользователи
Сообщений: 22
Награды: 0
Репутация: 13
Блокировки:
Сделал таймер воскрешения героев, который в лидерборде отсчитывается.
Когда лидерборд и группа игроков , для которых он отображается были глобальными переменными, то работало норм, но если умирали герои двух игроков, то по воскрешению первого была дисинхронизация, а когда заменил на локальные вовсе перестал работать.

Code

function Trig_Revive_Conditions takes nothing returns boolean
     if ( not ( IsUnitType(GetDyingUnit(), UNIT_TYPE_HERO) == true ) ) then
         return false
     endif
     if ( not ( IsUnitDeadBJ(GetDyingUnit()) == true ) ) then
         return false
     endif
     return true
endfunction

function Trig_Revive_Func010Func003C takes nothing returns boolean
     if ( not ( IsPlayerEnemy(GetOwningPlayer(GetDyingUnit()), Player(11)) == true ) ) then
         return false
     endif
     return true
endfunction

function Trig_Revive_Func010Func004C takes nothing returns boolean
     if ( not ( IsPlayerEnemy(GetOwningPlayer(GetDyingUnit()), Player(10)) == true ) ) then
         return false
     endif
     return true
endfunction

function Trig_Revive_Func010C takes nothing returns boolean
     if ( not ( IsUnitDeadBJ(GetTriggerUnit()) == true ) ) then
         return false
     endif
     return true
endfunction

function Trig_Revive_Actions takes nothing returns nothing
     local unit dh //Герой, котроый умер
     local integer ldh //Его лвл
     local location ru //Место воскрешения
     local location ra //тоже
     local leaderboard lb
     local force fe = null
     call ForceAddPlayerSimple( GetOwningPlayer(dh), fe )
     set dh = GetDyingUnit()
     set ldh = GetHeroLevel(dh)
     set ra = GetRectCenter(gg_rct_Rev_Alli)
     set ru = GetRectCenter(gg_rct_Rev_Und)
     call CreateLeaderboardBJ( fe, ( "Воскрешение через: " + I2S(ldh * 3) ) )
     set lb = GetLastCreatedLeaderboard()
     call LeaderboardDisplayBJ( true, lb )
     set udg_Timer_Title_Rev[GetConvertedPlayerId( GetOwningPlayer( dh ) )] = 1
     loop
         exitwhen udg_Timer_Title_Rev[GetConvertedPlayerId( GetOwningPlayer( dh ) )] > ( ldh * 3 )
         if (IsUnitDeadBJ(dh) == true) then
                  call TriggerSleepAction( 1.00 )
         else
                  call DoNothing(  )
         endif  
         call MultiboardSetItemValueBJ( udg_Table, 2, udg_TablePlayerRow[GetConvertedPlayerId(GetOwningPlayer(dh))], ( udg_PlayerColor[GetConvertedPlayerId(GetOwningPlayer(dh))] + ( GetPlayerName(GetOwningPlayer(dh)) + ( "|r" + ( "(" + ( I2S(( ( ldh * 3 ) - udg_Timer_Title_Rev[GetConvertedPlayerId(GetOwningPlayer(dh))] )) + ")" ) ) ) ) ) )
         call LeaderboardSetLabelBJ( lb, ( "Воскрешение через: " + I2S(( ( ldh * 3 ) - udg_Timer_Title_Rev[GetConvertedPlayerId(GetOwningPlayer(dh))] )) ) )
         set udg_Timer_Title_Rev[GetConvertedPlayerId( GetOwningPlayer( dh ) )] = udg_Timer_Title_Rev[GetConvertedPlayerId( GetOwningPlayer( dh ) )] + 1
     endloop
     call MultiboardSetItemValueBJ( udg_Table, 2, udg_TablePlayerRow[GetConvertedPlayerId(GetOwningPlayer(dh))], ( udg_PlayerColor[GetConvertedPlayerId(GetOwningPlayer(dh))] + ( GetPlayerName(GetOwningPlayer(dh)) + "|r" ) ) )
     call DestroyLeaderboardBJ( lb )
     set lb = null
     if ( Trig_Revive_Func010C() ) then
         if ( Trig_Revive_Func010Func003C() ) then
             call ReviveHeroLoc( dh, ra, true )
             call SmartCameraPanBJ( GetOwningPlayer(dh), ra, 0.01 )
             call SelectUnitForPlayerSingle( dh, GetOwningPlayer(dh) )
         else
             call DoNothing(  )
         endif
         if ( Trig_Revive_Func010Func004C() ) then
             call ReviveHeroLoc( dh, ru, true )
             call SmartCameraPanBJ( GetOwningPlayer(dh), ru, 0.01 )
             call SelectUnitForPlayerSingle( dh, GetOwningPlayer(dh) )
         else
             call DoNothing(  )
         endif
     else
         call DoNothing(  )
     endif
call DestroyForce(fe)
call RemoveLocation(ru)
call RemoveLocation(ra)
set fe = null
set ru = null
set ra = null
set dh = null
endfunction

//===========================================================================
function InitTrig_Revive takes nothing returns nothing
     set gg_trg_Revive = CreateTrigger(  )
     call TriggerRegisterAnyUnitEventBJ( gg_trg_Revive, EVENT_PLAYER_UNIT_DEATH )
     call TriggerAddCondition( gg_trg_Revive, Condition( function Trig_Revive_Conditions ) )
     call TriggerAddAction( gg_trg_Revive, function Trig_Revive_Actions )
endfunction
 

SirNikolasДата: Суббота, 12 Мая 2012, 15:17:56 | Сообщение # 2
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
Сейчас.

 

RedRomkaДата: Суббота, 12 Мая 2012, 15:30:49 | Сообщение # 3
2 уровень
Группа: Пользователи
Сообщений: 22
Награды: 0
Репутация: 13
Блокировки:
Одну ошибку нашёл
Code

call ForceAddPlayerSimple( GetOwningPlayer(dh), fe )  
set dh = GetDyingUnit()

надо местами переставить, но всё равно не пашет(
 

SirNikolasДата: Суббота, 12 Мая 2012, 16:00:05 | Сообщение # 4
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
Code
function Trig_Revive_Conditions takes nothing returns boolean
    return IsUnitType(GetTriggerUnit(), UNIT_TYPE_HERO) == true
endfunction

function Trig_Revive_Timer takes nothing returns nothing
    local handle h = GetExpiredTimer()
    local integer i = 0
    local multiboarditem mbi
    local string s
    local real x
    local real y
    loop
        exitwhen h == udg_ReviveTimer[i]
        set i = i + 1
    endloop
    set mbi = MultiboardGetItem(udg_Table, 1, udg_TablePlayerRow[i + 1])
    if udg_ReviveTime[i] > 1 then
        set udg_ReviveTime[i] = udg_ReviveTime[i] - 1
        set s = I2S(udg_ReviveTime[i])
        call MultiboardSetItemValue(mbi, udg_PlayerColor[i + 1] + GetPlayerName(Player(i)) + "|r (" + s + ")")
        call LeaderboardSetLabel(udg_ReviveLB[i], "Воскрешение через: " + s)
    else
        call MultiboardSetItemValue(mbi, udg_PlayerColor[i + 1] + GetPlayerName(Player(i)))
        call LeaderboardDisplay(udg_ReviveLB[i], false)
        if IsUnitAlly(udg_ReviveHero[i], Player(10)) then
            set x = GetRectCenterX(gg_rct_Rev_Alli)
            set y = GetRectCenterY(gg_rct_Rev_Alli)
        else
            set x = GetRectCenterX(gg_rct_Rev_Und)
            set y = GetRectCenterY(gg_rct_Rev_Und)
        endif
        call ReviveHero(udg_ReviveHero[i], x, y, true)
        if GetLocalPlayer() == Player(i) then
            call PanCameraToTimed(x, y, .0)
            call SelectUnit(udg_ReviveHero[i], true)
        endif
        call PauseTimer(udg_ReviveTimer[i])
    endif
    call MultiboardReleaseItem(mbi)
    set h = null
    set mbi = null
endfunction

function Trig_Revive_Actions takes nothing returns nothing
    local player p = GetOwningPlayer(GetTriggerUnit())
    local integer i = GetPlayerId(p)
    set udg_ReviveHero[i] = GetTriggerUnit()
    set udg_ReviveTime[i] = GetHeroLevel(udg_ReviveHero[i]) * 3
    call LeaderboardSetLabel(udg_ReviveLB[i], "Воскрешение через: " + I2S(udg_ReviveTime[i]))
    call LeaderboardDisplay(udg_ReviveLB[i], GetLocalPlayer() == p)
    call TimerStart(udg_ReviveTimer[i], 1., true, function Trig_Revive_Timer)
    set p = null
endfunction

//===========================================================================
function InitTrig_Revive takes nothing returns nothing
    local trigger trig = CreateTrigger()
    local integer i = 0
    loop
        call TriggerRegisterPlayerUnitEvent(trig, Player(i), EVENT_PLAYER_UNIT_DEATH, null)
        set udg_ReviveLB[i] = CreateLeaderboard()
        call PlayerSetLeaderboard(Player(i), udg_ReviveLB[i])
        exitwhen i == 11
        set i = i + 1
    endloop
    call TriggerAddCondition(trig, Condition(function Trig_Revive_Conditions))
    call TriggerAddAction(trig, function Trig_Revive_Actions)
    set trig = null
endfunction
Требуемые переменные:
ReviveLB: leaderboard array
ReviveHero: unit array
ReviveTime: integer array
ReviveTimer: timer array[11]


 

RedRomkaДата: Суббота, 12 Мая 2012, 20:58:11 | Сообщение # 5
2 уровень
Группа: Пользователи
Сообщений: 22
Награды: 0
Репутация: 13
Блокировки:
Спасибо! Ща переделаю. И ещё вопрос. Большая разница между использованием local location... и X Y точки, или ссылку на статейку где об этом почитать?
 

lawsonДата: Суббота, 12 Мая 2012, 22:05:19 | Сообщение # 6
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
Quote (RedRomka)
И ещё вопрос

точки Х Y работают через int или real - простые числа которые не занимают память, в то время как область оставляет еще и хэндл который нужно очищать.


Nic nie wiem bo mam chuj.
редактирую посты! ВСЕ!
 

RedRomkaДата: Суббота, 12 Мая 2012, 23:53:36 | Сообщение # 7
2 уровень
Группа: Пользователи
Сообщений: 22
Награды: 0
Репутация: 13
Блокировки:
Я только-только джасс начал изучать. Узнать хочу: в коде который SirNikolas написал есть строки
Code

local trigger trig = CreateTrigger()
...
set trig = null

Я правильно понял, триггеры тоже утечки создают если такие не приписывать?

Добавлено (12 Май 2012, 23:53:36)
---------------------------------------------

Quote (lawson)
область оставляет еще и хэндл который нужно очищать.


Тоесть
call removeLocation(loc)
set loc = null
недостаточно?
 

tRu^SДата: Суббота, 12 Мая 2012, 23:54:39 | Сообщение # 8
8 уровень
Группа: Проверенные
Сообщений: 614
Награды: 0
Репутация: 138
Блокировки:
Если ты скачаеш JNGP из этой темы то тебе не придёться писать set bla=null

 

RedRomkaДата: Суббота, 12 Мая 2012, 23:59:24 | Сообщение # 9
2 уровень
Группа: Пользователи
Сообщений: 22
Награды: 0
Репутация: 13
Блокировки:
Не, ГенПак стоит у меня. В туторах пишут: обнуляй, я так и делаю) Ну и всё же хочу знать: RemoveLocation достаточно или что-то ещё надо?
 

Ty3uKДата: Воскресенье, 13 Мая 2012, 08:13:18 | Сообщение # 10
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
Ник создал локальный триггер, поэтому его нужно обнулить. Т.е. да - триггеры дают утечки

╭∩╮(︶︿︶)╭∩╮
"Ульта Тайда мне в жопу!" © k0fe1n
Статьи: MUI-1|MUI-2|Шрифт
Полезности: JASP|JNGP|Уголок библиотек
 

SirNikolasДата: Воскресенье, 13 Мая 2012, 12:02:58 | Сообщение # 11
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
Quote (tRu^S)
Если ты скачаешь JNGP из этой темы, то тебе не придётся писать set bla=null
Лучше приучатся с самого начала обнулять локальные переменные. (boolean, integer, real, string и code не нуждаются в обнулении!)
Точки (location) - это игровые объекты, и их необходимо уничтожать с помощью RemoveLocation. А координаты (x/y) - просто действительные числа, и с ними можно работать прямо так.
Насчет триггера - он локальный, и переменную надо обнулить. Если бы я оставил gg_trg_Revive - не надо было бы.


 

Форум о Warcraft 3 » Раздел для картостроителей » GUI / Jass » [Вопрос] Время до воскрешения в leaderboard
  • Страница 1 из 1
  • 1
Поиск:

Copyright © 2006 - 2024 Warcraft3FT.info При копировании материалов c сайта ставьте, пожалуйста, активную обратную ссылку на нас • Design by gReeB04ki ©
Хостинг от uCoz