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

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

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

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

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

Когда подходишь к враж. герою, то проигрывается диалог №1, но если ты уничтожил нейтралов, то будет диалог №2.
Так же если просто сразиться с враж. героем, то в его армии будет 5 фениксов.
А если победил нейтралов, то будет 250 волков и надет какой-нибудь артефакт.
Возможно ли реализовать подобные штуки?
Создать взаимосвязь можно, но как - зависит от ситуации. Допустим в случае волков-фениксов при выполнении доп. квеста сразу можно у вражеского героя заменить армию и добавить артефакт.
С диалогом 2 варианта. Первый при выполнении доп. квеста подменять триггер на вражеском герое, который приведет ко второму диалогу.
Второй - с помощью функции GetObjectiveState проверять факт выполнения доп. квеста и в зависимости от выполнения условия выдавать тот или иной вариант.
Но я бы порекомендовал второй вариант, с первым сам намучился в свое время.
И кстати есть еще 3-й вариант - создать переменную, равную например 0, и при выполнении доп. квеста менять ее значение на 1. И при касании к вражескому герою проверять равна ли переменная 1. Но это по сути тот же второй вариант, только лишнюю переменную занимает
Аватар пользователя
8 лет назад
Но после уничтожения всех чертей ничего не происходит. Подскажите, где ошибка?
Ещё вместо функции Exists используйте IsObjectExists.
В ответ пользователю Jack_of_shadows
Аватар пользователя
8 лет назад
Jack_of_shadows
Ещё вместо функции Exists используйте IsObjectExists.

Спасибо, но всё решилось удалением кавычек в старттреде. Не знал, что там они не нужны.
8 лет назад
Здравствуйте. Можете написать функцию на двелинги: когда игрок посещает двелинги орков(допустим), выдавалось сообщение на их уничтожение, после чего игрок получает ресурсы, но компьютер до этого может с ними нормально взаимодействовать?
Аватар пользователя
8 лет назад
Существует враж. герой. Нужно, чтобы после его убийства он как бы "воскрешался". И эти воскрешения будут происходить, пока ГГ не захватит все шахты. Я написал несколько функций, но что-то не работает. Не знаю, как их связать между собой. Может вы подскажите?
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
8 лет назад
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
Аватар пользователя
8 лет назад
можно повесить 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
Аватар пользователя
8 лет назад
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')

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

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



Ошибку об отсутствии пишет после боя.
Аватар пользователя
8 лет назад
да, для заброшенных нельзя в редакторе, для остальных можно... тогда через SetObjectOwner() выставить. А насчет ошибки после боя хз, только что у себя проверил, все сработало как надо...
В ответ пользователю Gerter
Аватар пользователя
8 лет назад
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 минут
А, вторая проблема решилась просто тем, что регион был окружён вокруг юнита на карте и т.к. эта область считается уже как бы... агро к этому юниту и герой непосредственно туда не наступает... вообщем просто расстянул регион и всё окей.
Аватар пользователя
8 лет назад
так трудно сказать, конечно, если бы карту целиком посмотреть, может какой - то другой участок кода влияет...

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

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

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

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

В этом случае вообще ничего не происходит после убийства героя. Даже ошибки нет. И проверь лс своё.
8 лет назад
Попробуйте это тогда
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')

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

Статистика

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