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

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

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

      спасибо попробую

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

        спасибо попробую

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

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

          Это конечно смешно, но у меня в мирке из значимых для автокаста болта всего пара изменений, знаком --> показы изменения.

          [code:3umzdkg1]--------------------------------------------------
          function DoSkill(Skill, Target)

          if Skill.Level == 0 then return false; end
          local CurrTime = GetTick()
          if CastDelayEnd > CurrTime then return false; end
          local HomunSP = GetV(V_SP, MyID)
          local result = false
          if Skill.Engaged then -- if the skill is already active (or in delay time), wait until it goes OFF
          	if CurrTime > Skill.TimeOut then
          		Skill.Engaged = false
          	end
          else -- if the skill is OFF, activate it
          	if HomunSP >= Skill.MinSP then -- if there are enough SP left
          		MySkill = Skill.SkillID
          		if ( (MySkill == AS_FIL_MOON.SkillID) or (MySkill == AS_VAN_CAPR.SkillID) )
          		and (HTact.Level ~=-1) then
          			MySkillLevel = HTact.Level
          		elseif (MySkill == AS_VAN_BLES.SkillID) then
          			if     Target == OwnerID then
          				MySkillLevel = 3 -- lvl 3 heal rate: enemy=25%, self=25%, owner=50%
          			elseif Target == MyID then
          				MySkillLevel = 4 -- lvl 4 heal rate: enemy=36%, self=60%, owner=4%
          			else
          				MySkillLevel = Skill.Level
          			end
          		else
          			MySkillLevel = Skill.Level
          		end
          		Skill.TimeOut = CurrTime + Skill.HowLast
          		Skill.Engaged = true
          		SkillObject(MyID, MySkillLevel, MySkill, Target)
          		Log(string.format("Done skill %d lvl %d on target %d", MySkill, MySkillLevel, Target))
          

          --> CastDelayEnd = CurrTime + 0
          result = true
          MySkill = 0
          end
          end
          return result
          end[/code:3umzdkg1]
          [code:3umzdkg1]


          function CanDoAtkSkillsNow()
          -- is it the right time for an aggressive skill?

          local result = true
          local CurrTime = GetTick()
          local TimeOutElapsed = CurrTime - AtkStartTime > SKILL_TIME_OUT
          if (HTact.Skill == WITH_no_skill) then
          	result = false
          elseif HTact.Skill == WITH_one_skill then
          	-- Log(string.format("AtkSkillDoneCount = %d, CurrTime - AtkStartTime = %d", AtkSkillDoneCount, CurrTime - AtkStartTime))
          	if (AtkSkillDoneCount > 1) or  TimeOutElapsed then
          		result = false
          	end
          elseif HTact.Skill == WITH_two_skills then
          	if (AtkSkillDoneCount > 2) then
          		result = false
          	end
          elseif HTact.Skill == WITH_max_skills then
          	if TimeOutElapsed then
          		result = false
          	end
          elseif HTact.Skill == WITH_slow_power then
          	if (LONG_RANGE_SHOOTER ~= true) and (CurrTime - AtkStartTime < DELAY_SLOW_POWER) then
          

          --> if AtkSkillDoneCount ~= 0 then
          --> result = false
          end
          end
          end
          return result
          end[/code:3umzdkg1]

          насколько я помню главная проблема мирки была с ненужными задержками там где не надо. если кому интересно, можете скачать и попробовать, а также посмотреть мой вариант с небольшими правками <!-- m --><a class="postlink" href="http://forum.sepulka.org.ua/viewtopic.php?id=399">http://forum.sepulka.org.ua/viewtopic.php?id=399</a><!-- m --> к сожалению из-за изменения файла настроек мой вариант не будет работать с утилитой настроек от оригинальной мирки, а свою я все никак не напишу.

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

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

            Это конечно смешно, но у меня в мирке из значимых для автокаста болта всего пара изменений, знаком --> показы изменения.

            [code:3umzdkg1]--------------------------------------------------
            function DoSkill(Skill, Target)

            if Skill.Level == 0 then return false; end
            local CurrTime = GetTick()
            if CastDelayEnd > CurrTime then return false; end
            local HomunSP = GetV(V_SP, MyID)
            local result = false
            if Skill.Engaged then -- if the skill is already active (or in delay time), wait until it goes OFF
            	if CurrTime > Skill.TimeOut then
            		Skill.Engaged = false
            	end
            else -- if the skill is OFF, activate it
            	if HomunSP >= Skill.MinSP then -- if there are enough SP left
            		MySkill = Skill.SkillID
            		if ( (MySkill == AS_FIL_MOON.SkillID) or (MySkill == AS_VAN_CAPR.SkillID) )
            		and (HTact.Level ~=-1) then
            			MySkillLevel = HTact.Level
            		elseif (MySkill == AS_VAN_BLES.SkillID) then
            			if     Target == OwnerID then
            				MySkillLevel = 3 -- lvl 3 heal rate: enemy=25%, self=25%, owner=50%
            			elseif Target == MyID then
            				MySkillLevel = 4 -- lvl 4 heal rate: enemy=36%, self=60%, owner=4%
            			else
            				MySkillLevel = Skill.Level
            			end
            		else
            			MySkillLevel = Skill.Level
            		end
            		Skill.TimeOut = CurrTime + Skill.HowLast
            		Skill.Engaged = true
            		SkillObject(MyID, MySkillLevel, MySkill, Target)
            		Log(string.format("Done skill %d lvl %d on target %d", MySkill, MySkillLevel, Target))
            

            --> CastDelayEnd = CurrTime + 0
            result = true
            MySkill = 0
            end
            end
            return result
            end[/code:3umzdkg1]
            [code:3umzdkg1]


            function CanDoAtkSkillsNow()
            -- is it the right time for an aggressive skill?

            local result = true
            local CurrTime = GetTick()
            local TimeOutElapsed = CurrTime - AtkStartTime > SKILL_TIME_OUT
            if (HTact.Skill == WITH_no_skill) then
            	result = false
            elseif HTact.Skill == WITH_one_skill then
            	-- Log(string.format("AtkSkillDoneCount = %d, CurrTime - AtkStartTime = %d", AtkSkillDoneCount, CurrTime - AtkStartTime))
            	if (AtkSkillDoneCount > 1) or  TimeOutElapsed then
            		result = false
            	end
            elseif HTact.Skill == WITH_two_skills then
            	if (AtkSkillDoneCount > 2) then
            		result = false
            	end
            elseif HTact.Skill == WITH_max_skills then
            	if TimeOutElapsed then
            		result = false
            	end
            elseif HTact.Skill == WITH_slow_power then
            	if (LONG_RANGE_SHOOTER ~= true) and (CurrTime - AtkStartTime < DELAY_SLOW_POWER) then
            

            --> if AtkSkillDoneCount ~= 0 then
            --> result = false
            end
            end
            end
            return result
            end[/code:3umzdkg1]

            насколько я помню главная проблема мирки была с ненужными задержками там где не надо. если кому интересно, можете скачать и попробовать, а также посмотреть мой вариант с небольшими правками <!-- m --><a class="postlink" href="http://forum.sepulka.org.ua/viewtopic.php?id=399">http://forum.sepulka.org.ua/viewtopic.php?id=399</a><!-- m --> к сожалению из-за изменения файла настроек мой вариант не будет работать с утилитой настроек от оригинальной мирки, а свою я все никак не напишу.

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

              @sepulka:
              вообще-то надо править функцию чейзинга, т.к. аттак возникает когда уже началась атака, т.е. хомяк бьет его физ атаками...
              я не разбирался как именно работает мира и по этому не трогал функцию чейзинга, в функции аттака я поправил место выбора следующей жертвы, если ту что били умерла или убежала.
              [code:s652e4pc]
              -- Change target when the enemy is dead or lost (Смена цели когда противник умер или потерен из виду)
              local Ex, Ey = GetV(V_POSITION, MyEnemy)
              if (Ex == -1) or (MOTION_DEAD == GetV(V_MOTION, MyEnemy)) then
              [/code:s652e4pc]

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

                @"sepulka":
                вообще-то надо править функцию чейзинга, т.к. аттак возникает когда уже началась атака, т.е. хомяк бьет его физ атаками...
                я не разбирался как именно работает мира и по этому не трогал функцию чейзинга, в функции аттака я поправил место выбора следующей жертвы, если ту что били умерла или убежала.
                [code:s652e4pc]
                -- Change target when the enemy is dead or lost (Смена цели когда противник умер или потерен из виду)
                local Ex, Ey = GetV(V_POSITION, MyEnemy)
                if (Ex == -1) or (MOTION_DEAD == GetV(V_MOTION, MyEnemy)) then
                [/code:s652e4pc]

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

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

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

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

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

                      Поскажите пожалуйста есть ли возможность и если есть то где прописать что бы Ванилька скилом атаковала несколько раз?

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

                        Поскажите пожалуйста есть ли возможность и если есть то где прописать что бы Ванилька скилом атаковала несколько раз?

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

                          SamBut, в мир аи выставляется в тактиках, 1, 2 и много

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

                            SamBut, в мир аи выставляется в тактиках, 1, 2 и много

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

                              вы вроде про болты мне написали, чтобы она сначала их кидала. А как сделать, чтобы она не крутилась возле моба, которого бьет другой гом. Получается, что из-за этого она пропускает респ следующего , пока тупо крутится возле чужого. И еще чат зафлуживается надписями вы пытаетесь атаковать чужого моба, хоть она его и не атакует а тока бегает вокруг.

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

                                вы вроде про болты мне написали, чтобы она сначала их кидала. А как сделать, чтобы она не крутилась возле моба, которого бьет другой гом. Получается, что из-за этого она пропускает респ следующего , пока тупо крутится возле чужого. И еще чат зафлуживается надписями вы пытаетесь атаковать чужого моба, хоть она его и не атакует а тока бегает вокруг.

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

                                  Не бьет потому, что включен антикс. А так бы пинала (отсюда и надписи). Чтобы такого не было, надо включать анти-кс в AI. В MirAI он встроенный, а это значит, что либо у вас старая версия, либо скрипт плохо определяет чужих мобов и стоит перейти на другой (это будет проще, чем докручивать проверки вручную).

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

                                    Не бьет потому, что включен антикс. А так бы пинала (отсюда и надписи). Чтобы такого не было, надо включать анти-кс в AI. В MirAI он встроенный, а это значит, что либо у вас старая версия, либо скрипт плохо определяет чужих мобов и стоит перейти на другой (это будет проще, чем докручивать проверки вручную).

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

                                      Вообщем проблема была в том, что в Аи прописана вечная дружба для походов с другими алхимиками. Исправила. Теперь не бегает к чужим мобам. 🙂

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

                                        Вообщем проблема была в том, что в Аи прописана вечная дружба для походов с другими алхимиками. Исправила. Теперь не бегает к чужим мобам. 🙂

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

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

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

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

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