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

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

Ответ
 
BizzaroFukuro
MWS Hardcore
offline
Опыт: 2,178
Активность:
Проблема с чатом и плавающим текстом
Возникла проблема с написанием чат-системы.

Суть системы в том, что вводимые игроков сообщения отображаются над его юнитом в игре в виде плавающего текста, прикреплённому к этому юниту. Однако в мультиплеере возникает какой-то баг, из-за которого сообщения появляются не над тем юнитом, над которым надо (а над юнитом другого игрока, даже если он мёртв). Это проявляется, только когда как минимум 2 игрока будут что-то писать с неизвестной скоростью или в неизвестные моменты времени...

Много раз тестировал, но так и не понял в чём может быть проблема.
Собственно ниже приводятся 2 триггера и сама карта.
Код:
function Trig_ChatSystem_Actions takes nothing returns nothing
  local string s = GetEventPlayerChatString()
  local player p = GetTriggerPlayer()
  local integer id = GetPlayerId(p)
  local integer l = StringLength(s)

  if GetUnitState(udg_victim[id],UNIT_STATE_LIFE)>0 then
    call SetTextTagVisibility(udg_LocalTexttag[id],false)

    set udg_LocalTexttag[id] = CreateTextTag()
    call SetTextTagText(udg_LocalTexttag[id],udg_H[id]+udg_PlayerName[id]+": |n|r"+s,TextTagSize2Height(8))
    call SetTextTagPosUnit(udg_LocalTexttag[id],udg_victim[id],0.00)
    call SetTextTagColorBJ(udg_LocalTexttag[id],100.0,100.0,100.0,0.0)

    call SetTextTagVelocityBJ(udg_LocalTexttag[id],0,0)
    call SetTextTagPermanent(udg_LocalTexttag[id],false)
    call SetTextTagFadepoint(udg_LocalTexttag[id],l*0.1)
    call SetTextTagLifespan(udg_LocalTexttag[id],3+l*0.1)
  endif

  set s = null
endfunction

//===========================================================================
function InitTrig_ChatSystem takes nothing returns nothing
    set gg_trg_ChatSystem = CreateTrigger()
    call TriggerRegisterPlayerChatEvent(gg_trg_ChatSystem, Player(0), "", false)
    call TriggerRegisterPlayerChatEvent(gg_trg_ChatSystem, Player(1), "", false)
    call TriggerRegisterPlayerChatEvent(gg_trg_ChatSystem, Player(2), "", false)
    call TriggerRegisterPlayerChatEvent(gg_trg_ChatSystem, Player(3), "", false)
    call TriggerRegisterPlayerChatEvent(gg_trg_ChatSystem, Player(4), "", false)
    call TriggerRegisterPlayerChatEvent(gg_trg_ChatSystem, Player(5), "", false)
    call TriggerRegisterPlayerChatEvent(gg_trg_ChatSystem, Player(6), "", false)
    call TriggerRegisterPlayerChatEvent(gg_trg_ChatSystem, Player(7), "", false)
    call TriggerRegisterPlayerChatEvent(gg_trg_ChatSystem, Player(8), "", false)
    call TriggerRegisterPlayerChatEvent(gg_trg_ChatSystem, Player(9), "", false)
    call TriggerRegisterPlayerChatEvent(gg_trg_ChatSystem, Player(10), "", false)
    call TriggerRegisterPlayerChatEvent(gg_trg_ChatSystem, Player(11), "", false)
    call TriggerAddAction(gg_trg_ChatSystem, function Trig_ChatSystem_Actions)
endfunction

Код:
function Trig_ChatMoveTexttags_Actions takes nothing returns nothing
  local integer i = 0
  loop
  exitwhen i > 11
    call SetTextTagPosUnit(udg_LocalTexttag[i],udg_victim[i],0)
  set i = i + 1
  endloop
endfunction

//===========================================================================
function InitTrig_ChatMoveTexttags takes nothing returns nothing
    set gg_trg_ChatMoveTexttags = CreateTrigger(  )
    call TriggerRegisterTimerEventPeriodic( gg_trg_ChatMoveTexttags, 0.02 )
    call TriggerAddAction( gg_trg_ChatMoveTexttags, function Trig_ChatMoveTexttags_Actions )
endfunction
Прикрепленные файлы
Тип файла: w3x ChatSystem v1.01.w3x (21.2 Кбайт, 12 просмотров )
Старый 15.07.2010, 14:08
bee
vjass.optimizer
offline
Опыт: 16,615
Активность:
возможно, ячейка юнитов у тебя начинается не с 0, а с 1.
Старый 15.07.2010, 15:25
BizzaroFukuro
MWS Hardcore
offline
Опыт: 2,178
Активность:
bee,
>.<
...
с этим всё правильно и это здесь не причем
Старый 15.07.2010, 15:56
Icy
Это Я!
offline
Опыт: 1,785
Активность:
Чтобы сообщение не появлялось на трупах: if GetUnitState(udg_victim[id],UNIT_STATE_LIFE)>0.5 then
П.С: Точное значение жизни при которой юнит умирает не помню, но помню что больше 0.4 и меньше 0.5
А появляются хз где сообщения наверное из-за этого: exitwhen i > 11, ты должен либо проверять игрока в игре, либо создать массив в котором содержатся только играющие игроки и уже по нему проходиться до <кол-во играющих>
П.С: точно не знаю почему вар себя так ведёт, когда работает с несуществующей ячейкой, но есть предположение, что он либо убивает поток с ошибкой, либо движковые ссылки смешиваются из-за ошибки. Да, и чуть не забыл, есть один косяк у тебя "set udg_LocalTexttag[id] = CreateTextTag()", ты создаешь текстаг каждый раз, когда кто то пишет в чат, проверяй на наличие существующего текста в ячейке(метод "КРИВОЙ РУКИ и ПОПЫ") или же заранее создавать по тексту на каждого играющего игрока(тру метод)
Старый 15.07.2010, 17:36
BizzaroFukuro
MWS Hardcore
offline
Опыт: 2,178
Активность:
Цитата:
Сообщение от Icy
есть один косяк у тебя "set udg_LocalTexttag[id] = CreateTextTag()", ты создаешь текстаг каждый раз, когда кто то пишет в чат
Хм.. попробую твой способ.
(но сомневаюсь что поможет)
Старый 15.07.2010, 18:14
JassMan
свободен
offline
Опыт: 4,193
Активность:
if(GetWidgetLife(udg_victim[id])>0.405)then
Старый 15.07.2010, 18:45
Icy
Это Я!
offline
Опыт: 1,785
Активность:
~JassMan, точно =)

