Самого задолбал этот варимпортет, особенно, когда с одной карты на другое всё переносишь
Вот как я делаю импорт в своей карте.
В карте есть триггер. Он обычно выключен.
Вот его содержимое. Тут записана команда на импорт файлов из папки zMapImport.
Путь к папке zMapImport прописан в jasshelper.conf.
Сама папка zMapImport содержит в себе вот что.
В некоторых папках тоже есть папки.
А теперь сам процесс импорта:
Включаем триггер Import. Можно делать не триггером, а через Extensions -> Import Directory.
Сохранем карту.
Закрывем карту.
Теперь всё содержимое папки zMapImport есть в карте с сохранением своего расположения относительно zMapImport и отображается в Import Manager.
Уже после пункта 2 всё содержимое папки zMapImport есть в карте, но оно не отображается в Import Manager и будет удалено, если вы выключите триггер Import и сохраните карту опять. Аналогично и со способом через Extensions -> Import Directory.
Делаем на диске папку, в которой будут файлы для импорта с необходимым расположением относительно друг друга. Если нужно добавить файл, кидаем его в эту папку по нужному пути, выполняем действия 1-3. Если нужно обновить файл, обновляем его в этой папке, выполняем действия 1-3. Если нужно всё перенести в другую карту, делаем в ней триггер (или через Extensions -> Import Directory), выполняем действия 1-3.
Графика - Анимация: обратный ход броска
Графика - Анимация: точка броска
Combat - Attack x - Animation Backswing Point (Real)
The amount of time it takes a unit/building/hero to go through half the physical movement necessary to attack something. If the unit/building/hero has no animations for attacking, the time set in this field still applies, but there will be no viewed physical movement. This field combines additively with "Combat - Attack x - Animation Damage Point" to form the total time taken to physically attack a target.
Combat - Attack x - Animation Damage Point (Real)
The amount of time it takes a unit/building/hero to go through half the physical movement necessary to attack something. If the unit/building/hero has no animations for attacking, the time set in this field still applies, but there will be no viewed physical movement. This field combines additively with "Combat - Attack x - Animation Backswing Point" to form the total time taken to physically attack a target.
Как я понял, это работает так: приказ атаковать -> проходит время из "Графика - Анимация: точка броска" -> снаряд бросается -> проходит время из "Графика - Анимация: обратный ход броска" -> юнит готов к следующему приказу.
А может и нет, я не работал с этой способностью.
Но существа, вызванные способность гидры, являются, как ни странно, вызванными, то есть они не оставляют трупов (при смерти характерный эффект смерти призванного существа) и получают бонусный урон от диспела.
кстати можно по идее так мины какие-нибудь спавнить и делать рендж сплеши при атаках или стазис ловушки и еще до фига... кул идея короче!
Полностью поддерживаю, но у юнита, что заспавнится уже из умершего даммика, будет таймер жизни, и он будет считаться суммоном.
Потому если нужен вечный выделяемый юнит, нужно сделать даммика без модели с равкодом Х, способность на основе 'Apts' с длительностью 0.01 и триггер с событием Enters map и условием на сравнение равкода и действием "Создать нужного юнита".
Сделал так, чтобы катапульта при атаке спавнила скелетов, которых можно выделить и управлять.
function check takes nothing returns boolean
local unit u = GetFilterUnit()
local player p = GetOwningPlayer(caster)
local real coneAngle = TransferDegrees(bj_RADTODEG * Atan2(GetUnitY(u) - GetUnitY(caster), GetUnitX(u) - GetUnitX(caster)))
local real sector = 30
local boolean answer = u != caster and IsUnitEnemy(u, p) and IsUnitVisible(u, p) and IsUnitAliveBJ(u) and GetUnitFacing(caster) - coneAngle <= sector and GetUnitFacing(caster) - coneAngle >= sector - sector*2
set u = null
set p = null // игрока можно не обнулять, их всё же очень конечное количество.
return answer
endfunction
На кол-во handles это никак не повлияло.
Потому что никто из твоих FilterUnit() не был убран из игры. Без обнуления после удаления юнита хэндл бы остался, а с обнулением, был бы освобождён для нового использования.
У них стандартное время смерти 5 секунд, смотри игровые константы.
Поставь в игровых константах Decay Time - Effects время меньше, но не очень маленькое, а то анимация смерти эффекта проигрываться не будет.
Чтобы не плодить переменные эффекта, сделай такие функции:
function CreateEffectPoint takes string s, real x, real y returns nothing
call DestroyEffect(AddSpecialEffect(s, x, y))
endfunction
function CreateEffectTarget takes string s, widget w, string att returns nothing
call DestroyEffect(AddSpecialEffectTarget(s, w, att))
endfunction
Во время сохранения при включённой оптимизации кода и выключенном режиме дебага эти 2 функции будут "раскрыты", и в конечном коде будут только DestroyEffect(AddSpecialEffectTarget(...)). У Inline оптимизации есть некоторые требования для передаваемых параметров, потому функции не в некоторых случаях не будут "раскрыты".
Можно использовать способность "Ловчий" для увеличения дальности, но тогда герой не может передвигаться. Ещё можно сделать герою даммики с разной дальностью, которые и будут атаковать. То есть если предмет есть - даммик один, предмет выкинул, даммик другой. Ещё можно использовать морфы.
У труповозок нежити есть способноть, которая создаёт облако в точке попадания. Воспользуйся ею, её равкод 'Apts'. В поле "Длительность" ставится длительность созданного юнита. Но созданный этой способностью юнит неуязвим и не может быть выделен.
Прикрепил карту с катапульной, которая спавнит скелетов при атаке.
Поэкспериментировал немного.
Юнит, призванный этой способностью, не вызывает события спавна, но вызывает событие "Входит в область". Ему также можно давать приказы триггерно. Хм, так можно даммики делать.
Про обработку иконок (точнее создание рамок) это я сказал кстати, так я использую Button Manager для рамок, а BLP Lab только для оптимизации и конвертации.
Вот у меня вопрос в чём истинная цель создание ещё одного MPQ правщика, если есть другие. Вы хотите добиться умного импорта, которого нет у других правщиков. Али просто вы делаете его как хобби?
Как я уже говорил, весь функционал, которого не хватало Fakovу, есть в Grimex, Fakov просто о нём не знал. Я всё импортирую в 2 клика - включаю триггер, где 1 строка с импортом и сохраняю карту. Но карту нужно закрыть и открыть снова, а это большой минус для карт, загрузка которых требует продолжительного времени.
Я не хочу сказать, что Fakov занимается ерундой. Его утилита как раз подойдёт для громоздких карт. Ну а также, я надеюсь, эта утилита станет альтернативой Grimex, что хорошо. Grimex помимо импорта, может сразу сделать нужное обрамление иконки и много чего ещё. Я тут в комментариях кидал мануал Grimex на английском.
А можно изначально дать способность всем нужным юнитам в Редакторе Объектов, но заблокировать её нейтрально-враждебному игроку. Как только нужные условия будут выполнены, разблокировать способность.
Можно использовать утилиту Fakova, а можно, как я уже писал, использовать встроенный в JNPG Grimex, чем я и пользуюсь. Мануал Grimex прикрепил к своему предыдущему сообщению. Grimex также можно использовать из меню Extensions.
Также нужно помнить, что InitTechTree вызывается передInitBlizzard, то есть ваши настройки игроков, сделанные с помощью Scenario -> Techtree\Abilities\Upgrades Properties будут применены раньше, чем запрет Парового такнка и Берсеркера.
Потому, чтобы разблокировать Берсеркера и заблокировать Охотника за головами, можно сделать улучшение на Берсеркера сразу исследованным в Scenario -> Upgrades Properties, а Охотника за головами заблокировать в Scenario -> Techtree Properties.
function InitSummonableCaps takes nothing returns nothing
local integer index
set index = 0
loop
// upgraded units
// Note: Only do this if the corresponding upgrade is not yet researched
// Barrage - Siege Engines
if (not GetPlayerTechResearched(Player(index), 'Rhrt', true)) then
call SetPlayerTechMaxAllowed(Player(index), 'hrtt', 0)
endif
// Berserker Upgrade - Troll Berserkers
if (not GetPlayerTechResearched(Player(index), 'Robk', true)) then
call SetPlayerTechMaxAllowed(Player(index), 'otbk', 0)
endif
// max skeletons per player
call SetPlayerTechMaxAllowed(Player(index), 'uske', bj_MAX_SKELETONS)
set index = index + 1
exitwhen index == bj_MAX_PLAYERS
endloop
endfunction
Это функция, которая запускается из InitBlizzard, которая в свою очередь запускается из функции main. Она блокирует Берсеркера, Паровой танк и устанавливает лимит на скелетов.
Чтобы убрать Охотника за головами из казармы, но сделать доступным Берсеркера, нужно заблокировать у каждого игрока Охотника за головами и разблокировать Берсеркера.
Это функция, которая запускается из InitBlizzard, которая в свою очередь запускается из функции main.
Я это к тому, что если в карте нет //! inject main, то эта функция вызывается.
Ред. PT153
» Fa_losophy / FaMPQ
В карте есть триггер. Он обычно выключен.
А теперь сам процесс импорта:
Теперь всё содержимое папки zMapImport есть в карте с сохранением своего расположения относительно zMapImport и отображается в Import Manager.
Ред. PT153
» WarCraft 3 / Замедлить скорость анимации атаки
» WarCraft 3 / Кампания-противостояние 2
» WarCraft 3 / Скелеты из атаки
» WarCraft 3 / SharpCraft XGM Addon
Ред. PT153
» WarCraft 3 / Скелеты из атаки
Но существа, вызванные способность гидры, являются, как ни странно, вызванными, то есть они не оставляют трупов (при смерти характерный эффект смерти призванного существа) и получают бонусный урон от диспела.
Ред. PT153
» WarCraft 3 / Скелеты из атаки
Потому если нужен вечный выделяемый юнит, нужно сделать даммика без модели с равкодом Х, способность на основе 'Apts' с длительностью 0.01 и триггер с событием Enters map и условием на сравнение равкода и действием "Создать нужного юнита".
Ред. PT153
» WarCraft 3 / Jass утечка, спецэффект
У Inline оптимизации есть некоторые требования для передаваемых параметров, потому функции не в некоторых случаях не будут "раскрыты".
» WarCraft 3 / Jass утечка, спецэффект
» WarCraft 3 / Jass утечка, спецэффект
KingMaximax:
Ред. PT153
» WarCraft 3 / Jass утечка, спецэффект
» WarCraft 3 / Дальность атаки через предмет, триггер или способность
» WarCraft 3 / Скелеты из атаки
Ред. PT153
» WarCraft 3 / Скелеты из атаки
Юнит, призванный этой способностью, не вызывает события спавна, но вызывает событие "Входит в область". Ему также можно давать приказы триггерно.
Хм, так можно даммики делать.
Ред. PT153
» WarCraft 3 / Отобрать контроль над юнитами
» WarCraft 3 / Проблемы с постройкой зданий
» Fa_losophy / FaMPQ
» Fa_losophy / FaMPQ
Grimex помимо импорта, может сразу сделать нужное обрамление иконки и много чего ещё. Я тут в комментариях кидал мануал Grimex на английском.
» WarCraft 3 / Усиление нейтрально враждебных
» WarCraft 3 / Добавление файлов в карту через mpq-редактор не действует.
» WarCraft 3 / Добавление файлов в карту через mpq-редактор не действует.
Ред. PT153
» WarCraft 3 / Сделать берсерка доступным
Ред. PT153
» WarCraft 3 / Сделать берсерка доступным
Потому, чтобы разблокировать Берсеркера и заблокировать Охотника за головами, можно сделать улучшение на Берсеркера сразу исследованным в Scenario -> Upgrades Properties, а Охотника за головами заблокировать в Scenario -> Techtree Properties.
» WarCraft 3 / Сделать берсерка доступным
Чтобы убрать Охотника за головами из казармы, но сделать доступным Берсеркера, нужно заблокировать у каждого игрока Охотника за головами и разблокировать Берсеркера.
Ред. PT153
» WarCraft 3 / Проверка на уровень предмета.