Немного изменил одну библиотеку, взятую из данного сайта:
globals
        public     constant    trigger      TRIGGER    =    CreateTrigger()
    endglobals

    private function Trigger_Conditions takes nothing returns boolean
        local string s = LoadStr(HASHTABLE, GetSpellAbilityId(), StringHash("abil_id"))
        if (s != null) then
            return true
        endif
        return false
    endfunction

    private function Trigger_Actions takes nothing returns nothing
        call BJDebugMsg(RAW2S(GetSpellAbilityId()) + "str != null")
        call ExecuteFunc(LoadStr(HASHTABLE, GetSpellAbilityId(), StringHash("abil_id")))
    endfunction

    private function Init takes nothing returns nothing
        local boolexpr b = Condition(function Trigger_Conditions)
        call TriggerRegisterAnyUnitEventBJ(TRIGGER, EVENT_PLAYER_UNIT_SPELL_EFFECT)
        call TriggerAddCondition(TRIGGER, b)
        call TriggerAddAction(TRIGGER, function Trigger_Actions)
        call DestroyBoolExpr(b)
        set b = null
    endfunction

    function TriggerRegisterAnyUnitSpellEffectEvent takes integer abil, string str returns nothing
        call SaveStr(HASHTABLE, abil, StringHash("abil_id"), str)
    endfunction
И почему-то BJDebugMsg(...) из функции Trigger_Actions всплывает в игре независимо от того, тригерный скил или нет.
В Trigger_Conditions писал return HaveSavedString(HASHTABLE, abil, StringHash("abil_id")) - результат не меняется.
В чём проблема?

Принятый ответ

private function Trigger_Conditions takes nothing returns boolean
     return LoadStr(HASHTABLE, GetSpellAbilityId(), StringHash("abil_id")) != null and LoadStr(HASHTABLE, GetSpellAbilityId(), StringHash("abil_id")) != ""
endfunction
попробуйте так, или уберите:
local boolexpr b = Condition(function Trigger_Conditions)
call DestroyBoolExpr(b)
set b = null
Замените call TriggerAddCondition(TRIGGER, b) на call TriggerAddCondition(TRIGGER, Condition(function Trigger_Conditions))

Добавлю
Ещё бывает что значение из хеш-таблицы строкового показывало "(null)";
0
19
7 лет назад
0
Похожие вопросы:

ответ
низнаю какой спел у героя перезаряжается, на какой хватает маны, какие спелы у героя вообще есть, и в прочем на основе каких спелов они сделаны
да здравствует бд
FenikS1991:
Я знаю что это координаты умник.. пустые придирки не прокатят
я не только про координаты, я про всё
короче судя по всему ты пытаешься написать прогу которая бы думала вместо тебя
и это очень пичально
поэтому я просто оставлю это здесь
ответ
нет
no
ответ
FenikS1991, убери стоимость в 15 маны.
ответ
Не boolean а booexpr - это фильтр для группы, там никакие локалка не нужны.
Саму группу можно перебирать в цикле что правда дает шанс попасть в лимит операций и грохнуть поток.
Делать нужно примерно вот так :
function OnlyEnemyGroundAlive takes nothing returns boolean
    return GetUnitState( GetFilterUnit(), UNIT_STATE_LIFE )> 0.405 and IsUnitEnemy( GetFilterUnit(), bj_groupEnumOwningPlayer ) and IsUnitType( GetFilterUnit(), UNIT_TYPE_GROUND )
endfunction

function DamageEnemy takes nothing returns nothing
    call UnitDamageTarget( bj_lastReplacedUnit, GetEnumUnit(), 100.00, false, false, ATTACK_TYPE_NORMAL,  DAMAGE_TYPE_COLD, WEAPON_TYPE_WHOKNOWS )
endfunction

