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

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

В ответ пользователю OrnsteinDragonslayer
Аватар пользователя
OrnsteinDragonslayer
Вот написал функцию по совету:
Но после уничтожения всех чертей ничего не происходит. Подскажите, где ошибка?

В startThread функция пишется без кавычек:
startThread(cherti);
Возможно из-за этого и не работает.
OrnsteinDragonslayer

И еще. Возможно ли создать скрытую взаимосвязь между квестами? Попробую придумать простой пример:
Квест - уничтожить враж. героя
Вторичный квест - уничтожить нейтрала.

Когда подходишь к враж. герою, то проигрывается диалог №1, но если ты уничтожил нейтралов, то будет диалог №2.
Так же если просто сразиться с враж. героем, то в его армии будет 5 фениксов.
А если победил нейтралов, то будет 250 волков и надет какой-нибудь артефакт.
Возможно ли реализовать подобные штуки?
Создать взаимосвязь можно, но как - зависит от ситуации. Допустим в случае волков-фениксов при выполнении доп. квеста сразу можно у вражеского героя заменить армию и добавить артефакт.
С диалогом 2 варианта. Первый при выполнении доп. квеста подменять триггер на вражеском герое, который приведет ко второму диалогу.
Второй - с помощью функции GetObjectiveState проверять факт выполнения доп. квеста и в зависимости от выполнения условия выдавать тот или иной вариант.
Но я бы порекомендовал второй вариант, с первым сам намучился в свое время.
И кстати есть еще 3-й вариант - создать переменную, равную например 0, и при выполнении доп. квеста менять ее значение на 1. И при касании к вражескому герою проверять равна ли переменная 1. Но это по сути тот же второй вариант, только лишнюю переменную занимает
Аватар пользователя
Но после уничтожения всех чертей ничего не происходит. Подскажите, где ошибка?
Ещё вместо функции Exists используйте IsObjectExists.
РПГ-сценарий для HoMM5: Путь героя
ЧаВо по созданию карт для HoMM5: ЧаВо
Здравствуйте. Можете написать функцию на двелинги: когда игрок посещает двелинги орков(допустим), выдавалось сообщение на их уничтожение, после чего игрок получает ресурсы, но компьютер до этого может с ними нормально взаимодействовать?
Аватар пользователя
Существует враж. герой. Нужно, чтобы после его убийства он как бы "воскрешался". И эти воскрешения будут происходить, пока ГГ не захватит все шахты. Я написал несколько функций, но что-то не работает. Не знаю, как их связать между собой. Может вы подскажите?
function ImmortalNecr ()
while (1) do
sleep(2);
if (Exists('mine1') == nil) and (Exists('mine2') == nil) and (Exists('mine3') == nil) and (Exists('mine4') == nil) and (Exists('mine5') == nil) and (Exists('mine6') == nil) then
DefeatNecr ();
break
end;
end;
end;

startThread(ImmortalNecr);

function DefeatNecr ()
RemoveObject("Aberrar");
end;

function RessurectNecr(heroname,winner)
if heroname=='Aberrar' then
DeployReserveHero('Aberrar', 46, 140, GROUND);
end;
end;
Автор карт:
Долина расхитителей
Выбор мира
В ответ пользователю OrnsteinDragonslayer
OrnsteinDragonslayer
Существует враж. герой. Нужно, чтобы после его убийства он как бы "воскрешался". И эти воскрешения будут происходить, пока ГГ не захватит все шахты. Я написал несколько функций, но что-то не работает. Не знаю, как их связать между собой. Может вы подскажите?

Я в скриптах не очень разбираюсь, но вроде эта функция должна сработать, с учетом того, что у ИИ есть город и у шахт есть скриптовые имена:
function start()
MakeHeroReturnToTavernAfterDeath("Aberrar",1,1)
for i = 1,6 do
sleep(1)
Trigger(OBJECT_CAPTURE_TRIGGER,"mine"..i,"ImmortalNecr")
end
end

startThread(start)

function ImmortalNecr()
if GetObjectOwner("mine1") == 1 and GetObjectOwner("mine2") == 1 and GetObjectOwner("mine3") == 1 and GetObjectOwner("mine4") == 1 and GetObjectOwner("mine5") == 1 and GetObjectOwner("mine6") == 1 then
RemoveObject("Aberrar")
MakeHeroReturnToTavernAfterDeath("Aberrar",nil)
end
end
Аватар пользователя
можно повесить COMBAT_RESULTS_TRIGGER и, если герой, которого нужно воскрешать, потерпит поражение в бою, то проверить владельца шахт и действовать относительно этой проверки. Как-то так:
function fightResult(fightID)

local LooserName = GetSavedCombatArmyHero(fightID, 0)
if(LooserName == 'Aberrar') then
if(GetObjectOwner("mine1") == 1) and
(GetObjectOwner("mine2") == 1) and
(GetObjectOwner("mine3") == 1) and
(GetObjectOwner("mine4") == 1) and
(GetObjectOwner("mine5") == 1) and
(GetObjectOwner("mine6") == 1) then
UnreserveHero('Aberrar')
else
DeployReserveHero('Aberrar', 46, 140, GROUND)
end
end

end

Trigger(COMBAT_RESULTS_TRIGGER, 'fightResult')
Здравствуйте. Можете написать функцию на двелинги: когда игрок посещает двелинги орков(допустим), выдавалось сообщение на их уничтожение, после чего игрок получает ресурсы, но компьютер до этого может с ними нормально взаимодействовать?

Повесить OBJECT_CAPTURE_TRIGGER на двеллинг и при его срабатывании прописать нужные действия:
function Capture(n1, n2, s1, s2)

