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

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

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

Ответ
Страница 250 из 255
 
Опции темы
#3736
Старый 31.10.2022, 14:13
  #3736
^
Grigoriy
 
Аватар для Grigoriy
📖
Регистрация: 02.11.2016
Сообщения: 110
Регистрация: 02.11.2016
Сообщения: 110
По умолчанию
Re: Скрипты

Shiroyasha2910

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


Уж не знаю, зачем такая имбища, в виде таких дебаффов, что и стандартный дебафф отключать не нужно, но от Хоттабыча был гайд на тему боевых скриптов, с примерами. В любом случае, я забыл упомянуть, что конкретной длительности и силы этих заклинаний не сделать - всё будет зависеть от параметров героя, от лица которого будет идти скриптовое заклинание.
Grigoriy вне форума
Ответить с цитированием
#3737
Старый 31.10.2022, 18:59
  #3737
^
Азгалор
 
Аватар для Азгалор
📖
Регистрация: 24.04.2016
Сообщения: 177
Регистрация: 24.04.2016
Сообщения: 177
По умолчанию
Re: Скрипты

Привет! Кто-нибудь сталкивался с таким багом? У меня в боевом скрипте прописано, что герой кастует общее ускорение вначале каждого боя. Всё работает до тех пор, пока герой не оденет том магии света, после чего во время боя консоль жалуется что герой не может применить заклинание общее ускорение. Это вообще как-нибудь поправимо?
Азгалор вне форума
Ответить с цитированием
#3738
Старый 31.10.2022, 19:39
  #3738
^
Grigoriy
 
Аватар для Grigoriy
📖
Регистрация: 02.11.2016
Сообщения: 110
Регистрация: 02.11.2016
Сообщения: 110
По умолчанию
Re: Скрипты

АзгалорПривет! Кто-нибудь сталкивался с таким багом? У меня в боевом скрипте прописано, что герой кастует общее ускорение вначале каждого боя. Всё работает до тех пор, пока герой не оденет том магии света, после чего во время боя консоль жалуется что герой не может применить заклинание общее ускорение. Это вообще как-нибудь поправимо?

Возможно, что герою не хватало маны в момент теста с томом?
Grigoriy вне форума
Ответить с цитированием
#3739
Старый 31.10.2022, 20:22
  #3739
^
Азгалор
 
Аватар для Азгалор
📖
Регистрация: 24.04.2016
Сообщения: 177
Регистрация: 24.04.2016
Сообщения: 177
По умолчанию
Re: Скрипты

GrigoriyВозможно, что герою не хватало маны в момент теста с томом?
Хм, странно получается. У меня скрипт прописан так, что сначала даётся мана на спелл, а потом кастуется сам спелл. Почему-то если в начале боя у героя не хватает маны на спелл, то даже после выдачи игра его не кастует

Добавлено через 18 минут
В общем, прописал выдачу маны на стадию подготовки, теперь работает даже если у героя 0 маны на перед боем
Азгалор вне форума
Ответить с цитированием
#3740
Старый 31.10.2022, 20:48
  #3740
