Скрипты - Страница 248 - Форум HeroesWorld-а

Быстрая навигация по основным разделам форума:
Турниры
КАРТЫ
Heroes 6
Heroes 5
Heroes 4
Heroes 3
Heroes 2
Heroes 1
Might&Magic

Герои Меча и Магии 5 - Картостроительство (Редактор карт) В этом разделе можно обсуждать все что касается редактора карт для Heroes of Might and Magic V. Так же здесь обсуждаем картостроительство.

Ответ
Страница 248 из 248
 
Опции темы
#3706
Старый 11.08.2022, 13:51
  #3706
^
}{0TT@6bI4
 
Аватар для }{0TT@6bI4
📖
Регистрация: 05.09.2019
Адрес: Серебряные Города, Аль-Сафир
Сообщения: 1604
Выставка наград
Регистрация: 05.09.2019
Адрес: Серебряные Города, Аль-Сафир
Сообщения: 1604
Выставка наград
По умолчанию
Re: Скрипты

Здравствуйте
Пара вопросов по скрипту вашему: на поле боя не может быть существа с именем "Priest", равно как и Osillian (если это переменная, в которой хранится верное имя, тогда норм, а если вы забыли кавычки, то читайте дальше)
Все существа имеют составное скриптовое имя вида "координаты+айди+число", и это имя сохраняется в первый аргумент хука. В вашем случае — переменную unit. А "Priest" и "Osillian" на поле боя нет

Напишите хук хода защищающегося героя, внутри сделайте проверку:

for n, creature in GetDefenderCreatures() do
  local id = GetCreatureType(creature)
  if id == CREATURE_ARCHER then
     local targets = GetAttackerCreatures()
     chosen_target = targets[random(length(targets)+1]
     -- действия со стрелком creature и целью chosen_target
  end
end


Функцию random нужно написать заново, так как стандартная не работает. Рандомайзер можно взять из Эха Пустоты от RedHeavenHero, если он не против, или написать самому.
__________________
С уважением, }{0TT@6bI4
_________________
Группа картостроителей
Там ответы на вопросы, руководства, гайды и прочее
_________________
С уважением, }{0TT@6bI4
_________________
Группа картостроителей
Там ответы на вопросы, руководства, гайды и прочее
_________________
}{0TT@6bI4 вне форума
Ответить с цитированием
#3707
Старый 11.08.2022, 15:37
  #3707
^
Min_Carolin
 
Аватар для Min_Carolin
📖
Регистрация: 10.07.2018
Сообщения: 21
Регистрация: 10.07.2018
Сообщения: 21
По умолчанию
Re: Скрипты

Спасибо большое за ответ. Да, Osillian - это переменная( "Osillian = GetDefenderHero ()" ), а 'Priest' - имя вызванного скриптом AddCreature стека. Функция random присутствует. Остается только странность с отказом героя кастовать Небесный щит на существо. В приложенном ниже скриншоте показываю ошибку, которую выдает консоль, при попытке его скастовать на существо. 

Еще возникла проблема с предложенным Вами скриптом. Собственно, ошибка, связанная с этим, тоже присутствует на скриншоте. Вот моя функция random:

Заголовокlocal default_state = {
    {1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0},
    {0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 0},
    {1, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0},
    {1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1},
}
function GetPRNGSeed(state)
    local col, row = 1, 4
    local seed = {0, 0, 0, 0, 0, 0}
    for i=1,6 do
        local p2 = 1
        for j=1,23 do
            seed[i] = seed[i] + p2 * (%default_state[row][col] ~= state[row][col] or 0)
            p2 = p2 * 2
            row = row - 1
            if row < 1 then row, col = 4, col + 1 end
            if col > 32 then break end
        end
        if col > 32 then break end
    end
    return seed
end

function SetPRNGSeed(state, seeds)
    state = state or {}
    seeds = seeds or {}
    for i=1,4 do
        if not state[i] then
            state[i] = {}
        end
        for j=1,32 do
            state[i][j] = %default_state[i][j]
        end
    end
    local col, row = 1, 4
    local si
    for i=1,6 do
        si = seeds[i] or si
        if not si then break end
        local si = si
        for j=1,23 do
            local bit = mod(si, 2)
            si = (si - bit) / 2
            state[row][col] = state[row][col] ~= bit or 0
            row = row - 1
            if row < 1 then row, col = 4, col + 1 end
            if col > 32 then break end
        end
        if col > 32 then break end
    end
    return state
end

function NewPRNG(seeds)
    local state = SetPRNGSeed({}, seeds)
    local random = function(n, m)
        local state = %state
        local s
        local t = state[4]
        for i=1,21 do  -- t = t xor (t << 11)
            t[i] = t[i] ~= t[i+11] or 0
        end
        for i=9,32 do  -- t = t xor (t >> 8)
            t[i] = t[i] ~= t[i-8] or 0
        end
        state[4] = state[3]
        state[3] = state[2]
        s = state[1]
        state[2] = s
        for i=1,32 do  -- t = t xor s
            t[i] = t[i] ~= s[i] or 0
        end
        for i=20,32 do  -- t = t xor (s >> 19)
            t[i] = t[i] ~= s[i-19] or 0
        end
        state[1] = t
        local r = 0
        local p = 1
        for i=24,1,-1 do
            r = r + p * t[i]
            p = p * 2
        end
        r = r / 16777216
        if n then
            if not m then
                n, m = 1, n
            end
            return n + floor(r * (m - n + 1))
        else
            return r
        end
    end
    return random, state
end

function InitRandom()
    local seed_t = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
    local seed = {}
    local shift = 0
    for side = 0, 1 do
        for j, unit in GetCreatures(side) do
            local type = GetCreatureType(unit)
            local num = GetCreatureNumber(unit)
            local x, y = pos(unit)
            local n = mod(type, 180) + 180 * (x + 14 * (y + 14 * mod(num, 200)))
            shift = shift + 7
            for i=1,24 do
                local bit = mod(n, 2)
                n = (n - bit) / 2
                local index = mod(shift + i, 24) + 1
                seed_t[index] = seed_t[index] ~= bit or 0
            end
        end
        local x = 0
        local p = 1
        for i=1,24 do
            x = x + p * seed_t[i]
            p = p * 2
        end
        for i=1,12 do
            seed_t[i], seed_t[25 - i] = seed_t[25 - i], seed_t[i]
        end
        seed[side+1] = x
        seed[side+3] = x
        seed[side+5] = x
    end
    print('PRNG seed = ' .. seed[1] .. ':' .. seed[2])
    random = NewPRNG(seed)
end

А вот скрипт, в котором я его использую: 

Заголовокfunction DefenderHeroMove (unit)
Timer = Timer+1
  for n, creature in GetDefenderCreatures() do
    local id = GetCreatureType(creature)
    if id == CREATURE_ARCHER then
     local targets = GetAttackerCreatures()
     chosen_target = targets[random(length(targets)+1)]
    end
  end
commandShot (creature, chosen_target, nil)

}{0TT@6bI4Здравствуйте
Пара вопросов по скрипту вашему: на поле боя не может быть существа с именем "Priest", равно как и Osillian (если это переменная, в которой хранится верное имя, тогда норм, а если вы забыли кавычки, то читайте дальше)
Все существа имеют составное скриптовое имя вида "координаты+айди+число", и это имя сохраняется в первый аргумент хука. В вашем случае — переменную unit. А "Priest" и "Osillian" на поле боя нет

Напишите хук хода защищающегося героя, внутри сделайте проверку:

for n, creature in GetDefenderCreatures() do
  local id = GetCreatureType(creature)
  if id == CREATURE_ARCHER then
     local targets = GetAttackerCreatures()
     chosen_target = targets[random(length(targets)+1]
     -- действия со стрелком creature и целью chosen_target
  end
end


Функцию random нужно написать заново, так как стандартная не работает. Рандомайзер можно взять из Эха Пустоты от RedHeavenHero, если он не против, или написать самому.
Миниатюры
Нажмите на изображение для увеличения
Название:  nj5T1wUahwE.jpg
Просмотров: 8
Размер:	760.9 Кбайт
ID:	67818  
Min_Carolin вне форума
Ответить с цитированием
#3708
Старый 11.08.2022, 17:05
  #3708
^
}{0TT@6bI4
 
Аватар для }{0TT@6bI4
📖
Регистрация: 05.09.2019
Адрес: Серебряные Города, Аль-Сафир
Сообщения: 1604
Выставка наград
Регистрация: 05.09.2019
Адрес: Серебряные Города, Аль-Сафир
Сообщения: 1604
Выставка наград
По умолчанию
Re: Скрипты

Так в рандомайзере от RedHeavenHero функция рандома создаётся только по инициализации рандомайзера, т.е. по вызове функции InitRandom(), вам нужно добавить эту строчку в начало скрипта

Возможно, для каста небесного щита необходим навык призыва?
Я сталкивался с тем, что не могу скастовать масскарайку без магии света
__________________
С уважением, }{0TT@6bI4
_________________
Группа картостроителей
Там ответы на вопросы, руководства, гайды и прочее
_________________
С уважением, }{0TT@6bI4
_________________
Группа картостроителей
Там ответы на вопросы, руководства, гайды и прочее
_________________
}{0TT@6bI4 вне форума
Ответить с цитированием
#3709
Старый 11.08.2022, 17:32
  #3709
^
Min_Carolin
 
Аватар для Min_Carolin
📖
Регистрация: 10.07.2018
Сообщения: 21
Регистрация: 10.07.2018
Сообщения: 21
По умолчанию
Re: Скрипты

Да, действительно, с экспертным призывом небесный щит начал накладываться. И random тоже начал выдавать числа. Но теперь возникла вот такая проблема: скрипт ругается на второй аргумент Вашей функции, т.е. на переменную chosen_target (скриншот прилагается). Может, я ее как-то неправильно понял и, соответственно, неправильно пишу?

P.S. Все разрешилось, просто надо было sleep написать, чтобы все корректно отработало. Спасибо большое.

Сама функция: 

Заголовокfunction DefenderHeroMove (unit)
InitRandom()
  for n, creature in GetDefenderCreatures() do
    local id = GetCreatureType(creature)
     if id == CREATURE_ARCHER then
     local targets = GetAttackerCreatures()
     local chosen_target = targets[random(length(targets)+1)]
     commandShot (creature, chosen_target, nil)
     end
  end


}{0TT@6bI4Так в рандомайзере от RedHeavenHero функция рандома создаётся только по инициализации рандомайзера, т.е. по вызове функции InitRandom(), вам нужно добавить эту строчку в начало скрипта

Возможно, для каста небесного щита необходим навык призыва?
Я сталкивался с тем, что не могу скастовать масскарайку без магии света
Миниатюры
Нажмите на изображение для увеличения
Название:  1.jpg
Просмотров: 7
Размер:	747.5 Кбайт
ID:	67819  
Min_Carolin вне форума
Ответить с цитированием
#3710
Старый 11.08.2022, 19:59
  #3710
^
Min_Carolin
 
Аватар для Min_Carolin
📖
Регистрация: 10.07.2018
Сообщения: 21
Регистрация: 10.07.2018
Сообщения: 21
По умолчанию
Re: Скрипты

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

Опять же, вот скрипт:

Заголовокfunction DefenderHeroMove (unit)
InitRandom()
    for n, creature in GetDefenderCreatures() do
    local id = GetCreatureType(creature)
      if id == CREATURE_ARCHER then
      local targets = GetAttackerCreatures()
      chosen_target = targets[random(length(targets)+1)]
      sleep (50)
      commandShot (creature, chosen_target, not nil)
      sleep (1)
      end
  end

 

Min_Carolin

Да, действительно, с экспертным призывом небесный щит начал накладываться. И random тоже начал выдавать числа. Но теперь возникла вот такая проблема: скрипт ругается на второй аргумент Вашей функции, т.е. на переменную chosen_target (скриншот прилагается). Может, я ее как-то неправильно понял и, соответственно, неправильно пишу?

P.S. Все разрешилось, просто надо было sleep написать, чтобы все корректно отработало. Спасибо большое.

Сама функция: 

Заголовокfunction DefenderHeroMove (unit)
InitRandom()
  for n, creature in GetDefenderCreatures() do
    local id = GetCreatureType(creature)
     if id == CREATURE_ARCHER then
     local targets = GetAttackerCreatures()
     local chosen_target = targets[random(length(targets)+1)]
     commandShot (creature, chosen_target, nil)
     end
  end


Min_Carolin вне форума
Ответить с цитированием
Ответ
Страница 248 из 248


Опции темы



Часовой пояс GMT +4, время: 12:49.


vBulletin v3.5.0, Copyright ©2000-2022, Jelsoft Enterprises Ltd. (Русский)

Яндекс цитирование    Top.Mail.Ru