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

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

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

      Я про это и говорила. Просто чтобы это хорошо работало, мне нужно переписать мирковские функции поиска противника, а мне пока лениво ^^''' Но когда-нибудь, наверное, доберусь.

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

        Я про это и говорила. Просто чтобы это хорошо работало, мне нужно переписать мирковские функции поиска противника, а мне пока лениво ^^''' Но когда-нибудь, наверное, доберусь.

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

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

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

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

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

              Не совсем. Хомяк переагривается на атакера вне зависимости от приоритета на стадии ONCHASE_ST, то бишь, если хомяка по дороге кто-нибудь из саммона стукнет, он отвлекается.

              Вот это место, если точнее:
              [code:1ga8b701]local NextTarget = GetMyNextTarget(HomunHPPerc)
              if not isBadTarget and NextTarget ~= 0 then
              local EnemyDst = GetDistance2(MyEnemy, MyID)
              if (EnemyDst <= 2) or (EnemyDst <= GetDistance2(NextTarget, MyID)) then
              NextTarget = 0
              end
              end
              if NextTarget ~= 0 then
              MyEnemy = NextTarget
              vOwnerX, vOwnerY = OwnerX, OwnerY
              AtkStartTime = 0
              AtkSkillDoneCount = 0
              Log(string.format("Intercepting new target(%d)", MyEnemy))
              else
              if isBadTarget and MyState ~= EVADE_ST then
              StopHere("[CHASE_ST -> IDLE_ST] no alternative target found")
              return
              end
              end[/code:1ga8b701]

              Если сюда воткнуть ещё проверку приоритета, то всё будет правильно. Но, как я и сказала, не хочу ставить ещё одну заплатку, когда пора перешивать всё полностью ^^''

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

                Не совсем. Хомяк переагривается на атакера вне зависимости от приоритета на стадии ONCHASE_ST, то бишь, если хомяка по дороге кто-нибудь из саммона стукнет, он отвлекается.

                Вот это место, если точнее:
                [code:1ga8b701]local NextTarget = GetMyNextTarget(HomunHPPerc)
                if not isBadTarget and NextTarget ~= 0 then
                local EnemyDst = GetDistance2(MyEnemy, MyID)
                if (EnemyDst <= 2) or (EnemyDst <= GetDistance2(NextTarget, MyID)) then
                NextTarget = 0
                end
                end
                if NextTarget ~= 0 then
                MyEnemy = NextTarget
                vOwnerX, vOwnerY = OwnerX, OwnerY
                AtkStartTime = 0
                AtkSkillDoneCount = 0
                Log(string.format("Intercepting new target(%d)", MyEnemy))
                else
                if isBadTarget and MyState ~= EVADE_ST then
                StopHere("[CHASE_ST -> IDLE_ST] no alternative target found")
                return
                end
                end[/code:1ga8b701]

                Если сюда воткнуть ещё проверку приоритета, то всё будет правильно. Но, как я и сказала, не хочу ставить ещё одну заплатку, когда пора перешивать всё полностью ^^''

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

                  Можно как-нибудь заставить react срабатывать на удачный стил? Видел в записи как оно работает, но не нашёл примеров... или это на каждом мобе alt+t жмут?

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

                    Можно как-нибудь заставить react срабатывать на удачный стил? Видел в записи как оно работает, но не нашёл примеров... или это на каждом мобе alt+t жмут?

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

                      Либо жмут, либо пользуются сторонними программами, что есть бан.

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

                        Либо жмут, либо пользуются сторонними программами, что есть бан.

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

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

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

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

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

                              Florencia, Для начала какой АИ используешь?

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

                                Florencia, Для начала какой АИ используешь?

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

                                  ой, сорри забыла написать Mir Ai v1.2.2

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

                                    ой, сорри забыла написать Mir Ai v1.2.2

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

                                      Florencia, сменить аи, ну или для мобов поставить в тактиках WITH_FULL_POWER или как-то так.

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

                                        Florencia, сменить аи, ну или для мобов поставить в тактиках WITH_FULL_POWER или как-то так.

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

                                          Florencia, чтобы ванилька сначала бросала болт в нового врага нужно в файле AI.lua исправить вот этоти куски
                                          [code:k2jhniqc]
                                          function OnIDLE_ST()

                                          ...

                                          -- Is there a new target? -> chase_st
                                          if CurrTime - StartupTime > 600 then
                                          local NextTarget = GetMyNextTarget(HomunHPPerc)
                                          if NextTarget ~=0 then
                                          isCircling = false
                                          MyEnemy = NextTarget
                                          local Ex, Ey = GetV(V_POSITION, MyEnemy)
                                          if (math.abs(Ex - MyX) <= 1) and (math.abs(Ey - MyY) <= 1) then
                                          MyState = ATTACK_ST
                                          Attack(MyID, MyEnemy)
                                          AtkStartTime = 0
                                          Log(string.format("[IDLE_ST -> ATTACK_ST] Target(%d) already near, switch directly to combat", MyEnemy))
                                          else
                                          MyState = CHASE_ST
                                          Log(string.format("[IDLE_ST -> CHASE_ST] Intercepting new target(%d)", MyEnemy))
                                          end
                                          vOwnerX, vOwnerY = OwnerX, OwnerY
                                          return
                                          else
                                          if MyState == EVADE_ST then
                                          isCircling = false
                                          return
                                          end
                                          end
                                          end
                                          ...

                                          end

                                          ...

                                          function OnATTACK_ST()

                                          ...

                                          -- 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
                                          	Log(string.format("MyEnemy(%d) lost or dead. Searching for next target", MyEnemy))
                                          	local NextTarget = GetMyNextTarget(HomunHPPerc)
                                          	if NextTarget ~=0 then
                                          		MyEnemy = NextTarget
                                          		AtkSkillDoneCount = 0
                                          		AtkStartTime = GetTick() -- a new attack starts (usually this reset is in ON_IDLE_ST)
                                          	else
                                          		if MyState ~= EVADE_ST then
                                          			StopHere("[ATTACK_ST -> IDLE_ST] No more immediate targets")
                                          		end
                                          		return
                                          	end
                                          end
                                          

                                          ...

                                          end

                                          [/code:k2jhniqc]
                                          на то что ограничено стрелочками
                                          [code:k2jhniqc]
                                          function OnIDLE_ST()

                                          ...

                                          -- Is there a new target? -> chase_st
                                          if CurrTime - StartupTime > 600 then
                                          	local NextTarget = GetMyNextTarget(HomunHPPerc)
                                          	if NextTarget ~=0 then
                                          		isCircling = false
                                          		MyEnemy = NextTarget
                                          		local Ex, Ey = GetV(V_POSITION, MyEnemy)
                                          

                                          --> if((HomunType == VANILMIRTH or HomunType == VANILMIRTH_H
                                          or HomunType == VANILMIRTH2 or HomunType == VANILMIRTH_H2)
                                          and (HomunSP >= AS_VAN_CAPR.MinSP)
                                          and ( GetDistance(Ex, Ey, MyX, MyY) <= GetV( V_SKILLATTACKRANGE, AS_VAN_CAPR.SkillID))
                                          and (DoSkill(AS_VAN_CAPR,MyEnemy) != false)) then
                                          MyState = ATTACK_ST
                                          AtkStartTime = 0
                                          Log(string.format("[IDLE_ST -> ATTACK_ST] Target(%d) already near, switch directly to combat", MyEnemy))
                                          else<--
                                          if (math.abs(Ex - MyX) <= 1) and (math.abs(Ey - MyY) <= 1) then
                                          MyState = ATTACK_ST
                                          Attack(MyID, MyEnemy)
                                          AtkStartTime = 0
                                          Log(string.format("[IDLE_ST -> ATTACK_ST] Target(%d) already near, switch directly to combat", MyEnemy))
                                          else
                                          MyState = CHASE_ST
                                          Log(string.format("[IDLE_ST -> CHASE_ST] Intercepting new target(%d)", MyEnemy))
                                          end
                                          --> end<--
                                          vOwnerX, vOwnerY = OwnerX, OwnerY
                                          return
                                          else
                                          if MyState == EVADE_ST then
                                          isCircling = false
                                          return
                                          end
                                          end
                                          end

                                          ...

                                          end

                                          function OnATTACK_ST()

                                          ...

                                          -- 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
                                          	Log(string.format("MyEnemy(%d) lost or dead. Searching for next target", MyEnemy))
                                          	local NextTarget = GetMyNextTarget(HomunHPPerc)
                                          	if NextTarget ~=0 then
                                          		MyEnemy = NextTarget
                                          

                                          --> local Ex, Ey = GetV(V_POSITION, MyEnemy)
                                          if((HomunType == VANILMIRTH or HomunType == VANILMIRTH_H
                                          or HomunType == VANILMIRTH2 or HomunType == VANILMIRTH_H2)
                                          and (HomunSP >= AS_VAN_CAPR.MinSP)
                                          and ( GetDistance(Ex, Ey, MyX, MyY) <= GetV( V_SKILLATTACKRANGE, AS_VAN_CAPR.SkillID))
                                          and (DoSkill(AS_VAN_CAPR,MyEnemy) != false)) then
                                          AtkStartTime = GetTick() -- a new attack starts (usually this reset is in ON_IDLE_ST)
                                          AtkSkillDoneCount = 1
                                          else<--
                                          AtkSkillDoneCount = 0
                                          AtkStartTime = GetTick() -- a new attack starts (usually this reset is in ON_IDLE_ST)
                                          --> end<--
                                          else
                                          if MyState ~= EVADE_ST then
                                          StopHere("[ATTACK_ST -> IDLE_ST] No more immediate targets")
                                          end
                                          return
                                          end
                                          end

                                          ...

                                          end

                                          [/code:k2jhniqc]
                                          Данные куски кода не отлажены по этому советую сохранить резервную копию исходного файла, перед внесением изменений.

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

                                            Florencia, чтобы ванилька сначала бросала болт в нового врага нужно в файле AI.lua исправить вот этоти куски
                                            [code:k2jhniqc]
                                            function OnIDLE_ST()

                                            ...

                                            -- Is there a new target? -> chase_st
                                            if CurrTime - StartupTime > 600 then
                                            local NextTarget = GetMyNextTarget(HomunHPPerc)
                                            if NextTarget ~=0 then
                                            isCircling = false
                                            MyEnemy = NextTarget
                                            local Ex, Ey = GetV(V_POSITION, MyEnemy)
                                            if (math.abs(Ex - MyX) <= 1) and (math.abs(Ey - MyY) <= 1) then
                                            MyState = ATTACK_ST
                                            Attack(MyID, MyEnemy)
                                            AtkStartTime = 0
                                            Log(string.format("[IDLE_ST -> ATTACK_ST] Target(%d) already near, switch directly to combat", MyEnemy))
                                            else
                                            MyState = CHASE_ST
                                            Log(string.format("[IDLE_ST -> CHASE_ST] Intercepting new target(%d)", MyEnemy))
                                            end
                                            vOwnerX, vOwnerY = OwnerX, OwnerY
                                            return
                                            else
                                            if MyState == EVADE_ST then
                                            isCircling = false
                                            return
                                            end
                                            end
                                            end
                                            ...

                                            end

                                            ...

                                            function OnATTACK_ST()

                                            ...

                                            -- 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
                                            	Log(string.format("MyEnemy(%d) lost or dead. Searching for next target", MyEnemy))
                                            	local NextTarget = GetMyNextTarget(HomunHPPerc)
                                            	if NextTarget ~=0 then
                                            		MyEnemy = NextTarget
                                            		AtkSkillDoneCount = 0
                                            		AtkStartTime = GetTick() -- a new attack starts (usually this reset is in ON_IDLE_ST)
                                            	else
                                            		if MyState ~= EVADE_ST then
                                            			StopHere("[ATTACK_ST -> IDLE_ST] No more immediate targets")
                                            		end
                                            		return
                                            	end
                                            end
                                            

                                            ...

                                            end

                                            [/code:k2jhniqc]
                                            на то что ограничено стрелочками
                                            [code:k2jhniqc]
                                            function OnIDLE_ST()

                                            ...

                                            -- Is there a new target? -> chase_st
                                            if CurrTime - StartupTime > 600 then
                                            	local NextTarget = GetMyNextTarget(HomunHPPerc)
                                            	if NextTarget ~=0 then
                                            		isCircling = false
                                            		MyEnemy = NextTarget
                                            		local Ex, Ey = GetV(V_POSITION, MyEnemy)
                                            

                                            --> if((HomunType == VANILMIRTH or HomunType == VANILMIRTH_H
                                            or HomunType == VANILMIRTH2 or HomunType == VANILMIRTH_H2)
                                            and (HomunSP >= AS_VAN_CAPR.MinSP)
                                            and ( GetDistance(Ex, Ey, MyX, MyY) <= GetV( V_SKILLATTACKRANGE, AS_VAN_CAPR.SkillID))
                                            and (DoSkill(AS_VAN_CAPR,MyEnemy) != false)) then
                                            MyState = ATTACK_ST
                                            AtkStartTime = 0
                                            Log(string.format("[IDLE_ST -> ATTACK_ST] Target(%d) already near, switch directly to combat", MyEnemy))
                                            else<--
                                            if (math.abs(Ex - MyX) <= 1) and (math.abs(Ey - MyY) <= 1) then
                                            MyState = ATTACK_ST
                                            Attack(MyID, MyEnemy)
                                            AtkStartTime = 0
                                            Log(string.format("[IDLE_ST -> ATTACK_ST] Target(%d) already near, switch directly to combat", MyEnemy))
                                            else
                                            MyState = CHASE_ST
                                            Log(string.format("[IDLE_ST -> CHASE_ST] Intercepting new target(%d)", MyEnemy))
                                            end
                                            --> end<--
                                            vOwnerX, vOwnerY = OwnerX, OwnerY
                                            return
                                            else
                                            if MyState == EVADE_ST then
                                            isCircling = false
                                            return
                                            end
                                            end
                                            end

                                            ...

                                            end

                                            function OnATTACK_ST()

                                            ...

                                            -- 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
                                            	Log(string.format("MyEnemy(%d) lost or dead. Searching for next target", MyEnemy))
                                            	local NextTarget = GetMyNextTarget(HomunHPPerc)
                                            	if NextTarget ~=0 then
                                            		MyEnemy = NextTarget
                                            

                                            --> local Ex, Ey = GetV(V_POSITION, MyEnemy)
                                            if((HomunType == VANILMIRTH or HomunType == VANILMIRTH_H
                                            or HomunType == VANILMIRTH2 or HomunType == VANILMIRTH_H2)
                                            and (HomunSP >= AS_VAN_CAPR.MinSP)
                                            and ( GetDistance(Ex, Ey, MyX, MyY) <= GetV( V_SKILLATTACKRANGE, AS_VAN_CAPR.SkillID))
                                            and (DoSkill(AS_VAN_CAPR,MyEnemy) != false)) then
                                            AtkStartTime = GetTick() -- a new attack starts (usually this reset is in ON_IDLE_ST)
                                            AtkSkillDoneCount = 1
                                            else<--
                                            AtkSkillDoneCount = 0
                                            AtkStartTime = GetTick() -- a new attack starts (usually this reset is in ON_IDLE_ST)
                                            --> end<--
                                            else
                                            if MyState ~= EVADE_ST then
                                            StopHere("[ATTACK_ST -> IDLE_ST] No more immediate targets")
                                            end
                                            return
                                            end
                                            end

                                            ...

                                            end

                                            [/code:k2jhniqc]
                                            Данные куски кода не отлажены по этому советую сохранить резервную копию исходного файла, перед внесением изменений.

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