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

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

Ответ
 
avatarDr
Neophyte
offline
Опыт: 6,474
Активность:
Quests 'n' GetLocalPlayer()
Объясните, как сделать квест отдельно для каждого игрока. А точнее, как изменять его при выполнении каких-то действий.
Если можно, пример такого квеста:
Игра запускается, игрокам (у каждого 1 юнит) даётся квест - прийти в область.
Юнит заходит в область - квест выполняется и удаляется.
Старый 29.12.2009, 01:04
SRes
1110101000
offline
Опыт: 9,997
Активность:
Проблема в том, что информация о квесте должна быть у каждого игрока. Не уверен насчет квестов в ф9, возможно их можно без страха десинхронизации использовать. Т.е. каждый квест должен выполняться и у других игроков тоже, иначе будет десинхронизация.
Старый 29.12.2009, 01:11
ScorpioT1000
Работаем
offline
Опыт: отключен
лучше юзай кастомные квесты, типа простого вывода текста "новое задание: ...", "задание выполнено: ...", чем париться с этой хренотой
Старый 29.12.2009, 01:27
avatarDr
Neophyte
offline
Опыт: 6,474
Активность:
ScorpioT1000, а если я всё же решил париться?
» Creating
function InitTrig_ArrivalCreate takes nothing returns nothing
    local integer i=GetPlayerId(GetLocalPlayer())
    local questitem qi
    set gg_trg_ArrivalCreate=CreateTrigger()
    set Arrival[i]=CreateQuest()
    set qi=QuestCreateItem(Arrival[i])
    call QuestSetTitle(Arrival[i],"Title")
    call QuestSetDescription(Arrival[i],Description")
    call QuestSetIconPath(Arrival[i],"ReplaceableTextures\\CommandButtons\\BTNPeasant.blp")
    call QuestItemSetDescription(qi,"ItemDescription")
    call QuestSetEnabled(Arrival[i],false)
    set qi=null
endfunction
» Init
function ArrivalInit_Actions takes nothing returns nothing
    local integer i=0
    call TriggerSleepAction(5)
    call QuestSetEnabled(Arrival[GetPlayerId(GetLocalPlayer())],true)
    loop
        set ArrivalOn[i]=true
        set i=i+1
        exitwhen i==10
    endloop
    call DisplayTextToPlayer(GetLocalPlayer(),0,0," ")
    call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,10,"Quest")
    call StartSound(bj_questDiscoveredSound)
endfunction
function InitTrig_ArrivalInit takes nothing returns nothing
    set gg_trg_ArrivalInit=CreateTrigger()
    call TriggerAddAction(gg_trg_ArrivalInit,function ArrivalInit_Actions)
endfunction
» Action
function ArrivalComplete_Conditions takes nothing returns boolean
	Вот тут проблема. Нужно условие без десинка. Глобалка (Как мне казалось, не зависящая от локала) не работает.
    //if Arrival[GetPlayerId(GetOwningPlayer(GetTriggerUnit()))]!=null then
    //if GetLocalPlayer()==GetOwningPlayer(GetTriggerUnit()) and ArrivalOn[GetPlayerId(GetOwningPlayer(GetTriggerUnit()))]==true then
        return true
    endif
    return false
endfunction
function ArrivalComplete_Actions takes nothing returns nothing
    call DisplayTextToPlayer(GetLocalPlayer(),0,0," ")
    call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,10,"Completed")
    call StartSound(bj_questCompletedSound)
    call DestroyQuest(Arrival[GetPlayerId(GetLocalPlayer())])
    set Arrival[GetPlayerId(GetLocalPlayer())]=null
    set ArrivalOn[GetPlayerId(GetOwningPlayer(GetTriggerUnit()))]=false
endfunction
function InitTrig_ArrivalComplete takes nothing returns nothing
    local region r=CreateRegion()
    call RegionAddRect(r,CampSouth)
    set gg_trg_ArrivalComplete=CreateTrigger()
    call TriggerRegisterEnterRegion(gg_trg_ArrivalComplete,r,null)
    call TriggerAddCondition(gg_trg_ArrivalComplete,Condition(function ArrivalComplete_Conditions))
    call TriggerAddAction(gg_trg_ArrivalComplete,function ArrivalComplete_Actions)
    set r=null
