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

Сообщения от «Замена» startcombat Автопереведено

Пока нет оценок — будьте первым!
Аватар пользователя
#1
Долгое время раздражал нейтральный цвет героев при использовании StartCombat, экспериментируя нашел способ давать им цвета игроков.
При использовании SiegeTown цвет там сохранялся, но оставались объекты осады. Попробовал удалить все объекты с арены  осады и сработало.
Это будет Heaven1.(AdvMapTownShared).xdb это наша арена без осадных объектов.
<Interior href="/Arenas/Town/NewHaven/NewHaven.(ArenaDesc).xdb#xpointer(/ArenaDesc)"/> Меняет сцену когда открываешь существо или героя, хавен=травка и тд по названиям разберетесь.
Дальше будет Spes.xdb это наша установка на арене, в Shared вставляем нашу пустую арену (<Shared href="Heaven1.(AdvMapTownShared).xdb#xpointer(/AdvMapTownShared)"/>)
<PlayerID> как раз задаёт нужный цвет противника. Пример: <PlayerID>PLAYER_2</PlayerID>
<Specialization/> задаёт осадные бонусы по типу -1 удачи всем атакующим  у замка нежити и тд. Но можно их выключить.
<armySlots> армия противника. если не будет героя то будут мобы без героя но с цветом.
<GarrisonHero/> ссылка на вражеского героя. Пример <GarrisonHero href="Duncan.xdb#xpointer(/AdvMapHero)"/> 
<Script/> Боевые скрипты на арене пример <Script href="CombatScript_duncan.xdb#xpointer(/Script)"/>
<LinkToPlayer>PLAYER_2</LinkToPlayer> тоже советовал бы ставить нужный цвет противника.
<AllowQuickCombat>true</AllowQuickCombat> ну это понятно быстрый бой вк/выкл, правда не тестил работает ли выключение но скорее всего да.
Дальше будет файл вражеского героя в архиве он будет Duncan.xdb, именно в этом файле вписываем статы, заклинания и навыки.
<Shared> ссылка на героя  <Shared href="Duncan1.(AdvMapHeroShared).xdb#xpointer(/AdvMapHeroShared)"/>
в Duncan.xdb <armySlots> именно сюда вписывать армию героя.
Следующий файл Duncan1.(AdvMapHeroShared).xdb  это болванка-копия вражеского героя она нам нужна для того если хотите поменять например спецу героя, его иконку и тд.
Все эти файлы кидаем в вашу созданную карту и пути тоже делать правильные.
Теперь что бы вызвать битву вот пример кода пишем в свой MapScript
Автор
SiegeTown("Freyda", "/Maps/SingleMissions/test/Spes.xdb#xpointer(/AdvMapTown)",
'/Scenes/CombatArenas/Boss_c6m3_Dirt2.xdb#xpointer(/AdventureFlybyScene)')   
Freyda - это скриптовое имя вашего героя, потом идет путь к установке Spes, и третье идет путь на арену где это всё будет происходить. Можно как на стандартные арены сделать путь так и на кастомные свои карты. Для арен нужно именно Scenes а не Maps. 
Ну вроде бы и всё, из плюсов такого метода: не нужно держать героя в резерве, можно вызывать бой даже если этот герой стоит на карте, можно вызывать бой сколько раз угодно меняя установки/армии/статы и тд, можно красить цвет мобов без героя. Из минусов если у вашего героя есть навык Разгадка тайного и нажать на вражеского героя то игра вылетает, скорее всего я случайно удалил эту сцену где стоит вражеский герой на поляне но не точно(нашел как исправить, теперь не вылетает). из вражеских героев если у них будут артефакты они всегда будут выпадать с них и это никак нельзя запретить плюс или минус кому как.
Так же можно вызвать обычную осаду с объектами если заменить в Spes.xdb  Shared на стандартную Heaven.(AdvMapTownShared).xdb и задать ей стандартный путь оригинальных файлов.
Надеюсь инфа пригодится если кто то искал такой способ.
Если кто то не понял или не получается прикреплю карту тест где я всё там это сделал, можно на примере посмотреть.
Вложения 4
4 файл(ов) • Общий размер: 756,7 KB
Аватар пользователя
#2

Есть способ гораздо проще, если тебе не хочется пользоваться резервом - функция "MakeHeroInteractWithObject( heroName, objectName )". Вводишь скриптовые имена своего и нужного вражеского героя, и тогда твой герой как бы касается вражеского, тем самым запуская комбат. Если целевой вражеский герой сидит в городе, то в objectName нужно указывать скриптовое имя города, в котором он сидит(Ну или же запускать SiegeTown(heroName, townName, arenaName = "")). Если у города нет скриптового имени, то тогда нужно "пнуть" героя из города через SetObjectPosition(). Ну а если нужно, чтобы при этом всём запускался какой-то Combat Script, то тогда в Shared главного(своего) героя прописываешь путь к скрипту, который будет запускаться при каждой его стычке, и впиши условия, по которым скрипт начнет отрабатывать код только если мы встретимся с определенным героем, например(код взял со своей карты, который отрабатывает на встречу нужных героев, типа мой герой нападет/атакован определенными героями):

function CheckHero()
if (GetDefenderHero() and GetHeroName(GetDefenderHero()) == "Duncan") or (GetAttackerHero() and GetHeroName(GetAttackerHero()) == "Duncan") then
if (GetDefenderHero() and GetHeroName(GetDefenderHero()) == "Freyda") or (GetAttackerHero() and GetHeroName(GetAttackerHero()) == "Freyda") then
print("Рубль будет? Мне на яхту не хватает")
end
end

Такие дела)

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

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

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

Есть способ гораздо проще, если тебе не хочется пользоваться резервом - функция "MakeHeroInteractWithObject( heroName, objectName )". Вводишь скриптовые имена своего и нужного вражеского героя, и тогда твой герой как бы касается вражеского, тем самым запуская комбат. Если целевой вражеский герой сидит в городе, то в objectName нужно указывать скриптовое имя города, в котором он сидит(Ну или же запускать SiegeTown(heroName, townName, arenaName = "")). Если у города нет скриптового имени, то тогда нужно "пнуть" героя из города через SetObjectPosition(). Ну а если нужно, чтобы при этом всём запускался какой-то Combat Script, то тогда в Shared главного(своего) героя прописываешь путь к скрипту, который будет запускаться при каждой его стычке, и впиши условия, по которым скрипт начнет отрабатывать код только если мы встретимся с определенным героем, например(код взял со своей карты, который отрабатывает на встречу нужных героев, типа мой герой нападет/атакован определенными героями):

function CheckHero()
if (GetDefenderHero() and GetHeroName(GetDefenderHero()) == "Duncan") or (GetAttackerHero() and GetHeroName(GetAttackerHero()) == "Duncan") then
if (GetDefenderHero() and GetHeroName(GetDefenderHero()) == "Freyda") or (GetAttackerHero() and GetHeroName(GetAttackerHero()) == "Freyda") then
print("Рубль будет? Мне на яхту не хватает")
end
end

Такие дела)

Но тогда сработает "случайная арена", а не та которая нужна.