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

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

Аватар пользователя
Привет всем. Спустя долгое время наконец-то я вернулся к работе над картами, ясен-красен кое-что подзабыл, но вопрос не в этом. Очень долго я пытался сделать функцию, которая бы проверяла, на каком "этаже" находится герой - на поверхности или в подземелье. Именно этот параметр, а не общее расположение, ибо мне потом надо будет передать это значение "этажа" в другую функцию. Может кто подсказать, как грамотно сделать такую проверку?

Мои карты:
Падший рыцарь
Сердце Хаоса

Мои моды:
Визуальные:
Изменение внешнего вида героев-некромантов
Существа-жители и кое-что по мелочи в городах Ордена Порядка, Некрополиса и Инферно

NCF-существа:
Странствующие рыцари
Наемники

Аватар пользователя
BlueHeavenHero, если написать
local x, y, f = GetObjectPosition(имя_героя);
то f и будет номером этажа.
РПГ-сценарий для HoMM5: Путь героя
ЧаВо по созданию карт для HoMM5: ЧаВо
В ответ пользователю Jack_of_shadows
Аватар пользователя
Jack_of_shadows
BlueHeavenHero, если написать
local x, y, f = GetObjectPosition(имя_героя);
то f и будет номером этажа.
Не думал, что это может быть так просто. Спасибо, сейчас попробую сделать снова

Мои карты:
Падший рыцарь
Сердце Хаоса

Мои моды:
Визуальные:
Изменение внешнего вида героев-некромантов
Существа-жители и кое-что по мелочи в городах Ордена Порядка, Некрополиса и Инферно

NCF-существа:
Странствующие рыцари
Наемники

Аватар пользователя
Привет! Такой вопрос: если раскидать свой скрипт по нескольким файлам(вынести в файлы некоторые части кода, которые должны отрабатывать только в определенные моменты), а потом в нужный момент их запускать через doFile, там всё что нужно отрабатывать, и на этом будет окончена считка кода от туда? Просто, интересно разгрузит ли это карту, или же без разницы делить-не делить, а лагги всё равно будут?

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

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

