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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Всем привет, почитал на просторах форума и не только инфу про функцию 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;

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

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

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

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

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


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

Снова я с 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 работает, а далее нет.

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