Временно перебрался на другой комп, так как мой в ремонте, и столкнулся с проблемой: когда я включаю UMSWE и перезапускаю редактор, тот пишет "Unable to apply patch". Можно нажать крестик или ОК, но редактор запустится. При открытии или создании карты редактор начнёт спамить ошибками Trigger Editor. Права админа не помогают. JNPG и Варкрафт в разных папках на диске C, пути не содержат кириллицу.
Кстати, в R4 pjass странный, сам добавляет Condition там, где я их намеренно не делал, обновите его до последней версии.
Это делает JassHelper (edit 14.01.2021).
Ох уж эта склейка сообщений)
Временно перебрался на другой комп, так как мой в ремонте, и столкнулся с проблемой: когда я включаю UMSWE и перезапускаю редактор, тот пишет "Unable to apply patch". Можно нажать крестик или ОК, но редактор запустится. При открытии или создании карты редактор начнёт спамить ошибками Trigger Editor. Права админа не помогают. JNPG и Варкрафт в разных папках на диске C, пути не содержат кириллицу.
Ты хочешь сказать, что:
1.Кд висит на герое.
2.Кд нет на инвентаре.
3.Кд нет на предмете.
4.Кд не снимается удалением абилы.
Откуда такая информация?
Спасибо, но мемхак не хочу. Скорее изменю способность.
Ну так возьми и протести, это просто сделать. Заоодно выяснишь, кто прав.
Там нет правильного ответа, локальный игрок совершенно не то и создание звука в модельке тоже.
Попробуй так:
function CreateMirrorSoundPoint takes real x, real y, real z returns nothing
local sound s = CreateSound("Abilities\\Spells\\Orc\\MirrorImage\\MirrorImage.wav", false, true, true, 10, 10, "SpellsEAX")
call SetSoundParamsFromLabel(s, "MirrorImage")
call SetSoundDuration(s, 1756)
call SetSoundPosition(s, x, y, z)
call StartSound(s)
call KillSoundWhenDone(s)
set s = null
endfunction
Можно ещё прикрепить на юнита:
function CreateMirrorSoundUnit takes unit u returns nothing
local sound s = CreateSound("Abilities\\Spells\\Orc\\MirrorImage\\MirrorImage.wav", false, true, true, 10, 10, "SpellsEAX")
call SetSoundParamsFromLabel(s, "MirrorImage")
call SetSoundDuration(s, 1756)
call AttachSoundToUnit(s, u)
call StartSound(s)
call KillSoundWhenDone(s)
set s = null
endfunction
относительно глобального периодического таймера - нет, конечно, одно дело что-то каждую секунду вертится и проверяет кучу условий вне зависимости от того, есть там юниты вообще удовлетворяющие этим условиям или нет; другое дело - что-то только при конкретных действиях создается и проверяется.
Кажется, Вы плохо понимаете, как работает периодический триггер.
Периодически триггер вызывает условие, если оно есть, (TriggerEvaluate), а после действие (TriggerExecute). Потому если есть N периодических триггеров с разными условиями, то будет вызываться N условий каждый тик, то есть N новых потоков (если не 2N, я вот не знаю, наследуют ли действия поток условий или создают новый).
А если заменить это всё 1 таймеров с if - elseif, то условия будут вычисляться только до того момента, пока одно из них не даст TRUE. В худшем случае, будет посчитано N условий. Но даже в этом случае это будет лучше триггеров, так как те каждый тик создают как минимум N новых потоков, а 1 таймер каждый тик создают только 1 новый поток.
Другое дело, разница между одним период. триггером и 1 период таймером. Таймер регулировать проще, чем триггер, а в случае ненадобности, таймер можно просто удалить.
что не так?
Глобальные таймеры - это ни хорошо, ни плохо. Глобальный таймер можно создать 1 раз и его использовать.
Этот таймер нельзя перезаписать, но можно удалить.
А можно создавать и удалять, если это нужно. Я так делаю, чтобы быть убеждённым, что отсроченные действия не будут выполнены после удаления структуры и уже созданный таймер не будет потерян в памяти из-за его пересоздания при инициализации структуры.
struct CustomTimer
timer t
// some parameters
static method create takes nothing returns thistype
local thistype this = allocate()
set t = CreateTimer()
return this
endmethod
method onDestroy takes nothing returns nothing
call DestroyTimer(t)
endmethod
endstruct
В целом можно таймер просто паузить при удалении структуры, а при создании написать условие для проверки наличия таймера, но тогда это будет 4 строки, вместо 2-х, а таймеры будут всегда висеть в памяти.
А глобальный периодический таймер с кучей условий проверки - это нагрузка всегда.
А триггер нет?
Но производительность стремительно снижалась с появлением новых заклинаний.
Делаю много таймеров, так как у меня своя система баффов. Таймеры хранятся в глобальном массиве, но постоянно удаляются и создаются снова, и ничего не глючит. Может, всё-таки дело в локациях?
мне тяжелее пока использовать координаты, многого не понимаю в их вычислении, даже не понимаю, как, например, юнит в направлении X и Y другого юнита подвинуть
Математика Вам в помощь)
у себя и так делаю, это форматирование побилось тут
Я так и думал, потому лучше прикрепляйте ещё и .txt файл с кодом. А ещё TESH позволяет Tab переводить в пробелы и наоборот.
Скачай новую версию TESH с HIVE, удали папку tesh в папке JNPG, вместо неё распакуй туда скачанную. В блокноте пишешь свои функции, сохраняешь в папку tesh\includes. Если в это время открыт редактор, то в меню Trigger Editor кликаешь TESH -> Reload user includes, и твои функции начинают подсвечиваться. Формат подсветки можно настроить в Options, что над рабочей областью редактора.
IsDead(u5) == true можно просто писать IsDead(u5). Ровно как и not IsDead(u7) вместо IsDead(u7) == false.
Сделай скриншот ошибки и кинь сюда, избавься от локаций и сломанных моделек, после этого протестируй на фатал. Если он снова будет, вновь сделай скрин ошибки. Bergi_Bear:
ну да может быть, а если триггер такой всего 1 и он крутит с десяток функций, которые не нужно будет уничтожать или очищать, может в этом случае и да таймеры лучше, коли дело разовое
Ну, во-первых, делай отступы, код читаться будет проще.
Во-вторых, разделяй функции одной пустой строкой.
В-третьих, никогда не используй локации, если тебе не нужна координата Z. Bergi_Bear:
таймеры - на периодический триггер
Нет, таймеры лучше периодических триггеров, так как первые можно удалить при ненадобности, а со вторым так не сделаешь. Я читал где-то на сайте, что периодические триггеры - зло.
PT153,
Как именно называется условие, что источник урона дамми?
Тип юнита самый простой способ (Unit-Type Comparison). Но тогда дамми не должен быть универсальным, то есть дамми должен быть создан только для этого спела.
Пусть твой скил X.
Юнит кастует скил Y. У юнита есть дамми (можно его создавать каждый раз при касте Y и удалять через 5 секунд), который при касте Y кастует спел X в ту же цель. В триггере, что отлавливает получение урона, пишешь условие, что если источник урона есть тот самый дамми, пожрать ману у поражённого юнита. Думаю, что это вполне себе просто реализовать на ГУИ. ClotPh:
ну вокруг цели пикаешь всех врагов в группу, саму цель сразу из нее исключаешь, выбираешь случайного нового врага из группы на расстоянии перескока молнии от последнего пораженного, бьешь его следующей молнией и удаляешь из группы, ну и повторять так, сколько надо отскоков или пока группа не будет пустой.
новые молнии можно просто даммикастить
В данной реализации можно даже юзать стандартный манабёрн.
ссылка
не прерывается приказ почти у любой абилы без цели. В большинстве случаев, останавливаются, чтоб заюзать скилл. А потом продолжают делать те действия, которые оборвал. Типа Рев. Есть длительные касты, например: заговор неуязвимости, он остановится, попрыгает (channeling-анимация), и потом дальше будет идти. Или заклинание крови дракончика. А вот тех, из-за чего еще и не останавливается на ходу, совсем мало
То есть если я поставлю в очередь приказы постройки, а в середине использую эти способности, то очередь прервётся?
можно проверить
Во многом остановка при касте спела зависит от юнита, что его кастует. Если у юнита поставить Art - Animation - Cast Backswing и Art - Animation - Cast Pint на 0, то он при касте не будет останавливаться (те же Рёв и Провокация).
Думал, но не пробовал. Это записано в константах, боюсь, что не перенесёт вверх.
Сейчас протестирую.
Компилятор просто пропускает то, что в этом блоке, то есть я не смогу использовать глобалку, что в этом блоке.
If that code is parsed by a vJass compiler, it will remove what is inside the //! novjass blocks. If the function is just saved in normal World Editor, it will just ignore the //! novjass tags (since it will think they are comments) so it will still consider their contents.
Ред. PT153
» WarCraft 3 / Jass New Gen Pack - Rebuild 1.4
» WarCraft 3 / Unable to apply patch
» WarCraft 3 / I2H как сконвертировать
Ред. PT153
» WarCraft 3 / Jass New Gen Pack - Rebuild 1.4
Кстати, в R4 pjass странный, сам добавляет Condition там, где я их намеренно не делал, обновите его до последней версии.Это делает JassHelper (edit 14.01.2021).
Ред. PT153
» WarCraft 3 / Сброс перезарядки предмета.
» WarCraft 3 / Повторы слов в war3mapSkin\war3mapMisc
Ред. PT153
» WarCraft 3 / Своя подсветка функций
Автонабор по умолчанию включён. Его можно отключить, если что.
Ред. PT153
» WarCraft 3 / Позиционный звук
» WarCraft 3 / Продолжение: фатал из-за переполнения памяти
К тому же, таймер можно и не стартовать (Timer Start()), тогда и крутиться нечему.
Можете не отвечать.
Ред. PT153
» WarCraft 3 / Продолжение: фатал из-за переполнения памяти
Периодически триггер вызывает условие, если оно есть, (TriggerEvaluate), а после действие (TriggerExecute). Потому если есть N периодических триггеров с разными условиями, то будет вызываться N условий каждый тик, то есть N новых потоков (если не 2N, я вот не знаю, наследуют ли действия поток условий или создают новый).
А если заменить это всё 1 таймеров с if - elseif, то условия будут вычисляться только до того момента, пока одно из них не даст TRUE. В худшем случае, будет посчитано N условий. Но даже в этом случае это будет лучше триггеров, так как те каждый тик создают как минимум N новых потоков, а 1 таймер каждый тик создают только 1 новый поток.
Другое дело, разница между одним период. триггером и 1 период таймером. Таймер регулировать проще, чем триггер, а в случае ненадобности, таймер можно просто удалить.
Ред. PT153
» WarCraft 3 / Продолжение: фатал из-за переполнения памяти
» WarCraft 3 / Продолжение: фатал из-за переполнения памяти
» WarCraft 3 / Продолжение: фатал из-за переполнения памяти
Ред. PT153
» WarCraft 3 / Своя подсветка функций
» WarCraft 3 / Продолжение: фатал из-за переполнения памяти
Ровно как и not IsDead(u7) вместо IsDead(u7) == false.
Bergi_Bear: Крутить десяток функций можно и таймером)
Ред. PT153
» WarCraft 3 / Продолжение: фатал из-за переполнения памяти
Во-вторых, разделяй функции одной пустой строкой.
В-третьих, никогда не используй локации, если тебе не нужна координата Z.
Bergi_Bear:
Я читал где-то на сайте, что периодические триггеры - зло.
» WarCraft 3 / Продолжение: фатал из-за переполнения памяти
» WarCraft 3 / Система Save/Load для PUBG
» WarCraft 3 / Цепь молний, которая пожирает ману
» WarCraft 3 / Цепь молний, которая пожирает ману
Юнит кастует скил Y. У юнита есть дамми (можно его создавать каждый раз при касте Y и удалять через 5 секунд), который при касте Y кастует спел X в ту же цель. В триггере, что отлавливает получение урона, пишешь условие, что если источник урона есть тот самый дамми, пожрать ману у поражённого юнита. Думаю, что это вполне себе просто реализовать на ГУИ.
ClotPh: В данной реализации можно даже юзать стандартный манабёрн.
Ред. PT153
» WarCraft 3 / Способности, не прерывающие текущий приказ
» WarCraft 3 / Способности, не прерывающие текущий приказ
» WarCraft 3 / Равкод 'A00\'
» WarCraft 3 / Равкод 'A00\'
» WarCraft 3 / Равкод 'A00\'
Сейчас протестирую.
Компилятор просто пропускает то, что в этом блоке, то есть я не смогу использовать глобалку, что в этом блоке.