Перейти к содержанию

Сообщения от Скрипты

В ответ пользователю Jack_of_shadows
Аватар пользователя
Jack_of_shadows
Азгалор, долго вспоминал, короче нужно в этом случае обязательно передавать все 5 вариантов ответов, если используются только 2, то после них добавить еще , nil, nil, nil.

Да, вот теперь всё работает как надо. Огромное спасибо) Впрочем, и не только за это, а ещё и за скрипты связанные с табличкой артефактов :)

Всякое/карты:

Добавление недостающей музыки гномам

Аватар пользователя
Друзья, как реализовать одновременные анимации? Сейчас из-за того что строчки кода идут последовательно, возникает рассинхронизация небольшая. Также хотел спросить насчет паузы между анимациями. Пока что поставил на IDLE, но в таком случае объекты после окончания анимации сразу начинают новую, а мне нужна пауза. Пока есть идея реализовывать все это через функции и циклы. Подскажите, правильно ли я мыслю? И если вдруг лень объяснять, может, кто-то знает, в каких сценариях были реализованы такие анимации? Я могу сам в них залезть и посмотреть)
В ответ пользователю Madara_X
Аватар пользователя
Madara_X,
Madara_X
как реализовать одновременные анимации? Сейчас из-за того что строчки кода идут последовательно, возникает рассинхронизация небольшая.Также хотел спросить насчет паузы между анимациями. Пока что поставил на IDLE, но в таком случае объекты после окончания анимации сразу начинают новую, а мне нужна пауза
Прописать PlayObjectAnimation("скриптовое имя существа", "анимация", ONESHOT(ONESHOT_STILL если это анимация смерти(по желанию)), после написать sleep(нужное количество задержки), и после снова прописывать PlayObjectAnimation(), которая(ые) отработают уже после задержки из sleep()
Madara_X
В каких сценариях были реализованы такие анимации?
Первая миссия кампании за Фриду во Владыках, анимки тренирующихся существ в лагерях Рэндалла и Колдуэлла. Чтобы не бежать открывать туман войны на карте, можешь вбить в консоли @OpenCircleFog(0, 0, 0, 999, 1);

Всякое/карты:

Добавление недостающей музыки гномам

В ответ пользователю Азгалор
Аватар пользователя
Всем добрый день, нужна помощь в написании кода скрипта. Задумка - любой случайный герой заходит в определенное здание и это здание проверяет есть ли у героя перк - выдает ему бонус за этот перк. Проблема в том, что нужно проверить имеет ли герой много перков и дать ему много бонусов если он их имеет, сам научился писать код для проверки только одного перка и дальше игра не читает. Прошу кодеров помочь, нужен максимально простой скрипт такого вида: функция перкиФ (херонейм) если "герой имеет скилл" (херонейм, например скилл стрельба) то "добавить герою существ" (херонейм, например лучники, в колве 1) также если "герой имеет скилл" (херонейм, например логистика искусная) то "добавить герою артефакт" (херонейм, например кандалы неизбежности, непередаваемый) также если "герой имеет скилл" (херонейм, например логистика развитая) то "изменить герою стат" (херонейм, например защита, +2) также если "герой имеет скилл" (херонейм, например свет развитый) то "обучить героя заклинанию" (херонейм, например замедление на искусном уровне) конец конец Тригер (герой касается объекта под названием тттт, запуск функции перкиФ) Сами примеры могут быть другими, важен принцип и логика написания кода, чтобы один тригер касания проверял большое количество перков и выдавал герою существ, артефакт, заклинание Еще надо чтобы присутстовал нил и касание работало один раз и не выдавало по сто раз бонусы. Буду благодарен за объяснение Еще вопрос есть Нужен скрипт который будет работать при начале сражения Старткомбат если в битве присутствует герой некромант и если он имеет перк лидерство то герой противника получает -1 к боевому духу и аналогично для развитого и искусного уровня на -2 и -3 бд. Спасибо за помощь.
В ответ пользователю green belly
Аватар пользователя
green belly
Всем добрый день, нужна помощь в написании кода скрипта. Задумка - любой случайный герой заходит в определенное здание и это здание проверяет есть ли у героя перк - выдает ему бонус за этот перк. Проблема в том, что нужно проверить имеет ли герой много перков и дать ему много бонусов если он их имеет, сам научился писать код для проверки только одного перка и дальше игра не читает. Прошу кодеров помочь, нужен максимально простой скрипт такого вида: функция перкиФ (херонейм) если "герой имеет скилл" (херонейм, например скилл стрельба) то "добавить герою существ" (херонейм, например лучники, в колве 1) также если "герой имеет скилл" (херонейм, например логистика искусная) то "добавить герою артефакт" (херонейм, например кандалы неизбежности, непередаваемый) также если "герой имеет скилл" (херонейм, например логистика развитая) то "изменить герою стат" (херонейм, например защита, +2) также если "герой имеет скилл" (херонейм, например свет развитый) то "обучить героя заклинанию" (херонейм, например замедление на искусном уровне) конец конец Тригер (герой касается объекта под названием тттт, запуск функции перкиФ) Сами примеры могут быть другими, важен принцип и логика написания кода, чтобы один тригер касания проверял большое количество перков и выдавал герою существ, артефакт, заклинание Еще надо чтобы присутстовал нил и касание работало один раз и не выдавало по сто раз бонусы. Буду благодарен за объяснение Еще вопрос есть Нужен скрипт который будет работать при начале сражения Старткомбат если в битве присутствует герой некромант и если он имеет перк лидерство то герой противника получает -1 к боевому духу и аналогично для развитого и искусного уровня на -2 и -3 бд. Спасибо за помощь.
Вот пример моего кода на проверку магических скиллов и выдачу заклинаний в соответствии со школой. С существами и прочим можно сделать по аналогии



Добавлено через 9 минут
Друзья, а подскажите, сколько одновременных функций может исполняться в игре? Сейчас занимаюсь анимациями персонажей: создаю отдельные функции и запускаю их через startThread(), однако заметил, что ровно на второй команде startThread() игра намертво зависает. Если объединить все анимации в одну функцию, то тогда все ок.
Аватар пользователя
green belly, про перки: удобней всего(наверное) будет создать таблицу, куда занести перки, тип награды за перк и соответственно сами награды за разные уровни мастерства. После написать функцию которая будет проверять наличие нужных перков и их мастерство, определять какой тип награды должен быть и выдавать за них саму награду.

Про статы для боя: думаю, можно определять какой расе принадлежит герой через HasHeroSkill(heroName, ID расовых статов(типа "мастер артефактов" у магов, "контрудар" у рыцарей, мститель у эльфов, "некромантия" у некромантов и т.д.), и если у героя есть тот или иной стат(а он, по стандарту, может быть у героя только один), приписывать его в нужную расу. С лидерством так же, но для проверки уровня мастерства нужно использовать функцию GetHeroSkillMastery(heroName, ID скилла), которая возвращает число от 0 до 4(0 - не владеет перком совсем, 1-3 - начально/развито/искусно, 4 - совершенно(вроде как только для расовых перков, типа "Совершенный контрудар". Напомню, что совершенные уровни расовых перков получаются только благодаря артефакту "Кулон Мастерства")), и в соответствии с уровнем мастерства применять GiveHeroBattleBonus(heroName, HERO_BATTLE_BONUS_MORALE, -нужное число)

p.s. функция баттл-бонусов работает только в версии 3.1)

Всякое/карты:

Добавление недостающей музыки гномам

В ответ пользователю Madara_X
Аватар пользователя
Madara_X
Друзья, а подскажите, сколько одновременных функций может исполняться в игре? Сейчас занимаюсь анимациями персонажей: создаю отдельные функции и запускаю их через startThread(), однако заметил, что ровно на второй команде startThread() игра намертво зависает. Если объединить все анимации в одну функцию, то тогда все ок.
Потоков может быть много (в рамках разумного, возможно на нескольких десятках у кого-то начнет подтормаживать). Лично я чисто на всякий случай пускаю анимации существ только если игрок находится рядом (можно например в начале хода проверять расстояние герой-существа), но это уже мой режим параноика. Приведите простенький пример как именно запускаете и что происходит.
РПГ-сценарий для HoMM5: Путь героя
ЧаВо по созданию карт для HoMM5: ЧаВо
Аватар пользователя
Madara X, Азгалор, благодарю за ответы, со множественной проверкой перков в одном скрипте я разобрался) Но все ещё не могу разобраться с выдачей бонусов через givebattlebonus.
Нужен именно пример кода, может есть какие то карты у форумчан или примеры, где используют этот код.
Я ищу следующие примеры: 
1) если герой обладает навыком A, то дать ЭТОМУ ГЕРОЮ на один бой бонус (например +1 к скорости существам или +бд или + стат или + 1% к хп существам)
2) если герой обладает навыком B, то дать ГЕРОЮ ПРОТИВНИКА на один бой бонус (например -1 к скорости существ, - 1 бд, удачи и тд)
3) если герой обладает навыком C, то этот герой кастует в начале всех следующих битв заклинание D.
Благодарю за любые примеры и помощь!
В ответ пользователю green belly
Аватар пользователя
green belly
Madara X, Азгалор, благодарю за ответы, со множественной проверкой перков в одном скрипте я разобрался) Но все ещё не могу разобраться с выдачей бонусов через givebattlebonus.
Нужен именно пример кода, может есть какие то карты у форумчан или примеры, где используют этот код.
Я ищу следующие примеры: 
1) если герой обладает навыком A, то дать ЭТОМУ ГЕРОЮ на один бой бонус (например +1 к скорости существам или +бд или + стат или + 1% к хп существам)
2) если герой обладает навыком B, то дать ГЕРОЮ ПРОТИВНИКА на один бой бонус (например -1 к скорости существ, - 1 бд, удачи и тд)
3) если герой обладает навыком C, то этот герой кастует в начале всех следующих битв заклинание D.
Благодарю за любые примеры и помощь!
Вот такие статы можно менять у героев в GiveHeroBattleBonus(heroName, bonusType/bonusID, +-(если нужно прибавить, то + не ставить(иначе скрипт выдаст ошибку)) amount). Сами ID-шники и названия бонусов которые можно повысить или понизить(кроме Hitpoints(очки жизни существ), их можно только повышать):
HERO_BATTLE_BONUS_LUCK = 0
HERO_BATTLE_BONUS_MORALE = 1
HERO_BATTLE_BONUS_ATTACK = 2
HERO_BATTLE_BONUS_DEFENCE = 3
HERO_BATTLE_BONUS_HITPOINTS = 4
HERO_BATTLE_BONUS_INITIATIVE = 5
HERO_BATTLE_BONUS_SPEED = 6