^
}{0TT@6bI4
 
Аватар для }{0TT@6bI4
📖
Регистрация: 05.09.2019
Адрес: Серебряные Города, Аль-Сафир
Сообщения: 1751
Выставка наград
Регистрация: 05.09.2019
Адрес: Серебряные Города, Аль-Сафир
Сообщения: 1751
Выставка наград
По умолчанию
Re: Скрипты

Shiroyasha2910

Я тут почти закончил делать карту, но столкнулся с проблемой сделать свой бонус для сета артефактов, а именно, я вообще не представляю как подобное делать. Задумка такая, если у героя будут артефакты: шлем некроманта, проклятое кольцо, кольцо сломленного духа и амулет некроманта, то:

Гарантирует герою, что в начале боя все существа в армии противника окажутся под действием заклинаний «Замедление», «Неудача», «Слабость» и «Проклятие». Эффект действует на протяжении 10 ходов.

Помогите пожалуйста


Если вы понимаете, как привязать выполнение боевого скрипта к героям, надевшим определённые арты, то остальное всё достаточно просто:
function Start()
  for side=0,1 do
    if GetHero(side) then
      if GetHeroName(GetHeroSide()) then --Ваша проверка в бою на героя. Я рекомендую в скрипте карты приключений создавать глоб. переменную вида "hero".."_NecArtSet" в единицу при наличии сета (и в ноль при отсутствии) и тут писать вместо проверки имени проверку вида if GetGameVar(GetHeroName(GetHeroSide()).."_NecArtSet")+0==1 then
        startThread(function(side)
        combatSetPause(1)
        SummonCreature(side, CREATURE_YETI, 1)
        for n, unit in GetCreatures(side) do if GetCreatureType(unit)==CREATURE_YETI then local _helper = unit break; end; end
        while not exist(_helper) do sleep() end
        for n, spell in {SPELL_MASS_SLOW, ...} --Список масскастов
          UnitCastGlobalSpell(_helper, spell)
        end
        removeUnit(_helper)
        combatSetPause(nil)
        )
      end
    end
  end
end

Скрипт написал без тестирований, поэтому адапатируйте и потестируйте, пожалуйста. Также вам понадобится заменить в характеристиках существа Neutrals/Yeti ману на ~200 и мастерство в школе так, чтобы держалось 10 ходов. Ну или с числом вызываемых поиграться

__________________
С уважением, }{0TT@6bI4
_________________
Группа картостроителей
Там ответы на вопросы, руководства, гайды и прочее
_________________
С уважением, }{0TT@6bI4
_________________
Группа картостроителей
Там ответы на вопросы, руководства, гайды и прочее
_________________
}{0TT@6bI4 вне форума
Ответить с цитированием
#3741
Старый 03.11.2022, 13:17
  #3741
^
Азгалор
 
Аватар для Азгалор
📖
Регистрация: 24.04.2016
Сообщения: 177
Регистрация: 24.04.2016
Сообщения: 177
По умолчанию
Re: Скрипты

Привет, как бы мне прописать функцию с массивом или таблицей для сохранения координат существ чтобы потом их использовать для респавна новых? Координаты для спавна, соответственно, будут выбираться рандомно из сохранённого списка + не ставить существ если позиция ещё занята их законными владельцами.
Азгалор вне форума
Ответить с цитированием
#3742
Старый 03.11.2022, 14:42
  #3742
^
}{0TT@6bI4
 
Аватар для }{0TT@6bI4
📖
Регистрация: 05.09.2019
Адрес: Серебряные Города, Аль-Сафир
Сообщения: 1751
Выставка наград
Регистрация: 05.09.2019
Адрес: Серебряные Города, Аль-Сафир
Сообщения: 1751
Выставка наград
По умолчанию
Re: Скрипты

И в бою, и на карте приключений при спавне существа на занятую клетку оно заспавнится на ближайшую рядом.

В целом, ничего особо сложного нет
function SaveCreaturePos(table, mob)
local x, y, z = GetObjectPosition(mob)
creature_coord_table[mob] = {x=x, y=y, floor=z}
end --Что-то такое
__________________
С уважением, }{0TT@6bI4
_________________
Группа картостроителей
Там ответы на вопросы, руководства, гайды и прочее
_________________
С уважением, }{0TT@6bI4
_________________
Группа картостроителей
Там ответы на вопросы, руководства, гайды и прочее
_________________
}{0TT@6bI4 вне форума
Ответить с цитированием
#3743
Старый 03.11.2022, 16:16
  #3743
^
Азгалор
 
Аватар для Азгалор
📖
Регистрация: 24.04.2016
Сообщения: 177
Регистрация: 24.04.2016
Сообщения: 177
По умолчанию
Re: Скрипты

}{0TT@6bI4И в бою, и на карте приключений при спавне существа на занятую клетку оно заспавнится на ближайшую рядом.

В целом, ничего особо сложного нет
function SaveCreaturePos(table, mob)
local x, y, z = GetObjectPosition(mob)
creature_coord_table[mob] = {x=x, y=y, floor=z}
end --Что-то такое

 

Всё равно дело как-то не идёт. Написал такой скрипт на сохранение координат:
function SaveCoordinates( table )
     local monster_list = {};
     local k = 0;
     for i=1,500 do
          monster = "m"..i;
          if IsObjectExists( monster ) then
	       k = k + 1;
	       monster_list[k] = monster;
               local x, y, z = GetObjectPosition(monster_list[k])
               creatures_positions[k] = {x=x, y=y, floor=z}
          end;
     end;
end;

Потом в другой функции пытаюсь взять из этого списка рандомную позицию и поставить на неё существо, но игра выдаёт ошибку на пустые x, y, z. В другой функции взятие координат прописал так:

for k=1, length(creatures_positions) do
       local x, y, z = random(length(creatures_positions[k]))
Азгалор вне форума
Ответить с цитированием
#3744
Старый 03.11.2022, 22:18
  #3744
^
}{0TT@6bI4
 
Аватар для }{0TT@6bI4
📖
Регистрация: 05.09.2019
Адрес: Серебряные Города, Аль-Сафир
Сообщения: 1751
Выставка наград
Регистрация: 05.09.2019
Адрес: Серебряные Города, Аль-Сафир
Сообщения: 1751
Выставка наград
По умолчанию
Re: Скрипты

Во-первых, можно не заморачиваться с именованием всех мобов, а использовать функцию GetObjectNamesByType("MONSTER")

Во-вторых, очевидно неправильно пытаться в 3 ПЕРЕМЕННЫХ записать одно значение, которое возвращает РАНДОМ, в который передаётся ТАБЛИЦА. Это просто что-то с чем-то)

