Сделать триггер для проверки кода, ну и организовать систему для его считывания и поверь это очень много всего, придется продумать.
Если коротко ты цифрами будешь (условно) сохранять своего героя, каждый набор цифр отвечает за какой то параметр героя, силу, ловкость, уровень, предметы и так далее, когда я говорю что это очень много всего придется продумать так и есть, тебе придется создать базу данных, для всех чисел и все проверять при введении команды, для защиты можно сверять суму чисел и проверять героя за которого играет игрок.
Мой тебе совет, не поленись и вбей в поиск "сделать команду save для карты варкрафт 3", на твое удивление там будет то что тебе нужно, уже на второй ссылке.
Драконьчик, Спасибо Драконьчик, Не реагируют на способность "Укрыться за щитом", для теста пробовал другую способность - работает, почему может не реагировать на способность "Укрыться за щитом"? Драконьчик:
Вы немного ошиблись проектом.
И по делу: сделать всё достаточно просто.
Создай нестандартного юнита без модели, без радиуса видимости со способностью Москиты (чтобы он не отображался нигде и его нельзя было выделить), затем создай требование в РО для "Броска", что требуется этот юнит. Дальше уже триггерно делаешь так, чтобы при использовании способности "Укрыться за щитом" игроку-владельцу давали нужного юнита и наоборот.
При активировании способности "Укрыться за щитом" добавляй переключающего юнита в отряд и удаляй при деактивцаии. При начале применения броска проверяй - есть ли юнит в отряде. Если есть - ничего не делать, если нет - отменить приказ.
Не реагируют на способность "Укрыться за щитом", для теста пробовал другую способность - работает, почему может не реагировать на способность "Укрыться за щитом"?
Проверь уникальный ли у нее пункт "Порядок строк включен" он не должен совпадать с другими, которые используются в связке.
Могу скинуть триггер на Jass для отслежки ид приказа, при нажатии на клавишу способности, но вот как это тебе реализовать на GUI не скажу, не занимался таким. Там есть события и одно из них "EVENT_PLAYER_UNIT_ISSUED_ORDER" скорее оно тебе и нужно.
Посмотрел немного, вот такой вам вариант пойдет ?
Два триггера S001 и S002 первый удаляет способность при поднятии щита, второй добавляет при его опускании.
Да и при таком объеме есть смысл выучить jass и не делать таких огромных триггерных способностей. А вообще верно говорят, нужно на пустышке создавать способность проверять ее утечки и проверять не падает ли карта при ее использовании и после добавлять в саму карту.
Каждую секунду пикаешь юнитов по всей карте,если есть бафф то дать способность если нету баффа и есть способность (крита) то удалить способность<
Нужна помощь, как остледить условием что у героя есть способность ниже на скрине, у меня абилитибейнкаст , может что-то другое, но что?
Есть аура "Aura Fate" и сам баф "Aura Fate ( aura)"
Как сделать чтобы те кто под бафом получили способность критический удар "Aura Fate ( item )" ? [на GUI]
______
Впервые делаю такое, чет не могу сообразить как это осуществить правильно
Вот то что нужно, как пример, если способности нету будет 0 и условия не выполниться, если есть будет больше.
Это только что бы отследить есть ли способность.
Конкретно то что тебе нужно, здесь достаточно просто изменить способность, которую удаляешь и даешь, ну и баф.
Тебе нужно изменить у способностей одну строку, которая называется базовый ID приказа (+порядок строк). Просто, если он одинаковый, то срабатывают все неправильно, если у героя все способности канала с одинаковым ID.
Увы на карте, сейчас найдены утечки, я занимаюсь их устранением, оказались они в местах, от которых их не ждал, потому позже будет выложена версия без утечек, сейчас волны миньонов создают в карте проблему при длительной игре, а так же другие триггеры, на данный момент половину триггеров уже приведено в нужное состояние. FlyTab:
Увы на карте, сейчас найдены утечки, я занимаюсь их устранением, оказались они в местах, от которых их не ждал, потому позже будет выложена версия без утечек, сейчас волны миньонов создают в карте проблему при длительной игре, а так же другие триггеры, на данный момент половину триггеров уже приведено в нужное состояние.
после этого удалиться все даже его события и его нельзя будет вызвать командой TriggerExecute(gg_trg), я уже проверял это
Т.е. при следующем запуске карты, этот триггер невозможно будет включить обычными способами?
При запуске карты он создается снова, если вам нужно удалить его из карты, просто выберите его и удалите в редакторе, вместе с ним удалиться и переменная триггера, если у вас глобальная переменная триггера через cJass, ее нужно тоже будет убрать, если вы создавали его с помощью GUI и использовали переменную от GUI , там будет переменная которая сама удалиться при удалении триггера.
После удаления, при запуске триггера не будет.
Первая команда удаляет его через команды с другого триггера при игре, вторая просто отключает его условия, но не удаляет(его можно вызвать, но он работать не будет на своих событиях), не используйте их вместе.
А за безвозвратное удаление я написал выше.
Скиньте карту и что нужно удалить, тогда точней скажу. Может у вас чужая наработка, где просто создается лишний триггер, через другой.
Я не знаю в чем суть вашей проблемы, триггер можно просто отключить, DisableTrigger(gg_trg) (при этом его события больше не будут работать) или как вы хотите DestroyTrigger(gg_trg), после этого удалиться все даже его события и его нельзя будет вызвать командой TriggerExecute(gg_trg), я уже проверял это, при повторной активации нужно добавлять снова события. Но говорят части в оператвке остаються.
Для повторной активации его нужно создать как в функции инициализации, но помните функция этого триггера работает только раз, по новой его можно создать с другого триггера.
native CreateUnitAtLoc takes player id, integer unitid, location whichLocation, real face returns unit
использовать
native CreateUnit takes player id, integer unitid, real x, real y, real face returns unit
и тогда сразу же исчезнет надобность создавать точку (location)
Ну это уже кому как, я попробую тоже использовать это, просто увидел что при правильной очистке точек, удаляются и их Handle.
Увы но это чаще так, в Warcraft 3 нам предлагают возможность создать множество всего, но оптимизацию они складывают на плечи разработчиков карт, что не особо верно, не пробовал Dota 2 workshoop tools, но думаю там таки есть авто очистка мусора, аналогичная Java или других языков.
Уже выловил утечку, да уж, при цикле оказывается терялась ссылка на локацию и потому даляло 1 шт, вместо 3 и вот оттуда 2шт лишних, теперь нету спасибо. quq_CCCP:
Ну еще и 100500 юнитов могут начать лагать, 60+ на игрока которые куда то бегут уже не хорошо.
Так же советую сделать всех юнитов суммонами, чтобы они не разлагались
call UnitApplayTimedLife( unit, 'BFig', 0.00 ) это существенно снизит нагрузку на движок
P.S в ваших юнитах совсем не разобрался, какой то кавардак - нету четкого разделения на юнитов для волн, боссы, суммоны героев, герои игроков....
Это как раз то что искал, проверил при спавне 200 монстров, Handle удалялись как положено и возвращались в исходное состояние, тем самым лишая проблемы. Тему закрываю. Ige:
игра тормозит с командами если юнитов на карте больше какого то n-го количества и они попадают в ступор и идут по 3 шага, было такое до таймера смерти.
FlyTab, можно распределить монстров между игроками, тогда они не будут так "тупить". Используй нейтралов для этой цели.
И дело тут не в утечках, это баг/фича самого варкрафта
Я из за этого отказался от команды Атака, при которой был полезный эффект в виде, кастования магии врагами.
Если хорошо разбираетесь помогите с утечкой 6 Handle в способности Волна Силы (Вождя минотавров), называется "Trigger0PowerWave" в способностях триггер. Уже кажись все перепробовал, но меньше 6 никогда не становится.
Количество переменных уменьшил до двух и Хеш таблицы. Но ниже 6 никак не падает, хотя хеш чиститься точно, после действий.
quq_CCCP, а если в редакторе просто поубирать галочки «разлагается», разве не то же самое будет?
Мне все равно их убивать нужно, игра тормозит с командами если юнитов на карте больше какого то n-го количества и они попадают в ступор и идут по 3 шага, было такое до таймера смерти. quq_CCCP:
Ну еще и 100500 юнитов могут начать лагать, 60+ на игрока которые куда то бегут уже не хорошо.
Так же советую сделать всех юнитов суммонами, чтобы они не разлагались
call UnitApplayTimedLife( unit, 'BFig', 0.00 ) это существенно снизит нагрузку на движок
P.S в ваших юнитах совсем не разобрался, какой то кавардак - нету четкого разделения на юнитов для волн, боссы, суммоны героев, герои игроков....
За ту команду не знаю, вроде как она хуже 'BTLF', так как при этой команде юниты умирают без эффектов, а здесь они вызывают молнию и на примере Дамми юнитов уже плохо получается.
Подправил пока, тот что вы дали удалил там эффект молний из заклинания.
Ну про волы поподробнее, то у вас там не все так уж явно, с верху вниз пробежался и глянул, еще у вас походу крипы спаунятся постоянно?
В зависимости от того сколько разрушенных костяных заводов, сначала 3 раза переключаються, отключая предыдущий спавн, а последний добавляется, дополнительно к предпоследнему. На центре когда атакуешь баззу отключаются пред последние и включается центральный финальный, последние с големами остаются. Функция в первом триггере. Переключения в SwitchAttacker, пока там не было никаких правок.
Дикая смешь простого jassа с cjass (не пишите так, потом будет плохо - я вас предупредил)
Как оно выглядит у тебя, переменные мы объявляем где хотим а не вначале...
В 1 сточку и не надо даже никаких переменных, которые ты все равно не обнуляешь и ловишь утечки.
Я в курсе как компилятор переделывает код и как переносит, так удобно понимать, а сам принцип я и так знаю.
Цитирую себя опять "Как бороться с утечкой Handle при волнах", эти ответы можно приравнять к оффтопу, мне интересен только этот момент, он ведет к огромным утечкам, остальные я рано или поздно исправлю.
function Trig_Star_Set_Jass1_pickup_item_Actions takes nothing returns nothing
local integer array item_check
local unit Star_set_item_unit = GetManipulatingUnit()
local boolean array item_check_status
local integer start = 0
//local string text = "Предмет взят"
set item_check[0] = 'I00A'
set item_check[1] = 'I009'
set item_check[2] = 'I00E'
set item_check[3] = 'I00B'
set item_check[4] = 'I00D'
loop
exitwhen ((start > bj_MAX_INVENTORY) or ((item_check_status[0] == true) and (item_check_status[1] == true) and (item_check_status[2] == true) and (item_check_status[3] == true) and (item_check_status[4] == true)))
if ( GetItemTypeId(UnitItemInSlot(Star_set_item_unit, start)) == item_check[0] ) then
set item_check_status[0] = true
// call DisplayTextToForce( GetPlayersAll(), text )
endif
if ( GetItemTypeId(UnitItemInSlot(Star_set_item_unit, start)) == item_check[1] ) then
set item_check_status[1] = true
// call DisplayTextToForce( GetPlayersAll(), text )
endif
if ( GetItemTypeId(UnitItemInSlot(Star_set_item_unit, start)) == item_check[2] ) then
set item_check_status[2] = true
// call DisplayTextToForce( GetPlayersAll(), text )
endif
if ( GetItemTypeId(UnitItemInSlot(Star_set_item_unit, start)) == item_check[3]) then
set item_check_status[3] = true
// call DisplayTextToForce( GetPlayersAll(), text )
endif
if ( GetItemTypeId(UnitItemInSlot(Star_set_item_unit, start)) == item_check[4] ) then
set item_check_status[4] = true
// call DisplayTextToForce( GetPlayersAll(), text )
endif
set start = start + 1
endloop
if ((item_check_status[0] == true) and (item_check_status[1] == true) and (item_check_status[2] == true) and (item_check_status[3] == true) and (item_check_status[4] == true)) then
// call DisplayTextToForce( GetPlayersAll(), text )
call TriggerExecute( gg_trg_Star_Set_Add )
endif
set Star_set_item_unit = null
endfunction
В этой функции мы сделали локальный массив а обнулять его видимо будут чуваки с форума XGM (массивы переменных, если они созданы локально требуют обнуление, 1 значение 2 байте оперативки, не забываем об этом, не нужно обнулять только базовые типы не массивы.)
Серьезно integer вы советуете обнулять или может boolean который по сути 1 байт (0 или 1) ?
Сударь, а теперь внимательно посмотрите скрин и прочитайте что я там написал...
А теперь возьмите и отключите спавн юнитов и посмотрите на Handle, я пришел с этой проблемой с теми вещами на GUI я еще просто не добрался до тех функций, как следует, конкретно в моем случаи вы мне не подсказываете, а лишь тыкаете на места, про которые суть в этом вопросе и не стояла, здесь мне лишь интересен способ оптимизировать спав и не более.
Ну как и думал, туча гуи триггеров и все те же ошибки - location мы не удаляем (а лучше и вовсе не юзать, ну кроме редких случаев )
Какие еще те же ошибки я локации не удаляю, потому что буду после 1000 раз или более их создавать, а куски остаються в памяти, эх надеялся нормальный ответ услышать, а снова это, внимательней изучите и поймете, где локации и почему я не удаляю для юнитов их.
Там где нужно я их удаляю и это можно найти.
set NeedLoc[0] = Location(GetRectCenterX(gg_rct_LL_032), GetRectCenterY(gg_rct_LL_032))
set NeedLoc[1] = Location(GetRectCenterX(gg_rct_Region_LL2), GetRectCenterY(gg_rct_Region_LL2))
set NeedLoc[2] = Location(GetRectCenterX(gg_rct_Far_Left_Left), GetRectCenterY(gg_rct_Far_Left_Left))
set NeedLoc[3] = Location(GetRectCenterX(gg_rct_Region_L1), GetRectCenterY(gg_rct_Region_L1))
set NeedLoc[4] = Location(GetRectCenterX(gg_rct_Far_Mid_Left), GetRectCenterY(gg_rct_Far_Mid_Left))
set NeedLoc[5] = Location(GetRectCenterX(gg_rct_Region_C1), GetRectCenterY(gg_rct_Region_C1))
set NeedLoc[6] = Location(GetRectCenterX(gg_rct_Far_Center), GetRectCenterY(gg_rct_Far_Center))
set NeedLoc[7] = Location(GetRectCenterX(gg_rct_DarknessEnd), GetRectCenterY(gg_rct_DarknessEnd))
set NeedLoc[8] = Location(GetRectCenterX(gg_rct_Region_R1), GetRectCenterY(gg_rct_Region_R1))
set NeedLoc[9] = Location(GetRectCenterX(gg_rct_Far_Mid_Right), GetRectCenterY(gg_rct_Far_Mid_Right))
set NeedLoc[10] = Location(GetRectCenterX(gg_rct_Region_RR2), GetRectCenterY(gg_rct_Region_RR2))
set NeedLoc[11] = Location(GetRectCenterX(gg_rct_Far_Right_Right), GetRectCenterY(gg_rct_Far_Right_Right))
set Attackloc = Location(GetRectCenterX(gg_rct_Base), GetRectCenterY(gg_rct_Base))
Эти локации служат для постоянных точек спавна (постоянных, зачем мне их каждый раз по новому объявлять).
Этим изменениям кода, я убавил утечки в два раза где то.
Все ясно, здесь я от вас жду реального ответа, а получаю лишь предрассудки, не прочитав кода, вы делаете вывод.
"если скопировать юнита в редакторе, он будет иметь одинаков handle"
Серьезно?
Не хочу расстраивать, но именно из за такого бага я долго не мог понять, почему мой код не работает, пока не перевел id юнита в текст и не вывел себе сообщением и был удивлен что у двоих юнитов он одинаков.
Хендл - номер структуры в памяти, хендлы находятся в оперативной памяти, а raw-код ( type id как в гуях на инглише) это всего лишь номер строчки в слк таблице, которая сохранена на диске - своего рода база данных откуда движок игры берет начальные данные для создания объекта в оперативной памяти ну и только потом назначает ему уникальный хендл (ну почти всегда, близзарды еще не полечили все баги рекурсии хендлов)
Я не дурак и знаю что это такое, id юнита находиться командой GetHandleId(Юнит), именно он одинаков.
/////////////////////////////
Вот карта, там уже включен счетчик Handle и отключена моя доска для достижений.
Если отключить спавн юнитов, тут же роста нету. Про небольшие утечки от Волны Силы Вождя я знаю.
Карту в студию, желательно с комментариями. то тут уже был один юнный IceFrog у которого в карте черт ногу сломит.
С комментариями к сожалению не помогу, слишком много кода, весь описывать долго будет. GetLocalPlayer:
если скопировать юнита в редакторе, он будет иметь одинаков handle, такое нельзя как то использовать в карте, что бы для юнитов не создавались новые, переменная у меня одна, для юнитов(глобальная), что бы избежать частого создания, просто обнуляється в конце всех действий
Кто-нибудь вообще понял, что это означает?
Автор, разберись хотя бы в терминологии, что есть handle и что есть raw-код юнита. Ну полную ахинею же несешь.
id скопированного юнита идентичен, своему оригиналу, попробуй сделать проверку и какое то действия и убедишься, именно того кто скопирован с того кто стоит на карте.
"если скопировать юнита в редакторе, он будет иметь одинаков handle"
Серьезно?
Не хочу расстраивать, но именно из за такого бага я долго не мог понять, почему мой код не работает, пока не перевел id юнита в текст и не вывел себе сообщением и был удивлен что у двоих юнитов он одинаков.
Что тот вариант от автора, что ваш совсем верным не назвать в обоих авторы используют wait, когда нужно wait game time, так как при включении паузы таймер дальше работает, что глупо с точки зрения игры. Я уже молчу о Юните с аурой по сути, автор хотел просто погоду, а вы еще и дополнительные возможно не нужные функции предлагаете.
» WarCraft 3 / Проблема ТD карты
Ред. FlyTab
» WarCraft 3 / Как в редакторе варкрафт 3 сделать команду -save?
Если коротко ты цифрами будешь (условно) сохранять своего героя, каждый набор цифр отвечает за какой то параметр героя, силу, ловкость, уровень, предметы и так далее, когда я говорю что это очень много всего придется продумать так и есть, тебе придется создать базу данных, для всех чисел и все проверять при введении команды, для защиты можно сверять суму чисел и проверять героя за которого играет игрок.
Ред. FlyTab
» WarCraft 3 / Бросок условие
Посмотрел немного, вот такой вам вариант пойдет ?
Два триггера S001 и S002 первый удаляет способность при поднятии щита, второй добавляет при его опускании.
» WarCraft 3 / Ошибка, проверьте меня пожалуйста.
Ред. FlyTab
» WarCraft 3 / Как отследить баф (GUI)
Конкретно то что тебе нужно, здесь достаточно просто изменить способность, которую удаляешь и даешь, ну и баф.
» WarCraft 3 / Проблема из способностью канал
» WarCraft 3 / 10 Hero's Siege Phoenix
FlyTab: Ошибки исправил, смело играйте :)
Ред. FlyTab
» WarCraft 3 / Существует вообще такой способ?
Ред. FlyTab
» WarCraft 3 / Существует вообще такой способ?
» WarCraft 3 / Как бороться с утечкой Handle при волнах
Ред. FlyTab
» WarCraft 3 / Как бороться с утечкой Handle при волнах
» WarCraft 3 / Как бороться с утечкой Handle при волнах
quq_CCCP: Это как раз то что искал, проверил при спавне 200 монстров, Handle удалялись как положено и возвращались в исходное состояние, тем самым лишая проблемы. Тему закрываю.
Ige: Я из за этого отказался от команды Атака, при которой был полезный эффект в виде, кастования магии врагами.
» WarCraft 3 / Как бороться с утечкой Handle при волнах
Ред. FlyTab
» WarCraft 3 / Как бороться с утечкой Handle при волнах
» WarCraft 3 / Как бороться с утечкой Handle при волнах
quq_CCCP: За ту команду не знаю, вроде как она хуже 'BTLF', так как при этой команде юниты умирают без эффектов, а здесь они вызывают молнию и на примере Дамми юнитов уже плохо получается.
Подправил пока, тот что вы дали удалил там эффект молний из заклинания.
Ред. FlyTab
» WarCraft 3 / Как бороться с утечкой Handle при волнах
Ред. FlyTab
» WarCraft 3 / Как бороться с утечкой Handle при волнах
» WarCraft 3 / Как бороться с утечкой Handle при волнах
» WarCraft 3 / Как бороться с утечкой Handle при волнах
Ред. FlyTab
» WarCraft 3 / Как бороться с утечкой Handle при волнах
Этим изменениям кода, я убавил утечки в два раза где то.
Все ясно, здесь я от вас жду реального ответа, а получаю лишь предрассудки, не прочитав кода, вы делаете вывод.
Ред. FlyTab
» WarCraft 3 / Как бороться с утечкой Handle при волнах
/////////////////////////////
Вот карта, там уже включен счетчик Handle и отключена моя доска для достижений.
Если отключить спавн юнитов, тут же роста нету. Про небольшие утечки от Волны Силы Вождя я знаю.
» WarCraft 3 / Как бороться с утечкой Handle при волнах
GetLocalPlayer: id скопированного юнита идентичен, своему оригиналу, попробуй сделать проверку и какое то действия и убедишься, именно того кто скопирован с того кто стоит на карте.
» WarCraft 3 / Как бороться с утечкой Handle при волнах
Ред. FlyTab
» WarCraft 3 / Динамическая погода
Ред. FlyTab
» WarCraft 3 / Динамическая погода