Соответственно:
function buffsForbattle()
if HasHeroSkill("Duncan", SKILL_LUCK ) then
GiveHeroBattleBonus("Duncan", HERO_BATTLE_BONUS_SPEED, 1)
elseif...... и т.д.
end
end

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

Всякое/карты:

Добавление недостающей музыки гномам

Аватар пользователя

Кто может подсказать в чем ошибка кода. Все работает в коде кроме одной строки с добавлением стата герою. Писал код по руководству ОГО:

function arena1F ()
gold = GetPlayerResource (1, 6);
if gold >= 2000
then
QuestionBox ("/Maps/Multiplayer/arena/napadenie1.txt", "yes", "no");
else MessageBox("/Maps/Multiplayer/arena/napadenie1nexvatka.txt");
end;
end;
function yes ()
SetPlayerResource (1, 6, gold-2000);
ChangeHeroStat(heroname, STAT_ATTACK, 1);
end;
Trigger (OBJECT_TOUCH_TRIGGER, "arena1", "arena1F");

Все сообщения работают, проверки на количество золота работают, списание -2000 золота работает, но вот нападение герою не выдается.

Пробовал ставить sleep(1) после строки списания голды, пробовал ставить/убирать херонаме, менял название yes на другое, чтобы не пересекались с другими функциями yes (просто на карте таких объектов еще множество), писал код на добавление атаки первой строкой и без второй строки со списанием золота, все равно не работает.