Только x=creatures_position[k].x, y=..., z = ...
__________________
С уважением, }{0TT@6bI4
_________________
Группа картостроителей
Там ответы на вопросы, руководства, гайды и прочее
_________________
С уважением, }{0TT@6bI4
_________________
Группа картостроителей
Там ответы на вопросы, руководства, гайды и прочее
_________________
}{0TT@6bI4 вне форума
Ответить с цитированием
#3745
Старый 04.11.2022, 01:00
  #3745
^
Азгалор
 
Аватар для Азгалор
📖
Регистрация: 24.04.2016
Сообщения: 177
Регистрация: 24.04.2016
Сообщения: 177
По умолчанию
Re: Скрипты

}{0TT@6bI4Во-первых, можно не заморачиваться с именованием всех мобов, а использовать функцию GetObjectNamesByType("MONSTER")

Во-вторых, очевидно неправильно пытаться в 3 ПЕРЕМЕННЫХ записать одно значение, которое возвращает РАНДОМ, в который передаётся ТАБЛИЦА. Это просто что-то с чем-то)

Только x=creatures_position[k].x, y=..., z = ...

Короч, взял разрабовский скрипт респавна ботов из 3 карты кампании за Фриду владык севера, подредачил его под себя пользуясь ещё скриптом на спавн красных героев возле городов из последней карты с Фридой, получилось такое: 

function SaveCoordinats( table )
     local monster_list = {};
     local k = 0;
     for i=1,500 do
          monster = "m"..i;
          if IsObjectExists( monster ) then
	       k = k + 1;
	       monster_list[k] = monster;
               creatures_positions[k] = GetObjectPosition(monster_list[k])
          end;
     end;
               creatures_positions_list = length(creatures_positions)
end;

