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

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

Аватар пользователя
3 года назад
Я не помню, но на худой конец ее всегда можно сделать через переменную. 
3 года назад
Здравствуйте. Подскажите, пожалуйста, как включить скрипты на мультиплеерных картах?
Аватар пользователя
3 года назад
Скрипты карты приключений на мультиплеерных картах работают! Для включения боевых скриптов и скриптов города нужно пропатчить exe игры специальным патчем (не уверен на 100%, что нужно), могу скинуть в частном порядке.
Аватар пользователя
3 года назад

Всем доброго дня!

С помощью руководства решил я попробовать сделать боевой скрипт.
Возникло пару проблем по нему
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;

В ответ пользователю }{0TT@6bI4
3 года назад
}{0TT@6bI4
Скрипты карты приключений на мультиплеерных картах работают! Для включения боевых скриптов и скриптов города нужно пропатчить exe игры специальным патчем (не уверен на 100%, что нужно), могу скинуть в частном порядке.
Спасибо, видимо я где-то раньше накосячил. Был бы благодарен за патч, патчер у меня имеется если что)
В ответ пользователю IchGViji
Аватар пользователя
3 года назад
IchGViji

Всем доброго дня!

С помощью руководства решил я попробовать сделать боевой скрипт.
Возникло пару проблем по нему
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;


вероятно, проблема в этих двух строчках:
DEFENDER = GetDefenderHero();
print(DEFENDER);
ATTACKER = GetAttackerHero();
print(ATTACKER);

суть в чем - в игре определены 2 константы ATTACKER и DEFENDER, которые соответственно определяют атакующую и защищающуюся стороны боя. Этими строчками ты по сути перезаписываешь эти константы, назначая в них имена юнитов героев вместо стандартных сторон. Дальнейшие ошибки очевидны - GetAttackerCreatures() и GetDefenderCreatures() это просто обертки над функцией более низкого уровня - внутри них происходит вызов GetCreatures(ATTACKER) и GetCreatures(DEFENDER) соответственно. Из-за переопределенных констант, эти функции не могут отработать корректно, что и провоцирует ошибку. Остальной скрипт просто не отрабатывает из-за этих ошибок. Соответственно, решение простое - использовать другие названия для твоих констант имен героев.
В ответ пользователю Gerter
Аватар пользователя
3 года назад

Gerter

вероятно, проблема в этих двух строчках:
DEFENDER = GetDefenderHero();
print(DEFENDER);
ATTACKER = GetAttackerHero();
print(ATTACKER);

суть в чем - в игре определены 2 константы ATTACKER и DEFENDER, которые соответственно определяют атакующую и защищающуюся стороны боя. Этими строчками ты по сути перезаписываешь эти константы, назначая в них имена юнитов героев вместо стандартных сторон. Дальнейшие ошибки очевидны - GetAttackerCreatures() и GetDefenderCreatures() это просто обертки над функцией более низкого уровня - внутри них происходит вызов GetCreatures(ATTACKER) и GetCreatures(DEFENDER) соответственно. Из-за переопределенных констант, эти функции не могут отработать корректно, что и провоцирует ошибку. Остальной скрипт просто не отрабатывает из-за этих ошибок. Соответственно, решение простое - использовать другие названия для твоих констант имен героев.

Gerter, благодарю за помощь!

Действительно, стоило эти константам дать другие имена, как скрипт пошел как по маслу! По крайней мере, пока я его еще чем-то не сломаю:)
Получается, ATTACKER и DEFENDER это зарезервированные слова, как к примеру, CREATURE_VAMPIRE.
В ответ пользователю IchGViji
Аватар пользователя
3 года назад

IchGViji
Получается, ATTACKER и DEFENDER это зарезервированные слова, как к примеру, CREATURE_VAMPIRE.
Выдержка из файла combat-startup.lua:
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

и т.д.

Так что да, эти две константы трогать нельзя, иначе поломается весь боевой скрипт

3 года назад
Доброго времени суток.

Подскажите, если кто может, как добавить созданному эффекту с большой плоской водой блеск и отражения?
Имеется модель, вытащенная из тауна методом эффектов согласно гайду Хоттабыча "Достаём модели из города".
То есть, это не модель, это как раз эффект.
Я сильно увеличила некоторые его части, и всё более-менее норм, но он, собака, по умолчанию не блестит и не отражает, поэтому то, что должно скрываться под этой, типа,  водой ( а там дофига должно скрываться) - выглядит не ахти.
(Особенно скверно она смотрится на переходе между земляными и водными tiles, очень заметна разница между ними, а не должна быть заметна).

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