function Temp takes nothing returns nothing
    local group grp = CreateGroup( ) //создаём группу юнитов
    local real dx = 0.00   // координата x 
    local real dy = 0.00   // координата y
    
    set bj_groupEnumOwningPlayer == Player(0) // глобальная переменная чтобы передать данные в фильтр
    call GroupEnumUnitsInRange( grp, dx, dy, 512.00, Condition( function OnlyEnemyGroundAlive) )
    set bj_lastReplacedUnit = GetTriggerUnit( )// глобальная переменная чтобы передать данные в другую функцию.
    call ForGroup( grp, function DamageEnemy )
    
    call DestroyGroup( grp )
    
    set grp = null
endfunction
1 строчка бывает только у гуишников.
ответ
проверь настройки A01P, возможно, там кривые данные выше 3-го уровня

0
29
7 лет назад
Отредактирован Волчачка
0
private function Trigger_Conditions takes nothing returns boolean
     return LoadStr(HASHTABLE, GetSpellAbilityId(), StringHash("abil_id")) != null
endfunction
Лучше так, меньше утечек
Из "private function Init takes nothing returns nothing"
 local boolexpr b = Condition(function Trigger_Conditions)
//....
call DestroyBoolExpr(b)
set b = null
Вот этот участок немного сомнительный, хотя хз мож так надо...
HASHTABLE - иницилизированна ли данная хеш таблица?
0
21
7 лет назад
0
KingMaximax:
private function Trigger_Conditions takes nothing returns boolean
     return LoadStr(HASHTABLE, GetSpellAbilityId(), StringHash("abil_id")) != null
endfunction
Лучше так, меньше утечек
Из "private function Init takes nothing returns nothing"
 local boolexpr b = Condition(function Trigger_Conditions)
//....
call DestroyBoolExpr(b)
set b = null
Вот этот участок немного сомнительный, хотя хз мож так надо...
HASHTABLE - иницилизированна ли данная хеш таблица?
да.
0
29
7 лет назад
Отредактирован Волчачка
0
private function Trigger_Conditions takes nothing returns boolean
     return LoadStr(HASHTABLE, GetSpellAbilityId(), StringHash("abil_id")) != null and LoadStr(HASHTABLE, GetSpellAbilityId(), StringHash("abil_id")) != ""
endfunction
попробуйте так, или уберите:
local boolexpr b = Condition(function Trigger_Conditions)
call DestroyBoolExpr(b)
set b = null
Замените call TriggerAddCondition(TRIGGER, b) на call TriggerAddCondition(TRIGGER, Condition(function Trigger_Conditions))

Добавлю
Ещё бывает что значение из хеш-таблицы строкового показывало "(null)";
Принятый ответ
0
21
7 лет назад
0
или уберите:
local boolexpr b = Condition(function Trigger_Conditions)
call DestroyBoolExpr(b)
set b = null
Замените call TriggerAddCondition(TRIGGER, b) на call TriggerAddCondition(TRIGGER, Condition(function Trigger_Conditions))
Это помогло. Но почему так? Там же утечка создаётся.
0
29
7 лет назад
0
ScopteRectuS:
или уберите:
local boolexpr b = Condition(function Trigger_Conditions)
call DestroyBoolExpr(b)
set b = null
Замените call TriggerAddCondition(TRIGGER, b) на call TriggerAddCondition(TRIGGER, Condition(function Trigger_Conditions))
Это помогло. Но почему так? Там же утечка создаётся.
Дело в том, что вы удаляли то, что проверяло условие. Это вам не ректы и локи для региона.
если вы используете одно и тоже условие для триггеров то лучше сделать глобальным.
boolexpr BXPR_0000 = null
где-нибудь создаёте.
И добавляете в каждый нужный триггер, если не хотите расходовать лишнюю память на одно и тоже условие.
Ну есть и другой способ добавить в Trigger_Actions
if (условие) then
код вызова внутри
endif
private function Trigger_Actions takes nothing returns nothing
   if return LoadStr(HASHTABLE, GetSpellAbilityId(), StringHash("abil_id")) != null then
        call BJDebugMsg(RAW2S(GetSpellAbilityId()) + "str != null")
        call ExecuteFunc(LoadStr(HASHTABLE, GetSpellAbilityId(), StringHash("abil_id")))
    endif
endfunction
Чтобы оставить комментарий, пожалуйста, войдите на сайт.