function RespawnUnitsByLuck()
--    if ( GetDate(WEEK) == 3 ) and ( GetDate(DAY_OF_WEEK) == random(6) + 1 ) then
        local WR_luck = GetHeroStat(WR, STAT_LUCK)
	local respawns_types = { CREATURE_AIR_ELEMENTAL, CREATURE_PHOENIX }
	local respawns_quantities = { 100 * diff, 10 * diff }
	local respawns_mood = {3, 0} 
	local respawns_courage = {1, 2}
	local respawns_num = 20 + diff 
	local previous_pos = {}
        local respawns_id = 0
        local CanRespawnUnitsByLuck = random(100) + (10*(WR_luck+1)) * mod((WR_luck+1),diff)

        if CanRespawnUnitsByLuck >= mod(70,(WR_luck+2)) + (60+diff) then        --( 70 + (10+diff) ) then
           print("<color=blue>Шанс ", CanRespawnUnitsByLuck ,". <color=orange>Респавним юнитов")
        elseif CanRespawnUnitsByLuck < mod(70,(WR_luck+2)) + (60+diff) then     --( 50 + (10+diff) ) then
           print("<color=blue>Шанс ", CanRespawnUnitsByLuck ,". <color=orange>Никого не спавним")
           return 
        end

        if WR_luck >= 7 then 
                courage = {1, 0}
                respawns_num = 20 * diff      
                respawns_quantities = { 200 * diff, 20 * diff }
        end
            for k=1, creatures_positions_list do		
		if ( IsTilePassable(creatures_positions[k][3]) ) then 
			local type = random( 1 ) + 1
                        if type == 2 and WR_luck < 3 then 
                           type = 1
                        end
			local creaturetype = respawns_types[ type ]
			local quantity = respawns_quantities[ type ]
                        local mood = respawns_mood[ type ]
                        local courage = respawns_courage[ type ]
			respawns_id = respawns_id + 1;
			local respawnsname = 'respawns' .. respawns_id;
			CreateMonster( respawnsname, creaturetype, quantity, creatures_positions[k][3], mood, courage, random( 360 ) );
		end;
	  end;
--     end;
end;

 

Игра жалуется на "attempt to index a number value". У меня уже голова не варит как этот респавн допилить чтобы он заработал нормально 🙃 Изначальный, разрабовский вариант, работал, но у меня карта большая, много кустов, и каждую клетку маской заливать чтобы там не заспавнился бот - такое себе дело( Проще уж спавнить их на уже готовых монстриках, поэтому у меня для заполнения координат таковые уже имеются на карте.

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

Сразу говорю, в чём точно ошибка. Когда вы записываете в crearure_positions[k] возврат функции GetObjectPosition, то у вас эоот катый элемент становится числом, а не таблицей из трёх элементов. Поэтому нужно опять: creature_positions[k][1], creature_positions[k][2], creature_positions[k][3] = GetObjectPosition(monster)
И в проверке IsTilePassable нужно сначала в local x y z сохранить соответствующие элементы таблицы, а потом передать в IsTilePassable.
Ну и именно из-за этого ошибка "попытка индексировать число". Ведь creature[k] у вас не что иное, как чиселка
__________________
С уважением, }{0TT@6bI4
_________________
Группа картостроителей
Там ответы на вопросы, руководства, гайды и прочее
_________________
С уважением, }{0TT@6bI4
_________________
Группа картостроителей
Там ответы на вопросы, руководства, гайды и прочее
_________________
}{0TT@6bI4 вне форума
Ответить с цитированием
#3747
Старый 05.11.2022, 00:14
  #3747
^
Азгалор
 
Аватар для Азгалор
📖
Регистрация: 24.04.2016
Сообщения: 177
Регистрация: 24.04.2016
Сообщения: 177
По умолчанию
Re: Скрипты

}{0TT@6bI4Сразу говорю, в чём точно ошибка. Когда вы записываете в crearure_positions[k] возврат функции GetObjectPosition, то у вас эоот катый элемент становится числом, а не таблицей из трёх элементов. Поэтому нужно опять: creature_positions[k][1], creature_positions[k][2], creature_positions[k][3] = GetObjectPosition(monster)
И в проверке IsTilePassable нужно сначала в local x y z сохранить соответствующие элементы таблицы, а потом передать в IsTilePassable.
Ну и именно из-за этого ошибка "попытка индексировать число". Ведь creature[k] у вас не что иное, как чиселка

Этот как-то не сработал, зато пошло дело с твоим предыдущим вариантом) Правда, пришлось еще кое-что подправить, а то у меня IsTilePassable жаловался на неверный 3 аргумент. В общем, всё работает, но правда имеющиеся точки под спавн идут не случайно из списка а строго по нему, что довольно печально. Как-бы мне это дело зарандомить чтобы всё не сломать?

 

