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

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

Аватар пользователя
8 лет назад
Можете объяснить работу функции, вызывающей сражение? Почему при попытке начать бой с героем "Nemor", который резервный и выставлен на карту скриптом ранее (нейтральный герой, первоначально желтый), выдается ошибка, что данный герой не является резервным...

Добавлено через 5 минут
Все в скрипте, что связано с этим героем:

DeployReserveHero("Nemor", 111, 121, 1)
sleep(2)
SetObjectOwner("Nemor", 8)
AddHeroCreatures("Nemor", CREATURE_SHADOW_DRAGON, 5 * diff)
AddHeroCreatures("Nemor", CREATURE_BANSHEE, 10 * diff)
AddHeroCreatures("Nemor", CREATURE_LICH_MASTER, 15 * diff)
AddHeroCreatures("Nemor", CREATURE_NOSFERATU, 25 * diff)
AddHeroCreatures("Nemor", CREATURE_GHOST, 30 * diff)
AddHeroCreatures("Nemor", CREATURE_DISEASE_ZOMBIE, 70 * diff)
AddHeroCreatures("Nemor", CREATURE_SKELETON_WARRIOR, 100 * diff)

Trigger(REGION_ENTER_AND_STOP_TRIGGER, "SkullBatttle", "SkullBatttleScript")

function SkullBatttleScript(hero)
StartCombat(hero, "Nemor",7,
CREATURE_SKELETON_WARRIOR, GetHeroCreatures("Nemor", CREATURE_SKELETON_WARRIOR),
CREATURE_DISEASE_ZOMBIE, GetHeroCreatures("Nemor", CREATURE_DISEASE_ZOMBIE),
CREATURE_GHOST, GetHeroCreatures("Nemor", CREATURE_GHOST),
CREATURE_NOSFERATU, GetHeroCreatures("Nemor", CREATURE_NOSFERATU),
CREATURE_LICH_MASTER, GetHeroCreatures("Nemor", CREATURE_LICH_MASTER),
CREATURE_BANSHEE, GetHeroCreatures("Nemor", CREATURE_BANSHEE),
CREATURE_SHADOW_DRAGON, GetHeroCreatures("Nemor", CREATURE_SHADOW_DRAGON),
nil, "SkullCombatEnd", nil, nil)
end

function SkullCombatEnd(hero, result)
if result then
if IsObjectExists("Nemor") == 0 then
Trigger(REGION_ENTER_AND_STOP_TRIGGER, "SkullBatttle", nil)
MessageBox(path.."necroend.txt")
else
AddHeroCreatures("Nemor", CREATURE_SHADOW_DRAGON, 5 * diff)
AddHeroCreatures("Nemor", CREATURE_BANSHEE, 10 * diff)
AddHeroCreatures("Nemor", CREATURE_LICH_MASTER, 15 * diff)
AddHeroCreatures("Nemor", CREATURE_NOSFERATU, 25 * diff)
AddHeroCreatures("Nemor", CREATURE_GHOST, 30 * diff)
AddHeroCreatures("Nemor", CREATURE_DISEASE_ZOMBIE, 70 * diff)
AddHeroCreatures("Nemor", CREATURE_SKELETON_WARRIOR, 100 * diff)
end
end
end
Аватар пользователя
8 лет назад
Не стоит зарезервированных героев передавать другим игрокам. Там есть некоторые непонятные баги, связанные с этим, например, после смерти герой в резерв обратно не попадет, и его нельзя будет выставить.
IsObjectExists("Nemor") == 0
Так тоже не нужно делать, функция IsObjectExists никогда 0 не возвращает, только 1 и nil.
Аватар пользователя
8 лет назад
Как сделать такие диалоговые сообщения, как на карте "Путь героя", к примеру. Тоесть, в которых несколько вариантов ответа и каждый по-своему подписан и т.д.
Аватар пользователя
8 лет назад
Как сделать такие диалоговые сообщения, как на карте "Путь героя", к примеру.
Вот цитата с одного из форумов, где один из сотрудников Нивала рассказывал об изменениях в патче 3.1:
TalkBoxForPlayers( playersFilter, iconRef, iconTooltipRef, textRef, addTextRef, callback, mode, titleTextRef, selectTextRef, defaultOption, optionTextRef [, optionTextRef, ...] )
- открывает для выбранных игроков (playersFilter) диалог с несколькими вариантами ответа (от 1 до 5)
- функция не выдаёт сообщений об ошибке т.к. если параметры не верны, то используются значения по-умолчанию
- iconRef - ссылка на текстуру иконки
- iconTooltipRef - путь к тексту тултипа иконки
- textRef - путь к тексту диалога
- addTextRef - путь к тексту диалога (дополнительному)
- сallback - строка с именем lua-функции, через первый параметр которой сообщается ответ игрока (число: 0 - отмена, -1 - закрыт игрой, 1.. - номер выбранного игроком ответа)
- mode - режим: 0 - с кнопкой ОК, 1 - ОК/Закрыть
- titleTextRef - путь к тексту заголовка окна
- selectTextRef - путь к тексту заголовка перед опциями выбора
- defaultOption - номер ответа, подсвеченного по-умолчанию (число: 0 - нет, 1.. - номер ответа)
- optionTextRef - путь к тексту ответа № 1
- ... - путь к тексту ответа № ...