И сразу второй вопрос.
Почему некоторые Particle без проблем копируются внутри тауна, а некоторые нет?
Например,
Particle:Effects\_(Particle)\Towns\Rampart\MysticP ound\Fountain01
копируется и сохраняется без проблем.
Но брызги от водопада из той же модели
Particle:Effects\_(Effect)\Towns\Rampart\MysticPou nd:item_7772e68f-fed1-40e5-b9e9-0d216e051b90:Particle
хотя и сохраняются, но после, на карте, исчезают.
Я раза четыре пробовала.

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

Прошу прощения, что запостила в неправильный раздел, я только сейчас заметила, что опять в скрипты попала.
Аватар пользователя
3 года назад
Есть такой момент, что у некоторых партиклов не нужно настраивать сдвиг. То есть если сдвиг модели -300, -280, -20, то у партикла остаётся "родной" — 3, 1.4, 0 (например). Попробуйте

Насчёт бликов на воде — а в городе они были? Вообще, это настраивается дополнительными материалами для модели и, как я понимаю, без вмешательства в модель новые материалы не добавить.
В ответ пользователю }{0TT@6bI4
3 года назад
Здравствуйте, Хоттабыч. Очень рада вас снова читать, я тут загремела в больницу на полгода, а ноута у меня, увы, нет.

Эти партиклы и не надо было особо двигать, но они стопудово не переносятся.
Вот, сами смотрите, я скопировала:

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

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 минут
И вот ещё вопрос. Можно ли вытащить из замка модель без эффектов? 
Например, здоровенное эльфийское дерево ведь так и напрашивается. Но эффектов на нём нет.
Аватар пользователя
3 года назад
Встроенные элементы нельзя просто скопировать; выделите все свойства партикла через Shift, нажмите Ctrl+C. Затем в эффекте создайте новый пустой партикл с любым именем, добавьте в нём в Textures столько же элементов и нажмите Ctrl+V

Все свойсвта должны перенестись в новый партикл и уж никак не сбрасываться
В ответ пользователю }{0TT@6bI4
3 года назад
Хмм, большое спасибо, я буду пробовать.
Там много интересных моделей без эффектов.

Добавлено через 45 минут
Сорри, но я не поняла.
Как оттуда попасть в Эффекты?
Там только модели и материалы, доступ к папке Эффекты возможен только через открытое окно, но там, кажется, не сохранить ничего.

Или я неправильно поняла, и это надо с карты делать, а не из окна города?

Добавлено через 10 часов 29 минут
ЗыЗы Чтобы не засорять больше тему про скрипты, я перепишу свои вопросы в Вопросы по редактору карт.
3 года назад
Добрый вечер. Пытаюсь разобраться в боевых скриптах.. пока безуспешно. Видел тут кто-то писал, что есть руководство по боевым скриптам, может кто ссылочку на нее дать? Ибо я не нашел.
Возможно ли, что также, кто поможет сделать необходимый скрипт? Если это реализовать возможно конечно. Идея такова. Битва началась и если у героя вкачено умение "Покровительство Асхи", то на поле боя появятся 3 архангела.
В ответ пользователю Shiroyasha2910
Аватар пользователя
3 года назад
Shiroyasha2910
Добрый вечер. Пытаюсь разобраться в боевых скриптах.. пока безуспешно. Видел тут кто-то писал, что есть руководство по боевым скриптам, может кто ссылочку на нее дать? Ибо я не нашел.
Возможно ли, что также, кто поможет сделать необходимый скрипт? Если это реализовать возможно конечно. Идея такова. Битва началась и если у героя вкачено умение "Покровительство Асхи", то на поле боя появятся 3 архангела.


Shiroyasha2910, касательно боевых скриптов есть отличное руководство от уважаемого }{0TT@6bI4: боевые скрипты - гайд
А касательно вашей задумки, то сам пока подобного не делал, но как я вижу, стоит попробовать использовать функцию HasHeroSkill(), а результат записать в переменную через функцию SetGameVar() и его получить в файле боевого скрипта через GetGameVar(). Возможно есть и иной способ, но этот мне кажется самым очевидным.

Статистика

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

Сейчас на сайте 9 пользователей 1355 гостей