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

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

Ответ
 
tgonta
Pixelated Sora Coder
offline
Опыт: 3,160
Активность:
Фрагмент, провоцирующий дисконнект
Здравствуйте! У меня есть такая проблема - спустя 2 минуты дисконнектит игроков, когда отключаю нижеследующие триггеры, всё нормально, но без этих триггеров я обойтись не могу. Вот они:
Триггер 1

function AddEnergyPlayers takes nothing returns nothing
    if RectContainsCoords(gg_rct_Temple,GetUnitX(udg_Rusher[1]),GetUnitY(udg_Rusher[1])) then
        call SetPlayerState(Player(0),PLAYER_STATE_RESOURCE_LUMBER,GetPlayerState(Player(0),PLAYER_STATE_RESOURCE​_LUMBER) + 1) 
        call SetPlayerState(Player(0),PLAYER_STATE_LUMBER_GATHERED,GetPlayerState(Player(0),PLAYER_STATE_LUMBER_G​ATHERED) + 1)
    endif 
    if RectContainsCoords(gg_rct_Temple,GetUnitX(udg_Rusher[2]),GetUnitY(udg_Rusher[2])) then          
        call SetPlayerState(Player(1),PLAYER_STATE_RESOURCE_LUMBER,GetPlayerState(Player(1),PLAYER_STATE_RESOURCE​_LUMBER) + 1) 
        call SetPlayerState(Player(1),PLAYER_STATE_LUMBER_GATHERED,GetPlayerState(Player(1),PLAYER_STATE_LUMBER_G​ATHERED) + 1)
    endif
endfunction

function AddGoldPlayers takes nothing returns nothing
    local integer i = 0
    loop
        exitwhen i > 9
        call SetPlayerState(Player(i),PLAYER_STATE_RESOURCE_GOLD,GetPlayerState(Player(i),PLAYER_STATE_RESOURCE_G​OLD) + 1) 
        call SetPlayerState(Player(i),PLAYER_STATE_GOLD_GATHERED,GetPlayerState(Player(i),PLAYER_STATE_GOLD_GATHE​RED) + 1)
        set i = i + 1
    endloop
endfunction

function PeriodicSpawn takes nothing returns nothing
    if udg_RusherBoolean == true then
        // Íî÷üþ êðèïû áåãàòü íå äîëæíû, åñëè ðàøåðìîä âêëþ÷¸í.
        if GetFloatGameState(GAME_STATE_TIME_OF_DAY) >= 18.00 and GetFloatGameState(GAME_STATE_TIME_OF_DAY) <= 6.00 then
            return
        endif
    endif
    call TriggerExecute(gg_trg_CreepCreate)
endfunction

function TimersInit takes nothing returns nothing
    local timer array t
    set t[1] = CreateTimer()
    set t[2] = CreateTimer()
    if udg_RusherBoolean == true then
        set t[3] = CreateTimer()
        call TimerStart(t[3],1,true,function AddEnergyPlayers)
    endif
    call TimerStart(t[1],45,true,function PeriodicSpawn)
    call TimerStart(t[2],.75,true,function AddGoldPlayers)
    call TriggerSleepAction(45.)
    call StartSound(gg_snd_UtherReturns)
    call DisplayTextToPlayer(GetLocalPlayer(),0,0,"&#204;&#238;&#237;&#241;&#242;&am​p;#240;&#251; &#226;&#251;&#239;&#243;&#249;&#229;&#237;&#251;.")    
endfunction

//===========================================================================
function InitTrig_CreepFirstWave takes nothing returns nothing
    set gg_trg_CreepFirstWave = CreateTrigger()
    call TriggerAddAction(gg_trg_CreepFirstWave,function TimersInit)
endfunction  
Триггер 2

function Trig_RusherMultiboardUpdate_Conditions takes nothing returns boolean
    return GetSpellAbilityId() == 'A014' or GetSpellAbilityId() == 'A015'
endfunction

function RusherDominationReward takes nothing returns nothing
    local integer id = GetPlayerId(GetOwningPlayer(udg_SpellingRusher))
    call PauseUnit(udg_SpellingRusher,false)
    set udg_RushTimerStarted = false 
    set udg_RushInt[id] = udg_RushInt[id] + 1 
    if id == 0 then
        call MultiboardSetItemValue(MultiboardGetItem(udg_oad_mb,udg_oad_mb_spots[20],3),("|cFFFFE8A8" + I2S(udg_RushInt[id])) + "(5)") 
        if udg_RushInt[id] == 5 then
            call DisplayTextToPlayer(GetLocalPlayer(),0,0,"&#202;&#238;&#236;&#224;&#237;&am​p;#228;&#224; &#207;&#243;&#241;&#242;&#251;&#237;&#232; &#239;&#238;&#225;&#229;&#228;&#232;&#235;&#224;!")
        endif
    elseif id == 1 then
        call MultiboardSetItemValue(MultiboardGetItem(udg_oad_mb,udg_oad_mb_spots[21],3),("|cFFE1A8FF" + I2S(udg_RushInt[id])) + "(5)") 
        if udg_RushInt[id] == 5 then
            call DisplayTextToPlayer(GetLocalPlayer(),0,0,"&#202;&#238;&#236;&#224;&#237;&am​p;#228;&#224; &#206;&#224;&#231;&#232;&#241;&#224; &#239;&#238;&#225;&#229;&#228;&#232;&#235;&#224;!")
        endif
    endif  
