Добавлен , опубликован
Алгоритмы, Наработки и Способности
Способ реализации:
cJass
Тип:
Наработка
Версия Warcraft:
1.26a

Save/Load/Run Code


Мини библиотека позволяющая сохранять, читать и запускать функцию из хеша.
  • Восполняет отсутствие возможности создать массив функций и сохранить функцию в хеш.
  • Удобна для прикрепления способностей юнитам снарядам и предметам.
  • Вызов RunCode не сломается обфускацией в отличае от ExecuteFunc.

Устройство


Библиотека основана на использовании boolexpr.
Сохраняемая функция на самом деле Condition фильтр который вызывается из ForceEnumPlayers.

Функции


SaveCode берет хеш, ключ-строку, функцию.
LoadCode берет хеш, ключ-строку.
RunCode берет хеш, ключ-строку.
Для использования:
Копируем в кастом код карты или триггер.
Можно добавить доп функции/переменные для передачи атрибутов по вкусу.
По дефолту встроен 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

Карта пример внизу

`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
0
25
5 лет назад
Отредактирован Jack-of-shadow
0
Возможно выбор ForceEnumPlayers не самый лучший. Я не сравнивал производительность с остальными нативками использующими фильтр, но на вскидку он кажется самым легким из за наименьшего кол-ва используемых атрибутов.
Вот полный список из common.j
развернуть

native GroupEnumUnitsOfType takes group whichGroup, string unitname, boolexpr filter returns nothing

native GroupEnumUnitsOfPlayer takes group whichGroup, player whichPlayer, boolexpr filter returns nothing

native GroupEnumUnitsOfTypeCounted takes group whichGroup, string unitname, boolexpr filter, integer countLimit returns nothing

native GroupEnumUnitsInRect takes group whichGroup, rect r, boolexpr filter returns nothing

native GroupEnumUnitsInRectCounted takes group whichGroup, rect r, boolexpr filter, integer countLimit returns nothing

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 GroupEnumUnitsInRangeCounted takes group whichGroup, real x, real y, real radius, boolexpr filter, integer countLimit returns nothing

native GroupEnumUnitsInRangeOfLocCounted takes group whichGroup, location whichLocation, real radius, boolexpr filter, integer countLimit returns nothing

native GroupEnumUnitsSelected takes group whichGroup, player whichPlayer, boolexpr filter returns nothing

native ForceEnumPlayers takes force whichForce, boolexpr filter returns nothing

native ForceEnumPlayersCounted takes force whichForce, boolexpr filter, integer countLimit returns nothing

native ForceEnumAllies takes force whichForce, player whichPlayer, boolexpr filter returns nothing

native ForceEnumEnemies takes force whichForce, player whichPlayer, boolexpr filter returns nothing

native EnumDestructablesInRect takes rect r, boolexpr filter, code actionFunc returns nothing

native EnumItemsInRect takes rect r, boolexpr filter, code actionFunc returns nothing

Через эти функции вызов не проходит

native And takes boolexpr operandA, boolexpr operandB returns boolexpr
native Or takes boolexpr operandA, boolexpr operandB returns boolexpr
native Not takes boolexpr operand returns boolexpr
native DestroyBoolExpr takes boolexpr e returns nothing
0
16
5 лет назад
0
все нативки с фильтром будут иметь крайне похожую производительность, не парься
0
25
5 лет назад
Отредактирован Jack-of-shadow
0
DracoL1ch:
ну ForceEnumPlayers вроде как вызывает фильтр стролько раз сколько игроков в игре. По этому пришлось булку воткнуть, дабы избежать многократного вызова. Возможно если взять к примеру EnumItemsInRect в ректе c одним предметом, то можно что нибудь незачительно выиграть с этого.
1
16
5 лет назад
1
сколько игроков в форсе. Делай форс по
call ForForce(bj_FORCE_PLAYER[0],code)
и будет тебе один вызов
0
25
5 лет назад
Отредактирован Jack-of-shadow
0
DracoL1ch:
Блин, а ведь и правда)
0
28
5 лет назад
Отредактирован PT153
0
  integer   CodeHandle = GetHandleId(Location(0,0))
Переделай на это. Возможно, обёртка в //! nocjass не потребуется.
//! nocjass
key CodeParentKey
//! endnocjass

Есть проблема с LoadCode, потому что сохранение идёт через "code" + s, а загрузка через s. Я думаю, что нужно либо убрать вообще конкатенацию с "code", или добавить ей в LoadCode, а в RunCode её убрать.
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.