Ещё такой вопрос. Есть у меня проверка на удачу(GetHeroStat(герой, STAT_LUCK)), и вот в консоли я заметил что даже если поставить герою 10, то она будет выдавать не выше 5. Т.е. если я в скрипте поставлю условие чтобы удача была выше 6, то тогда это условие всегда будет неверным?

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

То есть у вас от 1 до k заменяются все существа при выполнении какого-то условия с удачей, а вы хотите, чтобы это происходило
а) Непоследовательно
б) Без повторений
в) Со всеми k элементами

Тогда нужен интересный алгоритм:
local used_indexes = {}
for i=1, k do
repeat N=random(k)+1
until not used_indexes[N]
used_indexes[N] = 1;
--Действия с существом с номером N (не k!!)
end
__________________
С уважением, }{0TT@6bI4
_________________
Группа картостроителей
Там ответы на вопросы, руководства, гайды и прочее
_________________
С уважением, }{0TT@6bI4
_________________
Группа картостроителей
Там ответы на вопросы, руководства, гайды и прочее
_________________
}{0TT@6bI4 вне форума
Ответить с цитированием
#3749
Старый 05.11.2022, 14:17
  #3749
^
BlueHeavenHero
 
Аватар для BlueHeavenHero
📖
Регистрация: 20.08.2022
Адрес: "Асхан/Священная Империя Единорога/Светлолесье"
Сообщения: 142
Регистрация: 20.08.2022
Адрес: "Асхан/Священная Империя Единорога/Светлолесье"
Сообщения: 142
По умолчанию
Re: Скрипты

Всем привет! Нужна помощь по скрипту. Написал я вот такой скрипт:
function ChristianAttacked()
DeployReserveHero("Christian", 98, 108, 0)
sleep(1)
MoveHero("Christian", 126, 139, -1)
if IsHeroAlive(hero) and GetObjectOwner("castle") == PLAYER_1 then
		StartDialogScene("/DialogScenes/FallenKnight/S3/DialogScene.xdb#xpointer(/DialogScene)")
		sleep(1)
    SetObjectiveState("prim6", OBJECTIVE_ACTIVE, 1)
else SetObjectiveState("prim5", OBJECTIVE_FAILED, 1)
loose()
end;
end;

Вроде всё правильно, НО - функция ниже не работает! Всё остальное, включая else, работает отлично. В чём ошибка? Пути к ролику точно правильно прописал...

if IsHeroAlive(hero) and GetObjectOwner("castle") == PLAYER_1 then
		StartDialogScene("/DialogScenes/FallenKnight/S3/DialogScene.xdb#xpointer(/DialogScene)")
		sleep(1)
    SetObjectiveState("prim6", OBJECTIVE_ACTIVE, 1)
__________________
Мои карты:
Сценарий "Падший рыцарь" - Мой первый сценарий.
Кампания "Пробуждение" - Только начал работу над кампанией.

Мои карты:
Сценарий "Падший рыцарь" - Мой первый сценарий.
Кампания "Пробуждение" - Только начал работу над кампанией.

BlueHeavenHero вне форума
Ответить с цитированием
#3750
Старый 05.11.2022, 15:32
  #3750
^
}{0TT@6bI4
 
Аватар для }{0TT@6bI4
📖
Регистрация: 05.09.2019
Адрес: Серебряные Города, Аль-Сафир
Сообщения: 1751
Выставка наград
Регистрация: 05.09.2019
Адрес: Серебряные Города, Аль-Сафир
Сообщения: 1751
Выставка наград
По умолчанию
Re: Скрипты

Потому что hero не определена. Проверьте в консоли. В переменную hero записано nil, и очевидно, проверка IsHeroAlive возвращает ложь.
__________________
С уважением, }{0TT@6bI4
_________________
Группа картостроителей
Там ответы на вопросы, руководства, гайды и прочее
_________________
С уважением, }{0TT@6bI4
_________________
Группа картостроителей
Там ответы на вопросы, руководства, гайды и прочее
_________________
}{0TT@6bI4 вне форума
Ответить с цитированием
Ответ
Страница 250 из 255


Опции темы



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


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

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