MOTR logo
    • Категории
    • Последние
    • Популярные
    • Метки
    • Пользователи
    • Группы
    • Зарегистрироваться
    • Войти

    Гайд по написанию скриптов для гомункулусов

    Запланировано Прикреплена Закрыта Перенесена Жизнь в пробирке
    528 Сообщения 60 Posters 51.3k Просмотры
    Загружаем больше сообщений
    • Сначала старые
    • Сначала новые
    • По количеству голосов
    Ответить
    • Ответить, создав новую тему
    Авторизуйтесь, чтобы ответить
    Эта тема была удалена. Только пользователи с правом управления темами могут её видеть.
    • K Не в сети
      killaxe Заблокирован
      отредактировано

      может вопрос и странный, но в каком "смысле" в скрипте использовано слово "local"? в языках я ничего не смыслю, но пытался чтото воткнуть:
      [code:22mah0ev]local msg = GetMsg (myid)[/code:22mah0ev] - здесь мы присваиваем переменной local msg значение выдаваемое функцией GetMsg (myid)
      [code:22mah0ev]if msg[1] == NONE_CMD[/code:22mah0ev] а здесь мы спрашиваем какое же значение выдала нам ф-я GetMsg (myid), но никакого слова "local" нету, хотя в строчке выше мы (как мне показалось по тексту) обозначили её (GetMsg (myid)) переменной "local msg" , а не просто "msg" ?
      может просто надо быть внимательнее,и я пишу бред ночью сонный 🙂 но всетаки.

      1 ответ Последний ответ Ответить Цитировать 0
      • K Не в сети
        killaxe Заблокирован
        отредактировано

        может вопрос и странный, но в каком "смысле" в скрипте использовано слово "local"? в языках я ничего не смыслю, но пытался чтото воткнуть:
        [code:22mah0ev]local msg = GetMsg (myid)[/code:22mah0ev] - здесь мы присваиваем переменной local msg значение выдаваемое функцией GetMsg (myid)
        [code:22mah0ev]if msg[1] == NONE_CMD[/code:22mah0ev] а здесь мы спрашиваем какое же значение выдала нам ф-я GetMsg (myid), но никакого слова "local" нету, хотя в строчке выше мы (как мне показалось по тексту) обозначили её (GetMsg (myid)) переменной "local msg" , а не просто "msg" ?
        может просто надо быть внимательнее,и я пишу бред ночью сонный 🙂 но всетаки.

        1 ответ Последний ответ Ответить Цитировать 0
        • Aiko StarA Не в сети
          Aiko Star
          отредактировано

          Оператор local используется при объявлении переменной для указания того факта, что эта переменная является локальной. То есть обратиться к ней "снаружи" от данной функции нельзя (из других вызываемых функций можно). Условный пример:
          [code:3vha93hm]function DancingAttack(homunID, targetID)
          local t = MDBTable(actor)
          if ((ActorHPPercent(HomunID) >= 0) and (ActorSPPercent(HomunID) >= 25) and (AABlocks(HomunID,OwnerID) <= 12) and (not t[11])) then
          -- determine the targets position
          local x, y = GetV(V_POSITION, targetID)
          SavedAttack(homunID, targetID)
          Move(homunID, x+1, y)
          Move(homunID, x-1, y)
          SavedAttack(homunID, targetID)
          Move(homunID, x, y+1)
          Move(homunID, x, y-1)
          else SavedAttack(homunID, targetID)
          end
          end[/code:3vha93hm]
          Объявленная локальная переменная t должна быть вида в вызываемых функциях ActorHPPercent(), ActorSPPercent, AABlocks.
          Но если где-то в другом месте кода у нас есть строка
          [code:3vha93hm]if ляляля then
          DancingAttack(MyID, MyEnemy)
          end[/code:3vha93hm]
          В "ляляля" обратиться к переменной t уже нельзя. И после энда тоже нельзя.
          Объяснение корявое, я понимаю. Подробнее можно нагуглить по запросу "область видимости переменных" 🙂
          PS На сколько я помню спецификацию Луы, именовать переменные через пробел нельзя.

          1 ответ Последний ответ Ответить Цитировать 0
          • Aiko StarA Не в сети
            Aiko Star
            отредактировано

            Оператор local используется при объявлении переменной для указания того факта, что эта переменная является локальной. То есть обратиться к ней "снаружи" от данной функции нельзя (из других вызываемых функций можно). Условный пример:
            [code:3vha93hm]function DancingAttack(homunID, targetID)
            local t = MDBTable(actor)
            if ((ActorHPPercent(HomunID) >= 0) and (ActorSPPercent(HomunID) >= 25) and (AABlocks(HomunID,OwnerID) <= 12) and (not t[11])) then
            -- determine the targets position
            local x, y = GetV(V_POSITION, targetID)
            SavedAttack(homunID, targetID)
            Move(homunID, x+1, y)
            Move(homunID, x-1, y)
            SavedAttack(homunID, targetID)
            Move(homunID, x, y+1)
            Move(homunID, x, y-1)
            else SavedAttack(homunID, targetID)
            end
            end[/code:3vha93hm]
            Объявленная локальная переменная t должна быть вида в вызываемых функциях ActorHPPercent(), ActorSPPercent, AABlocks.
            Но если где-то в другом месте кода у нас есть строка
            [code:3vha93hm]if ляляля then
            DancingAttack(MyID, MyEnemy)
            end[/code:3vha93hm]
            В "ляляля" обратиться к переменной t уже нельзя. И после энда тоже нельзя.
            Объяснение корявое, я понимаю. Подробнее можно нагуглить по запросу "область видимости переменных" 🙂
            PS На сколько я помню спецификацию Луы, именовать переменные через пробел нельзя.

            1 ответ Последний ответ Ответить Цитировать 0
            • LonelinessL Не в сети
              Loneliness
              отредактировано

              удивилась

              из других вызываемых функций можно

              Очень нетривиально как-то >< Действительно можно?..

              1 ответ Последний ответ Ответить Цитировать 0
              • LonelinessL Не в сети
                Loneliness
                отредактировано

                удивилась

                из других вызываемых функций можно

                Очень нетривиально как-то >< Действительно можно?..

                1 ответ Последний ответ Ответить Цитировать 0
                • Aiko StarA Не в сети
                  Aiko Star
                  отредактировано

                  Должно быть можно. Вложенные функции наследуют локальные переменные от родителя. Ну либо я старею и уже нихрена не помню (что тоже вполне вероятно).

                  1 ответ Последний ответ Ответить Цитировать 0
                  • Aiko StarA Не в сети
                    Aiko Star
                    отредактировано

                    Должно быть можно. Вложенные функции наследуют локальные переменные от родителя. Ну либо я старею и уже нихрена не помню (что тоже вполне вероятно).

                    1 ответ Последний ответ Ответить Цитировать 0
                    • drinkermannD Не в сети
                      drinkermann
                      отредактировано

                      Возможно уже обсуждалось, но еще раз спрошу.

                      1. язык lua позволяет подключать функции на C++ этот прием возможно использовать при написании Ai?

                      2. я так понимаю сспомощью V_ констант и функции GetV можно получать данные не доступные через клиент(хп\сп игроков и мобов, определять местонахождение игрока\моба даже если он в хайде\клокинге)?

                      3. возможен ли вывод инфы в чат\приват?

                      4. конкретика по RampageAi(его взял за основу своего скрипта) где лучше осуществить проверку "можно ли атаковать моба при определенном хп\сп" ну например <!-- l --><a class="postlink-local" href="http://forum.motronline.com/viewtopic.php?p=1968165#p1968165">viewtopic.php?p=1968165#p1968165</a><!-- l --> тут Зено описал как это реализвать, но непонятно какая именно функция модифицировалась и какой именно рампейдж использован(у меня версия 1.0 rc7 by Nakayama), как я понял из контекста модифицировалась AI_MSkillsAllowed(actor) при внесении изменений гомункуль все арвно атакует даже если значение его хп ниже указанных.
                        или я туплю где-то?
                        [code:3l7wjo9p]
                        -- добавляем параметры которые берутся из "базы мобов" (~\Conf\Monsters.lua)
                        function VerifyMonSettings(t,defaultTable,id)
                        -- ....
                        local argNames = { nil, "prio", "atk", "skLvl", "skDly", "skMax", "aSkLv", "aSkDl",

                         	"aSkMx", "defOnly", "kite", "ffa", "hlBm", "mammo", "aTer", "aBmb", "atkHP", "atkSP" }
                        

                      -- .............................................

                      -- добавляем проверку текущего хп и сп перед атакой(Скиллом?)

                      function AI_MSkillsAllowed(actor)

                      -- Check if we're pausing skills for the moment
                      
                      if PauseAttackSkill then
                      
                      	-- They're paused
                      
                      	return false
                      
                      end
                      
                      
                      
                      -- Get the monster's table
                      
                      local t = MDBTable(actor)
                      
                      
                      
                        -- Check if it's not attaking us
                      
                          if (GetV(V_TARGET,actor) ~= OwnerID) and (GetV(V_TARGET,actor) ~= HomunID) then
                      
                             -- Check if HP or SP is higher than needed
                      
                             if (ActorHPPercent(HomunID) < t[17]) or (ActorSPAmount(HomunID) < t[18]) then
                      
                             return false
                      
                             end
                      
                          end
                      
                      
                      
                      -- Check if level is greater than 0 and we haven't casted too often
                      
                      --	against them
                      
                      if t[4] > 0 and MSkillMaxCasts(actor) > ActorData[actor].Count.HomuSkill then
                      
                      	return true
                      
                      end
                      
                      
                      
                      -- If the value isn't greater than 0, disable skill usage
                      
                      return false
                      

                      end
                      -- .............................................................
                      в файле Monsters.lua меняем
                      DefaultMonsterSettings = { nil, prio=1, atk=true, skLvl=5, skDly=500, skMax=-1, aSkLv=5,

                              aSkDl=1000, aSkMx=-1, defOnly=false, kite=false, ffa=false,
                      
                              hlBm=false, mammo=0, aTer=0, aBmb=0, atkHP=30, atkSP=0 }
                      

                      -- не атаковать при хп < 30%
                      [/code:3l7wjo9p]
                      В результате у меня получилось, что гом все равно бьет все живое и скиллами в том числе. Куда копать?

                      1 ответ Последний ответ Ответить Цитировать 0
                      • drinkermannD Не в сети
                        drinkermann
                        отредактировано

                        Возможно уже обсуждалось, но еще раз спрошу.

                        1. язык lua позволяет подключать функции на C++ этот прием возможно использовать при написании Ai?

                        2. я так понимаю сспомощью V_ констант и функции GetV можно получать данные не доступные через клиент(хп\сп игроков и мобов, определять местонахождение игрока\моба даже если он в хайде\клокинге)?

                        3. возможен ли вывод инфы в чат\приват?

                        4. конкретика по RampageAi(его взял за основу своего скрипта) где лучше осуществить проверку "можно ли атаковать моба при определенном хп\сп" ну например <!-- l --><a class="postlink-local" href="http://forum.motronline.com/viewtopic.php?p=1968165#p1968165">viewtopic.php?p=1968165#p1968165</a><!-- l --> тут Зено описал как это реализвать, но непонятно какая именно функция модифицировалась и какой именно рампейдж использован(у меня версия 1.0 rc7 by Nakayama), как я понял из контекста модифицировалась AI_MSkillsAllowed(actor) при внесении изменений гомункуль все арвно атакует даже если значение его хп ниже указанных.
                          или я туплю где-то?
                          [code:3l7wjo9p]
                          -- добавляем параметры которые берутся из "базы мобов" (~\Conf\Monsters.lua)
                          function VerifyMonSettings(t,defaultTable,id)
                          -- ....
                          local argNames = { nil, "prio", "atk", "skLvl", "skDly", "skMax", "aSkLv", "aSkDl",

                           	"aSkMx", "defOnly", "kite", "ffa", "hlBm", "mammo", "aTer", "aBmb", "atkHP", "atkSP" }
                          

                        -- .............................................

                        -- добавляем проверку текущего хп и сп перед атакой(Скиллом?)

                        function AI_MSkillsAllowed(actor)

                        -- Check if we're pausing skills for the moment
                        
                        if PauseAttackSkill then
                        
                        	-- They're paused
                        
                        	return false
                        
                        end
                        
                        
                        
                        -- Get the monster's table
                        
                        local t = MDBTable(actor)
                        
                        
                        
                          -- Check if it's not attaking us
                        
                            if (GetV(V_TARGET,actor) ~= OwnerID) and (GetV(V_TARGET,actor) ~= HomunID) then
                        
                               -- Check if HP or SP is higher than needed
                        
                               if (ActorHPPercent(HomunID) < t[17]) or (ActorSPAmount(HomunID) < t[18]) then
                        
                               return false
                        
                               end
                        
                            end
                        
                        
                        
                        -- Check if level is greater than 0 and we haven't casted too often
                        
                        --	against them
                        
                        if t[4] > 0 and MSkillMaxCasts(actor) > ActorData[actor].Count.HomuSkill then
                        
                        	return true
                        
                        end
                        
                        
                        
                        -- If the value isn't greater than 0, disable skill usage
                        
                        return false
                        

                        end
                        -- .............................................................
                        в файле Monsters.lua меняем
                        DefaultMonsterSettings = { nil, prio=1, atk=true, skLvl=5, skDly=500, skMax=-1, aSkLv=5,

                                aSkDl=1000, aSkMx=-1, defOnly=false, kite=false, ffa=false,
                        
                                hlBm=false, mammo=0, aTer=0, aBmb=0, atkHP=30, atkSP=0 }
                        

                        -- не атаковать при хп < 30%
                        [/code:3l7wjo9p]
                        В результате у меня получилось, что гом все равно бьет все живое и скиллами в том числе. Куда копать?

                        1 ответ Последний ответ Ответить Цитировать 0
                        • Aiko StarA Не в сети
                          Aiko Star
                          отредактировано

                          1. нет, не работает
                          2. хп-сп мобов нельзя получать, координаты в клоке-хайде через GetActors
                          3. нет
                          4. по указанной ссылке подробно написано, в каком файле с какой строчки (номер после имени файла) что менять (собственно, код). Замечу, что файл ..\AI\USER_AI\MonSupport.lua редактируется три раза. У меня после данной модификации никаких ошибок не возникало.
                          1 ответ Последний ответ Ответить Цитировать 0
                          • Aiko StarA Не в сети
                            Aiko Star
                            отредактировано

                            1. нет, не работает
                            2. хп-сп мобов нельзя получать, координаты в клоке-хайде через GetActors
                            3. нет
                            4. по указанной ссылке подробно написано, в каком файле с какой строчки (номер после имени файла) что менять (собственно, код). Замечу, что файл ..\AI\USER_AI\MonSupport.lua редактируется три раза. У меня после данной модификации никаких ошибок не возникало.
                            1 ответ Последний ответ Ответить Цитировать 0
                            • drinkermannD Не в сети
                              drinkermann
                              отредактировано

                              Номер строки не даст абсолютно ничего, ибо версия разная и соответственно строки могут отличаться(если дам свои адреса они попадут у вас на комментарии). Интересует именно функция, да и теперь не особо то интересует, ибо сделал по-другому 😉

                              1 ответ Последний ответ Ответить Цитировать 0
                              • drinkermannD Не в сети
                                drinkermann
                                отредактировано

                                Номер строки не даст абсолютно ничего, ибо версия разная и соответственно строки могут отличаться(если дам свои адреса они попадут у вас на комментарии). Интересует именно функция, да и теперь не особо то интересует, ибо сделал по-другому 😉

                                1 ответ Последний ответ Ответить Цитировать 0
                                • Aiko StarA Не в сети
                                  Aiko Star
                                  отредактировано

                                  Повторюсь - у меня проблем с корректировкой не возникло. Версия RampageAI v1[1].0 rc6 fixed by Nakayama. Если не совпадают номера строк, можно тупо по названию функций смотреть, тоже помогает.

                                  1 ответ Последний ответ Ответить Цитировать 0
                                  • Aiko StarA Не в сети
                                    Aiko Star
                                    отредактировано

                                    Повторюсь - у меня проблем с корректировкой не возникло. Версия RampageAI v1[1].0 rc6 fixed by Nakayama. Если не совпадают номера строк, можно тупо по названию функций смотреть, тоже помогает.

                                    1 ответ Последний ответ Ответить Цитировать 0
                                    • drinkermannD Не в сети
                                      drinkermann
                                      отредактировано

                                      Ух.. я и просил функцию >__<. Третий фрагмент кода в посте зено не включает описания функции, тупо номер строки
                                      ..\AI\USER_AI\MonSupport.lua 377
                                      , который в свою очередь попадает в rc7 рампаге от накаямы на функцию function AI_MSkillsAllowed(actor).

                                      итого:
                                      3 изменения MonSupport.lua
                                      function VerifyMonSettings(t,defaultTable,id)
                                      function MAttackAllowed(actor)
                                      function AI_MSkillsAllowed(actor) ?! вот это я хотел увидеть
                                      и в Monsters.lua
                                      добавляются описанные параметры к нужным мобам и дефолтному мобу.
                                      Должно работать, проверять лень.

                                      1 ответ Последний ответ Ответить Цитировать 0
                                      • drinkermannD Не в сети
                                        drinkermann
                                        отредактировано

                                        Ух.. я и просил функцию >__<. Третий фрагмент кода в посте зено не включает описания функции, тупо номер строки
                                        ..\AI\USER_AI\MonSupport.lua 377
                                        , который в свою очередь попадает в rc7 рампаге от накаямы на функцию function AI_MSkillsAllowed(actor).

                                        итого:
                                        3 изменения MonSupport.lua
                                        function VerifyMonSettings(t,defaultTable,id)
                                        function MAttackAllowed(actor)
                                        function AI_MSkillsAllowed(actor) ?! вот это я хотел увидеть
                                        и в Monsters.lua
                                        добавляются описанные параметры к нужным мобам и дефолтному мобу.
                                        Должно работать, проверять лень.

                                        1 ответ Последний ответ Ответить Цитировать 0
                                        • Aiko StarA Не в сети
                                          Aiko Star
                                          отредактировано

                                          Ну хоть чуточку смекалки и сообразительности можно же проявить, зачем же строго по инструкции...
                                          В функциях добавляются только проверки на текущие значения хп-сп хомяка, значит, бОльшая часть функций остается нетронутой. Тупо берем самый первый комментарий из этого таинственного куска кода, задаем поиск и... обнаруживаем, что функцию function MAttackAllowed(actor) только что меняли, а функцию function AI_MSkillsAllowed(actor) не трогали (а в ней упомянутый кусок есть как раз). И номер строки примерно в тот же район ссылается.
                                          Вообще, чтобы разрешить ваши терзания, скажу, что эту часть кода действительно надо вставлять в function AI_MSkillsAllowed(actor) 🙂

                                          1 ответ Последний ответ Ответить Цитировать 0
                                          • Aiko StarA Не в сети
                                            Aiko Star
                                            отредактировано

                                            Ну хоть чуточку смекалки и сообразительности можно же проявить, зачем же строго по инструкции...
                                            В функциях добавляются только проверки на текущие значения хп-сп хомяка, значит, бОльшая часть функций остается нетронутой. Тупо берем самый первый комментарий из этого таинственного куска кода, задаем поиск и... обнаруживаем, что функцию function MAttackAllowed(actor) только что меняли, а функцию function AI_MSkillsAllowed(actor) не трогали (а в ней упомянутый кусок есть как раз). И номер строки примерно в тот же район ссылается.
                                            Вообще, чтобы разрешить ваши терзания, скажу, что эту часть кода действительно надо вставлять в function AI_MSkillsAllowed(actor) 🙂

                                            1 ответ Последний ответ Ответить Цитировать 0
                                            • Первое сообщение
                                              Последнее сообщение