Добавлен
В общем, я хотел написать jass-способность на jass. Суть была в том, что герой после применения способности на другого героя становился копией другого героя (проще говоря, "мимикрировал"). Мелочей много, но пока застрял на одной: чтобы после смерти "копии" игроку-владельцу возвращался оригинальный герой.
Поскольку это должно произойти мгновенно, то действие Wait for condition не подойдёт, поскольку оно проверяет условие не чаще, чем раз в период времени.
Я попробовал сделать вот так:
function Trig_Ab_Mimicr_Conditions takes nothing returns boolean
if ( not ( GetSpellAbilityId() == 'A000' ) ) then
return false
endif
return true
endfunction
function Trig_MimicrDie_Conditions takes copy returns boolean
if ( not ( IsUnitAliveBJ( copy ) == false ) ) then
return false
endif
return true
endfunction
function Trig_Ab_Mimicr_Actions takes nothing returns nothing
local unit mim = GetSpellAbilityUnit()
local unit copy
local location p = GetUnitLoc( mim )
local player vlad = GetOwningPlayer( mim )
call ShowUnitHide( mim )
call CreateNUnitsAtLoc( 1, GetUnitTypeId(GetSpellTargetUnit()), vlad, p, 1.35 )
call SetUnitOwner( mim, Player(12), true )
set copy = GetLastCreatedUnit()
endfunction
function Trig_MimicrDie_Actions takes nothing returns nothing
call RemoveUnit( copy )
call ShowUniShow( mim )
call SetUnitPositionLoc( mim, p )
call SetUnitOwner( mim, vlad, true )
endfunction
===========================================================================
function InitTrig_Ab_Mimicr takes nothing returns nothing
set gg_trg_Ab_Mimicr = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_Ab_Mimicr, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddCondition( gg_trg_Ab_Mimicr, Condition( function Trig_Ab_Mimicr_Conditions ) )
call TriggerAddAction( gg_trg_Ab_Mimicr, function Trig_Ab_Mimicr_Actions )
endfunction
И так:
function Trig_Ab_Mimicr_Conditions takes nothing returns boolean
if ( not ( GetSpellAbilityId() == 'A000' ) ) then
return false
endif
return true
endfunction
function Trig_Ab_Mimicr_Actions takes nothing returns nothing
local unit mim = GetSpellAbilityUnit()
local unit copy
local location p = GetUnitLoc( mim )
local player vlad = GetOwningPlayer( mim )
call ShowUnitHide( mim )
call CreateNUnitsAtLoc( 1, GetUnitTypeId(GetSpellTargetUnit()), vlad, p, 1.35 )
call SetUnitOwner( mim, Player(12), true )
set copy = GetLastCreatedUnit()
function Trig_MimicrDie_Conditions takes copy returns boolean
if ( not ( IsUnitAliveBJ( copy ) == false ) ) then
return false
endif
return true
endfunction
endfunction
function Trig_MimicrDie_Actions takes nothing returns nothing
call RemoveUnit( copy )
call ShowUniShow( mim )
call SetUnitPositionLoc( mim, p )
call SetUnitOwner( mim, vlad, true )
endfunction
//===========================================================================
function InitTrig_Ab_Mimicr takes nothing returns nothing
set gg_trg_Ab_Mimicr = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_Ab_Mimicr, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddCondition( gg_trg_Ab_Mimicr, Condition( function Trig_Ab_Mimicr_Conditions ) )
call TriggerAddAction( gg_trg_Ab_Mimicr, function Trig_Ab_Mimicr_Actions )
endfunction
И даже так:
function Trig_Ab_Mimicr_Conditions takes nothing returns boolean
if ( not ( GetSpellAbilityId() == 'A000' ) ) then
return false
endif
return true
endfunction
function Trig_Ab_Mimicr_Actions takes nothing returns nothing
local unit mim = GetSpellAbilityUnit()
local unit copy
local location p = GetUnitLoc( mim )
local player vlad = GetOwningPlayer( mim )
local trigger gg_trg_Ab_MimicrDie
call ShowUnitHide( mim )
call CreateNUnitsAtLoc( 1, GetUnitTypeId(GetSpellTargetUnit()), vlad, p, GetUnitFacing(mim) )
call SetUnitOwner( mim, Player(12), true )
set copy = GetLastCreatedUnit()
call TriggerRegisterAnyUnitEventBJ( gg_trg_Ab_MimicrDie, copy, EVENT_UNIT_DEATH )
call TriggerAddAction( gg_trg_Ab_MimicrDie, function Trig_Ab_MimicrDie_Actions )
endfunction
function Trig_MimicrDie_Actions takes nothing returns nothing
call RemoveUnit( copy )
call ShowUniShow( mim )
call SetUnitPositionLoc( mim, p )
call SetUnitOwner( mim, vlad, true )
endfunction
//===========================================================================
function InitTrig_Ab_Mimicr takes nothing returns nothing
set gg_trg_Ab_Mimicr = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_Ab_Mimicr, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddCondition( gg_trg_Ab_Mimicr, Condition( function Trig_Ab_Mimicr_Conditions ) )
call TriggerAddAction( gg_trg_Ab_Mimicr, function Trig_Ab_Mimicr_Actions )
endfunction
И всё равно код выдаёт две ошибки компиляции: "отсутствует оператор кода" и "returns nothing вернула непредвиденное значение".
Не прошу переписывать весь код за меня, просто дать совет по его улучшению. Позже сам исправлю утечки, добавлю спецэффекты и т.д.

