Данная библиотека предназначена для тех, кто не хочет или не может изучать JASS, но имеет проблемы с утечками. Для использования необходимо: 1. Установить JASS NewGen Pack. 2. Скачать, собственно, саму библиотеку и закинуть ее в папку ...\jassnewgenpack5d\AdicHelper\lib\ 3. В своей карте написать в нестандартном коде: include "ALL.j"[spoiler="Нестандартный код здесь"][/spoiler]4. Забыть об утечках.
Результат - такое действие, как, например, "Боевая единица - Move (Triggering unit) to ((Position of (Target unit of ability being cast)) offset by 200.00 towards (Angle from (Position of (Triggering unit)) to (Position of (Target unit of ability being cast))) degrees)" не будет оставлять утечных точек.
Если же Вам нужно, к примеру, занести точку или эффект в переменную для дальнейшей работы с ними, перед этим действием нужно прописать Личным сценарием (Custom script): ALL_Remove = false, а после него - ALL_Remove = true.
Однако повторюсь, лучше использовать JASS, ведь вручную можно сделать все гораздо лучше.
private constant timer Timer = CreateTimer() private int MaxVar = -1 private int array LeakNum private location array LocationVar private rect array RectVar private group array GroupVar private force array ForceVar private group Group private force Force public bool Remove = false
public rect RemoveRect(rect leak) { if Remove { MaxVar++ MaxVar:RectVar = leak MaxVar:LeakNum = RectLeak if MaxVar == 0 { TimerStart(Timer, .0, false, function RemoveLeak) } } return leak } public rect RectFromCenterSizeBJ_GetRectFromCircleBJ(location l, real width, real height, bool b) { real x = GetLocationX(l), y = GetLocationY(l) if b { width *= .5 height *= .5 return Re##ct(x - width, y - height, x + width, y + height) } return Re##ct(x - width, y - width, x + width, y + width) }
public location RemoveLocation(location leak) { if Remove { MaxVar++ MaxVar:LocationVar = leak MaxVar:LeakNum = LocationLeak if MaxVar == 0 { TimerStart(Timer, .0, false, function RemoveLeak) } } return leak } public location GetWidgetLoc(widget w) { return Loc##ation(GetWidgetX(w), GetWidgetY(w)) } public location PolarProjection##BJ(location l, real r, real a) { a *= .0174533 return Loc##ation(GetLocationX(l) + Cos(a) * r, GetLocationY(l) + Sin(a) * r) } public location MeleeGetLoc##WithinRect(location l, rect r) { real minX = GetRectMinX®, maxX = GetRectMaxX®, \ minY = GetRectMinY®, maxY = GetRectMaxY® real x = GetLocationX(l), y = GetLocationY(l) if x < minX { x = minX } elseif x > maxX { x = maxX } if y < minY { return Loc##ation(x, minY) } elseif y > maxY { return Loc##ation(x, maxY) } return Loc##ation(x, y) }
public group DestroyGroup(group leak) { if Remove { MaxVar++ MaxVar:GroupVar = leak MaxVar:LeakNum = GroupLeak if MaxVar == 0 { TimerStart(Timer, .0, false, function RemoveLeak) } } return leak } public group GetUnitsInRange##OfLocMatching(real r, location l, boolexpr b) { Group = CreateGroup() GroupEnumUnitsInRangeOfLoc(Group, l, r, b) return Group } public group GetUnitsInRect##Matching(rect r, boolexpr b) { Group = CreateGroup() GroupEnumUnitsInRect(Group, r, b) return Group } public group GetUnitsInRect##OfPlayer(rect r, player p) { Group = CreateGroup() bj_groupEnumOwningPlayer = p GroupEnumUnitsInRect(Group, r, filterGetUnitsInRectOfPlayer) return Group } public group GetUnitsOfPlayer##Matching(player p, boolexpr b) { Group = CreateGroup() GroupEnumUnitsOfPlayer(Group, p, b) return Group } public group GetUnitsOfPlayer##AndTypeId(player p, int id) { Group = CreateGroup() bj_groupEnumTypeId = id GroupEnumUnitsOfPlayer(Group, p, filterGetUnitsOfPlayerAndTypeId) return Group } public group GetUnitsOfTypeId##All(int id) { group g = CreateGroup() bj_groupAddGroupDest = CreateGroup() bj_groupEnumTypeId = id for (int i = 0) { GroupEnumUnitsOfPlayer(g, Player(i), filterGetUnitsOfTypeIdAll) ForGroup(g, function GroupAddGroupEnum) exitwhen i == 15 i++ } Destroy##Group(g) g = null return bj_groupAddGroupDest } public group GetUnits##SelectedAll(player p) { Group = CreateGroup() SyncSelections() GroupEnumUnitsSelected(Group, p, null) return Group }
public force DestroyForce(force leak) { if Remove { MaxVar++ MaxVar:ForceVar = leak MaxVar:LeakNum = ForceLeak if MaxVar == 0 { TimerStart(Timer, .0, false, function RemoveLeak) } } return leak } public force GetForce##OfPlayer(player p) { Force = CreateForce() ForceAddPlayer(Force, p) return Force } public force GetPlay##ersAllies(player p) { Force = CreateForce() ForceEnumAllies(Force, p, null) return Force } public force GetPlayersByMap##Control(mapcontrol mc) { player p = Player(0) Force = CreateForce() for (int i = 0) { if GetPlayerController(p) == mc { ForceAddPlayer(Force, p) } exitwhen i == 15 p = Player(++i) } p = null return Force } public force GetPlay##ersEnemies(player p) { Force = CreateForce() ForceEnumEnemies(Force, p, null) return Force } public force GetPlay##ersMatching(boolexpr b) { Force = CreateForce() ForceEnumPlayers(Force, b) return Force }
//! textmacro ALL__RegisterMultiboardUpdater takes NAME, ARGS, PARAMS, PRE public void Multiboard##SetItem$NAME$BJ(multiboard mb, int col, int row, $ARGS$) { int rows = MultiboardGetRowCount(mb) int cols = MultiboardGetColumnCount(mb) multiboarditem mbi $PRE$ if col == 0 { if row == 0 { MultiboardSetItems$NAME$(mb, $PARAMS$) } else { row-- for (int i = 0; i < cols; i++) { mbi = MultiboardGetItem(mb, row, i) MultiboardSetItem$NAME$(mbi, $PARAMS$) MultiboardReleaseItem(mbi) } } } elseif row == 0 { col-- for (int i = 0; i < rows; i++) { mbi = MultiboardGetItem(mb, i, col) MultiboardSetItem$NAME$(mbi, $PARAMS$) MultiboardReleaseItem(mbi) } } else { mbi = MultiboardGetItem(mb, row - 1, col - 1) MultiboardSetItem$NAME$(mbi, $PARAMS$) MultiboardReleaseItem(mbi) } mbi = null } //! endtextmacro //! runtextmacro ALL__RegisterMultiboardUpdater("Style", "bool showVal, bool showIcon", "showVal, showIcon", "") //! runtextmacro ALL__RegisterMultiboardUpdater("Value", "string val", "val", "") //! runtextmacro ALL__RegisterMultiboardUpdater("ValueColor", "real red, real green, real blue, real trans", "r, g, b, t", "int r = R2I(red * 2.55), g = R2I(green * 2.55), b = R2I(blue * 2.55), t = 255 - R2I(trans * 2.55)") //! runtextmacro ALL__RegisterMultiboardUpdater("Width", "real width", "width", "width *= .01") //! runtextmacro ALL__RegisterMultiboardUpdater("Icon", "string icon", "icon", "") }[/code]
после того как я добавляю в кастом скрипт ' include "All.j" ' у меня перестает запускаться карта. Жму на проверку - просто открывалось главное меню вара
DeadJass, русских букв в пути нет. Я просто открыл свою карту из папки "Maps" в редакторе, добавил строку " include "All.j"", сохранил и карта открывается в эдиторе, а в игре - нет
Добавлено (11-06-2011, 23:36) --------------------------------------------- причем спокойно открывается и в JNGP и в WEU и в обычном редакторе, только что проверил
Добавлено (12-06-2011, 08:39) --------------------------------------------- короче просто надо сохранять, а потом запускать
Добавлено удаление утечки при использовании условия "Боевая единица - Count Living Units Owned By Player".
Изменен момент включения системы - после создания всех триггеров и перед запуском триггеров инициализации. Теперь vJASS'еры могут не бояться за псевдоутечки в инициализаторах библиотек и областей.
Библиотека больше не увеличивает время загрузки карты при большом (свыше 100) количестве областей на карте.
Теперь система больше не конфликтует с библиотекой "cj_antibj_base.j" из стандартного набора, так что их можно подключать вместе.
private nothing RemoveLeak() { handle h = GetExpiredTimer() integer i = 0 whilenot h == Timer[i++] {} if LeakNum[i] < 2 { if LeakNum[i] < 1 { RemoveLocation(LocationVar[i]) } else { RemoveRect(RectVar[i]) } } elseif LeakNum[i] < 3 { DestroyGroup(GroupVar[i]) } else { DestroyForce(ForceVar[i]) } CurVar-- h = null } public rect RemoveRect(rect leak) { if Remove { if CurVar >= MaxVar { Timer[CurVar] = CreateTimer() MaxVar++ } RectVar[CurVar] = leak LeakNum[CurVar] = 1 TimerStart(Timer[CurVar++], .0, false, function RemoveLeak) } return leak } public rect RectFromCenterSizeBJ_GetRectFromCircleBJ(location l, real width, real height, boolean b) { real x = GetLocationX(l), y = GetLocationY(l) if b { width = width * .5 height = height * .5 return Re##ct(x - width, y - height, x + width, y + height) } return Re##ct(x - width, y - width, x + width, y + width) } public location RemoveLocation(location leak) { if Remove { if CurVar >= MaxVar { Timer[CurVar] = CreateTimer() MaxVar++ } LocationVar[CurVar] = leak LeakNum[CurVar] = 0 TimerStart(Timer[CurVar++], .0, false, function RemoveLeak) } return leak } public location GetWidgetLoc(widget w) { return Loc##ation(GetWidgetX(w), GetWidgetY(w)) } public location PolarProjection##BJ(location l, real r, real a) { a = a * .0174532925166 return Loc##ation(GetLocationX(l) + Cos(a) * r, GetLocationY(l) + Sin(a) * r) } public location MeleeGetLoc##WithinRect(location l, rect r) { real minX = GetRectMinX(r), maxX = GetRectMaxX(r), \ minY = GetRectMinY(r), maxY = GetRectMaxY(r), \ x = GetLocationX(l), y = GetLocationY(l) if x < minX { x = minX } elseif x > maxX { x = maxX } if y < minY { return Loc##ation(x, minY) } elseif y > maxY { return Loc##ation(x, maxY) } return Loc##ation(x, y) } public group DestroyGroup(group leak) { if Remove { if CurVar >= MaxVar { Timer[CurVar] = CreateTimer() MaxVar++ } GroupVar[CurVar] = leak LeakNum[CurVar] = 2 TimerStart(Timer[CurVar++], .0, false, function RemoveLeak) } return leak } private boolean LivingPlayerUnitsOfTypeIdFilter() { unit u = GetFilterUnit() if GetWidgetLife(u) > .0 && GetUnitTypeId(u) == bj_livingPlayerUnitsTypeId { bj_groupCountUnits++ } u = null return false } public integer CountLiving##PlayerUnitsOfTypeId(integer id, player p) { Group = CreateGroup() bj_livingPlayerUnitsTypeId = id bj_groupCountUnits = 0 GroupEnumUnitsOfPlayer(Group, p, Boolexpr) DestroyGroup(Group) return bj_groupCountUnits } public group GetUnitsInRange##OfLocMatching(real r, location l, boolexpr b) { Group = CreateGroup() GroupEnumUnitsInRangeOfLoc(Group, l, r, b) DestroyBoolExpr(b) return Group } public group GetUnitsInRect##Matching(rect r, boolexpr b) { Group = CreateGroup() GroupEnumUnitsInRect(Group, r, b) DestroyBoolExpr(b) return Group } public group GetUnitsInRect##OfPlayer(rect r, player p) { Group = CreateGroup() bj_groupEnumOwningPlayer = p GroupEnumUnitsInRect(Group, r, filterGetUnitsInRectOfPlayer) return Group } public group GetUnitsOfPlayer##Matching(player p, boolexpr b) { Group = CreateGroup() GroupEnumUnitsOfPlayer(Group, p, b) DestroyBoolExpr(b) return Group } public group GetUnitsOfPlayer##AndTypeId(player p, integer id) { Group = CreateGroup() bj_groupEnumTypeId = id GroupEnumUnitsOfPlayer(Group, p, filterGetUnitsOfPlayerAndTypeId) return Group } public group GetUnitsOfTypeId##All(integer id) { group g = CreateGroup() integer i = 0 bj_groupAddGroupDest = CreateGroup() bj_groupEnumTypeId = id do { GroupEnumUnitsOfPlayer(g, Player(i), filterGetUnitsOfTypeIdAll) ForGroup(g, function GroupAddGroupEnum) exitwhen i == 15 i++ } DestroyGroup(g) g = null return bj_groupAddGroupDest } public group GetUnits##SelectedAll(player p) { Group = CreateGroup() SyncSelections() GroupEnumUnitsSelected(Group, p, null) return Group } public force DestroyForce(force leak) { if Remove { if CurVar >= MaxVar { Timer[CurVar] = CreateTimer() MaxVar++ } ForceVar[CurVar] = leak LeakNum[CurVar] = 3 TimerStart(Timer[CurVar++], .0, false, function RemoveLeak) } return leak } public force GetForce##OfPlayer(player p) { Force = CreateForce() ForceAddPlayer(Force, p) return Force } public force GetPlay##ersAllies(player p) { Force = CreateForce() ForceEnumAllies(Force, p, null) return Force } public force GetPlayersByMap##Control(mapcontrol mc) { player p = Player(0) integer i = 0 Force = CreateForce() do { if GetPlayerController(p) == mc { ForceAddPlayer(Force, p) } exitwhen i == 15 p = Player(++i) } p = null return Force } public force GetPlay##ersEnemies(player p) { Force = CreateForce() ForceEnumEnemies(Force, p, null) return Force } public force GetPlay##ersMatching(boolexpr b) { Force = CreateForce() ForceEnumPlayers(Force, b) DestroyBoolExpr(b) return Force } private nothing Init() { Boolexpr = Filter(function LivingPlayerUnitsOfTypeIdFilter) } }
автор, если будут силы и желание, то можешь написать прогу которая делала бы это с кодом, одноразово заменяя все бж-щное и утечное на исправленную... тоесть правила код карты а не define-ла всё это дело... Было бы круто, я бы даже попробывал =)
Мне сказали, что они лишь раскрывают bj но не удаляют утечек, какие ваши аргументы?
Quote (Faion)
Во вторых в новой редакции cjass автоматическое удаление утечек.
Подробнее и личку, если это позволит мне использовать гуи + забыть об утечках.
Основатель команды "Компьютерные Акулы" Г. Разработчик проекта: Forest: Dead Match Признанный сансей картостроения в wc3 Ищу Дизайнеров/Художников на бесплатную основу. Скайп: Don.Laonda В зависимости от качества и объема работ, можно говорить и о платной основе.
Обновлено. Небольшое изменение касательно производительности (использование единого таймера). Похоже, это final version. Не знаю, что еще можно добавить.
Я в личку писал что надо добавить) Но наверн это не реализуемо без постороннего по.
Установил в свой проект, работает, спасает, спс за труд. Добавил в титры =\
Добавлено (31 Январь 2012, 22:56:43) --------------------------------------------- Правда об утечках забыть не получится. Ещё юнитов надо обнулять... но если их вписать в твою либу то гуи превратится в страшный гемор с кучей All_Remove = false
Основатель команды "Компьютерные Акулы" Г. Разработчик проекта: Forest: Dead Match Признанный сансей картостроения в wc3 Ищу Дизайнеров/Художников на бесплатную основу. Скайп: Don.Laonda В зависимости от качества и объема работ, можно говорить и о платной основе.
Может, [{]? Зайди в меню "cJass" и поставь галочки на "Enable AdicParser" и "Enable AdicOptimizer". Если меню нет, качай JNGP по ссылке в первом сообщении.
всё скачано, все галочки стоят, все равно ту же самую ошибку пишет. может я что-то не так делаю? ALL.j в папке lib, в custom code пишу include "ALL.j" нужно что-то еще?
Добавлено (18 Февраль 2012, 14:40:06) --------------------------------------------- всё ребят, пользовался ЖНГП экспериментальным) все поставилось) спасибо