endfunction
Проблема в условиях для Action.
avatarDr добавил:
SRes, в ф9 квест и будет у всех отображаться, если его не сделать локальным.
Насчёт своей проблемы, получается что глобалка ArrivalOn[Игрок] задаётся тоже только для локального игрока?
avatarDr добавил:
А ещё я сделал проверочный триг небольшой.
"Если квест0 включён, то показать текст"
"Если квест1 включён, то показать текст"
"Если квест2 включён, то показать текст"
...
Для 0 игрока он показывает, что квест0 включён.
А для 1 и дальше ничего не показывает, хотя квесты нормально отображаются. В чём подвох?
Старый 29.12.2009, 09:13
YellowStar
poon
offline
Опыт: 15,144
Активность:
Работает для локальных игроков. Решение в названии темы уже дал для себя сам (гетЮнитовнер равен игроку квестовыи тип, тогда выполнить действие для локального игрока...
Старый 29.12.2009, 15:26
avatarDr
Neophyte
offline
Опыт: 6,474
Активность:
narayan, это конечно гениально, но десинки мне не нужны. Я код выложил, найди лучше ошибочку.
Старый 29.12.2009, 15:29
YellowStar
poon
offline
Опыт: 15,144
Активность:
с кпк сижу, но все же напишу нужный код.

function SyncQuest takes player p returns nothing
quest q
if GetLocalPlayer()==p then
твои действия
endif


главное изначально локалки не объявляи, а лишь после внутри иф блока. Тогда не будет десинка. Да и не забудь что после создания таким образом квеста, тебе придется его синхронизировать только с лок игроком, иначе десинк.
Старый 29.12.2009, 15:48
avatarDr
Neophyte
offline
Опыт: 6,474
Активность:
Давай ты потом поподробнее объяснишь. А то ЛокалПлеер меня вообще пугает.
Как вам мой метод: изменения квеста делаю локально, а параллельно с этим делаю глобалки КвестВключён, УбитоМонстров, по глобалкам всё сверяю, а локально только показываю изменения.
Старый 29.12.2009, 19:36
YellowStar
poon
offline
Опыт: 15,144
Активность:
Делаи убито монстров тоже локально. Затем сверяи и делаи деиствие. Если нужно могу пример накатать...
Старый 30.12.2009, 13:41
avatarDr
Neophyte
offline
Опыт: 6,474
Активность:
Накатай, если поможет, буду очень благодарен.
Старый 30.12.2009, 14:11
SRes
1110101000
offline
Опыт: 9,997
Активность:
Цитата:
Затем сверяи и делаи деиствие

И получай десинхронизацию, т.к. у остальных игроков переменная будет иметь другое значение. Следовательно проверка пойдет по другому сценарию.
Цитата:
SRes, в ф9 квест и будет у всех отображаться, если его не сделать локальным.

Лол, Америка здравствуй ! Для тех кто не понял - в своем посте я сказал что информация о квесте должна быть у всех игроков (иначе проверка через тот-же if будет иметь разный результат у каждого == десинхронизация), а квесты в Ф9 - не знаю, возможно их можно использовать ЛОКАЛЬНО без десинхронизации, но это только возможно.
Старый 30.12.2009, 18:29
YellowStar
poon
offline
Опыт: 15,144
Активность:
SRes - ты видимо не знаешь как варсинхронизируются. Если данное не типа хендл, то после лок операции десинка не будет (а будет запускать для игрока с текущим значением)

Как вариант
set loc=getplayerid(localplayer)
попробуй.
Старый 31.12.2009, 00:38
SRes
1110101000
offline
Опыт: 9,997
Активность:
narayan, Орли, ага ? А у тебя есть исходник вара ? Поделись, не впадлу. Я основываюсь на своем здравом сознании и на своих знаниях в этой области. Они не идеальны и далеко не огромны, но они есть, а это значит что у меня есть свое мнение.
Вар вообще по сути не синхронизируется, у него просто проверяется правильность данных у клиентов, если у сервера данные не такие как у клиента - сервер посылает клиент нафиг. Да и кто его знает, без точных данных никто тут не прав. Ибо я наблюдал пару раз картину, когда хост лагал, типо "Ожидание игроков", при этом чат работал, у хоста писало "Разрыв соединения" (по словам хоста), хотя это теоретически невозможно, но так было, скорее всего из-за особенности платформы Garena. В Battle.net я такого не наблюдал ни разу.
Старый 31.12.2009, 11:01
avatarDr
Neophyte
offline
Опыт: 6,474
Активность:
SRes, сервера в варе нет, есть равный среди равных.
а квесты в Ф9 - не знаю, возможно их можно использовать ЛОКАЛЬНО без десинхронизации, но это только возможно.
Можно. Щас на пальцах объясню. Квест убить по 1 волку каждому из 10 игроков. Создаём глобально 1 квест - убить волка, массив булинов с номерами игроков - убит ли волк у игрока. Всё.
При убийстве волка игроком проверяем массив булей (Он то единый для всех), если не убил, то меняем его элемент массива, а локально делаем квест выполненным. Удалять квест нельзя, десинк, а вот закрыть его и обнулить переменную можно.
Старый 31.12.2009, 20:04
SRes
1110101000
offline
Опыт: 9,997
Активность:
Лол. Причем здесь сам квест ? Я сказал про _квесты в ф9_.
Цитата:
SRes, сервера в варе нет, есть равный среди равных.

:D, кто тебе это сказал ? Тебя обманули. В варе client-server. Иначе каким образом ты объяснишь вылет всех игроков, при обрыве коннекта у хоста?
Старый 31.12.2009, 20:30
RazArt

offline
Опыт: 11,197
Активность:
А мне кажится удп...
Старый 31.12.2009, 20:40
SRes
1110101000
offline
Опыт: 9,997
Активность:
Архитектура и протокол пересылки пакетов - абсолютно разные вещи. Не позорься так.
Старый 31.12.2009, 20:45
avatarDr
Neophyte
offline
Опыт: 6,474
Активность:
SRes, при обрыве коннекта выбирается другой хост. А вылетают все, если некому.
Я и говорю про отображение в ф9. Оно зависит от QuestEnabled() у игрока.

Отредактировано avatarDr, 01.01.2010 в 01:30.
Старый 01.01.2010, 01:22
SRes
1110101000
offline
Опыт: 9,997
Активность:
Цитата:
SRes, при обрыве коннекта выбирается другой хост. А вылетают все, если некому.

Oh, really ? Ты в этом посте сказал что в варе client-server. Сам себе противоречишь, товарищ.
Старый 01.01.2010, 02:09
Lord Vampire
В больнице -_-
offline
Опыт: 2,211
Активность:
avatarDr, как моё предложение - почему бы не сделать добавление в конце текста надписи "1 игрок выполнил задани, 2 игрок... и т.д."? Тогда если какой-то игрок убил волка добавляй туда надпись с его цифрой. Помоему этот вариант оптимальней, чем париться с ЛОКАЛЬНЫМИ квестами. Хотя надеюсь у тебя всё получится, т.к. интересно будет посмотреть.
И с наступающим!
Старый 01.01.2010, 02:18
Ответ

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

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

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

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



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