1 пункт: 11. Несоблюдение правил оформления ресурсов.
`
ОЖИДАНИЕ РЕКЛАМЫ...
Этот комментарий удален
23
Похожие вопросы:

ответ
set day\night cycle On/Off в разделе Инициализация сражение или в Окружении
Хочется банить за такие вопросы в 2015 году.
ответ
Naadir, что значит сохраняется но не компилится?
можно скрины кода а также пути к карте, игре и редактору
ответ
Вот для примера сделал, с комментарием для каждой функции
что бы нужный герой мог копировать спелы, добавь его в группу.

38
1 пункт: 11. Несоблюдение правил оформления ресурсов.
Принятый ответ
25
Сложно читать эту кашу и понять где у тебя вызываются эти ошибки. Проще было бы в пустой карте потестить с твоим кодом, юнитами и тд.
А еще мне кажется, что вот тут что-то не так. Мб из-за копипасты случайно ты вставил.
Загруженные файлы
Ответы (8)
25
human1, ты скинул 3 разных решения в одном файле? Какое из них ты хочешь проверить на ошибки?)
25
human1, ну вот к примеру тут:
function Trig_MimicrDie_Conditions takes copy returns boolean
    if ( not ( IsUnitAliveBJ( copy ) == false ) ) then
        return false
    endif
    return true
endfunction
Ты не указал тип переменной copy, поэтому эта функция ломается. Должен же указать тип unit, верно?
25
human1, как уже написали ниже, ты объявил переменные в одной функции Trig_Ab_Mimicr_Actions, а пытаешься использовать в другой функции Trig_MimicrDie_Actions, где этих переменных не существует.
Если хочешь их там использовать - создавай глобальные переменные а не локальные.
25
human1, да и вообще, кто вызывает функцию Trig_MimicrDie_Actions? Она существует но никто ее не вызывает по твоему коду)
25
human1, либо ты не скинул функцию на подобии InitTrig_Ab_MimicrDie
Как я понял такая должна быть, ибо есть условия и действия, но нету триггера
25
human1, вот часть твоего кода, который слегка переработал и не выдает ошибок
trigger gg_trg_Ab_Mimicr = null

function Trig_Ab_Mimicr_Conditions takes nothing returns boolean
    return GetSpellAbilityId() == 'A000'
endfunction

function Trig_Ab_Mimicr_Actions takes nothing returns nothing
    local unit mim = GetSpellAbilityUnit()
    local unit copy
    local location p = GetUnitLoc( mim )
    local player vlad = GetOwningPlayer( mim )
    call ShowUnitHide( mim )
    call CreateNUnitsAtLoc( 1, GetUnitTypeId(GetSpellTargetUnit()), vlad, p, 1.35 )
    call SetUnitOwner( mim, Player(12), true )
    set copy = GetLastCreatedUnit()
endfunction

//===========================================================================
function InitTrig_Ab_Mimicr takes nothing returns nothing
    set gg_trg_Ab_Mimicr = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_Ab_Mimicr, EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddCondition( gg_trg_Ab_Mimicr, Condition( function Trig_Ab_Mimicr_Conditions ) )
    call TriggerAddAction( gg_trg_Ab_Mimicr, function Trig_Ab_Mimicr_Actions )
endfunction
Но я не вдумывался, что он делает, я лишь сделал так, чтобы он компилировался и немного оптимизировал.
25
А в джассе точно можно так делать? Дальше не читал.
Загруженные файлы
Чтобы оставить комментарий, пожалуйста, войдите на сайт.