Пример:
s = 'Text/Chest/Choose.txt'
TalkBoxForPlayers( PLAYERFLT_1, nil,s, s,s, 'test1', 0, s,s, 0, s,s,s )

Внимание! В локализованных версиях патча отсутствует один необходимый текстовый файл, требуемый для корректной работы TalkBoxForPlayers. Его можно просто создать:

Файл: UI/CommonBoxes/TalkBox/Text.txt
Содержание: (h5)(color_bright)(value=text) (вместо обычных скобок угловые)
Формат файла: plain Unicode text (в NOTEPAD сохранить как Unicode)

Данный файл рекомендуется распространять в составе архивов карт, которые используют TalkBoxForPlayers.

Второй вариант — сделать специальный мод, который содержал бы данный файл и требовать присутствие мода для работы карты (распространять вместе).
Аватар пользователя
8 лет назад
А как потом определить, какой ответ был выбран?

Добавлено через 31 секунду
И что такое дополнительный текст?

Добавлено через 3 минуты
У меня варианты ответов - это выбор награды за квест.
Аватар пользователя
8 лет назад
AstralLein, я сейчас делаю небольшой гайд по скриптам, буквально на днях выложу. Там будет подробнее это описано.
Вкратце - TalkBox передаёт в функцию-каллбэк 2 параметра: номер ответившего игрока и номер выбранного ответа. Все дополнительные тексты можно и не писать, в "Пути героя" я заполнял только заголовок (имя персонажа), иконку, основной текст и текст для ответов.
Аватар пользователя
8 лет назад
TalkBoxForPlayers(1, nil, nil, path.."skullfinaltext.txt", nil, "SkullEndFinal", 0, path.."ooo.txt", nil, 0, path.."m.txt", path.."mm.txt", path.."mmm.txt")

Так сойдет?

Добавлено через 44 минуты
Хм... А какой должен быть путь к стандартной иконке в углу?

И как в итоговой функции определить героя, который активировал все это дело и получит награду?

Добавлено через 2 минуты
У меня сейчас так:

function SkullEndFinal(player, answer)
if answer == 1 then
Trigger(OBJECT_TOUCH_TRIGGER, "HutSkullQuest", "SkullPusty")
MessageBox (path.."endend.txt")
sleep(2)
RemoveArtefact(???, 83)
ChangeResource(6, 60000, ???)
ChangeResource(2, 50, ???)
sleep(2)
SetObjectiveState("SkullQuest", OBJECTIVE_COMPLETED)
elseif answer == 2 then
Trigger(OBJECT_TOUCH_TRIGGER, "HutSkullQuest", "SkullPusty")
MessageBox (path.."endend.txt")
sleep(2)
RemoveArtefact(???, 83)
ChangeHeroState(???, 4, 5)
sleep(2)
SetObjectiveState("SkullQuest", OBJECTIVE_COMPLETED)
elseif answer == 3 then
Trigger(OBJECT_TOUCH_TRIGGER, "HutSkullQuest", "SkullPusty")
MessageBox (path.."endend.txt")
sleep(2)
RemoveArtefact(???, 83)
AddHeroCreatures(???, CREATURE_DEMILICH, 45)
sleep(2)
SetObjectiveState("SkullQuest", OBJECTIVE_COMPLETED)
end

