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

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

Ответ
 
alexprey
познающий Unity
offline
Опыт: 68,501
Активность:
Имя для героя
О чем наработка?
Вы вводите в чате имя своего героя, оно появляется над ним. Если имя было введено, то над героем выводится что ты написал.
Плюсы:
+ Можно использовать для мультиплеера
+ Инициализируется 1 строчкой
+ Идет на всех версиях вара
+ Обсолютно без утечек
Установка:
Копируем этот код в кустом скрипт карты, создаем 3 массивных переменные: u - юнит, name - строка, tt - плавающий текст и 1 логическую переменную isdestroy(она нужна для настройки системы)
Если вы хотите чтобы то что вы писали в чате отображалось над героем, то поставьте этой переменной значение "да"(Истина, true), тогда триггер удалится, после выбора юнита.
Так же создайте триггер otheractions, и там пишите что вам нужно, он сработает после того как любой игрок выберет себе имя.
» Код новой системы

Код:
function MoveName takes nothing returns nothing
 local integer i = 1
 loop
  exitwhen i > 12
  if udg_tt[i] != null then
   call SetTextTagPosUnit(udg_tt[i],udg_u[i],0)
  endif
  set i = i + 1
 endloop
 set i = 0
endfunction
function CreateName takes nothing returns nothing
 local integer pid = GetPlayerId(GetTriggerPlayer()) + 1
 if udg_name[pid] == "" then
  if GetEventPlayerChatString() != "" then
   set udg_name[pid] = GetEventPlayerChatString()
   set udg_tt[pid] = CreateTextTag()
   call SetTextTagText(udg_tt[pid],"|c00FF0000"+udg_name[pid]+"|r",10 * 0.023 / 10)
   call SetTextTagPosUnit(udg_tt[pid],udg_u[pid],0)
   call DisplayTextToPlayer(GetTriggerPlayer(),1,1,"|c0000FF00Имя принято|r")
   call PauseUnit(udg_u[pid],false)
   call TriggerExecute(gg_trg_otheractions)
   if udg_isdestroy then
    call DestroyTrigger(GetTriggeringTrigger())
   endif
  else
    call DisplayTextToPlayer(GetTriggerPlayer(),1,1,"|c00FF0000Имя не должно быть пустым|r")
  endif
 else
  call SetTextTagText(udg_tt[pid],"|c00FF0000"+udg_name[pid]+"|r: "+GetEventPlayerChatString(),10 * 0.023/10)
  call TriggerSleepAction(10)
  call SetTextTagText(udg_tt[pid],"|c00FF0000"+udg_name[pid]+"|r",10 * 0.023 / 10)
 endif
 set pid = 0
endfunction
function InitTT takes nothing returns nothing
 local timer t = CreateTimer()
 call TimerStart(t,0.01,true,function MoveName)
 set t = null
endfunction
function InitNameForPlayer takes integer id returns nothing
 local trigger t = CreateTrigger()
 local player p = Player(id-1)
 call PauseUnit(udg_u[id],true)
 call DisplayTextToPlayer(p,1,1,"|c00FF8000Введите имя|r")
 call TriggerRegisterPlayerChatEvent( t, p, "", true )
 call TriggerAddAction(t,function CreateName)
 set t = null
endfunction


» Код старой системы

- ненужна переменная isdestroy
- ненужен триггер otheractions
Код:
function MoveName takes nothing returns nothing 
  local integer i = 1 
  loop 
   exitwhen i > 12 
   if udg_tt[i] != null then 
    call SetTextTagPosUnit(udg_tt[i],udg_u[i],0) 
   endif 
   set i = i + 1 
  endloop 
  set i = 0 
endfunction 
function CreateName takes nothing returns nothing 
  local integer pid = GetPlayerId(GetTriggerPlayer()) + 1 
  if udg_name[pid] == "" then 
   if GetEventPlayerChatString() != "" then 
    set udg_name[pid] = GetEventPlayerChatString() 
    set udg_tt[pid] = CreateTextTag() 
    call SetTextTagText(udg_tt[pid],"|c00FF0000"+udg_name[pid]+"|r",10 * 0.023 / 10) 
    call SetTextTagPosUnit(udg_tt[pid],udg_u[pid],0) 
    call DisplayTextToPlayer(GetTriggerPlayer(),1,1,"|c0000FF00Имя принято|r") 
   else 
     call DisplayTextToPlayer(GetTriggerPlayer(),1,1,"|c00FF0000Имя не должно быть пустым|r") 
   endif 
  else 
   call SetTextTagText(udg_tt[pid],"|c00FF0000"+udg_name[pid]+"|r: "+GetEventPlayerChatString(),10 * 0.023/10) 
   call TriggerSleepAction(10) 
   call SetTextTagText(udg_tt[pid],"|c00FF0000"+udg_name[pid]+"|r",10 * 0.023 / 10) 
  endif 
  set pid = 0 
endfunction 
function InitTT takes nothing returns nothing 
  local timer t = CreateTimer() 
  call TimerStart(t,0.01,true,function MoveName) 
  set t = null 
