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

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

В ответ пользователю Shiroyasha2910
Аватар пользователя
3 года назад
Shiroyasha2910

Отключать стандартный бонус не нужно, проверка на наличие артефактов очень легкая, а вторая часть действительно выглядит очень сложной, хочешь написать, что лучше пока забыть об этом?

Уж не знаю, зачем такая имбища, в виде таких дебаффов, что и стандартный дебафф отключать не нужно, но от Хоттабыча был гайд на тему боевых скриптов, с примерами. В любом случае, я забыл упомянуть, что конкретной длительности и силы этих заклинаний не сделать - всё будет зависеть от параметров героя, от лица которого будет идти скриптовое заклинание.
Аватар пользователя
3 года назад
Привет! Кто-нибудь сталкивался с таким багом? У меня в боевом скрипте прописано, что герой кастует общее ускорение вначале каждого боя. Всё работает до тех пор, пока герой не оденет том магии света, после чего во время боя консоль жалуется что герой не может применить заклинание общее ускорение. Это вообще как-нибудь поправимо?
В ответ пользователю Азгалор
Аватар пользователя
3 года назад
Азгалор
Привет! Кто-нибудь сталкивался с таким багом? У меня в боевом скрипте прописано, что герой кастует общее ускорение вначале каждого боя. Всё работает до тех пор, пока герой не оденет том магии света, после чего во время боя консоль жалуется что герой не может применить заклинание общее ускорение. Это вообще как-нибудь поправимо?

Возможно, что герою не хватало маны в момент теста с томом?
В ответ пользователю Grigoriy
Аватар пользователя
3 года назад
Grigoriy

Возможно, что герою не хватало маны в момент теста с томом?
Хм, странно получается. У меня скрипт прописан так, что сначала даётся мана на спелл, а потом кастуется сам спелл. Почему-то если в начале боя у героя не хватает маны на спелл, то даже после выдачи игра его не кастует

Добавлено через 18 минут
В общем, прописал выдачу маны на стадию подготовки, теперь работает даже если у героя 0 маны на перед боем
В ответ пользователю Shiroyasha2910
Аватар пользователя
3 года назад
Shiroyasha2910

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

Гарантирует герою, что в начале боя все существа в армии противника окажутся под действием заклинаний «Замедление», «Неудача», «Слабость» и «Проклятие». Эффект действует на протяжении 10 ходов.

Помогите пожалуйста


Если вы понимаете, как привязать выполнение боевого скрипта к героям, надевшим определённые арты, то остальное всё достаточно просто:
function Start()
for side=0,1 do
if GetHero(side) then
if GetHeroName(GetHeroSide()) then --Ваша проверка в бою на героя. Я рекомендую в скрипте карты приключений создавать глоб. переменную вида "hero".."_NecArtSet" в единицу при наличии сета (и в ноль при отсутствии) и тут писать вместо проверки имени проверку вида if GetGameVar(GetHeroName(GetHeroSide()).."_NecArtSet")+0==1 then
startThread(function(side)
combatSetPause(1)
SummonCreature(side, CREATURE_YETI, 1)
for n, unit in GetCreatures(side) do if GetCreatureType(unit)==CREATURE_YETI then local _helper = unit break; end; end
while not exist(_helper) do sleep() end
for n, spell in {SPELL_MASS_SLOW, ...} --Список масскастов
UnitCastGlobalSpell(_helper, spell)
end
removeUnit(_helper)
combatSetPause(nil)
)
end
end
end
end

Скрипт написал без тестирований, поэтому адапатируйте и потестируйте, пожалуйста. Также вам понадобится заменить в характеристиках существа Neutrals/Yeti ману на ~200 и мастерство в школе так, чтобы держалось 10 ходов. Ну или с числом вызываемых поиграться

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