хм... сейчас проверил и действительно, текстаг нада создавать при самом событии, да и видимо он сам уничтожается, а не просто скрывается функцией Лайфспан

Сори за дезинформацию.

Код:
function Trig_ChatSystem_Actions takes nothing returns nothing
  local string s = GetEventPlayerChatString()
  local player p = GetTriggerPlayer()
  local integer id = GetPlayerId(p)
  local integer l = StringLength(s)

  if GetUnitState(udg_victim[id],UNIT_STATE_LIFE)>0.405 then
    set udg_LocalTexttag[i] = CreateTextTag()
    call SetTextTagText(udg_LocalTexttag[id],udg_H[id]+udg_PlayerName[id]+": |n|r"+s,TextTagSize2Height(8))
    //call SetTextTagPosUnit(udg_LocalTexttag[id],udg_victim[id],0.00) // это никчему, периодик тригер сам установит позицию

    call SetTextTagColorBJ(udg_LocalTexttag[id],100.0,100.0,100.0,0.0)
    call SetTextTagVelocityBJ(udg_LocalTexttag[id],0,0)
    call SetTextTagPermanent(udg_LocalTexttag[id],false)
    call SetTextTagFadepoint(udg_LocalTexttag[id],l*0.1)
    call SetTextTagLifespan(udg_LocalTexttag[id],3+l*0.1)
  endif

  set s = null
endfunction

//===========================================================================
function InitTrig_ChatSystem takes nothing returns nothing
  set gg_trg_ChatSystem = CreateTrigger()
  call TriggerRegisterPlayerChatEvent(gg_trg_ChatSystem, Player(0), "", false)
  call TriggerRegisterPlayerChatEvent(gg_trg_ChatSystem, Player(1), "", false)
  call TriggerRegisterPlayerChatEvent(gg_trg_ChatSystem, Player(2), "", false)
  call TriggerRegisterPlayerChatEvent(gg_trg_ChatSystem, Player(3), "", false)
  call TriggerRegisterPlayerChatEvent(gg_trg_ChatSystem, Player(4), "", false)
  call TriggerRegisterPlayerChatEvent(gg_trg_ChatSystem, Player(5), "", false)
  call TriggerRegisterPlayerChatEvent(gg_trg_ChatSystem, Player(6), "", false)
  call TriggerRegisterPlayerChatEvent(gg_trg_ChatSystem, Player(7), "", false)
  call TriggerRegisterPlayerChatEvent(gg_trg_ChatSystem, Player(8), "", false)
  call TriggerRegisterPlayerChatEvent(gg_trg_ChatSystem, Player(9), "", false)
  call TriggerRegisterPlayerChatEvent(gg_trg_ChatSystem, Player(10), "", false)
  call TriggerRegisterPlayerChatEvent(gg_trg_ChatSystem, Player(11), "", false)
  call TriggerAddAction(gg_trg_ChatSystem, function Trig_ChatSystem_Actions)
endfunction


Код:
function Trig_ChatMoveTexttags_Actions takes nothing returns nothing
  local integer i = 0

  loop
    exitwhen i > 11

    if GetPlayerSlotState(Player(i)) == PLAYER_SLOT_STATE_PLAYING then
      call SetTextTagPosUnit(udg_LocalTexttag[i], udg_victim[i], 0)
    endif

    set i = i + 1
  endloop

endfunction

//===========================================================================
function InitTrig_ChatMoveTexttags takes nothing returns nothing
    set gg_trg_ChatMoveTexttags = CreateTrigger(  )
    call TriggerRegisterTimerEventPeriodic( gg_trg_ChatMoveTexttags, 0.02 )
    call TriggerAddAction( gg_trg_ChatMoveTexttags, function Trig_ChatMoveTexttags_Actions )
endfunction

Отредактировано Icy, 15.07.2010 в 19:29.
Старый 15.07.2010, 19:11
BizzaroFukuro
MWS Hardcore
offline
Опыт: 2,178
Активность:
Не знаю, где вы нахватались бреда про 0.405, но причина всё равно не в этом.

Система заработала только когда я создал массив тексттагов 1 раз при инициализации и использовал их (пришлось погеморроиться с фейдом). Почему не работал первичный вариант (в первом посте), для меня всё равно остаётся загадкой до сих пор.

Теперь возник другой вопрос: иногда у тексттага пропадает чёрная тень под ним, как её вернуть?
Старый 22.07.2010, 13:09
Ответ

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

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

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

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



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