В чем может быть проблема?

В ответ пользователю green belly
Аватар пользователя
green belly, игра не знает кто такой heroname, которому она должна накинуть +1 атаки. Вот тебе рабочий вариант + добавил функцию на отрицательный ответ(а то в твоём случае, как я вижу, должна быть и функция на отрицательный ответ):
function arena1F(hero)
arena1Fhero = hero
gold = GetPlayerResource(1, 6)
if gold >= 2000 then
QuestionBox ("/Maps/Multiplayer/arena/napadenie1.txt", "yes", "no")
else MessageBox("/Maps/Multiplayer/arena/napadenie1nexvatka.txt")
end
end

function yes()
SetPlayerResource(1, 6, gold-2000)
ChangeHeroStat(arena1Fhero, STAT_ATTACK, 1)
end

function no() --это всего лишь пример того, что будет вызвано если нажать Нет. Код можно изменить под свои хотелки, или вовсе убрать вызов функции при отказе, заменив в QuestionBox "no" на nil
SetPlayerResource(1, 6, gold-2000)
ChangeHeroStat(arena1Fhero, STAT_LUCK, 1)
end

Trigger(OBJECT_TOUCH_TRIGGER, "arena1", "arena1F")

Всякое/карты:

Добавление недостающей музыки гномам