Аватар пользователя
Я думаю это ничего не изменит, поскольку подгрузка кода интерпретатором это очень быстрая операция. Если же речь о его выполнении (например, настроить какую-нибудь локацию при старте карты или в момент входа в эту локацию), то конечно можно сэкономить, но для этого не обязательно делить на файлы, просто код в функции, которая вызывается в определённый момент.
РПГ-сценарий для HoMM5: Путь героя
ЧаВо по созданию карт для HoMM5: ЧаВо
Аватар пользователя
У меня вопрос, как поменять стоимость забывания навыка в здании ментора?
В ответ пользователю BlueHeavenHero
Аватар пользователя
BlueHeavenHero
Не думал, что это может быть так просто. Спасибо, сейчас попробую сделать снова
Что-то у меня не получается... Я всё же не понял, как можно передать полученный результат этажа из GetObjectPosition в глобальную переменную(

Мои карты:
Падший рыцарь
Сердце Хаоса

Мои моды:
Визуальные:
Изменение внешнего вида героев-некромантов
Существа-жители и кое-что по мелочи в городах Ордена Порядка, Некрополиса и Инферно

NCF-существа:
Странствующие рыцари
Наемники

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

BlueHeavenHero, я себе на карте такую функцию написал:

function WhereAmI(obj)
local x, y, z = GetObjectPosition(obj);
if z == 0 then
return 0
elseif z == 1 then
return 1
end
end

Использование: 

    if heroName == "Duncan" then
if WhereAmI( heroName ) == 0 then
DuncanInGround = 1
elseif WhereAmI( heroName ) == 1 then
DuncanInGround = 0
end
end

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

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

Аватар пользователя
Любая переменная для которой не написано local, она и есть глобальная. Просто выбросим из примера одно слово:
x, y, f = GetObjectPosition(имя_героя);
Переменным желательно только присвоить более длинные имена, раз они видны из всего скрипта.
РПГ-сценарий для HoMM5: Путь героя
ЧаВо по созданию карт для HoMM5: ЧаВо
Аватар пользователя

Всем привет, почитал на просторах форума и не только инфу про функцию talkboxforplayer, всё работает кроме одного, функция не видит коснувшегося героя. Окошко с вариантами есть, тексты ответов есть, кнопки есть, а вот героя не видит, и армию не выдает.
Замысел такой - случайный герой касается домика - выбирает ответ - получает армию.

Сам код взят из руководства Jack_of_shadows:
Зеленым цветом выделил правильный код, который я копировал, а красным код, который я писал под себя и он разумеется содержит где то ошибку

function DialogBox(icon, title, text, mode, callback, ...)
hero = human
if arg.n==1 then
TalkBoxForPlayers(GetCurrentPlayer(), icon, nil, text, nil, callback, mode, title, nil, 0, arg[1])
elseif arg.n==2 then
TalkBoxForPlayers(GetCurrentPlayer(), icon, nil, text, nil, callback, mode, title, nil, 0, arg[1], arg[2])
elseif arg.n==3 then
TalkBoxForPlayers(GetCurrentPlayer(), icon, nil, text, nil, callback, mode, title, nil, 0, arg[1], arg[2], arg[3])
elseif arg.n==4 then
TalkBoxForPlayers(GetCurrentPlayer(), icon, nil, text, nil, callback, mode, title, nil, 0, arg[1], arg[2], arg[3], arg[4])
elseif arg.n==5 then
TalkBoxForPlayers(GetCurrentPlayer(), icon, nil, text, nil, callback, mode, title, nil, 0, arg[1], arg[2], arg[3], arg[4], arg[5])
end;
end

Trigger (OBJECT_TOUCH_TRIGGER, "pokrov1", "Talk1");

function Talk1()
DialogBox("/UI/MessageBox/Message.xdb#xpointer(/Texture)","/UI/MessageBox/TalkBox/text.txt", "/Maps/Multiplayer/arena/voenachalnik1.txt", 1, "Talk1Callback", "/Maps/Multiplayer/arena/voenachalnik2.txt", "/Maps/Multiplayer/arena/voenachalnik3.txt", "/Maps/Multiplayer/arena/voenachalnik4.txt")
end

function Talk1Callback(pl, ans)
if (ans==1) and HasHeroSkill (human, 57)
then
AddHeroCreatures (human, 106, 50);
elseif (ans==2) and HasHeroSkill (human, 57)
then
AddHeroCreatures (human, 107, 50);
elseif (ans==3) and HasHeroSkill (human, 57)
then
AddHeroCreatures (human, 108, 50);
end;
end;

Благодарю за помощь

Аватар пользователя
green belly, сразу же вижу что у тебя триггер не передаёт никакие аргументы в функцию с DialogBox'ом, т.е. в Talk1. А ещё у тебя как-то неверно прописано назначение переменной героя, с которым нужно что-либо делать. Для начала следует убрать строку hero = human из DialogBox(она там просто не нужна), строку function Talk1() заменить на function Talk1(hero), в самой функции добавить строку human = hero. Теперь скрипт будет знать кто такой human чтобы давать ему существ.

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

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

В ответ пользователю Азгалор
Аватар пользователя
Азгалор
green belly, сразу же вижу что у тебя триггер не передаёт никакие аргументы в функцию с DialogBox'ом, т.е. в Talk1. А ещё у тебя как-то неверно прописано назначение переменной героя, с которым нужно что-либо делать. Для начала следует убрать строку hero = human из DialogBox(она там просто не нужна), строку function Talk1() заменить на function Talk1(hero), в самой функции добавить строку human = hero. Теперь скрипт будет знать кто такой human чтобы давать ему существ.


Спасибо, сделал, заработало.
Ранее никаких переменных и аргументов не указывал и не подтягивал
Аватар пользователя

Снова я с TalkBoxForPlayers

Проблема такая, есть рабочий код, он прописан 8 раз для 8 игроков на касание 8 объектов. И тут начинается самый шок.

Для первых 2 функций - работает все идеально.

Для 3-8 функций - не вызывается диалог бокс.

Для этих же 3-8 функций вызывается строка else messagebox....

Сам код:

function pokrov1F(hero)
human = hero
if HasHeroSkill(human, 80)
then
DialogBox("/UI/MessageBox/Message.xdb#xpointer(/Texture)","/UI/MessageBox/TalkBox/text.txt", "/Maps/Multiplayer/arena/pokrov1.txt", 1, "pokrov1otvetF", "/Maps/Multiplayer/arena/pokrov2.txt", "/Maps/Multiplayer/arena/pokrov3.txt", "/Maps/Multiplayer/arena/pokrov4.txt", "/Maps/Multiplayer/arena/pokrov5.txt")
Trigger (OBJECT_TOUCH_TRIGGER, "pokrov1", nil);
else MessageBox("/Maps/Multiplayer/arena/netpokrov.txt");
end;
end;
Trigger (OBJECT_TOUCH_TRIGGER, "pokrov1", "pokrov1F");

function pokrov1otvetF(pl, ans)
if (ans==1)
then
ChangeHeroStat(human, STAT_ATTACK, 3);
elseif (ans==2)
then
ChangeHeroStat(human, STAT_SPELL_POWER, 3);
elseif (ans==3)
then
ChangeHeroStat(human, STAT_KNOWLEDGE, 3);
elseif (ans==4)
then
ChangeHeroStat(human, STAT_LUCK, 2);
end;
end;

Разумеется я меняю параметры для того чтобы работало на разных игроков

Меняю на цифры 2,3 и тд до 8, выделил жёлтым цветом меняемые параметры

Для меня неизвестно где проблема, потому что ВО ВСЕХ функциях реально проверяется наличие перка 80, ведь когда его нет показывается else messagebox, но как так для цифр 1 и 2 работает, а далее нет.

Аватар пользователя
green belly, посмотри коммент #3900
Аватар пользователя
green belly, мне кажется, вопрос всё-таки не с TalkBoxForPlayers(), а с неработающей проверкой HasHeroSkill(). Попробуйте декомпозировать проблему, например просто за каждого из игроков прописать в консоли @print(HasHeroSkill("имя_соответствующего_героя", 80)) и посмотреть везде ли будет одинаковый результат.
РПГ-сценарий для HoMM5: Путь героя
ЧаВо по созданию карт для HoMM5: ЧаВо

Статистика

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