Перейти к содержанию

Дайджесты за январь-февраль

Обновления гайдов и аддонов

Январь Февраль

Мониторинг серверов и редактор аддонов

Представляем вам две легенды. То, о чем можно было только мечтать, стало реальностью.

Мониторинг серверов Редактор аддонов

Подсказки из игры на вашем сайте

Теперь вы можете отображать сведения о внутриигровых элементах простым наведением курсора мыши.

Подробнее

Апдейтер аддонов

Представляем вам программу для автообновления аддонов и делимся подробностями.

Подробнее Скачать

snaikev

Пользователь
  • Постов

    4
  • Зарегистрирован

  • Посещение

Сообщения, опубликованные snaikev

  1. да долго не сдавал много накопилось, можно так сказать. 
     

    Аддон AutoSelectDialog

    Настройка:
    НПС, квесты и названия действий описываются в файле config.txt. Любой пользователь может добавлять и удалять в этом файле всё, что угодно (сохраняя общий формат), настраивая аддон под свои требования.

    За один разговор с НПС (т.е. то время, пока открыта панель взаимодействия с НПС со списком квестов и действий) каждый квест, настроенный на автовыбор, аддон принимает и завершает лишь один раз.

    ["Олег Шпилёв"] = { "Обет Рвения" },

    ВОПРОС:

    как сделать так чтобы аддон принимал и завершал задание столько раз пока закончатся знаки рвения (по квесту берет по 50 знаков рвения)?

    Всё что я могу придумать это что то такое, но вообще проблема не только с операторами, но и с формой записи:

    ["Олег Шпилёв"] = { WHILE { ( Знак Рвения > 49 ) "Обет Рвения" } }

    или на алгоритмическом языке это: если Знак Рвения > 49, то "Обет Рвения" (или ["Олег Шпилёв"] = { "Обет Рвения" },)

    if Знак Рвения > 49 then "Обет Рвения" (или ["Олег Шпилёв"] = { "Обет Рвения" },)
     

    Я не совсем понимаю что тут написано.

     

    Чтобы аддон делал то что тебе нужно - редактируешь его код (обычно самый большой луа файл в аддоне) чтобы он делал то что тебе нужно. В даном случае - при наличии знаков и соблюдении других условий (имя нпрц и наличие квеста) брал и завершал квест.

    Скажите, а как в конфиге аддона

    AutoSelectDialog

     зациклить квест "Обет Рвения"??? Чтобы он не отходил, подходил, а вырабатывал сразу все знаки рвения. Может есть простая команда в конфигурации?

    В конфиге - никак. В конфиге только список квестов редактируется.

     

    Конечно можно написать код для взаимодействия в самом файле конфига, но проще в таком случае написать весь аддон с нуля.

    ну а ты можешь по быстрому написать вставку в луа, например, чтобы один квест выполнялся постоянно непрерывно. Я все другие квесты удалю из конфига и останется один просто "Обет Рвения" непрерывный. ?

    я не смогу сам сделать луа файл и написать аддон, у меня нет баз данных на ссылки внутри файла луа и язык программирования я знаю паскаль и бэйсик, алгоритмический, а тут вроде C++ что ли

    Ммм... Не. Луа, кстати, во многом проще многих других языков программирования.

    я посмотрел вроде должно быть не так сложно, всё просто должно быть.

    надо лишь разобраться в этой части аддона и зациклить все три функции

     

    local acceptedOnce
    local cached

    -- After returning a quest other already finished quests could not disappear
    -- from the list, so we can cache the list between calls. But other quests
    -- might come to finished state after returning already finished, so after
    -- returning a quest we have to continue searching for is there any other
    -- quests to finish or otherwise destroy the cache to build a new next time.
    function FinishQuest(interactorId)
        local flag = false
        local actions = autoSelectQuests[userMods.FromWString(object.GetName(interactorId))]
        if actions then
            if not cached then
                cached = {}
                local quests = object.GetInteractorQuests(interactorId)
                local imax = quests and GetTableSize(quests.readyToGive) or 0
                for i = 0, imax do
                    if quests.readyToAccept then
                        local reward = avatar.GetQuestReward(quests.readyToAccept)
                        local cantReturn = reward and reward.alternativeItems and GetTableSize(reward.alternativeItems) > 1
                        if not cantReturn then
                            local info = avatar.GetQuestInfo(quests.readyToAccept)
                            local name = userMods.FromWString(ExtractWStringFromValuedText(info.name))
                            cached[name] = quests.readyToAccept
                        end
                    end
                end
            end
            for j = 1, GetTableSize(actions) do
                local name = actions[j]
                if cached[name] then
                    if flag then return flag end
                    acceptedOnce[name] = true
                    avatar.ReturnQuest(cached[name], nil)
                    cached[name] = nil
                    flag = true
                end
            end
        end
        cached = nil
        return flag
    end

    -- After accepting a quest any other available quest could disappear from
    -- the list and/or new quests could appear, so we can not cache the list
    -- and we have to request the list of available quests every time.
    function AcceptQuest(interactorId)
        local actions = autoSelectQuests[userMods.FromWString(object.GetName(interactorId))]
        if actions then
            local quests = object.GetInteractorQuests(interactorId)
            local imax = quests and GetTableSize(quests.readyToGive) or 0
            if imax > 0 then
                local name = {}
                for j = 1, GetTableSize(actions) do
                    if not acceptedOnce[ actions[j] ] then
                        for i = 0, imax do
                            if quests.readyToGive then
                                if not name then
                                    local info = avatar.GetQuestInfo(quests.readyToGive)
                                    name = userMods.FromWString(ExtractWStringFromValuedText(info.name))
                                end
                                if name == actions[j] then
                                    acceptedOnce[ name ] = true
                                    avatar.AcceptQuest(quests.readyToGive)
                                    return true
                                end
                            end
                        end
                    end
                end
            end
        end
    end

    function RunDialog(interactorId)
        local actions = autoSelectDialog[userMods.FromWString(object.GetName(interactorId))]
        if actions then
            for j = 1, GetTableSize(actions) do
                if type(actions[j]) == "function" then
                    actions[j]()
                else --if type(actions[j]) == "string" then
                    local choices = avatar.GetInteractorNextCues()
                    for i = 0, GetTableSize(choices) do
                        if choices and userMods.FromWString(choices.name) == actions[j] then
                            avatar.SelectInteractorCue(i)
                            break
                        end
                    end
                end
            end
        end
    end

    Описание игровых функций можешь найти в доках к игре.

    Это по этому адресу? data\Mods\Docs а вы сами то играли хоть раз в аллоды онлайн? Или аддон пишет другой там Jed и hal.dll. Когда они будут дежурить или в сети?

     

    Это по этому адресу.

    Я играл в аллоды.

    Кто пишет аддон - понятия не имею.

    я посмотрел, да это очень интересно  data\Mods\Docs . Это может занять много времени на изучение. Легче уже вручную сделать квест хоть потратить неделю ручного труда по нажимании нескольких кнопок. Или попытаться найти простой автокликер на два нажатия левой кнопки мыши. Но мне не надо писать заново аддон, мне лишь немного изменить имеющийся. Это должно занять не так много времени.

    Если напишешь аддон - получишь полезный опыт. Если потратишь неделю времени на клики - потеряешь неделю жизни.

    • Судя по всем вся эта цепочка вызывается из движка по событию
      "EVENT_INTERACTION_STARTED", которое вызывает OnInteractionStarted, которое ищет или FinishQuest, или AcceptQuest или RunDialog
       
       
      По идее должно быть событие 
      "EVENT_INTERACTION_FINISHED",
       
      Написал вставку в код.Можешь сказать где ошибка?


      проверил
       
       
    • в общем дело такое
       
       
    •  
      первый раз подходишь всё норм делает
       
       
    • второй раз подходишь делает делает только две функции
       
       
    • а функцию завершить не считывает

    aoQm6NfHvRk.jpg

    AutoSelectDialog.lua

    там ниже этого кода вставка

      if not inProgress then 
    OnTalkStarted() 
    OnInteractionStarted() 
    return 
    end

    или


    elseif not inProgress then 
    OnTalkStarted() 
    OnInteractionStarted()

    но что то всё равно остается всё так как в оригинале

    Надо почитать какой ивент самый последний будет
    надо бы документацию по API почитать, но сейчас нет времени

    да, по идее нужно перезапустить интерактивную часть.
    Но изначально она вызывается из движка, а не из луа.
    А потом уже через callback дёргается луа функция
     

    allods (1).txt

    allods (2).txt

    Event interaction started приходит когда ты начинаешь диалог с НПЦ.

     

    Я не знаю как сейчас работает сдача и прием квеста, но по-моему это можно делать в одном диалоге. Т.е. вместо того чтобы завершить диалог, нужно снова выполнить функцию по поиску нужного квеста, возможно рекурсивно.

    Либо можно при наличии достаточного количества предметов после завершения диалога снова открывать диалог с НПЦ.

    • если верить описанию по ссылке, то проверку наличия предметов игра сама сделает, когда квест будет сдаваться. Получить же его можно и без предметов, т.е. после получения цепочка должна прерваться сама
    • В следующий (третий) разговор квест "Обет Рвения" будет только взят, но не засчитается из-за недостатка знаков рвения.

    В таком случае нужно после принятия/сдачи квеста не прерывать диалог, а смотреть есть ли что принять/сдать снова. Например можно добавить в функцию еще один параметр, в котором будет храниться уровень рекурсии, и передавать в него число, на один большее текущего уровня, при числе большем нуля - не завершать диалог, и завершать работу функции, а при числе, скажем, 50 - завершать диалог.

  2. Аддон AutoSelectDialog

    Настройка:
    НПС, квесты и названия действий описываются в файле config.txt. Любой пользователь может добавлять и удалять в этом файле всё, что угодно (сохраняя общий формат), настраивая аддон под свои требования.

    За один разговор с НПС (т.е. то время, пока открыта панель взаимодействия с НПС со списком квестов и действий) каждый квест, настроенный на автовыбор, аддон принимает и завершает лишь один раз.

    ["Олег Шпилёв"] = { "Обет Рвения" },

    ВОПРОС:

    как сделать так чтобы аддон принимал и завершал задание столько раз пока закончатся знаки рвения (по квесту берет по 50 знаков рвения)?

    Всё что я могу придумать это что то такое, но вообще проблема не только с операторами, но и с формой записи:

    ["Олег Шпилёв"] = { WHILE { ( Знак Рвения > 49 ) "Обет Рвения" } }

    или на алгоритмическом языке это: если Знак Рвения > 49, то "Обет Рвения" (или ["Олег Шпилёв"] = { "Обет Рвения" },)

    if Знак Рвения > 49 then "Обет Рвения" (или ["Олег Шпилёв"] = { "Обет Рвения" },)

  3. Скажите, а как в конфиге аддона

    AutoSelectDialog

     зациклить квест "Обет Рвения"??? Чтобы он не отходил, подходил, а вырабатывал сразу все знаки рвения. Может есть простая команда в конфигурации?

×
×
  • Создать...

Важная информация

Пользуясь сайтом, вы принимаете Условия использования