Добавлено через 1 час 18 минут
GetAttackerCreatures возвращает существ атакующей стороны.. но как именно это использовать для обращения к конкретному стеку?
Аватар пользователя
8 лет назад
А какой должен быть путь к стандартной иконке в углу?
Стандартной то нету, но вот например свитоток, такой же как в MessageBox:
'/UI/MessageBox/Message.xdb#xpointer(/Texture)'
Хотя красивее туда лица какие-нибудь вставлять, например один из героев Академии:
'/Textures/Icons/Heroes/Academy/Academy_Zehir_128x128.(Texture).xdb#xpointer(/Texture)'
И как в итоговой функции определить героя, который активировал все это дело и получит награду?
TalkBox идёт для игрока, поэтому имя героя в нём не участвует. Но если он вызывается при заходе в домик или к существу, то все триггеры касания передают имя героя, можно его запомнить и потом использовать.
GetAttackerCreatures возвращает существ атакующей стороны.. но как именно это использовать для обращения к конкретному стеку?
local units = GetAttackerCreatures();
for i, unit in units do
local unit_id = GetCreatureType(unit);
-- по имени unit можно ещё получить количество существ, координаты и т.д.
end
Аватар пользователя
8 лет назад
Типа в функции касания добавить hero = name и потом использовать этот name?
Аватар пользователя
8 лет назад
Автопереведено
AstralLein, да.
Аватар пользователя
8 лет назад
Хм. Туплю что-то глядя на код (который про GetAttackerCreatures). Допустим, на стороне атакующих лич, теперь я смогу к нему обратиться при помощи CREATURE_LICH?
Аватар пользователя
8 лет назад
AstralLein, не, если надо найти у атакующих всех личей и заставить их что-то сделать, это будет так:
local units = GetAttackerCreatures();
for i, unit in units do
local unit_id = GetCreatureType(unit);
if (unit_id == CREATURE_LICH) then
-- что-нибудь сделать
end
end
Аватар пользователя
8 лет назад
Начинаю понимать... а если такое... любой юнит атакующих умер и что-то случилось? Это через нужный Get ( забыл имя функции) и в качестве имени юнита units?
Аватар пользователя
8 лет назад
Во первых, если юнит умер, то GetAttackerCreatures() его уже не выдаст. Насколько я помню, он выдаёт все текущие отряды на поле боя. Сам момент смерти любого существа сопровождается вызовом функции UnitDeath, в которую передается имя умершего существа, но что с этим именем можно делать, если существа уже нет, я не проверял.
Во вторых,
и в качестве имени юнита units?
units - массив имен, который вернула GetAttackerCreatures(). Если попытаться его скажем вывести:
print(units)
Будет что-то подобное:
{"creature_0", "creature_1", "creature_2", "creature_3"}
Когда мы перебираем эту таблицу циклом
for i, unit in units do
то переменная unit уже содержит имя одного существа, например "creature_0". Это внутреннее имя, которое игра присвоила отряду. В реальности оно немного другое. Лучше всего это увидеть, если просто в бою вызвать консоль и попробовать соответствующие команды.
Аватар пользователя
8 лет назад
Я имею ввиду можно ли создать событие с условием гибели любого стека из армии атакующих?

Добавлено через 10 минут
Вообще предполагается сделать две вещи:

- когда ходит единственный стек защищающегося, он кое-что делает.

- когда умирает любой стек атакующего, появляются призраки на стороне защищающегося.

Статистика

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