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

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

Закрытая тема
 
CeDiL
Pinkie <3
offline
Опыт: 2,092
Активность:
Desync
Десинжронизация. Тоесть Дисконнект некоторых игроков при использовании GetLocalPlayer() помогите решить проблему и посоветуйте как можно и как нельзя делать. Вот Триггеры где использовал.

Код:
scope HeroSelection initializer InitHeroSelection

function HeroCreation takes player p, integer id returns nothing
set PlayerHeroes[GetPlayerId(p)] = CreateUnit(p,id, -400,1800, 45)
    if GetLocalPlayer() == p then
    call ClearSelection()
    call SelectUnit(PlayerHeroes[GetPlayerId(p)], true)
    call SetCameraPosition(-400,1800)
    call SetCameraBounds(-288.0, 768.0, -288.0, 2016.0, 992.0, 2016.0, 992.0, 768.0)
     if IsPlayerInForce(GetLocalPlayer(), Binders) then
      call DisplayTimedTextToPlayer(GetLocalPlayer(), 0, 0, 10, GetPlayerNameColored(p)+"|cff5F9EA0"+" has chosen the "+GetObjectName(id)+"."+"|r")
     endif
    endif
endfunction

function HeroRepickActions  takes nothing returns nothing
local player p = GetTriggerPlayer()
if PlayerHeroes[GetPlayerId(p)] != null then
call RemoveUnit(PlayerHeroes[GetPlayerId(p)])
if GetLocalPlayer() == p then
call SetCameraBounds(-3392.0, 1760.0, -3392.0, 1760.0, -2880.0, 2400.0, -2880.0, 1760.0)
call SetCameraPosition(-3100,2000)
set PlayerHeroes[GetPlayerId(p)] = null
endif
else 
set p = null
return  
endif
set p = null
endfunction

function HeroRandomActions takes nothing returns nothing
if PlayerHeroes[GetPlayerId(GetTriggerPlayer())] == null then
call HeroCreation(GetTriggerPlayer(), HeroId[GetRandomInt(0, 5)])
else 
return  
endif
endfunction

function HeroSelectActions takes nothing returns nothing
call HeroCreation(GetOwningPlayer(GetSoldUnit()), GetUnitTypeId(GetSoldUnit()))
call RemoveUnit(GetSoldUnit())
endfunction

function RemoveHeroSelection takes nothing returns nothing
local integer i = 0
call TimerDialogDisplay(TempTimerDialog, false)
set TempTimerDialog = null
call ReleaseTimer(TempTimer)
loop
exitwhen i>3
if PlayerHeroes[i] == null and IsPlayerInForce(Player(i), Binders) then
call HeroCreation(Player(i), HeroId[GetRandomInt(0, 5)])
endif
set i=i+1
endloop
call DisableTrigger(Repick)
call DisableTrigger(Random)
call DisableTrigger(HeroSelect)
call DestroyTrigger(Repick)
call DestroyTrigger(Random)
call DestroyTrigger(HeroSelect)
endfunction

function HeroSelectionTimer takes nothing returns nothing
set TempTimer = NewTimer()
set TempTimerDialog = CreateTimerDialog(TempTimer)
call TimerDialogSetTitle(TempTimerDialog, "Choose a hero.")
call TimerDialogDisplay(TempTimerDialog, true)
call TimerStart(TempTimer, 45, false, function RemoveHeroSelection)
endfunction
//===========================================================================
function InitHeroSelection takes nothing returns nothing
    local trigger tr = CreateTrigger()
    local integer i = 0
    set HeroSelect = CreateTrigger()
    set Repick = CreateTrigger()
    set Random = CreateTrigger()
    call TriggerRegisterTimerEvent(tr, 0.2, false)
    call TriggerAddAction(tr, function HeroSelectionTimer)
    call TriggerRegisterAnyUnitEventBJ( HeroSelect, EVENT_PLAYER_UNIT_SELL)
    call TriggerAddAction( HeroSelect, function HeroSelectActions )
    loop 
    exitwhen i>3
    call TriggerRegisterPlayerChatEvent( Random, Player(i), "-random", true)
    call TriggerRegisterPlayerChatEvent( Repick, Player(i), "-repick", true)
    set i = i+1
    endloop
    call TriggerAddAction( Random, function HeroRandomActions)
    call TriggerAddAction( Repick, function HeroRepickActions)
endfunction
endscope


Код:
scope GameStart initializer InitGameStart

