Here is the trigger used in DotA as of 6.04b(they started using some protector so I can't acess later versions). Sorry it is in Jass.
===========================================================================
// Trigger: Dopplewalk
//
// SPELLCASTER
//===========================================================================
function Trig_Dopplewalk_Conditions takes nothing returns boolean
if ( not ( GetSpellAbilityId() == 'A0D7' ) ) then
return false
endif
return true
endfunction
function Trig_Dopplewalk_Actions takes nothing returns nothing
set udg_DPWalker = GetTriggerUnit()
call CreateNUnitsAtLocFacingLocBJ( 1, 'e00E', GetOwningPlayer(GetTriggerUnit()), GetUnitLoc(GetTriggerUnit()), GetUnitLoc(GetTriggerUnit()) )
call UnitAddItemByIdSwapped( 'I010', GetLastCreatedUnit() )
call UnitUseItemTarget( GetLastCreatedUnit(), GetLastCreatedItem(), GetTriggerUnit() )
endfunction
//===========================================================================
function InitTrig_Dopplewalk takes nothing returns nothing
set gg_trg_Dopplewalk = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_Dopplewalk, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddCondition( gg_trg_Dopplewalk, Condition( function Trig_Dopplewalk_Conditions ) )
call TriggerAddAction( gg_trg_Dopplewalk, function Trig_Dopplewalk_Actions )
endfunction
//===========================================================================
// Trigger: Dopplewalk Move
//===========================================================================
function Trig_Dopplewalk_Move_Conditions takes nothing returns boolean
if ( not ( UnitHasBuffBJ(GetTriggerUnit(), 'B03A') == true ) ) then
return false
endif
return true
endfunction
function Trig_Dopplewalk_Move_Actions takes nothing returns nothing
call SetUnitPositionLoc( GetTriggerUnit(), GetUnitLoc(udg_DPWalker) )
endfunction
//===========================================================================
function InitTrig_Dopplewalk_Move takes nothing returns nothing
set gg_trg_Dopplewalk_Move = CreateTrigger( )
call TriggerRegisterEnterRectSimple( gg_trg_Dopplewalk_Move, GetPlayableMapRect() )
call TriggerAddCondition( gg_trg_Dopplewalk_Move, Condition( function Trig_Dopplewalk_Move_Conditions ) )
call TriggerAddAction( gg_trg_Dopplewalk_Move, function Trig_Dopplewalk_Move_Actions )
endfunction
//===========================================================================