endfunction

function Trig_RusherMultiboardUpdate_Actions takes nothing returns nothing
    local unit u = GetSpellAbilityUnit()
    local string color
    set udg_SpellingRusher = u
    if udg_RushTimerStarted == true then
        if u == udg_Rusher[1] then
            set color = "|cFFFFE8A8"
        elseif u == udg_Rusher[2] then
            set color = "|cFFE1A8FF"
        endif
        call DisplayTextToPlayer(GetOwningPlayer(u),0,0,color + "&#209;&#237;&#224;&#247;&#224;&#235;&#224; &#237;&#243;&#230;&#237;&#238; &#243;&#237;&#232;&#247;&#242;&#238;&#230;&#232;&#242;&#252;​ &#226;&#240;&#224;&#230;&#229;&#241;&#234;&#238;&#227;&#238;​ &#208;&#224;&#248;&#229;&#240;&#224;.")
        set u = null
        return
    endif
    call PauseUnit(udg_SpellingRusher,true)
    call TimerStart(udg_RusherTimer,10,false,function RusherDominationReward)
    set udg_RushTimerStarted = true    
    set u = null
endfunction

//===========================================================================
function InitTrig_RusherMultiboardUpdate takes nothing returns nothing
    set gg_trg_RusherMultiboardUpdate = CreateTrigger()
    call TriggerRegisterAnyUnitEventBJ(gg_trg_RusherMultiboardUpdate,EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddCondition(gg_trg_RusherMultiboardUpdate,Condition(function Trig_RusherMultiboardUpdate_Conditions))
    call TriggerAddAction(gg_trg_RusherMultiboardUpdate,function Trig_RusherMultiboardUpdate_Actions)
endfunction    
Как убрать эти дисконнекты? В чём их причина?
Старый 18.02.2010, 23:09
Anufis

offline
Опыт: 6,290
Активность:
Я не шарю, че у тебя тут написано, но попробуй закоментить эти строки и попробуй
call SetPlayerState(Player(0),PLAYER_STATE_LUMBER_GATHERED,GetPlayerState(Player(0),P LAYER_STATE_LUMBER_G​ATHERED) + 1)
call SetPlayerState(Player(1),PLAYER_STATE_LUMBER_GATHERED,GetPlayerState(Player(1),P LAYER_STATE_LUMBER_G​ATHERED) + 1)
all SetPlayerState(Player(i),PLAYER_STATE_GOLD_GATHERED,GetPlayerState(Player(i),PLA YER_STATE_GOLD_GATHE​RED) + 1)

Anufis добавил:
Вариант 2: закоменть вывод сообщений с getlocalplayer'ом
Старый 18.02.2010, 23:45
DioD

offline
Опыт: 45,134
Активность:
всё от русского языка в коде, его там быть не должно ни при каких условиях.
а вообще удалите ка call TriggerSleepAction(45.) и замените на таймер.
Старый 19.02.2010, 04:56
ZLOBICH
Kicked by XimikS
offline
Опыт: 4,727
Активность:
Диод врет, пророчу.
Старый 19.02.2010, 13:04
tgonta
Pixelated Sora Coder
offline
Опыт: 3,160
Активность:
Диод врёт, у меня раньше с этим всё работало)
Теперь 2 минуты прошло - и дисконнектит всех.
Старый 19.02.2010, 13:38
FellGuard
Losyash
offline
Опыт: 39,547
Активность:
Тогда надо подумать, что изменилось за эти 2 минуты, откатить и пошагово выявить причину.
Старый 19.02.2010, 13:41
YellowStar
poon
offline
Опыт: 15,144
Активность:
А я думал в сети getlocalplr , не под лок ифом ведет себя некоректно.
Старый 19.02.2010, 15:47
DioD

offline
Опыт: 45,134
Активность:
дело в том что убогий код может конфликтовать с другим убогим кодом, если этот код раньше работал дело явно не в нём.
Старый 19.02.2010, 16:08
Maxidial

offline
Опыт: 93
Активность:
Лучше реально пошагово коменть "подозреваемые триггеры" у меня так 1 раз из за неадекватного кода карта после запуска убивала игру:-D
Старый 06.03.2010, 22:55
agentex

offline
Опыт: 34,834
Активность:
call DisplayTextToPlayer(GetLocalPlayer(),0,0,"...")
причина в этом 100%. столкнулся однажды сам, теперь вывожу только циклом.
Старый 06.03.2010, 23:14
RazArt

offline
Опыт: 11,197
Активность:
Если agentex прав, а он почти всегда прав :D + если я ещё помню жасс замени своё быдлокодерство на это:

Код:
local integer n=0
loop
    exitwhen n<=11
    call DisplayTextToPlayer(Player(n),0,0,"...")
    set n=n+1
endloop

А ещё триггеры в проэкте есть?

thx за замечания х)

Отредактировано RazArt, 08.03.2010 в 10:52.
Старый 07.03.2010, 06:59
Doc

offline
Опыт: 63,163
Активность:
exitwhen n<=12
11 надо
И поправь пробел после set
DoctorGester добавил:
Player(15)
Player(n)
Старый 07.03.2010, 10:21
Ответ

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

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

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

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



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