|
|
|
|
[Вопрос] Время до воскрешения в 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
Блокировки:
| Ник создал локальный триггер, поэтому его нужно обнулить. Т.е. да - триггеры дают утечки
|
|
|
|
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 - не надо было бы.
|
|
|
|
|
|
|
|
|
|
|