Скрипты для начинающих - Страница 17 - Форум HeroesWorld-а

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

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

Ответ
Страница 17 из 17
 
Опции темы
#241
Старый 31.05.2021, 09:45
  #241
^
Gerter
 
Аватар для Gerter
📖
Регистрация: 16.07.2012
Адрес: Санкт-Петербург
Сообщения: 805
pegn0ly#9113
Выставка наград
Регистрация: 16.07.2012
Адрес: Санкт-Петербург
Сообщения: 805
pegn0ly#9113
Выставка наград
По умолчанию
Re: Скрипты для начинающих

SyryusДобрый день!

В итоге получился вот такой скрипт:

preserve_heroes={"Elleshar", "Linaas", "Gillion", "Diraya", "Itil", "Ossir", "Nadaur"}
function Def( heroName )
for key, name in preserve_heroes do
if name == heroName then
local PreserveHero=1
end;
end;
if not PreserveHero then
         StartCombat(heroName, "Metlirn",7,44,24,146,80,148,16,147,48,50,16,48,48,44,24)
     end;
end;
Trigger( REGION_ENTER_AND_STOP_TRIGGER, "def", "Def" );

Он всех без исключения героев перехватывает...
В том, числе пробовал Ильфиной ("Itil") в регион зайти - тоже бой начинается, а в консоли сообщение: Value was NIL when getting global with name 'PreserveHero'
твоя ошибка связана с областью видимости переменной. Если ты объявляешь локальную переменную внутри некоторого блока, то она будет известна только внутри этого блока. Иначе говоря, в твоем примере переменная PreserveHero известна только в блоке 
if name == heroName then
local PreserveHero=1
end;

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

preserve_heroes={"Elleshar", "Linaas", "Gillion", "Diraya", "Itil", "Ossir", "Nadaur"}
function Def( heroName )
local PreserveHero
for key, name in preserve_heroes do
if name == heroName then
PreserveHero=1
end;
end;
if not PreserveHero then
         StartCombat(heroName, "Metlirn",7,44,24,146,80,148,16,147,48,50,16,48,48,44,24)
     end;
end;
Trigger( REGION_ENTER_AND_STOP_TRIGGER, "def", "Def" );


либо, что еще проще, воспользоваться встроенной функцией contains()

preserve_heroes={"Elleshar", "Linaas", "Gillion", "Diraya", "Itil", "Ossir", "Nadaur"}
function Def( heroName )
if not contains(preserve_heroes, heroName) then
         StartCombat(heroName, "Metlirn",7,44,24,146,80,148,16,147,48,50,16,48,48,44,24)
     end;
end;
Trigger( REGION_ENTER_AND_STOP_TRIGGER, "def", "Def" );

 

__________________
MCCS v0.3.6 - мультиплеерный мод, добавляющий уникальный контент и механики в игру

Ушел в геймдев.
MCCS v0.3.6 - мультиплеерный мод, добавляющий уникальный контент и механики в игру

Ушел в геймдев.
Gerter вне форума
Ответить с цитированием
#242
Старый 31.05.2021, 10:00
  #242
