Save/Load/Run Code
Мини библиотека позволяющая сохранять, читать и запускать функцию из хеша.
- Восполняет отсутствие возможности создать массив функций и сохранить функцию в хеш.
- Удобна для прикрепления способностей юнитам снарядам и предметам.
- Вызов RunCode не сломается обфускацией в отличае от ExecuteFunc.
Устройство
Библиотека основана на использовании boolexpr.
Сохраняемая функция на самом деле Condition фильтр который вызывается из ForceEnumPlayers.
Сохраняемая функция на самом деле Condition фильтр который вызывается из ForceEnumPlayers.
Функции
SaveCode берет хеш, ключ-строку, функцию.
LoadCode берет хеш, ключ-строку.
RunCode берет хеш, ключ-строку.
LoadCode берет хеш, ключ-строку.
RunCode берет хеш, ключ-строку.
Для использования:
Копируем в кастом код карты или триггер.
Можно добавить доп функции/переменные для передачи атрибутов по вкусу.
По дефолту встроен CodeSendUnitAttr()
Копируем в кастом код карты или триггер.
Можно добавить доп функции/переменные для передачи атрибутов по вкусу.
По дефолту встроен CodeSendUnitAttr()
код библиотеки
library CodeLib
globals
boolexpr array CodeArray
force CodeForce = CreateForce()
key CodeHandle
boolean CodeBool = false
integer CodeCount = 0
//CustomAttribute
unit CodeUnitSource
unit CodeUnitTarget
endglobals
define CodeFunc (c) = ForceEnumPlayers(CodeForce, c)
define LoadCode (h,s) = LoadInteger(h,CodeHandle ,StringHash(s))
define RunCode (h,s) = {CodeBool = true; CodeFunc (CodeArray[LoadCode (h,s)]) }
define SaveCode (h,s,c) = {
CodeCount ++
SaveInteger (h,CodeHandle ,StringHash(s), CodeCount )
CodeArray[CodeCount] = Condition(c)
}
//CustomAttributeSet
define CodeSendUnitAttr (s,t) = {CodeUnitSource = s; CodeUnitTarget = t }
endlibrary
Ред. Jack-of-shadow
Вот полный список из common.j
Через эти функции вызов не проходит
native Or takes boolexpr operandA, boolexpr operandB returns boolexpr
native Not takes boolexpr operand returns boolexpr
native DestroyBoolExpr takes boolexpr e returns nothing
Ред. Jack-of-shadow
ну ForceEnumPlayers вроде как вызывает фильтр стролько раз сколько игроков в игре. По этому пришлось булку воткнуть, дабы избежать многократного вызова. Возможно если взять к примеру EnumItemsInRect в ректе c одним предметом, то можно что нибудь незачительно выиграть с этого.
call ForForce(bj_FORCE_PLAYER[0],code)
и будет тебе один вызов
Ред. Jack-of-shadow
Блин, а ведь и правда)
Ред. PT153