zpxo, я могу отвечать на закрытые вопросы, не волнуйся, абилка прокачана, это тебе приходится убирать ответ, писать коммент, а потом снова закрывать вопрос
юзай отдельную функцию что я скинул, мне кажется так удобнее будет, а то какая-то дрисня со склейкой получилась
function GetRandomSubGroupEx takes group sourceGroup, group g, integer count returns nothing
set bj_randomSubGroupGroup = g
set bj_randomSubGroupWant = count
set bj_randomSubGroupTotal = CountUnitsInGroup( sourceGroup )
if ( bj_randomSubGroupWant <= 0 or bj_randomSubGroupTotal <= 0 ) then
return
endif
set bj_randomSubGroupChance = I2R( bj_randomSubGroupWant ) / I2R( bj_randomSubGroupTotal )
call ForGroup( sourceGroup, function GetRandomSubGroupEnum )
endfunction
первый аргумент группа, из которой нужно достать рандомных юнитов, второй аргумент куда этих рандомных юнитов засунуть и третий кол-во, код можешь закинуть куда угодно, в шапку карты например
ну да, тут есть утечка.
эх. сложно живётся гуишникам, сейчас объясню
у тебя юзается точка с полярным смещением, код выглядит примерно так
function PolarProjectionBJ takes location source, real dist, real angle returns location
local real x = GetLocationX(source) + dist * Cos(angle * bj_DEGTORAD)
local real y = GetLocationY(source) + dist * Sin(angle * bj_DEGTORAD)
return Location(x, y)
endfunction
то есть функция принимает точку, а когда ты указываешь позицию юнита, ты её создаёшь, то есть она тут уже нигде не исчезает как ты видишь, а заодно возвращает ещё одну, новую точку, то есть создаётся по факту 2 точки, одна это позиция юнита, другая это смещение, вот именно смещение ты и присваиваешь и удаляешь в последствии. чтобы исправить это, тебе нужно запеременить позицию юнита, указать её в смещении, а потом уже удалить и позицию, и смещение, выглядит вот так
ну и есть ощущения что выбор рандомных юнитов из группы юнитов тоже утекает
function GetRandomSubGroup takes integer count, group sourceGroup returns group
local group g = CreateGroup()
set bj_randomSubGroupGroup = g
set bj_randomSubGroupWant = count
set bj_randomSubGroupTotal = CountUnitsInGroup(sourceGroup)
if (bj_randomSubGroupWant <= 0 or bj_randomSubGroupTotal <= 0) then
return g
endif
set bj_randomSubGroupChance = I2R(bj_randomSubGroupWant) / I2R(bj_randomSubGroupTotal)
call ForGroup(sourceGroup, function GetRandomSubGroupEnum)
return g
endfunction
да, утекает, опять переменная не обнуляется и не уничтожается, сейчас скажу что нужно делать
для этого нужно использовать GetWorldBounds( ) вместо bj_mapInitialPlayableArea, но дело в том, что вызов GetWorldBounds( ) каждый раз вызывает утечку, чтобы этого не происходило, нужно создать переменную типа рект и присвоить ей значение, то есть вот это:
а потом использовать udg_названиеПеременной в кастомскрипте (в данном случае udg_EntireMapRect), тогда будут учитываться и тёмные зоны
Если убрать все утечки, прям все все, цифра счетчика будет возвращаться к первоначальной позиции? Или она будет продолжать расти с каждым запуском триггера?
счётчик хэндлов не особо точен, если у тебя не скачет что-то дохрена вверх постоянно, то всё норм, иногда нужно подождать какое-то время чтобы всё стабилизировалось (трупы там допустим исчезнут, эффекты пропадут после смерти и тому подобное)
Я правильно понимаю, я могу заранее через действие "Отряд выбрать каждого с условиями совпадения" записать позиции(точку) в переменную типа "точка". А после взаимодействовать с ней и далее очистить ее. Тем самым я освобождаю память?
да, но использовать другую функцию для выбора нужно - GroupEnumUnitsInRangeOfLoc
если дружишь с английским то я думаю понятно что оно делает, если нет - выбор юнитов в группу в радиусе от точки, вот пример использования
Эта функция записывает всех юнитов в группу TempGroup, которые совпадают выше условиями из переменной TempBlxpr, на всей карте mapInitialPlayableArea?
да. если, опять же, дружишь с английским, то я думаю mapInitialPlayableArea уже говорит сама за себя (исходная игровая зона карты), то есть по сути вся карта (исключая тёмные края вроде) zpxo:
Выходит я могу менять условия и тип юнита/игрока в переменной TempBlxpr?
да, следующим ответом станет понятно почему нужно использовать переменную TempBlxpr zpxo:
А если я сделаю через действие "Отряд выбрать каждого с условиями совпадения" и запишу юнитов в группу TempGroup - память в этом случае забивается? Если да, то как?
я уже помогал другому челу с этой утечкой, тогда я тоже впервые для себя открыл её
если вкратце, гуишные функции с приставкой Matching выглядят примерно так
function GetUnitsInRectMatching takes rect r, boolexpr filter returns group
local group g = CreateGroup()
call GroupEnumUnitsInRect(g, r, filter)
call DestroyBoolExpr(filter)
return g
endfunction
меняется только функция выбора если не ошибаюсь. в общем-то всё просто - не обнуляется переменная g, то есть нет действия set g = null, и собственно, с использованием локалки такое действие ты сюда никак не пихнёшь, только глобалка нужна, потому что после действия return больше никакие действия пихнуть нельзя (на гуи называется "пропустить остальные действия"). но это бж функция, ты её не изменишь, кастомную писать только надо, но зачем, когда я уже скинул примеры как выбирать юнитов в группу
в следующий раз не нужно выделять весь текст, просто кликни по моему нику, либо выдели нужный текст и нажми кнопку цитировать
native GroupEnumUnitsInRange takes group whichGroup, real x, real y, real radius, boolexpr filter returns nothing
native GroupEnumUnitsInRangeOfLoc takes group whichGroup, location whichLocation, real radius, boolexpr filter returns nothing
native GroupEnumUnitsInRect takes group whichGroup, rect r, boolexpr filter returns nothing
native GroupEnumUnitsOfPlayer takes group whichGroup, player whichPlayer, boolexpr filter returns nothing
native GroupEnumUnitsOfType takes group whichGroup, string unitname, boolexpr filter returns nothing
native GroupEnumUnitsSelected takes group whichGroup, player whichPlayer, boolexpr filter returns nothing
у некоторых есть аналоги с потолком выбора (кол-ва юнитов)
DestroyGroup( ... ) нужно использовать только если ты постоянно создаёшь группу до этого (в основном это требуется, если ты должен сделать действия с теми же юнитами спустя какое-то время, например выбрать кого-то там в области, наложить эффект, подождать 2 секунды и продамажить), но для темповых действий лучше иметь одну группу и просто очищать её
можно было бы и через вхождение в область сделать, но наверное тогда лучше через таймер на каждого юнита, чтобы мгновенно получил урон, а потом уже тикать начало
ну, можно либо триггерный яд сделать, либо дать даммику и отдать ему команду attackonce или как оно там, короче атаковать разово, на каждого в области наверное придётся делать по даммику и приказать атаковать
PUVer, да я сделаю без этого глупого оформления и цветов игроков. Как у тебя на скринах, что циферка слева у ника, просто пока желания нет, другой картой занимаюсь
» WarCraft 3 / два юнита одновременно
» WarCraft 3 / Ланшафт
» World of WarCraft / Дополнение Dragonflight выйдет 28 ноября!
» Блог им. rsfghd / генерация случайных чисел без повтора
» Мозг Махлайда / А кого вы выберите?)
» WarCraft 3 / Мультибоард и числа
» WarCraft 3 / Мультибоард и числа
» WarCraft 3 / Вопрос по поводу дополнения
» WarCraft 3 / помогите найти карту или её жанр
castle fight
» WarCraft 3 / Заклинание цепной молнии
» WarCraft 3 / Как написать код без утечек, для 1 триггера
да, ты можешь так сделать, вот пример
» WarCraft 3 / Как написать код без утечек, для 1 триггера
юзай отдельную функцию что я скинул, мне кажется так удобнее будет, а то какая-то дрисня со склейкой получилась
» Администрация XGM / склейка сообщений
» WarCraft 3 / Как написать код без утечек, для 1 триггера
Ред. rsfghd
» WarCraft 3 / Как написать код без утечек, для 1 триггера
» WarCraft 3 / Как написать код без утечек, для 1 триггера
эх. сложно живётся гуишникам, сейчас объясню
» WarCraft 3 / Как написать код без утечек, для 1 триггера
» WarCraft 3 / Как написать код без утечек, для 1 триггера
если дружишь с английским то я думаю понятно что оно делает, если нет - выбор юнитов в группу в радиусе от точки, вот пример использования
zpxo:
zpxo:
zpxo:
» WarCraft 3 / Мультибоард и числа
» WarCraft 3 / Заклинание цепной молнии
» WarCraft 3 / Как написать код без утечек, для 1 триггера
» WarCraft 3 / Как сделать отравление в области?
Ред. rsfghd
» WarCraft 3 / Как сделать отравление в области?
» WarCraft 3 / Как сделать отравление в области?
» WarCraft 3 / Мультибоард и числа