28

» WarCraft 3 / два юнита одновременно

Ну при найме/появлении такого-то юнита на карте сделай проверку на наличие исследования, если оно есть, то спавни такого же юнита рядом
28

» WarCraft 3 / Мультибоард и числа

PUVer, да, я видел, ты не упоминал что хочешь, чтобы игроки в один ряд помещались, это проще)
28

» WarCraft 3 / помогите найти карту или её жанр

ну.. есть похожее что-то, только не горизонтально разделено, а вертикально, и вместо кристалла замки
castle fight
28

» WarCraft 3 / Как написать код без утечек, для 1 триггера

а после переведу в реальное число и вставлю в bj_randomSubGroupWant?
не в реальное, а в целочисленное
да, ты можешь так сделать, вот пример

И я могу внутри функции перевести переменную из реального в целое, в момент ссылания на переменную?
по совпадению сразу и на это ответил в примере)

Загруженные файлы
28

» WarCraft 3 / Как написать код без утечек, для 1 триггера

zpxo, я могу отвечать на закрытые вопросы, не волнуйся, абилка прокачана, это тебе приходится убирать ответ, писать коммент, а потом снова закрывать вопрос
юзай отдельную функцию что я скинул, мне кажется так удобнее будет, а то какая-то дрисня со склейкой получилась
28

» Администрация XGM / склейка сообщений

а, там в принципе файлы из предыдущего сообщения заменяются если одинаковое название, это вообще не круто


теперь там вообще старое изображение но новая карта, хотя вот только что показывалось 2 новых

опять 2 новых изображения вместо старых, чу происходит
28

» WarCraft 3 / Как написать код без утечек, для 1 триггера

м, файлы заменились из-за автоматической склейки сообщений, потому что имели одинаковое название, неприятно
28

» WarCraft 3 / Как написать код без утечек, для 1 триггера

Рандомный выбор именно утекает?
выбор, я же скинул код с группой

вот это не утекает вроде
  • bj_randomSubGroupWant* - кол-во рандомных юнитов
группа 0 основная, группа 1 с рандомами

А не страшно что у меня указан случайный угол, в момент создания точки со смещением?
случайный угол это ровно то же действие, что и случайное число от 0 до 360. числа, реальные, строки и подобное не утекает

ну наверное постоянная вставка такого огромного кол-ва кода тебя может напрягать, так что сейчас сделаю отдельную функцию для тебя

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
первый аргумент группа, из которой нужно достать рандомных юнитов, второй аргумент куда этих рандомных юнитов засунуть и третий кол-во, код можешь закинуть куда угодно, в шапку карты например
Загруженные файлы
28

» WarCraft 3 / Как написать код без утечек, для 1 триггера

Я сейчас ломаю голову над данным триггером:
ну да, тут есть утечка.
эх. сложно живётся гуишникам, сейчас объясню

у тебя юзается точка с полярным смещением, код выглядит примерно так
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
да, утекает, опять переменная не обнуляется и не уничтожается, сейчас скажу что нужно делать
Загруженные файлы
28

» WarCraft 3 / Как написать код без утечек, для 1 триггера

а как я могу использовать ВСЮ карту?
для этого нужно использовать GetWorldBounds( ) вместо bj_mapInitialPlayableArea, но дело в том, что вызов GetWorldBounds( ) каждый раз вызывает утечку, чтобы этого не происходило, нужно создать переменную типа рект и присвоить ей значение, то есть вот это:
а потом использовать udg_названиеПеременной в кастомскрипте (в данном случае udg_EntireMapRect), тогда будут учитываться и тёмные зоны

Как провернуть такое же действие, как выше, но с предметами?
зачем? выбор предметов не утечен на твоём скрине, вот используемый код
function EnumItemsInRectBJ takes rect r, code actionFunc returns nothing
    call EnumItemsInRect(r, null, actionFunc)
endfunction

function GetPlayableMapRect takes nothing returns rect
    return bj_mapInitialPlayableArea
endfunction
Если убрать все утечки, прям все все, цифра счетчика будет возвращаться к первоначальной позиции? Или она будет продолжать расти с каждым запуском триггера?
счётчик хэндлов не особо точен, если у тебя не скачет что-то дохрена вверх постоянно, то всё норм, иногда нужно подождать какое-то время чтобы всё стабилизировалось (трупы там допустим исчезнут, эффекты пропадут после смерти и тому подобное)
Загруженные файлы
28

» WarCraft 3 / Как написать код без утечек, для 1 триггера

Я правильно понимаю, я могу заранее через действие "Отряд выбрать каждого с условиями совпадения" записать позиции(точку) в переменную типа "точка". А после взаимодействовать с ней и далее очистить ее. Тем самым я освобождаю память?
да, но использовать другую функцию для выбора нужно - GroupEnumUnitsInRangeOfLoc
если дружишь с английским то я думаю понятно что оно делает, если нет - выбор юнитов в группу в радиусе от точки, вот пример использования
512.00 - радиус
zpxo:
Эта функция записывает всех юнитов в группу 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 больше никакие действия пихнуть нельзя (на гуи называется "пропустить остальные действия"). но это бж функция, ты её не изменишь, кастомную писать только надо, но зачем, когда я уже скинул примеры как выбирать юнитов в группу

в следующий раз не нужно выделять весь текст, просто кликни по моему нику, либо выдели нужный текст и нажми кнопку цитировать
Загруженные файлы
28

» WarCraft 3 / Как написать код без утечек, для 1 триггера

создать DAMI юнита
dummy* - дамми

вот пример выбора юнитов в темповую группу без утечек с использованием точек

есть несколько функций для выбора юнитов
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 секунды и продамажить), но для темповых действий лучше иметь одну группу и просто очищать её
Загруженные файлы
28

» WarCraft 3 / Как сделать отравление в области?

TheBlakeRed, ну вот пример триггерного

можно было бы и через вхождение в область сделать, но наверное тогда лучше через таймер на каждого юнита, чтобы мгновенно получил урон, а потом уже тикать начало
Загруженные файлы
28

» WarCraft 3 / Как сделать отравление в области?

ну, можно либо триггерный яд сделать, либо дать даммику и отдать ему команду attackonce или как оно там, короче атаковать разово, на каждого в области наверное придётся делать по даммику и приказать атаковать
28

» WarCraft 3 / Мультибоард и числа

PUVer, да я сделаю без этого глупого оформления и цветов игроков. Как у тебя на скринах, что циферка слева у ника, просто пока желания нет, другой картой занимаюсь