if(n2 == 1) then
MessageBox(...)
SetPlayerResource(...)
RemoveObject(...) или RazeBuilding(...), если нужно унчитожить
end

end

Trigger(OBJECT_CAPTURE_TRIGGER, 'имя объекта', 'Capture')
Нет войне.
В ответ пользователю Gerter
Аватар пользователя
Gerter
можно повесить COMBAT_RESULTS_TRIGGER и, если герой, которого нужно воскрешать, потерпит поражение в бою, то проверить владельца шахт и действовать относительно этой проверки. Как-то так:
function fightResult(fightID)

local LooserName = GetSavedCombatArmyHero(fightID, 0)
if(LooserName == 'Aberrar') then
if(GetObjectOwner("mine1") == 1) and
(GetObjectOwner("mine2") == 1) and
(GetObjectOwner("mine3") == 1) and
(GetObjectOwner("mine4") == 1) and
(GetObjectOwner("mine5") == 1) and
(GetObjectOwner("mine6") == 1) then
UnreserveHero('Aberrar')
else
DeployReserveHero('Aberrar', 46, 140, GROUND)
end
end

end

Trigger(COMBAT_RESULTS_TRIGGER, 'fightResult')

Проверил и сразу несколько вопросов. Как сделать так, чтобы шахты изначально принадлежали какому-либо игроку?
И второе: скрипт сбоит, консоль пишет: Аберрар не принадлежит никакому игроку. Хотя в плейер пропертайс он в резервных героях ждёт своего часа. Втф?
Автор карт:
Долина расхитителей
Выбор мира
Аватар пользователя
В редакторе можно выставить владельца. В какой момент пишет, что никому не принадлежит? прямо при запуске карты или после боя уже?
Нет войне.
В ответ пользователю Gerter
Аватар пользователя
Gerter
В редакторе можно выставить владельца. В какой момент пишет, что никому не принадлежит? прямо при запуске карты или после боя уже?

Может я слепой, но где?



Ошибку об отсутствии пишет после боя.
Автор карт:
Долина расхитителей
Выбор мира
Аватар пользователя
да, для заброшенных нельзя в редакторе, для остальных можно... тогда через SetObjectOwner() выставить. А насчет ошибки после боя хз, только что у себя проверил, все сработало как надо...
Нет войне.
В ответ пользователю Gerter
Аватар пользователя
Gerter
да, для заброшенных нельзя в редакторе, для остальных можно... тогда через SetObjectOwner() выставить. А насчет ошибки после боя хз, только что у себя проверил, все сработало как надо...
Спасибо, с шахтами разобрался. Вот на всякий случай сама ошибка. Вдруг я как-то перевёл не правильно. Хотя есть ли разница, если у тебя её нет вообще? Не понимаю. Может можно как-то переписать скрипт? Костыль какой?

Так же еще спрошу довольно странный вопрос, но... почему это не работает?
function HelpSin ()
MessageBox("/Maps/SingleMissions/rework (4)/sin.txt");
RemoveObject("sin");
Trigger(REGION_ENTER_AND_STOP_TRIGGER , "sinRegion", nil);
end;

Trigger(REGION_ENTER_AND_STOP_TRIGGER , "sinRegion", "HelpSin");

У меня подобных функций куча, а конкретно эта не работает...

Добавлено через 8 минут
А, вторая проблема решилась просто тем, что регион был окружён вокруг юнита на карте и т.к. эта область считается уже как бы... агро к этому юниту и герой непосредственно туда не наступает... вообщем просто расстянул регион и всё окей.
Автор карт:
Долина расхитителей
Выбор мира
Аватар пользователя
так трудно сказать, конечно, если бы карту целиком посмотреть, может какой - то другой участок кода влияет...

еще альтернативно, можно попробовать через PLAYER_REMOVE_HERO_TRIGGER :
function RemoveHero(looser, winner)
if(looser == 'Aberrar') then
--проверки шахт и тд
end
end

Trigger(PLAYER_REMOVE_HERO_TRIGGER, id нужного игрока, 'RemoveHero')
Нет войне.
В ответ пользователю Gerter
Аватар пользователя
Gerter
так трудно сказать, конечно, если бы карту целиком посмотреть, может какой - то другой участок кода влияет...

еще альтернативно, можно попробовать через PLAYER_REMOVE_HERO_TRIGGER :
function RemoveHero(looser, winner)
if(looser == 'Aberrar') then
--проверки шахт и тд
end
end

Trigger(PLAYER_REMOVE_HERO_TRIGGER, id нужного игрока, 'RemoveHero')

В этом случае вообще ничего не происходит после убийства героя. Даже ошибки нет. И проверь лс своё.
Автор карт:
Долина расхитителей
Выбор мира
Попробуйте это тогда
function RemoveHero()
while 1 do
if not IsHeroAlive("Aberrar) then
if GetObjectOwner("mine1") == 1 and GetObjectOwner("mine2") == 1 and GetObjectOwner("mine3") == 1 and GetObjectOwner("mine4") == 1 and GetObjectOwner("mine5") == 1 and GetObjectOwner("mine6") == 1 then
UnreserveHero("Aberrar")
else DeployReserveHero("Aberra", координаты)
end
end
end
end

startThread (RemoveHero)


Добавлено через 8 минут
Gerter


Повесить OBJECT_CAPTURE_TRIGGER на двеллинг и при его срабатывании прописать нужные действия:
function Capture(n1, n2, s1, s2)

if(n2 == 1) then
MessageBox(...)
SetPlayerResource(...)
RemoveObject(...) или RazeBuilding(...), если нужно унчитожить
end

end

Trigger(OBJECT_CAPTURE_TRIGGER, 'имя объекта', 'Capture')

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

Статистика

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