Данная библиотека предназначена для тех, кто не хочет или не может изучать 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]
0.00 towards (Angle from (Position of (Triggering unit)) to (Position of (Target unit of ability being cast))) degrees)" не будет оставлять утечных точек. Если же Вам нужно, к примеру, занести точку в переменную для дальнейшей работы с ней, перед этим действием нужно прописать Личным сценарием (Custom script): ALL_Remove = false.
А нужно ли после установки переменной прописывать
Code
ALL_Remove=true
?
Сообщение отредактировал rixt7956 - Пятница, 28 Января 2011, 15:06:30
public function RemoveLocation takes location l returns location local timer t if ALL_Remove then set t = CreateTimer() call SaveLocationHandle(Hash, GetHandleId(t), 0, l) call TimerStart(t, .0, false, function RemoveLocationTimer) set t = null else set ALL_Remove = true endif return l endfunction
if ALL_Remove == false then set ALL_Remove = true.
а помоему так будет лучше, так как не надо создовать кучу глобалок, но я бы использовал такое только в карте, в которой есть только гуи.
:facepalm: мб просветишь, о великий, причем тут глобалки? Утечки переменные которые не очищают, или перезаписывают предварительно не очистив их, а там уже строго пофиг глобалка или локалка.
В целом библиотека бесполезна по 2-м причинам, нубы как правило юзают стандартный ВЕ, данная либа в нем работать не будет, я уж не говорю о том что они не вкурсе о такой вещи как кастом код... А для норм жассюзеров это тоже не нужно, они и сами спокойно оптимизят код.
О нас думают плохо лишь те, кто хуже нас, а те кто лучше нас... Им просто не до нас. My Project: Nindogatari MAL
Faion, а как ты по другому удалишь к примеру спецэфект на гуи, не занося его заранее в глобальную переменную, так как локальные на гуи недостопы. И поэтому может получиться куча глобалок. Одна для спецэфекта, другая для точки, и так куча получиться.
а по-моему, так будет лучше, так как не надо создовать кучу глобалок
Нет, не лучше. Для устранения каждой утечки вызывается по меньшей мере одна функция, создается таймер и юзается хэш.
Quote (rixt7956)
И поэтому может получиться куча глобалок. Одна для спецэфекта, другая для точки, и так куча получится.
А на что тебе тогда (Last created ...)? Да, с точкой такое не пройдет, зато со всем остальным - запросто. Правда, если еще вспомнить, что все эти last created - это BJ, то можно прийти к выводу, что
Quote (SirNikolas)
лучше использовать JASS, ведь вручную можно сделать все гораздо лучше.
Добавлено (02-03-2011, 18:52) --------------------------------------------- Доступна новая версия. Теперь она убирает еще и утечки кланов (force).
Quote (rixt7956)
А нужно ли после установки переменной прописывать ALL_Remove=true?
Постарался хорошо, посмотрим как много пользователей будет использовать твою систему.
Добавлено (02-03-2011, 19:30) --------------------------------------------- Я б например не пихал бы в свою карту то что не прошло хорошо тестирования и не было оценено большинством.
Nic nie wiem bo mam chuj. редактирую посты! ВСЕ!
Сообщение отредактировал lawson - Среда, 02 Марта 2011, 19:30:54
Обновлено, см. первый пост. Устранен баг, из-за которого библиотека иногда попросту не работала. Также немного оптимизирован алгоритм благодаря избавлению от хэша.
Добавлено (10-06-2011, 19:45) --------------------------------------------- Открываю NewGen WE, он выдаёт ошибку Couldn't load plugin.... но всё равно в итоге запускается. Это нормально?
Сообщение отредактировал FatalBlade - Пятница, 10 Июня 2011, 19:37:23
У меня такой ошибки не было. Запускается карта или что?
Карта то запускается. Вот только то что я написал в Custom Code он воcпринимает как ошибку. Пишет - " is not a valid integer value. Якобы ошибка компиляции (Compile Error).
Потом я попробовал просто скопировать весь код и вставить в Custom Code. То же самое.
В первом случчае игра всётаки запустилась, но триггерные скилы начали работать как то странно. Если у меня удаляются утечки в каждом триггере, плюс стоит наработка, то мне нужно стереть все удаления утечек?
Если у меня удаляются утечки в каждом триггере плюс стоит наработка, то мне нужно стереть все удаления утечек?
Нет, со стандартным удалением, по идее, это конфликтовать не должно. По крайней мере, у меня такого не было. Могут быть ошибки, если в триггерах ты используешь wait. Тогда нужно делать так:
Custom script: ALL_Remove = false Set SpellPoint = (Position of (Triggering unit)) Custom script: ALL_Remove = true
Чего? JassHelper может максимум выдавать 100 ошибок. Кстати, проверь, включен ли он и включен ли синтаксис vJASS.
Добавлено (11-06-2011, 15:51) --------------------------------------------- FatalBlade, все ясно. Соседняя тема показала, что у тебя отключен AdicHelper.