Используя фреймы, я заметил что происходит моментальный десинхрон при вызове функции с GetLocalPlayer(), но не особо могу понять почему происходит десинхрон или что с ним можно сделать.
GetLocalPlayer() присутствует в двух местах кода ниже:
- call TimerStart( tm, 0.01, GetLocalPlayer() == pl, function Check ) Запускаем Check каждые 0.01 сек
- if ( GetLocalPlayer() == pl ) then
И даже не понятно, где выходит утечка(как минимум, для тупого меня, лишь предположения типо хештега, функции клина сообщений, отправки сообщения игроку). Знатоки, можете помочь?
Таймер
//Timer i guess
function Check takes nothing returns nothing
local player pl = GetLocalPlayer()
local integer pn = GetConvertedPlayerId(pl)
local force pf = GetForceOfPlayer(pl)
local integer a = 1
local integer b = 1
local integer frame = FindCLayerUnderCursor() // находим фрейм под курсором
if IsKeyPressed( 0x01 ) then // проверяем нажата ли ЛЕВАЯ клавиша мыши в данный момент, если нужна правая то 0x02
if LMBTap then // проверяем нажимали ли ранее (Check ведь каждые 0.1 секунду происхjlbn)
set LMBTap = false //Если нет, говорим что нажимаем
set bj_lastClickedFrame = frame // записываем последний фрейм что нажали
if bj_lastClickedFrame == HeroFunct then // проверяем кнопка ли фрейм
call ClearTextMessages()
call SetFrameSize( HeroButton, 0.027, 0.032 ) // Если да то уменьшаем (Типо анимация)
call DisplayTextToForce(GetForceOfPlayer(pl),GetAbilityBaseTip(abi_hero_p[int_player_hero[pn]],1)+"|n"+GetAbilityBaseUbertip(abi_hero_p[int_player_hero[pn]],1))
endif
if bj_lastClickedFrame == FactFunct then // проверяем кнопка ли фрейм
call ClearTextMessages()
call SetFrameSize( FactionButton, 0.027, 0.032 ) // Если да то уменьшаем (Типо анимация)
call DisplayTextToForce(GetForceOfPlayer(pl),GetAbilityBaseTip(abi_fac[UI_FactionID[pn]],1)+"|n"+GetAbilityBaseUbertip(abi_fac[UI_FactionID[pn]],1))
endif
if bj_lastClickedFrame == B3Funct then // проверяем кнопка ли фрейм
call ClearTextMessages()
call SetFrameSize( Button3, 0.027, 0.032 ) // Если да то уменьшаем (Типо анимация)
loop
exitwhen a > 4
call DisplayTimedTextToForce(pf,45.0,"|cffffcc00Задание номер:|r "+I2S(a))
call DisplayTimedTextToForce(pf,45.0,QuestText[1]+QuestName[1][a]+QuestText[2]+I2S(IntCrit[1][a])+QuestText[3]+RewardName[1][a])
if ( QuestCheck[1][a] == false ) then
call DisplayTimedTextToForce(pf,45.0,"|c00FF0000Не выполнен|r")
else
call DisplayTimedTextToForce(pf,45.0,"|c0000FF00Выполнен|r")
endif
set a = a + 1
endloop
endif
if bj_lastClickedFrame == B4Funct then // проверяем кнопка ли фрейм
call ClearTextMessages()
call SetFrameSize( Button4, 0.027, 0.032 ) // Если да то уменьшаем (Типо анимация)
set a = 5
loop
exitwhen a > 8
if ( Quest[2][b] == 3 ) then
call DisplayTimedTextToForce(pf,45.0,"|cffffcc00Задание номер:|r "+I2S(a))
call DisplayTimedTextToForce(pf,45.0,QuestText[1]+QuestName[2][b]+QuestText[2]+I2S(IntCrit[2][b])+QuestText[3]+RewardName[2][b])
endif
if ( Quest[2][b] == 4 ) then
call DisplayTimedTextToForce(pf,45.0,"|cffffcc00Задание номер:|r "+I2S(a))
call DisplayTimedTextToForce(pf,45.0,QuestText[4]+QuestName[2][b]+QuestText[5]+I2S(IntCrit[2][b])+QuestText[3]+RewardName[2][b])
endif
if ( Quest[2][b] == 5 ) then
call DisplayTimedTextToForce(pf,45.0,"|cffffcc00Задание номер:|r "+I2S(a))
call DisplayTimedTextToForce(pf,45.0,QuestText[1]+QuestName[2][b]+QuestText[2]+I2S(IntCrit[2][b])+QuestText[3]+RewardName[2][b])
endif
if ( QuestCheck[2][b] == false ) then
call DisplayTimedTextToForce(pf,45.0,"|c00FF0000Не выполнен|r")
else
call DisplayTimedTextToForce(pf,45.0,"|c0000FF00Выполнен|r")
endif
set b = b + 1
set a = a + 1
endloop
endif
if bj_lastClickedFrame == B5Funct then // проверяем кнопка ли фрейм
call ClearTextMessages()
call SetFrameSize( Button5, 0.027, 0.032 ) // Если да то уменьшаем (Типо анимация)
set a = 9
loop
exitwhen a > 11
if ( Quest[3][b] == 6 ) then
call DisplayTimedTextToForce(pf,45.0,"|cffffcc00Задание номер:|r "+I2S(a))
call DisplayTimedTextToForce(pf,45.0,QuestText[7]+QuestName[3][b]+QuestText[8]+RewardName[3][b])
endif
if ( Quest[3][b] == 7 ) then
call DisplayTimedTextToForce(pf,45.0,"|cffffcc00Задание номер:|r "+I2S(a))
call DisplayTimedTextToForce(pf,45.0,QuestText[1]+QuestName[3][b]+QuestText[2]+I2S(IntCrit[3][b])+QuestText[3]+RewardName[3][b])
endif
if ( QuestCheck[3][b] == false ) then
call DisplayTimedTextToForce(pf,45.0,"|c00FF0000Не выполнен|r")
else
call DisplayTimedTextToForce(pf,45.0,"|c0000FF00Выполнен|r")
endif
set b = b + 1
set a = a + 1
endloop
endif
if bj_lastClickedFrame == B6Funct then // проверяем кнопка ли фрейм
call ClearTextMessages()
call SetFrameSize( Button6, 0.027, 0.032 ) // Если да то уменьшаем (Типо анимация)
set a = 0
call DisplayTextToForce(pf,"Активированные |c00E4201Bхаосы|r")
loop
exitwhen a > ChaosMax
if ( ChaosBOOL[a] == true ) then
call DisplayTextToForce(pf,ChaosNAME[a])
call DisplayTextToForce(pf,ChaosDISC[a])
endif
set a = a + 1
endloop
endif
endif
else
set LMBTap = true //говорим что отпустили
if bj_lastClickedFrame == HeroFunct then //если последний нажатый фрейм кнопка
set bj_lastClickedFrame = 0 //стираем из переменой последний фрейм
call SetFrameSize( HeroButton, 0.029, 0.034 ) // восстанавливаем размер
endif
if bj_lastClickedFrame == FactFunct then //если последний нажатый фрейм кнопка
set bj_lastClickedFrame = 0 //стираем из переменой последний фрейм
call SetFrameSize( FactionButton, 0.029, 0.034 ) // восстанавливаем размер
endif
if bj_lastClickedFrame == B3Funct then //если последний нажатый фрейм кнопка
set bj_lastClickedFrame = 0 //стираем из переменой последний фрейм
call SetFrameSize( Button3, 0.029, 0.034 ) // восстанавливаем размер
endif
if bj_lastClickedFrame == B4Funct then //если последний нажатый фрейм кнопка
set bj_lastClickedFrame = 0 //стираем из переменой последний фрейм
call SetFrameSize( Button4, 0.029, 0.034 ) // восстанавливаем размер
endif
if bj_lastClickedFrame == B5Funct then //если последний нажатый фрейм кнопка
set bj_lastClickedFrame = 0 //стираем из переменой последний фрейм
call SetFrameSize( Button5, 0.029, 0.034 ) // восстанавливаем размер
endif
if bj_lastClickedFrame == B6Funct then //если последний нажатый фрейм кнопка
set bj_lastClickedFrame = 0 //стираем из переменой последний фрейм
call SetFrameSize( Button6, 0.029, 0.034 ) // восстанавливаем размер
endif
endif
endfunction
Функция с GetLocalPlayer
function GameStart2 takes player i returns nothing
local player pl = i
local integer pn = GetConvertedPlayerId(pl)
local unit un = udg_Hero[pn]
local location loc = GetRectCenter(survloc[pn])
local unit uv
local unit cp
local timer array tm
set tm[pn] = CreateTimer()
call ShowUnitAbility(un,'amov',false)
call TimerStart( tm[pn], 0.01, GetLocalPlayer() == pl, function Check ) Запускаем Check каждые 0.01 сек
if ( GetLocalPlayer() == pl ) then
Back создаем основу для последующих фреймов
call SetFrameAbsolutePoint( ButtonBackdrop, ANCHOR_CENTER, 0.4, 0.14 )
call SetFrameSize( ButtonBackdrop, 0.35, 0.04 ) размеры
call SetFrameTexture( ButtonBackdrop, "panel3.blp", false ) Чисто текстура
Button Создали кнопку, повторюсь что имя из fdf файла
call SetFrameAbsolutePoint( HeroButton, ANCHOR_CENTER, 0.25, 0.14 )
call SetFrameSize( HeroButton, 0.029, 0.034 ) размеры
call SetFrameTexture( HeroButton, Icon_Hero[int_player_hero[pn]], false ) Создали кнопку, повторюсь что имя из fdf файла
call SetFramePoint( HeroFunct, ANCHOR_CENTER, HeroButton, ANCHOR_CENTER, 0.00, 0.00 )
call SetFrameSize( HeroFunct, 0.029, 0.034 ) Опять размеры шаманим
call SetFrameAbsolutePoint( HeroFunct, ANCHOR_CENTER, 0.25, 0.14 )
Button
call SetFrameAbsolutePoint( FactionButton, ANCHOR_CENTER, 0.285, 0.14 )
call SetFrameSize( FactionButton, 0.029, 0.034 ) размеры
call SetFrameTexture( FactionButton, Icon_Frac[UI_FactionID[pn]], false ) Создали кнопку, повторюсь что имя из fdf файла
call SetFramePoint( FactFunct, ANCHOR_CENTER, FactionButton, ANCHOR_CENTER, 0.00, 0.00 )
call SetFrameSize( FactFunct, 0.029, 0.034 ) Опять размеры шаманим
Button
call SetFrameAbsolutePoint( Button3, ANCHOR_CENTER, 0.325, 0.14 )
call SetFrameSize( Button3, 0.029, 0.034 ) размеры
call SetFrameTexture( Button3, "ReplaceableTextures\\CommandButtons\\BTNBlueScroll.blp", false )// Создали кнопку, повторюсь что имя из fdf файла
call SetFramePoint( B3Funct, ANCHOR_CENTER, Button3, ANCHOR_CENTER, 0.00, 0.00 )
call SetFrameSize( B3Funct, 0.029, 0.034 ) Опять размеры шаманим
Button
call SetFrameAbsolutePoint( Button4, ANCHOR_CENTER, 0.355, 0.14 )
call SetFrameSize( Button4, 0.029, 0.034 ) размеры
call SetFrameTexture( Button4, "ReplaceableTextures\\CommandButtons\\BTNPurpleScroll.blp", false ) Создали кнопку, повторюсь что имя из fdf файла
call SetFramePoint( B4Funct, ANCHOR_CENTER, Button4, ANCHOR_CENTER, 0.00, 0.00 )
call SetFrameSize( B4Funct, 0.029, 0.034 ) Опять размеры шаманим
Button
call SetFrameAbsolutePoint( Button5, ANCHOR_CENTER, 0.385, 0.14 )
call SetFrameSize( Button5, 0.029, 0.034 ) размеры
call SetFrameTexture( Button5, "ReplaceableTextures\\CommandButtons\\BTNOrangeScroll.blp", false ) Создали кнопку, повторюсь что имя из fdf файла
call SetFramePoint( B5Funct, ANCHOR_CENTER, Button5, ANCHOR_CENTER, 0.00, 0.00 )
call SetFrameSize( B5Funct, 0.029, 0.034 ) Опять размеры шаманим
Button
call SetFrameAbsolutePoint( Button6, ANCHOR_CENTER, 0.415, 0.14 )
call SetFrameSize( Button6, 0.029, 0.034 ) размеры
call SetFrameTexture( Button6, "ReplaceableTextures\\CommandButtons\\BTNShopDic_Chaosomicon.blp", false )
call SetFramePoint( B6Funct, ANCHOR_CENTER, Button6, ANCHOR_CENTER, 0.00, 0.00 )
call SetFrameSize( B6Funct, 0.029, 0.034 ) Опять размеры шаманим
call SetFrameAbsolutePoint( FrameLead, ANCHOR_CENTER, 0.30, 0.17 )
call SetFrameSize( FrameLead, 0.10, 0.00 )
call SetFrameFont( FrameLead, "Fonts\\FRIZQT__.TTF", 0.010, 0 )
call SetFrameText( FrameLead, "|c00FF8000Лидерство|r("+I2S(UI_Lead[pn])+")" )
call SetFrameAbsolutePoint( FrameMastery, ANCHOR_CENTER, 0.36, 0.17 )
call SetFrameSize( FrameMastery, 0.10, 0.00 )
call SetFrameFont( FrameMastery, "Fonts\\FRIZQT__.TTF", 0.010, 0 )
call SetFrameText( FrameMastery, "|c00FF4646Мастерство|r("+I2S(UI_Mastery[pn])+")" )
call SetFrameAbsolutePoint( FrameMagic, ANCHOR_CENTER, 0.42, 0.17 )
call SetFrameSize( FrameMagic, 0.10, 0.00 )
call SetFrameFont( FrameMagic, "Fonts\\FRIZQT__.TTF", 0.010, 0 )
call SetFrameText( FrameMagic, "|c008000FFВорожба|r("+I2S(UI_Magic[pn])+")" )
call SetFrameAbsolutePoint( FrameCharisma, ANCHOR_CENTER, 0.48, 0.17 )
call SetFrameSize( FrameCharisma, 0.10, 0.00 )
call SetFrameFont( FrameCharisma, "Fonts\\FRIZQT__.TTF", 0.010, 0 )
call SetFrameText( FrameCharisma, "|c00FFFF00Харизма|r("+I2S(UI_Charisma[pn])+")" )
call SetFrameAbsolutePoint( FrameFire, ANCHOR_CENTER, 0.54, 0.17 )
call SetFrameSize( FrameFire, 0.10, 0.00 )
call SetFrameFont( FrameFire, "Fonts\\FRIZQT__.TTF", 0.008, 0 )
call SetFrameText( FrameFire, "|c00FF0000Огнекристалл|r("+I2S(UI_CDamage[pn])+")" )
endif
endfunction
local player pl = i
local integer pn = GetConvertedPlayerId(pl)
local unit un = udg_Hero[pn]
local location loc = GetRectCenter(survloc[pn])
local unit uv
local unit cp
local timer array tm
set tm[pn] = CreateTimer()
call ShowUnitAbility(un,'amov',false)
call TimerStart( tm[pn], 0.01, GetLocalPlayer() == pl, function Check ) Запускаем Check каждые 0.01 сек
if ( GetLocalPlayer() == pl ) then
Back создаем основу для последующих фреймов
call SetFrameAbsolutePoint( ButtonBackdrop, ANCHOR_CENTER, 0.4, 0.14 )
call SetFrameSize( ButtonBackdrop, 0.35, 0.04 ) размеры
call SetFrameTexture( ButtonBackdrop, "panel3.blp", false ) Чисто текстура
Button Создали кнопку, повторюсь что имя из fdf файла
call SetFrameAbsolutePoint( HeroButton, ANCHOR_CENTER, 0.25, 0.14 )
call SetFrameSize( HeroButton, 0.029, 0.034 ) размеры
call SetFrameTexture( HeroButton, Icon_Hero[int_player_hero[pn]], false ) Создали кнопку, повторюсь что имя из fdf файла
call SetFramePoint( HeroFunct, ANCHOR_CENTER, HeroButton, ANCHOR_CENTER, 0.00, 0.00 )
call SetFrameSize( HeroFunct, 0.029, 0.034 ) Опять размеры шаманим
call SetFrameAbsolutePoint( HeroFunct, ANCHOR_CENTER, 0.25, 0.14 )
Button
call SetFrameAbsolutePoint( FactionButton, ANCHOR_CENTER, 0.285, 0.14 )
call SetFrameSize( FactionButton, 0.029, 0.034 ) размеры
call SetFrameTexture( FactionButton, Icon_Frac[UI_FactionID[pn]], false ) Создали кнопку, повторюсь что имя из fdf файла
call SetFramePoint( FactFunct, ANCHOR_CENTER, FactionButton, ANCHOR_CENTER, 0.00, 0.00 )
call SetFrameSize( FactFunct, 0.029, 0.034 ) Опять размеры шаманим
Button
call SetFrameAbsolutePoint( Button3, ANCHOR_CENTER, 0.325, 0.14 )
call SetFrameSize( Button3, 0.029, 0.034 ) размеры
call SetFrameTexture( Button3, "ReplaceableTextures\\CommandButtons\\BTNBlueScroll.blp", false )// Создали кнопку, повторюсь что имя из fdf файла
call SetFramePoint( B3Funct, ANCHOR_CENTER, Button3, ANCHOR_CENTER, 0.00, 0.00 )
call SetFrameSize( B3Funct, 0.029, 0.034 ) Опять размеры шаманим
Button
call SetFrameAbsolutePoint( Button4, ANCHOR_CENTER, 0.355, 0.14 )
call SetFrameSize( Button4, 0.029, 0.034 ) размеры
call SetFrameTexture( Button4, "ReplaceableTextures\\CommandButtons\\BTNPurpleScroll.blp", false ) Создали кнопку, повторюсь что имя из fdf файла
call SetFramePoint( B4Funct, ANCHOR_CENTER, Button4, ANCHOR_CENTER, 0.00, 0.00 )
call SetFrameSize( B4Funct, 0.029, 0.034 ) Опять размеры шаманим
Button
call SetFrameAbsolutePoint( Button5, ANCHOR_CENTER, 0.385, 0.14 )
call SetFrameSize( Button5, 0.029, 0.034 ) размеры
call SetFrameTexture( Button5, "ReplaceableTextures\\CommandButtons\\BTNOrangeScroll.blp", false ) Создали кнопку, повторюсь что имя из fdf файла
call SetFramePoint( B5Funct, ANCHOR_CENTER, Button5, ANCHOR_CENTER, 0.00, 0.00 )
call SetFrameSize( B5Funct, 0.029, 0.034 ) Опять размеры шаманим
Button
call SetFrameAbsolutePoint( Button6, ANCHOR_CENTER, 0.415, 0.14 )
call SetFrameSize( Button6, 0.029, 0.034 ) размеры
call SetFrameTexture( Button6, "ReplaceableTextures\\CommandButtons\\BTNShopDic_Chaosomicon.blp", false )
call SetFramePoint( B6Funct, ANCHOR_CENTER, Button6, ANCHOR_CENTER, 0.00, 0.00 )
call SetFrameSize( B6Funct, 0.029, 0.034 ) Опять размеры шаманим
call SetFrameAbsolutePoint( FrameLead, ANCHOR_CENTER, 0.30, 0.17 )
call SetFrameSize( FrameLead, 0.10, 0.00 )
call SetFrameFont( FrameLead, "Fonts\\FRIZQT__.TTF", 0.010, 0 )
call SetFrameText( FrameLead, "|c00FF8000Лидерство|r("+I2S(UI_Lead[pn])+")" )
call SetFrameAbsolutePoint( FrameMastery, ANCHOR_CENTER, 0.36, 0.17 )
call SetFrameSize( FrameMastery, 0.10, 0.00 )
call SetFrameFont( FrameMastery, "Fonts\\FRIZQT__.TTF", 0.010, 0 )
call SetFrameText( FrameMastery, "|c00FF4646Мастерство|r("+I2S(UI_Mastery[pn])+")" )
call SetFrameAbsolutePoint( FrameMagic, ANCHOR_CENTER, 0.42, 0.17 )
call SetFrameSize( FrameMagic, 0.10, 0.00 )
call SetFrameFont( FrameMagic, "Fonts\\FRIZQT__.TTF", 0.010, 0 )
call SetFrameText( FrameMagic, "|c008000FFВорожба|r("+I2S(UI_Magic[pn])+")" )
call SetFrameAbsolutePoint( FrameCharisma, ANCHOR_CENTER, 0.48, 0.17 )
call SetFrameSize( FrameCharisma, 0.10, 0.00 )
call SetFrameFont( FrameCharisma, "Fonts\\FRIZQT__.TTF", 0.010, 0 )
call SetFrameText( FrameCharisma, "|c00FFFF00Харизма|r("+I2S(UI_Charisma[pn])+")" )
call SetFrameAbsolutePoint( FrameFire, ANCHOR_CENTER, 0.54, 0.17 )
call SetFrameSize( FrameFire, 0.10, 0.00 )
call SetFrameFont( FrameFire, "Fonts\\FRIZQT__.TTF", 0.008, 0 )
call SetFrameText( FrameFire, "|c00FF0000Огнекристалл|r("+I2S(UI_CDamage[pn])+")" )
endif
endfunction
Принятый ответ
Netherstorm, таймер однократный и многократный в jass считай разные обьекты, у одного игрока он тикает, у другого нет - игра такого не понимает.
И в целом что за подход, такие вещи делаются в триггере для всех сразу, 0.01 - 100 раз в сек, чет многовато. Ну и создавай обьекты для всех игроков разом, а локально пряч\показывай. Если кто то чето нажал, сообщи об этом всем остальным, к примеру выбором даммика или через кешь синхронизируй.
И в целом что за подход, такие вещи делаются в триггере для всех сразу, 0.01 - 100 раз в сек, чет многовато. Ну и создавай обьекты для всех игроков разом, а локально пряч\показывай. Если кто то чето нажал, сообщи об этом всем остальным, к примеру выбором даммика или через кешь синхронизируй.
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Ред. Netherstorm
Попробовал создать таймер под каждого игрока(массив), не сработало.
В действиях триггера проверяешь для каждого игрока позицию курсора и прочее, через sleepAdctions, и можешь кешем синхать или выбирать даммиков.
И в целом что за подход, такие вещи делаются в триггере для всех сразу, 0.01 - 100 раз в сек, чет многовато. Ну и создавай обьекты для всех игроков разом, а локально пряч\показывай. Если кто то чето нажал, сообщи об этом всем остальным, к примеру выбором даммика или через кешь синхронизируй.
Ред. Netherstorm
Но что я имею ввиду:
Общий таймер, две локалки(pl - player, num - integer) срабатываемый каждую 0.1 сек, в котором действие loop на проверку GetLocalPlayer() == Player(a).
Внутри этой проверки проверка на нажатие, проверка на кнопку.
Начальные значения: num - 0, player - Player(PLAYER_NEUTRAL_AGRESSIVE).
set num = 1
И так как кнопка нажата
set pl = Player(a).
if ( num == 1 ) then
Отправить сообщение(общее действие) pl 1 сообщение под номером 1