В ответ пользователю Азгалор
Аватар пользователя
Азгалор
green belly, игра не знает кто такой heroname, которому она должна накинуть +1 атаки. Вот тебе рабочий вариант + добавил функцию на отрицательный ответ(а то в твоём случае, как я вижу, должна быть и функция на отрицательный ответ):
function arena1F(hero)
arena1Fhero = hero
gold = GetPlayerResource(1, 6)
if gold >= 2000 then
QuestionBox ("/Maps/Multiplayer/arena/napadenie1.txt", "yes", "no")
else MessageBox("/Maps/Multiplayer/arena/napadenie1nexvatka.txt")
end
end

function yes()
SetPlayerResource(1, 6, gold-2000)
ChangeHeroStat(arena1Fhero, STAT_ATTACK, 1)
end

function no() --это всего лишь пример того, что будет вызвано если нажать Нет. Код можно изменить под свои хотелки, или вовсе убрать вызов функции при отказе, заменив в QuestionBox "no" на nil
SetPlayerResource(1, 6, gold-2000)
ChangeHeroStat(arena1Fhero, STAT_LUCK, 1)
end

Trigger(OBJECT_TOUCH_TRIGGER, "arena1", "arena1F")
Благодарю, заработало)
Аватар пользователя

Снова я с вопросами((
Читаю инфу в инете и все равно не могу понять как правильно написать.
Вводные данные:
1) на карте 8 игроков - каждый сам за себя - все разные расы - у каждого своя "зона прокачки"

2) у каждого стоит своя постройка со скриптовым именем - предположим zdanie1 у первого игрока - zdanie2 у второго и так до 8 игрока.

Что нужно накодить:
1) случайный герой игрока 1 касается своей постройки zdanie1 и идет проверка наличия скилла, если скилл имеется, то дается боевой бонус на битву случайным ГЕРОЯМ ПРОТИВНИКА игроков 2-8.

Это ключевой момент всего скрипта, именно герою ПРОТИВНИКА.

Аналогично с другими игроками и их зданиями.
Случайный герой игрока 2 касается своего здания zdanie2 и идет проверка наличия скилла, если имеется, то выдается боевой бонус на битву всем героям противников, то бишь героям игроков 1,3-8.
И так по всем игрокам прописать.
2) Понимаю что примерно такого вида должен быть код (код будет ниже в пункте 3), но до конца не осилю его.

