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


[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: PUVer, SirNikolas, Ty3uK  
Форум о Warcraft 3 » Раздел для картостроителей » GUI / Jass » [Вопрос] GetLocalPlayer() (выдаёт лаги?)
[Вопрос] GetLocalPlayer()
FatalBladeДата: Среда, 28 Марта 2012, 18:48:57 | Сообщение # 1
10 уровень
Группа: Проверенные
Сообщений: 1523
Награды: 0
Репутация: 439
Блокировки:
После триггерного добавления/удаления способностей герою, при использование вот этого кода:

Code
    if GetLocalPlayer() == GetOwningPlayer(u) then
         call ClearSelection()
         call SelectUnit( u, true )
     endif


Игра подвисает на пол секунды. Хотя это не первый раз когда герой триггерно выбирается подобным образом. Я даже проверил через таймер, то есть выбор юнита я сделал через 5 сек после добавление способностей, и лаг происходит именно через 5 сек, то есть именно во время выбора героя. Причём даже не триггерного... Даже если вручную выбираю героя, лаг происходит. Почему?


 

SirNikolasДата: Среда, 28 Марта 2012, 18:54:36 | Сообщение # 2
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
Потому что это происходит впервые.
Code
call RemoveUnit(CreateUnit(Player(15), <ID героя>, .0, .0, .0))
Советую так делать практически со всеми героями и дамми.


 

FatalBladeДата: Среда, 28 Марта 2012, 21:23:26 | Сообщение # 3
10 уровень
Группа: Проверенные
Сообщений: 1523
Награды: 0
Репутация: 439
Блокировки:
Quote (SirNikolas)
Потому что это происходит впервые.

Quote (FatalBlade)
Хотя это не первый раз когда герой триггерно выбирается подобным образом.

:)

Quote (SirNikolas)
Советую так делать практически со всеми героями и дамми.

Уже делается со всеми дамми и юнитами. С героями правда не делается, но поидее если герой является изменённым стандартным юнитом то лагать вообще не должно при его создании. И...
Quote (FatalBlade)
это не первый раз когда герой триггерно выбирается подобным образом.

Добавлено (28 Март 2012, 21:23:26)
---------------------------------------------

Quote (SirNikolas)
Советую так делать практически со всеми героями и дамми.

Сделал так же с героями. Ничего не изменилось.


 

SirNikolasДата: Четверг, 29 Марта 2012, 07:12:05 | Сообщение # 4
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
Что у нас на событии "Unit selected"?

 

FatalBladeДата: Четверг, 29 Марта 2012, 14:37:49 | Сообщение # 5
10 уровень
Группа: Проверенные
Сообщений: 1523
Награды: 0
Репутация: 439
Блокировки:
Quote (SirNikolas)
Что у нас на событии "Unit selected"?

Вот это
Code
function Trig_Selection_Conditions takes nothing returns boolean
      return IsUnitType(GetTriggerUnit(), UNIT_TYPE_STRUCTURE) == true and GetUnitTypeId(GetTriggerUnit()) != 'n001'
endfunction

function Trig_Selection_Actions takes nothing returns nothing
      local player p = GetTriggerPlayer()
      local unit u = GetTriggerUnit()
      local player pu = GetOwningPlayer(u)
      local unit up
      local integer ut = GetUnitTypeId(u)

      if p != pu then
          set up = LoadUnitHandle(udg_Hash, GetUnitTypeId(u), GetPlayerId(p) + LoadInteger(udg_Hash, GetHandleId(u), 0))
          if GetLocalPlayer() == p then
              call ClearSelection()
              call SelectUnit( up, true )
          endif
        elseif p == pu and ut == 'ngme' then
          set up = LoadUnitHandle(udg_Hash, GetHandleId(u), 0)
          if GetLocalPlayer() == p then
              call ClearSelection()
              call SelectUnit( up, true )
          endif
      endif

      set p = null
      set pu = null
      set u = null
      set up = null
endfunction

//===========================================================================
function InitTrig_Selection takes nothing returns nothing
      local integer i = 0
      set gg_trg_Selection = CreateTrigger(  )
      loop
        exitwhen i > 9
          call TriggerRegisterPlayerUnitEvent( gg_trg_Selection, Player(i), EVENT_PLAYER_UNIT_SELECTED, null )
          set i = i + 1
      endloop
      call TriggerAddCondition( gg_trg_Selection, Condition( function Trig_Selection_Conditions ) )
      call TriggerAddAction( gg_trg_Selection, function Trig_Selection_Actions )
endfunction


Добавлено (29 Март 2012, 14:37:49)
---------------------------------------------
Но оно лагает только в одном единственном случае, о котором я писал выше. И да, только первый раз. Но это не первый раз когда герой триггерно выбирается.
Да и кроме того, условие сразу отсеивает дальнейшие действия этого триггера, так как герои не являются Зданиями.)




Сообщение отредактировал FatalBlade - Четверг, 29 Марта 2012, 14:41:10
 

SirNikolasДата: Четверг, 29 Марта 2012, 14:45:59 | Сообщение # 6
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
Code
loop
    if p != pu then
        set up = LoadUnitHandle(udg_Hash, GetUnitTypeId(u), GetPlayerId(p) + LoadInteger(udg_Hash, GetHandleId(u), 0))
    else
        exitwhen ut != 'ngme'
        set up = LoadUnitHandle(udg_Hash, GetHandleId(u), 0)
    endif
    if GetLocalPlayer() == p then
        call ClearSelection()
        call SelectUnit( up, true )
    endif
    exitwhen true
