Добавлен , опубликован
Алгоритмы, Наработки и Способности
Способ реализации:
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
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 её убрать.
0
25
5 лет назад
Отредактирован Jack-of-shadow
0
PT153:
Ок. незнал что есть можно объявить тип key.

DracoL1ch:
Щас проверил и понял что ForForce не вариант. Он же code берет, а не boolexpr.
0
28
5 лет назад
0
Ок. незнал что есть можно объявить тип key.
Есть проблема с LoadCode, потому что сохранение идёт через "code" + s, а загрузка через s. Я думаю, что нужно либо убрать вообще конкатенацию с "code", или добавить ей в LoadCode, а в RunCode её убрать.
Я думаю, всё же это стоит поправить.
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.