Сообщения от Скрипты
Всем доброго дня!
С помощью руководства решил я попробовать сделать боевой скрипт.
Возникло пару проблем по нему
1) функция GetDefenderCreatures() выдает ошибку: "Wrong type of argument 1 when calling function GetUnits" в независимости, где я в файле скрипта ее вызову. Пробовал аналогичную функцию, но для атакующего - GetAttackerCreatures(). Первый раз сработала, второй раз та же проблема, что и с Defender.
2) хуки DefenderHeroMove(heroName) и AttackerHeroMove(heroName) при ходе героев не запускаются - в консоли даже нет сообщения, что скрипт вошел в тело функции, и даже ошибки никакой не выдает. Один раз даже было, что хук AttackerHeroMove(heroName) просто зациклился. Стабильно работают только хуки Prepare() и Start().
Можете, пожалуйста, подсказать, как эти проблемы разрешить?
Содержимое скрипта (пока просто логи, чтобы понять, что работает, что нет):print("inside combat file");DEFENDER = GetDefenderHero();print(DEFENDER);ATTACKER = GetAttackerHero();print(ATTACKER);defenderCreatures = {0};attackerCreatures = {0};function Prepare() print("inside Prepare function"); print("Prepare function has ended");end;function Start() print("inside Start function"); ShowFlyingSign(GetMapDataPath().."CombatMessage.txt", DEFENDER, 200); defenderCreatures = GetDefenderCreatures(); attackerCreatures = GetAttackerCreatures(); print(1); for key, creature in defenderCreatures do print("key=", key, ", creature=", creature); end; print(attackerCreatures); print("Start function has ended");end;function DefenderHeroMove(heroName) print("inside DefenderHeroMove function"); ShowFlyingSign(GetMapDataPath().."CombatMessage.txt", DEFENDER, 200); print("DefenderHeroMove function has ended");end;function AttackerHeroMove(heroName) print("inside AttackerHeroMove function"); ShowFlyingSign(GetMapDataPath().."CombatMessage.txt", DEFENDER, 200); print("AttackerHeroMove function has ended");end;
Скрипты карты приключений на мультиплеерных картах работают! Для включения боевых скриптов и скриптов города нужно пропатчить exe игры специальным патчем (не уверен на 100%, что нужно), могу скинуть в частном порядке.
Всем доброго дня!
С помощью руководства решил я попробовать сделать боевой скрипт.
Возникло пару проблем по нему
1) функция GetDefenderCreatures() выдает ошибку: "Wrong type of argument 1 when calling function GetUnits" в независимости, где я в файле скрипта ее вызову. Пробовал аналогичную функцию, но для атакующего - GetAttackerCreatures(). Первый раз сработала, второй раз та же проблема, что и с Defender.
2) хуки DefenderHeroMove(heroName) и AttackerHeroMove(heroName) при ходе героев не запускаются - в консоли даже нет сообщения, что скрипт вошел в тело функции, и даже ошибки никакой не выдает. Один раз даже было, что хук AttackerHeroMove(heroName) просто зациклился. Стабильно работают только хуки Prepare() и Start().
Можете, пожалуйста, подсказать, как эти проблемы разрешить?Содержимое скрипта (пока просто логи, чтобы понять, что работает, что нет):
print("inside combat file");DEFENDER = GetDefenderHero();print(DEFENDER);ATTACKER = GetAttackerHero();print(ATTACKER);defenderCreatures = {0};attackerCreatures = {0};function Prepare()print("inside Prepare function");print("Prepare function has ended");end;function Start()print("inside Start function");ShowFlyingSign(GetMapDataPath().."CombatMessage.txt", DEFENDER, 200);defenderCreatures = GetDefenderCreatures();attackerCreatures = GetAttackerCreatures();print(1);for key, creature in defenderCreatures doprint("key=", key, ", creature=", creature);end;print(attackerCreatures);print("Start function has ended");end;function DefenderHeroMove(heroName)print("inside DefenderHeroMove function");ShowFlyingSign(GetMapDataPath().."CombatMessage.txt", DEFENDER, 200);print("DefenderHeroMove function has ended");end;function AttackerHeroMove(heroName)print("inside AttackerHeroMove function");ShowFlyingSign(GetMapDataPath().."CombatMessage.txt", DEFENDER, 200);print("AttackerHeroMove function has ended");end;
вероятно, проблема в этих двух строчках:
DEFENDER = GetDefenderHero();print(DEFENDER);ATTACKER = GetAttackerHero();print(ATTACKER);суть в чем - в игре определены 2 константы ATTACKER и DEFENDER, которые соответственно определяют атакующую и защищающуюся стороны боя. Этими строчками ты по сути перезаписываешь эти константы, назначая в них имена юнитов героев вместо стандартных сторон. Дальнейшие ошибки очевидны - GetAttackerCreatures() и GetDefenderCreatures() это просто обертки над функцией более низкого уровня - внутри них происходит вызов GetCreatures(ATTACKER) и GetCreatures(DEFENDER) соответственно. Из-за переопределенных констант, эти функции не могут отработать корректно, что и провоцирует ошибку. Остальной скрипт просто не отрабатывает из-за этих ошибок. Соответственно, решение простое - использовать другие названия для твоих констант имен героев.
вероятно, проблема в этих двух строчках:DEFENDER = GetDefenderHero();print(DEFENDER);ATTACKER = GetAttackerHero();print(ATTACKER);
суть в чем - в игре определены 2 константы ATTACKER и DEFENDER, которые соответственно определяют атакующую и защищающуюся стороны боя. Этими строчками ты по сути перезаписываешь эти константы, назначая в них имена юнитов героев вместо стандартных сторон. Дальнейшие ошибки очевидны - GetAttackerCreatures() и GetDefenderCreatures() это просто обертки над функцией более низкого уровня - внутри них происходит вызов GetCreatures(ATTACKER) и GetCreatures(DEFENDER) соответственно. Из-за переопределенных констант, эти функции не могут отработать корректно, что и провоцирует ошибку. Остальной скрипт просто не отрабатывает из-за этих ошибок. Соответственно, решение простое - использовать другие названия для твоих констант имен героев.
Gerter, благодарю за помощь!
Действительно, стоило эти константам дать другие имена, как скрипт пошел как по маслу! По крайней мере, пока я его еще чем-то не сломаю:)
Получается, ATTACKER и DEFENDER это зарезервированные слова, как к примеру, CREATURE_VAMPIRE.
Получается, ATTACKER и DEFENDER это зарезервированные слова, как к примеру, CREATURE_VAMPIRE.
ATTACKER = 0
DEFENDER = 1
function IsAttacker(unit) return GetUnitSide(unit) == ATTACKER end
function IsDefender(unit) return GetUnitSide(unit) == DEFENDER end
function GetAttackerHero() local temp = GetHero(ATTACKER) return temp end
function GetDefenderHero() local temp = GetHero(DEFENDER) return temp end
function GetAttackerCreatures() local temp = GetCreatures(ATTACKER) return temp end
function GetDefenderCreatures() local temp = GetCreatures(DEFENDER) return temp end
function GetAttackerWarMachines() local temp = GetWarMachines(ATTACKER) return temp end
function GetDefenderWarMachines() local temp = GetWarMachines(DEFENDER) return temp end
function GetAttackerBuildings() local temp = GetBuildings(ATTACKER) return temp end
function GetDefenderBuildings() local temp = GetBuildings(DEFENDER) return temp end
function GetAttackerSpellSpawns() local temp = GetSpellSpawns(ATTACKER) return temp end
function GetDefenderSpellSpawns() local temp = GetSpellSpawns(DEFENDER) return temp end
и т.д.Так что да, эти две константы трогать нельзя, иначе поломается весь боевой скрипт
Подскажите, если кто может, как добавить созданному эффекту с большой плоской водой блеск и отражения?
Имеется модель, вытащенная из тауна методом эффектов согласно гайду Хоттабыча "Достаём модели из города".
То есть, это не модель, это как раз эффект.
Я сильно увеличила некоторые его части, и всё более-менее норм, но он, собака, по умолчанию не блестит и не отражает, поэтому то, что должно скрываться под этой, типа, водой ( а там дофига должно скрываться) - выглядит не ахти.
(Особенно скверно она смотрится на переходе между земляными и водными tiles, очень заметна разница между ними, а не должна быть заметна).
Позарез надо навесить этот блеск на воду, я этот водяной эффект уже лет пять пыталась сделать, и вот начало получаться, но такой облом.
И сразу второй вопрос.
Почему некоторые Particle без проблем копируются внутри тауна, а некоторые нет?
Например,
Particle:Effects\_(Particle)\Towns\Rampart\MysticP ound\Fountain01
копируется и сохраняется без проблем.
Но брызги от водопада из той же модели
Particle:Effects\_(Effect)\Towns\Rampart\MysticPou nd:item_7772e68f-fed1-40e5-b9e9-0d216e051b90:Particle
хотя и сохраняются, но после, на карте, исчезают.
Я раза четыре пробовала.
Что делать с этим горем, как мне присобачить к водопаду эти брызги, или сделать отдельный эффект нужных брызг?
Хелп кто может. Особенно Хоттабыч).
Прошу прощения, что запостила в неправильный раздел, я только сейчас заметила, что опять в скрипты попала.
Насчёт бликов на воде — а в городе они были? Вообще, это настраивается дополнительными материалами для модели и, как я понимаю, без вмешательства в модель новые материалы не добавить.
Эти партиклы и не надо было особо двигать, но они стопудово не переносятся.
Вот, сами смотрите, я скопировала:
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Light L_NORMAL Освещается ли партикл солнцем и ambient
Particle null
Position
Position.x -0.25
Position.y 0.3
Position.z 1.6
Rotation
Rotation.x 0
Rotation.y 0
Rotation.z 0
Rotation.w 1
Scale 1 Коэффициент масштабирования
Speed 0.8 Коэффициент на скорость проигрывания
Offset 0 (seconds) Пауза перед проигрыванием
EndCycle 3 (seconds) Длина одного цикла (не повторять = 0)
CycleCount 0 Количество повторений при проигрывании партикла, 0 = бесконечно
Pivot Место крепления текстуры к партиклу
Pivot.x 0
Pivot.y 0
Textures
Textures.[0] Texture:Textures\Effects\Water\Water00
Textures.[1] Texture:Textures\Effects\Water\Water01
Textures.[2] Texture:Textures\Effects\Water\Water02
Textures.[3] Texture:Textures\Effects\Water\Water03
Textures.[4] Texture:Textures\Effects\Water\Water04
Textures.[5] null
Textures.[6] null
Textures.[7] null
Textures.[8] null
Textures.[9] null
Textures.[10] null
Textures.[11] null
Textures.[12] null
Textures.[13] null
Textures.[14] null
Textures.[15] null
LeaveParticlesWhereStarted false Do we need particles be attached to it's source or leaved at birth place?
Priority 0
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Particle null пишут. Но когда сохраняешь в городе, там никакой не нулл, там всё в порядке.
Я четыре раза переделывала, не переносятся, заразы. И добавить их в модель на карте не получается, добавляешь, а при перезагрузке опять нулл.
.
Может быть, я попробую сделать отдельную модель пены, но тоже непонятно как, если эта хрень не переносится.
Но точно нет способа её перенести?
Насчёт бликов, в городе их не было, но я нашла способ, как их сделать.
Надо просто засунуть в Дату, в отдельные папки _(Model)\Effects\Towns, файл Rampart_MysticPound-lambert3.(Material), и там вручную прописать M_REFLECT_WATER вместо M_GENERIC, и вода сразу становится как родная.
Жаль, с водопадом так не выходит, потому что если там поменять M_CLOUDS_H5, вода перестаёт течь.
В этих вручную вложенных файлах вообще можно многое делать. Можно ли туда прилепить второй эффект, интересно...
Добавлено через 2 часа 19 минут
И вот ещё вопрос. Можно ли вытащить из замка модель без эффектов?
Например, здоровенное эльфийское дерево ведь так и напрашивается. Но эффектов на нём нет.
Все свойсвта должны перенестись в новый партикл и уж никак не сбрасываться
Там много интересных моделей без эффектов.
Добавлено через 45 минут
Сорри, но я не поняла.
Как оттуда попасть в Эффекты?
Там только модели и материалы, доступ к папке Эффекты возможен только через открытое окно, но там, кажется, не сохранить ничего.
Или я неправильно поняла, и это надо с карты делать, а не из окна города?
Добавлено через 10 часов 29 минут
ЗыЗы Чтобы не засорять больше тему про скрипты, я перепишу свои вопросы в Вопросы по редактору карт.
Возможно ли, что также, кто поможет сделать необходимый скрипт? Если это реализовать возможно конечно. Идея такова. Битва началась и если у героя вкачено умение "Покровительство Асхи", то на поле боя появятся 3 архангела.
Добрый вечер. Пытаюсь разобраться в боевых скриптах.. пока безуспешно. Видел тут кто-то писал, что есть руководство по боевым скриптам, может кто ссылочку на нее дать? Ибо я не нашел.
Возможно ли, что также, кто поможет сделать необходимый скрипт? Если это реализовать возможно конечно. Идея такова. Битва началась и если у героя вкачено умение "Покровительство Асхи", то на поле боя появятся 3 архангела.
Shiroyasha2910, касательно боевых скриптов есть отличное руководство от уважаемого }{0TT@6bI4: боевые скрипты - гайд
А касательно вашей задумки, то сам пока подобного не делал, но как я вижу, стоит попробовать использовать функцию HasHeroSkill(), а результат записать в переменную через функцию SetGameVar() и его получить в файле боевого скрипта через GetGameVar(). Возможно есть и иной способ, но этот мне кажется самым очевидным.