В целом, ничего особо сложного нет
function SaveCreaturePos(table, mob)
local x, y, z = GetObjectPosition(mob)
creature_coord_table[mob] = {x=x, y=y, floor=z}
end --Что-то такое
В ответ пользователю }{0TT@6bI4
Аватар пользователя
3 года назад
}{0TT@6bI4
И в бою, и на карте приключений при спавне существа на занятую клетку оно заспавнится на ближайшую рядом.

В целом, ничего особо сложного нет
function SaveCreaturePos(table, mob)
local x, y, z = GetObjectPosition(mob)
creature_coord_table[mob] = {x=x, y=y, floor=z}
end --Что-то такое

 

Всё равно дело как-то не идёт. Написал такой скрипт на сохранение координат:
function SaveCoordinates( table )
local monster_list = {};
local k = 0;
for i=1,500 do
monster = "m"..i;
if IsObjectExists( monster ) then
k = k + 1;
monster_list[k] = monster;
local x, y, z = GetObjectPosition(monster_list[k])
creatures_positions[k] = {x=x, y=y, floor=z}
end;
end;
end;

Потом в другой функции пытаюсь взять из этого списка рандомную позицию и поставить на неё существо, но игра выдаёт ошибку на пустые x, y, z. В другой функции взятие координат прописал так:

for k=1, length(creatures_positions) do
local x, y, z = random(length(creatures_positions[k]))
Аватар пользователя
3 года назад
Во-первых, можно не заморачиваться с именованием всех мобов, а использовать функцию GetObjectNamesByType("MONSTER")

Во-вторых, очевидно неправильно пытаться в 3 ПЕРЕМЕННЫХ записать одно значение, которое возвращает РАНДОМ, в который передаётся ТАБЛИЦА. Это просто что-то с чем-то)

Только x=creatures_position[k].x, y=..., z = ...
В ответ пользователю }{0TT@6bI4
Аватар пользователя
3 года назад
}{0TT@6bI4
Во-первых, можно не заморачиваться с именованием всех мобов, а использовать функцию GetObjectNamesByType("MONSTER")

Во-вторых, очевидно неправильно пытаться в 3 ПЕРЕМЕННЫХ записать одно значение, которое возвращает РАНДОМ, в который передаётся ТАБЛИЦА. Это просто что-то с чем-то)

Только x=creatures_position[k].x, y=..., z = ...

Короч, взял разрабовский скрипт респавна ботов из 3 карты кампании за Фриду владык севера, подредачил его под себя пользуясь ещё скриптом на спавн красных героев возле городов из последней карты с Фридой, получилось такое: 

function SaveCoordinats( table )
local monster_list = {};
local k = 0;
for i=1,500 do
monster = "m"..i;
if IsObjectExists( monster ) then
k = k + 1;
monster_list[k] = monster;
creatures_positions[k] = GetObjectPosition(monster_list[k])
end;
end;
creatures_positions_list = length(creatures_positions)
end;

function RespawnUnitsByLuck()
-- if ( GetDate(WEEK) == 3 ) and ( GetDate(DAY_OF_WEEK) == random(6) + 1 ) then
local WR_luck = GetHeroStat(WR, STAT_LUCK)
local respawns_types = { CREATURE_AIR_ELEMENTAL, CREATURE_PHOENIX }
local respawns_quantities = { 100 * diff, 10 * diff }
local respawns_mood = {3, 0}
local respawns_courage = {1, 2}
local respawns_num = 20 + diff
local previous_pos = {}
local respawns_id = 0
local CanRespawnUnitsByLuck = random(100) + (10*(WR_luck+1)) * mod((WR_luck+1),diff)

if CanRespawnUnitsByLuck >= mod(70,(WR_luck+2)) + (60+diff) then --( 70 + (10+diff) ) then
print("Шанс ", CanRespawnUnitsByLuck ,". Респавним юнитов")
elseif CanRespawnUnitsByLuck < mod(70,(WR_luck+2)) + (60+diff) then --( 50 + (10+diff) ) then
print("Шанс ", CanRespawnUnitsByLuck ,". Никого не спавним")
return
end

if WR_luck >= 7 then
courage = {1, 0}
respawns_num = 20 * diff
respawns_quantities = { 200 * diff, 20 * diff }
end
for k=1, creatures_positions_list do
if ( IsTilePassable(creatures_positions[k][3]) ) then
local type = random( 1 ) + 1
if type == 2 and WR_luck < 3 then
type = 1
end
local creaturetype = respawns_types[ type ]
local quantity = respawns_quantities[ type ]
local mood = respawns_mood[ type ]
local courage = respawns_courage[ type ]
respawns_id = respawns_id + 1;
local respawnsname = 'respawns' .. respawns_id;
CreateMonster( respawnsname, creaturetype, quantity, creatures_positions[k][3], mood, courage, random( 360 ) );
end;
end;
-- end;
end;

 