endfunction 
function InitNameForPlayer takes integer id returns nothing 
  local trigger t = CreateTrigger() 
  local player p = Player(id-1) 
  call DisplayTextToPlayer(p,1,1,"|c00FF8000Введите имя|r") 
  call TriggerRegisterPlayerChatEvent( t, p, "", true ) 
  call TriggerAddAction(t,function CreateName) 
  set t = null 
endfunction


В инициализации карты ставим код
Код:
call InitTT ()

Запуск:
Там где надо будет задать имя указываем в переменной u юнита, для которого выбираем имя, id массива - это номер игрока(начиная с 1)
затем после этого ставим код
Код:
call InitNameForPlayer(id)

вместо id - номер игрока(начиная с 1)
все очень просто))))!
Внимание Новая Версия!
- Добавлена настройка системы (теперь можно настроить, будет ли выводиться текст над игроком или нет)
- Блокируется управление юнитом, после выбора имени юнит разблокируется
- Можно вписать любые действия, которые вы хотите произвести, после выбора имени (триггер otheractions)
Прикрепленные файлы
Тип файла: w3x j.w3x (17.7 Кбайт, 103 просмотров )

Отредактировано King Ksel, 05.12.2009 в 12:29.
Старый 04.12.2009, 22:39
Alibek
Choops
offline
Опыт: 12,699
Активность:
King Ksel, посмотрел...
на код несмотрел, но в игре выглядет классно
очень нужен для всех ОРПГ
Старый 04.12.2009, 22:47
MaHBe

offline
Опыт: 5,910
Активность:
Хорошая наработка.И код хороший.10\10
Старый 04.12.2009, 23:07
RazArt

offline
Опыт: 11,197
Активность:
Ну и тут тоже самое напишу :)
SetTextTagPosUnit полюбому вызывает утечку локи, представь себе что каждые 0,1 сек у вас будет 12 утечек. Заменяй SetTextTagPosUnit на SetTextTagPos. Дальше лень код смотреть было, но уверен есть ещё утечки...
Старый 04.12.2009, 23:35
Bermoff

offline
Опыт: 4,101
Активность:
King_Ksel, хотел раскритиковать тебя,как только прочитал описание наработки,но,посмотрев-передумал.Прикольно смотрится=)
Старый 05.12.2009, 00:19
alexprey
познающий Unity
offline
Опыт: 68,501
Активность:
RazArt, если честно то он двигает не 12 раз, а сколько было создано текст тагов. Опять же SetTextTagPosUnit это нативка, и лучше её использовать чем еще добавить 2 функции.
Уж так лучше наверное будет
Код:
call SetTextTagPosUnit(tt,u,0)

чем
Код:
call SetTextTagPos(tt,GetUnitX(u),GetUnitY(u),0)

Хотя фиг знает.
Старый 05.12.2009, 11:59
Nekit1234007

offline
Опыт: 11,916
Активность:
Цитата:
Сообщение от King Ksel
Код:
call SetTextTagPos(tt,GetUnitX(u),GetUnitY(u),0)
Текст будет у ног героя =)

И ещё эти имена будут видны врагам сквозь туман войны.
Старый 05.12.2009, 12:04
alexprey
познающий Unity
offline
Опыт: 68,501
Активность:
Nekit1234007, да будет. В принцепе можно еще сделать чтобы на больших дистанциях его не было видно, но я даже не представляю как это сделать

King Ksel добавил:
Цитата:
Сообщение от Nekit1234007
Текст будет у ног героя =)
Точно)))
Старый 05.12.2009, 12:07
RazArt

offline
Опыт: 11,197
Активность:
Хм... ГетЛокалПлеер?)
Старый 05.12.2009, 13:08
alexprey
познающий Unity
offline
Опыт: 68,501
Активность:
RazArt, возможно
Старый 05.12.2009, 13:17
Cytaster

offline
Опыт: 3,757
Активность:
Отличная наработка, заслуживает свое место в базе XGM.
-А какую функцию надо изменить что бы имя героя было не у ног а на голове.
Вот эту?
call SetTextTagPos(tt,GetUnitX(u),GetUnitY(u),0)
Может Поменять местами X и Y или изменить значение после функций GetUnitY(u),0 ,0 на например 180.-
П.С. У меня глюки пошли, я мог бы поклясться что еще сегодня утром было у ног героя, надо перед компом меньше сидет. O_O

Отредактировано Sarcazi, 05.12.2009 в 20:51.
Старый 05.12.2009, 20:46
Alibek
Choops
offline
Опыт: 12,699
Активность:
Цитата:
А какую функцию надо изменить что бы имя героя было не у ног а на голове.

имя и так на над головой
Старый 05.12.2009, 20:47
alexprey
познающий Unity
offline
Опыт: 68,501
Активность:
Sarcazi, если менять SetTextTagPosUnit на SetTextTagPos , то в последнем значении поставь не 0 а что-то другое. Но оставь лучше как есть
Старый 05.12.2009, 20:49
MartinMC

offline
Опыт: 6,005
Активность:
оч полезная система! буду юзать обязательно, укажу в эбоутас
Старый 07.12.2009, 17:04
Ответ

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

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

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

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



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