Добавлен human1
В общем, я хотел написать 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
Поскольку это должно произойти мгновенно, то действие 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
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
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
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 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
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
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 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
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
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 вернула непредвиденное значение".
Не прошу переписывать весь код за меня, просто дать совет по его улучшению. Позже сам исправлю утечки, добавлю спецэффекты и т.д.
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. Несоблюдение правил оформления ресурсов.
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
А еще мне кажется, что вот тут что-то не так. Мб из-за копипасты случайно ты вставил.
Если хочешь их там использовать - создавай глобальные переменные а не локальные.
Как я понял такая должна быть, ибо есть условия и действия, но нету триггера