Игра жалуется на "attempt to index a number value". У меня уже голова не варит как этот респавн допилить чтобы он заработал нормально 🙃 Изначальный, разрабовский вариант, работал, но у меня карта большая, много кустов, и каждую клетку маской заливать чтобы там не заспавнился бот - такое себе дело( Проще уж спавнить их на уже готовых монстриках, поэтому у меня для заполнения координат таковые уже имеются на карте.

Аватар пользователя
3 года назад
Сразу говорю, в чём точно ошибка. Когда вы записываете в crearure_positions[k] возврат функции GetObjectPosition, то у вас эоот катый элемент становится числом, а не таблицей из трёх элементов. Поэтому нужно опять: creature_positions[k][1], creature_positions[k][2], creature_positions[k][3] = GetObjectPosition(monster)
И в проверке IsTilePassable нужно сначала в local x y z сохранить соответствующие элементы таблицы, а потом передать в IsTilePassable.
Ну и именно из-за этого ошибка "попытка индексировать число". Ведь creature[k] у вас не что иное, как чиселка
В ответ пользователю }{0TT@6bI4
Аватар пользователя
3 года назад
}{0TT@6bI4
Сразу говорю, в чём точно ошибка. Когда вы записываете в crearure_positions[k] возврат функции GetObjectPosition, то у вас эоот катый элемент становится числом, а не таблицей из трёх элементов. Поэтому нужно опять: creature_positions[k][1], creature_positions[k][2], creature_positions[k][3] = GetObjectPosition(monster)
И в проверке IsTilePassable нужно сначала в local x y z сохранить соответствующие элементы таблицы, а потом передать в IsTilePassable.
Ну и именно из-за этого ошибка "попытка индексировать число". Ведь creature[k] у вас не что иное, как чиселка

Этот как-то не сработал, зато пошло дело с твоим предыдущим вариантом) Правда, пришлось еще кое-что подправить, а то у меня IsTilePassable жаловался на неверный 3 аргумент. В общем, всё работает, но правда имеющиеся точки под спавн идут не случайно из списка а строго по нему, что довольно печально. Как-бы мне это дело зарандомить чтобы всё не сломать?

 

Ещё такой вопрос. Есть у меня проверка на удачу(GetHeroStat(герой, STAT_LUCK)), и вот в консоли я заметил что даже если поставить герою 10, то она будет выдавать не выше 5. Т.е. если я в скрипте поставлю условие чтобы удача была выше 6, то тогда это условие всегда будет неверным?

Аватар пользователя
3 года назад
То есть у вас от 1 до k заменяются все существа при выполнении какого-то условия с удачей, а вы хотите, чтобы это происходило
а) Непоследовательно
б) Без повторений
в) Со всеми k элементами

Тогда нужен интересный алгоритм:
local used_indexes = {}
for i=1, k do
repeat N=random(k)+1
until not used_indexes[N]
used_indexes[N] = 1;
--Действия с существом с номером N (не k!!)
end
В ответ пользователю }{0TT@6bI4
Аватар пользователя
3 года назад
Всем привет! Нужна помощь по скрипту. Написал я вот такой скрипт:
function ChristianAttacked()
DeployReserveHero("Christian", 98, 108, 0)
sleep(1)
MoveHero("Christian", 126, 139, -1)
if IsHeroAlive(hero) and GetObjectOwner("castle") == PLAYER_1 then
StartDialogScene("/DialogScenes/FallenKnight/S3/DialogScene.xdb#xpointer(/DialogScene)")
sleep(1)
SetObjectiveState("prim6", OBJECTIVE_ACTIVE, 1)
else SetObjectiveState("prim5", OBJECTIVE_FAILED, 1)
loose()
end;
end;

Вроде всё правильно, НО - функция ниже не работает! Всё остальное, включая else, работает отлично. В чём ошибка? Пути к ролику точно правильно прописал...

if IsHeroAlive(hero) and GetObjectOwner("castle") == PLAYER_1 then
StartDialogScene("/DialogScenes/FallenKnight/S3/DialogScene.xdb#xpointer(/DialogScene)")
sleep(1)
SetObjectiveState("prim6", OBJECTIVE_ACTIVE, 1)
Аватар пользователя
3 года назад
Потому что hero не определена. Проверьте в консоли. В переменную hero записано nil, и очевидно, проверка IsHeroAlive возвращает ложь.

Статистика

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

Сейчас на сайте 3 пользователей 1343 гостей