endloop
set p = null
set pu = null
set u = null
set up = null
Но это так, мелочи.

Может, просто выполнить эти действия при ините? :)


 

FatalBladeДата: Четверг, 29 Марта 2012, 14:50:05 | Сообщение # 7
10 уровень
Группа: Проверенные
Сообщений: 1523
Награды: 0
Репутация: 439
Блокировки:
Quote (SirNikolas)
Но это так, мелочи.

Ладно я понял) Но зачем циклом???

Quote (SirNikolas)
Может, просто выполнить эти действия при ините? :)

Ты о чём? Это же реакция на событие Юнит Выбран.


 

ImpregnableДата: Четверг, 29 Марта 2012, 15:03:20 | Сообщение # 8
6 уровень
Группа: Проверенные
Сообщений: 231
Награды: 0
Репутация: 92
Блокировки:
Есть подозрение, что при выборе юнита SelectUnit запускается триггер gg_trg_Selection, и это приводит к бесконечному циклу.

Если долго мучиться, то может,
все равно нихуя не получится.
 

SirNikolasДата: Четверг, 29 Марта 2012, 15:08:10 | Сообщение # 9
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
Quote (FatalBlade)
Но зачем циклом???
Поскольку Близзарды не предоставили нам оператор goto, приходится извращаться таким образом. В любом случае цикл выполнится только один раз. Вместо "exitwhen ut != 'ngme'" я мог бы написать "if ut != 'ngme' { return }", но тогда бы не обнулились переменные.


 

FatalBladeДата: Четверг, 29 Марта 2012, 15:18:12 | Сообщение # 10
10 уровень
Группа: Проверенные
Сообщений: 1523
Награды: 0
Репутация: 439
Блокировки:
Quote (Impregnable)
Есть подозрение, что при выборе юнита SelectUnit запускается триггер gg_trg_Selection

Триггер то да, запускается, но он сразу же отсеивается условием, если выбранный юнит - не здание. А в данном случае, лаг происходит именно с героями
, и только после того как все 3 спелла были выбраны.

Как это у меня работает? Обьясню. Игрок выбирает героя в монументе (аналог таверны). Появляется герой, и появляется дамми с 9-ю способностями пустышками, из которых герою выбирается 3. Это его спеллы, которые выбрал игрок. Но не в этом суть....
Как только появляется герой, он выбирается для игрока, триггерно. Лага НЕТУ!!! Раз выбирается 3 из 9 спеллов, то я сделал что после 3-го спелла которого выбрал герой, удаляется дамми, и выбирается герой. Не важно, выбирается ли герой триггерно, или в ручную в игре, лаг всё равно происходит. Хотя герой уже был выбран ранее, при его создание (выборе в таверне).

Quote (Impregnable)
и это приводит к бесконечному циклу.

Но тогда это должен быть постоянный лаг. То есть начнётся лаг и всё, варик краш, или фатал. А тут на полсекунды.

Добавлено (29 Март 2012, 15:18:12)
---------------------------------------------

Quote (SirNikolas)
goto

return
или же просто триггерно запустить другой триггер/функцию


 

ImpregnableДата: Четверг, 29 Марта 2012, 15:24:40 | Сообщение # 11
6 уровень
Группа: Проверенные
Сообщений: 231
Награды: 0
Репутация: 92
Блокировки:
Если можешь вырезать все ... постороннее из свой карты, то кидай сюда. Надоело уже гадать.

Если долго мучиться, то может,
все равно нихуя не получится.
 

FatalBladeДата: Четверг, 29 Марта 2012, 15:31:59 | Сообщение # 12
10 уровень
Группа: Проверенные
Сообщений: 1523
Награды: 0
Репутация: 439
Блокировки:
Quote (Impregnable)
Если можешь вырезать все ... постороннее из свой карты,

Не могу эт долго очень)

Но факт в том, что триггер который я только что выложил - единственный триггер который срабатывает на собтие Юнит Выбран. Как он может запустить бесконечный цикл, если в самом триггере нету циклов?


 

ImpregnableДата: Четверг, 29 Марта 2012, 15:43:25 | Сообщение # 13
6 уровень
Группа: Проверенные
Сообщений: 231
Награды: 0
Репутация: 92
Блокировки:
Цикл - многократное, последовательное выполнение одних и тех же действий, а не loop;endloop.
Насколько я понял лаг где-то в начале игры и всего 1 раз. Думаю можно признать, что он тебя победил и спокойно доделывать карту.


Если долго мучиться, то может,
все равно нихуя не получится.
 

FatalBladeДата: Четверг, 29 Марта 2012, 15:48:37 | Сообщение # 14
10 уровень
Группа: Проверенные
Сообщений: 1523
Награды: 0
Репутация: 439
Блокировки:
Quote (Impregnable)
Насколько я понял лаг где-то в начале игры и всего 1 раз.

Ну это зависит от игрока. Игрок может и не сразу выбрать все 3 спелла. Играть можно даже не выбрав не одного спелла. Никто конечно затягивать с этим не будет. Мне то лаг особо не мешает, но вот у людей со слабыми компами этот лаг будет не пол секунды, а например полторы.

Quote (Impregnable)
Думаю можно признать, что он тебя победил и спокойно доделывать карту.

:D


 

Форум о Warcraft 3 » Раздел для картостроителей » GUI / Jass » [Вопрос] GetLocalPlayer() (выдаёт лаги?)
  • Страница 1 из 1
  • 1
Поиск:

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