Стоит отдельно отметить, что я научился выдавать скиллы-заклинания-артефакты-боевые бонусы через тригер касания, но только тому кто касается здания (на моей карте это равняется дать плюшку СВОЕМУ герою ведь у каждого свое здание) за что большая благодарность АЗГАЛОРУ

3) Мой тестовый код который НЕ работает, но пытается, итак герой касается и погнали:

function zdanie1F ()
hero1 = GetPlayerHeroes(PLAYER_1);
hero2 = GetPlayerHeroes(PLAYER_2);
hero3 = GetPlayerHeroes(PLAYER_3);
hero4 = GetPlayerHeroes(PLAYER_4);
hero5 = GetPlayerHeroes(PLAYER_5);
hero6 = GetPlayerHeroes(PLAYER_6);
hero7 = GetPlayerHeroes(PLAYER_7);
hero8 = GetPlayerHeroes(PLAYER_8);
geroi1 = hero1
geroi2 = hero2
geroi3 = hero3
geroi4 = hero4
geroi5 = hero5
geroi6 = hero6
geroi7 = hero7
geroi8 = hero8
if HasHeroSkill (geroi1, условно скилл навигация)
then
GiveHeroBattleBonus (geroi2, бонус морали, -3);
GiveHeroBattleBonus (geroi3, бонус морали, -3);
GiveHeroBattleBonus (geroi4, бонус морали, -3);
GiveHeroBattleBonus (geroi5, бонус морали, -3);
GiveHeroBattleBonus (geroi6, бонус морали, -3);
GiveHeroBattleBonus (geroi7, бонус морали, -3);
GiveHeroBattleBonus (geroi8, бонус морали, -3);
Trigger (OBJECT_TOUCH_TRIGGER, "zdanie1", nil);
end;
end;
Trigger (OBJECT_TOUCH_TRIGGER, "zdanie1", "zdanie1F");

P.S. Копался в карте X-РТА - там есть подобный скрипт, только там реализован он без тригера и с помощью знаков -- которые подтягивают ранее прописанные значения типа --герой1 = херо1, ну а там уже кодеры серьезные.

Аватар пользователя
green belly, вот вам пару наводок:
Функция GetPlayerHeroes() возвращает массив героев, функция GiveHeroBattleBonus() принимает первым параметром имя одного героя. Нужно проходить циклом по всем героям в массиве. Например для PLAYER_2:
for i, hero in hero2 do
GiveHeroBattleBonus(hero, бонус морали, -3);
end
И так для всех противников.
Функция zdanie1F() принимает на вход имя героя который коснулся триггера. Это отражено было в коде который вам скидывал Азгалор. Его и нужно проверять в HasHeroSkill().
Знаки -- это комментарии, то есть не являются кодом. Советую глянуть какую-нибудь статью про lua, станет понятнее.
РПГ-сценарий для HoMM5: Путь героя
ЧаВо по созданию карт для HoMM5: ЧаВо
В ответ пользователю Jack_of_shadows
Аватар пользователя
Jack_of_shadows
green belly, вот вам пару наводок:
Функция GetPlayerHeroes() возвращает массив героев, функция GiveHeroBattleBonus() принимает первым параметром имя одного героя. Нужно проходить циклом по всем героям в массиве. Например для PLAYER_2:
for i, hero in hero2 do
GiveHeroBattleBonus(hero, бонус морали, -3);
end
И так для всех противников.
Функция zdanie1F() принимает на вход имя героя который коснулся триггера. Это отражено было в коде который вам скидывал Азгалор. Его и нужно проверять в HasHeroSkill().
Знаки -- это комментарии, то есть не являются кодом. Советую глянуть какую-нибудь статью про lua, станет понятнее.
Спасибо, поправил имена героев и прописал циклы, заработало)

Статистика

Приветствуем новейшего участника: Emil