function GameStartActions takes nothing returns nothing
    if IsPlayerInForce(GetLocalPlayer(), Binders) then 
    call DisplayTimedTextToPlayer(GetLocalPlayer(), 0, 0, 45.0, "|cff5F9EA0"+"Welcome to Binders!"+"|r")
    call DisplayTimedTextToPlayer(GetLocalPlayer(), 0, 0, 45.0, "|cff5F9EA0"+"You have 45 seconds to select a hero."+"|r")
    call SetCameraBounds(-3392.0, 1760.0, -3392.0, 1760.0, -2880.0, 2400.0, -2880.0, 1760.0)
    endif
    call FogEnable(false)
    call FogMaskEnable(false)
    endfunction
//===========================================================================
function InitGameStart takes nothing returns nothing
    local trigger tr = CreateTrigger()
    call TriggerRegisterTimerEvent(tr, 0.1, false)
    call TriggerAddAction(tr,function GameStartActions )
endfunction
endscope


И всё вроде ... только эти 2 триггера. Один решает вопросы выбора героев из таверны а другой просто пишет бурду в начале, Группа "Binders" имеет всех активных игроков внутри. а PlayerHeroes[0..3] это герои всех игроков с 0 до 3(первый до 4го). HeroId[GetRandomInt(0, 5)] тоже настроенны хотя число 2 не выдаётся никогда(10000 раз пробовал).
П.С: Если есть проблемки с тригером то напишите.
Старый 22.03.2011, 21:10
spellwerk

offline
Опыт: 4,869
Активность:
где отладочные сообщения?
     if IsPlayerInForce(GetLocalPlayer(), Binders) then
      call DisplayTimedTextToPlayer(GetLocalPlayer(), 0, 0, 10, GetPlayerNameColored(p)+"|cff5F9EA0"+" has chosen the "+GetObjectName(id)+"."+"|r")
     endif
     if IsPlayerInForce(p, Binders) then
      call DisplayTimedTextToPlayer(p, 0, 0, 10, GetPlayerNameColored(p)+"|cff5F9EA0"+" has chosen the "+GetObjectName(id)+"."+"|r")
     endif
Старый 22.03.2011, 21:22
Doc

offline
Опыт: 63,163
Активность:
 call DisplayTimedTextToPlayer(GetLocalPlayer(), 0, 0, 10, GetPlayerNameColored(p)+"|cff5F9EA0"+" has chosen the "+GetObjectName(id)+"."+"|r")
атата, используй нужного игрока, бывают десинки.
А проблема собсно тут:
if GetLocalPlayer() == p then
call SetCameraBounds(-3392.0, 1760.0, -3392.0, 1760.0, -2880.0, 2400.0, -2880.0, 1760.0)
call SetCameraPosition(-3100,2000)
set PlayerHeroes[GetPlayerId(p)] = null
endif
Предпоследня строка, локально ставишь переменную => проверка проходит локально => юнит создается локально.
Старый 22.03.2011, 21:23
CeDiL
Pinkie <3
offline
Опыт: 2,092
Активность:
Чтото типо этого? для второго триггера тут норма?
Код:
function GameStartActions takes nothing returns nothing
local integer i = 0
loop
 exitwhen i>3
    if IsPlayerInForce(Player(i), Binders) then 
    call DisplayTimedTextToPlayer(Player(i), 0, 0, 45.0, "|cff5F9EA0"+"Welcome to Binders!"+"|r")
    call DisplayTimedTextToPlayer(Player(i), 0, 0, 45.0, "|cff5F9EA0"+"You have 45 seconds to select a hero."+"|r")
    set i = i+1
    endloop
    if IsPlayerInForce(GetLocalPlayer(), Binders) then
    call SetCameraBounds(-3392.0, 1760.0, -3392.0, 1760.0, -2880.0, 2400.0, -2880.0, 1760.0)
    endif
    call FogEnable(false)
    call FogMaskEnable(false)
    endfunction


CeDiL добавил:
Осталось только Репик Функцию подправить, сейчас подумаю как.

CeDiL добавил:
Doc, А так?
Код:
function HeroRepickActions  takes nothing returns nothing
local player p = GetTriggerPlayer()
if PlayerHeroes[GetPlayerId(p)] != null then
call RemoveUnit(PlayerHeroes[GetPlayerId(p)])
set PlayerHeroes[GetPlayerId(p)] = null
if GetLocalPlayer() == p then
call SetCameraBounds(-3392.0, 1760.0, -3392.0, 1760.0, -2880.0, 2400.0, -2880.0, 1760.0)
call SetCameraPosition(-3100,2000)
endif
else 
set p = null
return  
endif
set p = null
endfunction


CeDiL добавил:
Всё понял как работает GetLocalPlayer и что такое десинки, большое спасибо! Вроде сейчас всё хорошо идёт.

Отредактировано CeDiL, 22.03.2011 в 22:39.
Старый 22.03.2011, 22:55
Закрытая тема

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

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

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

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



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