^
}{0TT@6bI4
 
Аватар для }{0TT@6bI4
📖
Регистрация: 05.09.2019
Адрес: Серебряные Города, Аль-Сафир
Сообщения: 1313
Выставка наград
Регистрация: 05.09.2019
Адрес: Серебряные Города, Аль-Сафир
Сообщения: 1313
Выставка наград
По умолчанию
Re: Скрипты для начинающих

Предупрежу тогда Syrvyus, что вызов contatins без параметров приводит к вылету игры.
Gerter, будет ли вылет, если параметры окажутся nil-овыми?
__________________
С уважением, }{0TT@6bI4
_________________
Группа картостроителей
Там ответы на вопросы, руководства, гайды и прочее
_________________
С уважением, }{0TT@6bI4
_________________
Группа картостроителей
Там ответы на вопросы, руководства, гайды и прочее
_________________
}{0TT@6bI4 сейчас на форуме
Ответить с цитированием
#243
Старый 31.05.2021, 10:05
  #243
^
Syryus
📖
Регистрация: 09.11.2017
Сообщения: 10
Регистрация: 09.11.2017
Сообщения: 10
По умолчанию
Re: Скрипты для начинающих

}{0TT@6bI4Ладно, попробуйте вот так:

preserve_heroes={"Elleshar", "Linaas", "Gillion", "Diraya", "Itil", "Ossir", "Nadaur"}
function Def( heroName )
PreserveHero=0
for key, name in preserve_heroes do
if name == heroName then local PreserveHero=1
end;
end;
if  PreserveHero==0 then         
StartCombat(heroName, "Metlirn",7,44,24,146,80,148,16,147,48,50,16,48,48,44,24)    
end;
end;
Trigger( REGION_ENTER_AND_STOP_TRIGGER, "def", "Def" );

Тоже все герои в бой вступают
И в консоли нет никаких сообщений
Syryus вне форума
Ответить с цитированием
#244
Старый 31.05.2021, 10:16
  #244
^
Gerter
 
Аватар для Gerter
📖
Регистрация: 16.07.2012
Адрес: Санкт-Петербург
Сообщения: 805
pegn0ly#9113
Выставка наград
Регистрация: 16.07.2012
Адрес: Санкт-Петербург
Сообщения: 805
pegn0ly#9113
Выставка наград
По умолчанию
Re: Скрипты для начинающих

}{0TT@6bI4Предупрежу тогда Syrvyus, что вызов contatins без параметров приводит к вылету игры.
Gerter, будет ли вылет, если параметры окажутся nil-овыми?
вылетит, только если вместо таблицы передать nil(можно, кстати, поправить этот косяк разрабов). Но мне такая ситуация кажется крайне маловероятной на практике, т.к. нужно специально передать nil в функцию для такого исхода. Т.е. даже если написать:
x = {}
x = nil
if contains(x, 1) then...

то вылета не будет.
__________________
MCCS v0.3.6 - мультиплеерный мод, добавляющий уникальный контент и механики в игру

Ушел в геймдев.
MCCS v0.3.6 - мультиплеерный мод, добавляющий уникальный контент и механики в игру

Ушел в геймдев.
Gerter вне форума
Ответить с цитированием
#245
Старый 31.05.2021, 10:41
  #245
^
}{0TT@6bI4
 
Аватар для }{0TT@6bI4
📖
Регистрация: 05.09.2019
Адрес: Серебряные Города, Аль-Сафир
Сообщения: 1313
Выставка наград
Регистрация: 05.09.2019
Адрес: Серебряные Города, Аль-Сафир
Сообщения: 1313
Выставка наград
По умолчанию
Re: Скрипты для начинающих

Ясно, спасибо.
Если просто ошибиться в написании имени массива, например contains(perserve_heroes, "Itil") вместо contains(preserve_heroes, "Itil"), то ничего не будет? Это очень хорошо
__________________
С уважением, }{0TT@6bI4
_________________
Группа картостроителей
Там ответы на вопросы, руководства, гайды и прочее
_________________
С уважением, }{0TT@6bI4
_________________
Группа картостроителей
Там ответы на вопросы, руководства, гайды и прочее
_________________
}{0TT@6bI4 сейчас на форуме
Ответить с цитированием
#246
Старый 31.05.2021, 10:49
  #246
^
Gerter
 
Аватар для Gerter
📖
Регистрация: 16.07.2012
Адрес: Санкт-Петербург
Сообщения: 805
pegn0ly#9113
Выставка наград
Регистрация: 16.07.2012
Адрес: Санкт-Петербург
Сообщения: 805
pegn0ly#9113
Выставка наград
По умолчанию
Re: Скрипты для начинающих

}{0TT@6bI4Ясно, спасибо.
Если просто ошибиться в написании имени массива, например contains(perserve_heroes, "Itil") вместо contains(preserve_heroes, "Itil"), то ничего не будет? Это очень хорошо
выдаст дефолтное value was nil with name...
__________________
MCCS v0.3.6 - мультиплеерный мод, добавляющий уникальный контент и механики в игру

Ушел в геймдев.
MCCS v0.3.6 - мультиплеерный мод, добавляющий уникальный контент и механики в игру

Ушел в геймдев.
Gerter вне форума
Ответить с цитированием
#247
Старый 31.05.2021, 10:51
  #247
^
Syryus
📖
Регистрация: 09.11.2017
Сообщения: 10
Регистрация: 09.11.2017
Сообщения: 10
По умолчанию
Re: Скрипты для начинающих

preserve_heroes={"Elleshar", "Linaas", "Gillion", "Diraya", "Itil", "Ossir", "Nadaur"}
function Def( heroName )
local PreserveHero
for key, name in preserve_heroes do
if name == heroName then
PreserveHero=1
end;
end;
if not PreserveHero then
         StartCombat(heroName, "Metlirn",7,44,24,146,80,148,16,147,48,50,16,48,48,44,24)
     end;
end;
Trigger( REGION_ENTER_AND_STOP_TRIGGER, "def", "Def" );


В таком виде тоже все герои в бой вступают

preserve_heroes={"Elleshar", "Linaas", "Gillion", "Diraya", "Itil", "Ossir", "Nadaur"}
function Def( heroName )
if not contains(preserve_heroes, heroName) then
         StartCombat(heroName, "Metlirn",7,44,24,146,80,148,16,147,48,50,16,48,48,44,24)
     end;
end;
Trigger( REGION_ENTER_AND_STOP_TRIGGER, "def", "Def" );

 

А вот такой вариант работает как задумано :Рейнджеров пропускает, с остальными бой...Спасибо!
Еще сопутствующий вопрос - как добавить сюда, чтобы сброс триггера происходил после проигрыша конкретного игрока?
Syryus вне форума
Ответить с цитированием
#248
Старый 31.05.2021, 11:07
  #248
^
}{0TT@6bI4
 
Аватар для }{0TT@6bI4
📖
Регистрация: 05.09.2019
Адрес: Серебряные Города, Аль-Сафир
Сообщения: 1313
Выставка наград
Регистрация: 05.09.2019
Адрес: Серебряные Города, Аль-Сафир
Сообщения: 1313
Выставка наград
По умолчанию
Re: Скрипты для начинающих

Gerterвыдаст дефолтное value was nil with name...
Это не страшно, главное, что без вылетов)
__________________
С уважением, }{0TT@6bI4
_________________
Группа картостроителей
Там ответы на вопросы, руководства, гайды и прочее
_________________
С уважением, }{0TT@6bI4
_________________
Группа картостроителей
Там ответы на вопросы, руководства, гайды и прочее
_________________
}{0TT@6bI4 сейчас на форуме
Ответить с цитированием
#249
Старый 31.05.2021, 11:15
  #249
^
Gerter
 
Аватар для Gerter
📖
Регистрация: 16.07.2012
Адрес: Санкт-Петербург
Сообщения: 805
pegn0ly#9113
Выставка наград
Регистрация: 16.07.2012
Адрес: Санкт-Петербург
Сообщения: 805
pegn0ly#9113
Выставка наград
По умолчанию
Re: Скрипты для начинающих

SyryusЕще сопутствующий вопрос - как добавить сюда, чтобы сброс триггера происходил после проигрыша конкретного игрока?

после поражения конкретно в этом бою? как-то так можно:

preserve_heroes={"Elleshar", "Linaas", "Gillion", "Diraya", "Itil", "Ossir", "Nadaur"}
function Def( heroName )
if not contains(preserve_heroes, heroName) then
         local owner = GetObjectOwner(heroName)
         local fight_id = GetLastSavedCombatIndex()
         StartCombat(heroName, "Metlirn",7,44,24,146,80,148,16,147,48,50,16,48,48,44,24)
         while GetLastSavedCombatIndex() == fight_id do
            sleep()
         end
         if not IsHeroAlive(heroName) and owner == номер_игрока then
            Trigger( REGION_ENTER_AND_STOP_TRIGGER, "def", nil)
         end
     end;
end;
Trigger( REGION_ENTER_AND_STOP_TRIGGER, "def", "Def" );
__________________
MCCS v0.3.6 - мультиплеерный мод, добавляющий уникальный контент и механики в игру

Ушел в геймдев.
MCCS v0.3.6 - мультиплеерный мод, добавляющий уникальный контент и механики в игру

Ушел в геймдев.
Gerter вне форума
Ответить с цитированием
#250
Старый 31.05.2021, 11:21
  #250
^
Syryus
📖
Регистрация: 09.11.2017
Сообщения: 10
Регистрация: 09.11.2017
Сообщения: 10
По умолчанию
Re: Скрипты для начинающих

[quote=Gerter]


после поражения конкретно в этом бою? как-то так можно:

preserve_heroes={"Elleshar", "Linaas", "Gillion", "Diraya", "Itil", "Ossir", "Nadaur"}
function Def( heroName )
if not contains(preserve_heroes, heroName) then
         local owner = GetObjectOwner(heroName)
         local fight_id = GetLastSavedCombatIndex()
         StartCombat(heroName, "Metlirn",7,44,24,146,80,148,16,147,48,50,16,48,48,44,24)
         while GetLastSavedCombatIndex() == fight_id do
            sleep()
         end
         if not IsHeroAlive(heroName) and owner == номер_игрока then
            Trigger( REGION_ENTER_AND_STOP_TRIGGER, "def", nil)
         end
     end;
end;
Trigger( REGION_ENTER_AND_STOP_TRIGGER, "def", "Def" );

 

Этот вариант я уже знаю, спасибо разным руководствам, но он задумке не соответствует...нужно, чтобы триггер всегда срабатывал, пока определенный игрок владеет локацией, в которой расположен регион. Как только этот игрок проигрывает партию, то триггер сбрасывается
Syryus вне форума
Ответить с цитированием
#251
Старый 31.05.2021, 11:25
  #251
^
Gerter
 
Аватар для Gerter
📖
Регистрация: 16.07.2012
Адрес: Санкт-Петербург
Сообщения: 805
pegn0ly#9113
Выставка наград
Регистрация: 16.07.2012
Адрес: Санкт-Петербург
Сообщения: 805
pegn0ly#9113
Выставка наград
По умолчанию
Re: Скрипты для начинающих

ну тогда все намного проще:
function PlayerLostCheck()
  while GetPlayerState(номер_игрока) ~= PLAYER_LOST do
    sleep()
  end
  Trigger(REGION_ENTER_AND_STOP_TRIGGER, 'def', nil)
end

startThread(PlayerLostCheck)
__________________
MCCS v0.3.6 - мультиплеерный мод, добавляющий уникальный контент и механики в игру

Ушел в геймдев.
MCCS v0.3.6 - мультиплеерный мод, добавляющий уникальный контент и механики в игру

Ушел в геймдев.
Gerter вне форума
Ответить с цитированием
#252
Старый 31.05.2021, 11:25
  #252
^
}{0TT@6bI4
 
Аватар для }{0TT@6bI4
📖
Регистрация: 05.09.2019
Адрес: Серебряные Города, Аль-Сафир
Сообщения: 1313
Выставка наград
Регистрация: 05.09.2019
Адрес: Серебряные Города, Аль-Сафир
Сообщения: 1313
Выставка наград
По умолчанию
Re: Скрипты для начинающих

Syryus

Еще сопутствующий вопрос - как добавить сюда, чтобы сброс триггера происходил после проигрыша конкретного игрока?

function PlayerLooseCheck(pl)
while 1 do
if GetPlayerState(pl)==PLAYER_LOST then
Trigger(...зануление триггера)
end
sleep(10)
end
end;

startThread(PlayerLooseCheck, PLAYER_НОМЕРИГРОКА)


Можно так, например. Можно еще триггер потери героя игроком повесить, и на нем определять, проиграл ли игрок, — так меньше нагрузка на игру, но есть сомнения, что этот способ сработал бы

__________________
С уважением, }{0TT@6bI4
_________________
Группа картостроителей
Там ответы на вопросы, руководства, гайды и прочее
_________________
С уважением, }{0TT@6bI4
_________________
Группа картостроителей
Там ответы на вопросы, руководства, гайды и прочее
_________________
}{0TT@6bI4 сейчас на форуме
Ответить с цитированием
#253
Старый 31.05.2021, 11:27
  #253
^
}{0TT@6bI4
 
Аватар для }{0TT@6bI4
📖
Регистрация: 05.09.2019
Адрес: Серебряные Города, Аль-Сафир
Сообщения: 1313
Выставка наград
Регистрация: 05.09.2019
Адрес: Серебряные Города, Аль-Сафир
Сообщения: 1313
Выставка наград
По умолчанию
Re: Скрипты для начинающих

biggrin Пока писал, Gerter уже ответил. Даже названия функций совпали... практически))
__________________
С уважением, }{0TT@6bI4
_________________
Группа картостроителей
Там ответы на вопросы, руководства, гайды и прочее
_________________
С уважением, }{0TT@6bI4
_________________
Группа картостроителей
Там ответы на вопросы, руководства, гайды и прочее
_________________
}{0TT@6bI4 сейчас на форуме
Ответить с цитированием
#254
Старый 01.06.2021, 09:48
  #254
^
Syryus
📖
Регистрация: 09.11.2017
Сообщения: 10
Регистрация: 09.11.2017
Сообщения: 10
По умолчанию
Re: Скрипты для начинающих

Коллеги, огромное спасибо!

Протестирую варианты сброса триггера позже и отпишусь...

Добавлено через 22 часа 17 минут
Вчера не дошёл до теста сброса триггера, но потестил основной скрипт в разных ситуациях.
Оказалось, что он не работает для героев под управлением ИИ...
Так и задумано? Или можно еще что-то добавить в скрипт, чтобы он ИИ героев тоже вводил/не вводил в бой по условию скрипта?

Поправка: После входа ИИ героя в регион, если в зоне его очков движения есть вражеский герой - он вступает с ним в бой, по окончании хода этого ИИ героя, если армия, описанная в скрипте побеждает, то ИИ герой исчезает...
Syryus вне форума
Ответить с цитированием
#255
Старый 01.06.2021, 10:32
  #255
^
OrnsteinDragonslayer
 
Аватар для OrnsteinDragonslayer
📖
Регистрация: 10.01.2016
Сообщения: 155
Регистрация: 10.01.2016
Сообщения: 155
По умолчанию
Re: Скрипты для начинающих

Здравствуйте. Вопрос таков - мне нужно, чтобы у героя была статичная армия. Т.е. в определенный момент тебе выдаются, например, 10 юнитов Х и 5 юнитов Y. В определенный момент, если были потери, то устанавливать армию того же героя обратно в значения 10 юнитов Х и 5 юнитов Y. Так же чтобы была возможность изменять параметры, например, чуть позже тебе уже будут выдавать 15 X, 9Y, 3Z. Проще сделать, наверное, функцию "выдавания армии" и триггер в определенные моменты поставить. Но это уж я сам разберусь, а вот с самой проверкой армии, героя, или что там надо проверять, и как написать функцию, чтобы она не "добавляла" юнитов, а "изменяла" их значения? Заранее спасибо
OrnsteinDragonslayer вне форума
Ответить с цитированием
Ответ
Страница 17 из 17


Опции темы



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


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

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