Можно ли как-то нацепить на декорации спецэффекты? Заметил, что этого нельзя сделать. Вернее, по предположениям комментаторов, можно, но у модели должны быть точки-аттачи как у юнитов. А у декора и итемов таких нет. Решил пока создать их отдельно в точке, после каких то действии этот эффект должен исчезнуть.
с декором юниту ничего нельзя сделать, как уничтожить. 80-90% его уничтожают. Могу отследить отмену или переотдачу приказов, не могу отследить мгновенное уничтожение декорации. таймером чекаю хп декора (меньше или равно ноль хп - декор мертв), после чего должен спецэффект удалится. удаление не происходит совсем или происходит не сразу.

Я делаю проще просто через
call BlzSetSpecialEffectScale( effect, 0.0 )
call DestroyEffect(effect)
`
ОЖИДАНИЕ РЕКЛАМЫ...
23
Декорация разрушаемый объект? Есть событие на его смерть. При создании сохраняй эффект в хэш для каждой декорации.
27
Obelick, так не работает. Удаляет не сразу, есть микро-задержка. но дебаг срабатывает, почему же спецэффект не удаляется то?
пример
TriggerRegisterDeathEvent(DeleteEffects, d)
QueueOrders.EffectObjects[GetHandleId(d)]= QueueOrders.EffectWayPoint[h][NumberOrder]
           
 local DeleteEffects = CreateTrigger()
TriggerAddAction(DeleteEffects,function()
                print("декорация мертва")
                local h = GetHandleId(GetTriggerWidget())
                DestroyEffect(QueueOrders.EffectObjects[h])
end)
здесь система с очередью приказов. При зажатии на SHIFT вы можете записать триггерами приказы/цели и пр.
полный код


do
    local InitGlobalsOrigin = InitGlobals -- хукаем функцию InitGlobals

	function InitGlobals()
		InitGlobalsOrigin()
        --работа с фреймами
            function LoadToc(s)
                if BlzLoadTOCFile(s) then
                    print("Loaded: "..s)
                else
                
                    print("Failed to Load: "..s)
                end   
            end
            function ShowInterfaceE()
                LoadToc("templates.toc")
                
                --перед созданием юнита отключаем триггер на отлов приказа, тк при создании юнит получает приказ stop. при получении приказа триггер добавляет в структуру
                DisableTrigger(detectedtrigger1)
                trigger1_enabled = false
                local unit = CreateUnit(Player(0), FourCC("hfoo"), 0, 0, 0)
                EnableTrigger(detectedtrigger1)
                trigger1_enabled = true
                
                SelectUnitSingle(unit)
                TimerStart(CreateTimer(), 0.3, false, function() 
                
                    --создаем консольные текстуры (по сути переделанная в fdf-file ConsoleUI - убраны бока)
                    local framehandle Console = BlzCreateFrameByType("SIMPLEFRAME","MyConsole",BlzGetOriginFrame(ORIGIN_FRAME_GAME_UI, 0),"MyConsole",0)
                    --показать ConsoleUIBackdrop (при инициализации почему-то не показывается, только во время игры) w=0.8 h=0.13
                    BlzFrameClearAllPoints(BlzGetFrameByName("ConsoleUIBackdrop",0))
                    BlzFrameSetAbsPoint(BlzGetFrameByName("ConsoleUIBackdrop",0), FRAMEPOINT_BOTTOMLEFT, 0.0, 0.0)
                    --снова возвращаем Portrait на место w=0.06 h=0.08
                    BlzFrameSetVisible(BlzGetOriginFrame(ORIGIN_FRAME_PORTRAIT,0), true)
                    --BlzFrameClearAllPoints(BlzGetOriginFrame(ORIGIN_FRAME_PORTRAIT,0))
                    --BlzFrameSetAbsPoint(BlzGetOriginFrame(ORIGIN_FRAME_PORTRAIT,0), FRAMEPOINT_BOTTOMLEFT, 0.26, 0.03)
                    --показать Portrait HP/MANA (показываются тексты, когда выделен юнит) text w=0.06 h=0,016
                    local hpFrame = BlzGetOriginFrame(ORIGIN_FRAME_PORTRAIT_HP_TEXT, 0)
                    BlzFrameClearAllPoints(hpFrame)
                    BlzFrameSetAbsPoint(hpFrame, FRAMEPOINT_CENTER, 0.253, 0.024)
                    local mpFrame = BlzGetOriginFrame(ORIGIN_FRAME_PORTRAIT_MANA_TEXT, 0)
                    BlzFrameClearAllPoints(mpFrame)
                    BlzFrameSetAbsPoint(mpFrame, FRAMEPOINT_CENTER, 0.253, 0.008)
                    --центральная информационная панель
                    local BottomCenterUI = BlzFrameGetChild(BlzGetFrameByName("ConsoleUI",0),1)
                    --BlzFrameSetVisible(BottomCenterUI, true)
                    BlzFrameClearAllPoints(BottomCenterUI)
                    BlzFrameSetAbsPoint(BottomCenterUI, FRAMEPOINT_CENTER, 0.4025,0.0583)
                    --контейнер кнопки неактивного рабочего W=0.039 h=0.039 (Idle worker Button Container)
                    BlzFrameSetVisible(BlzFrameGetChild(BlzGetFrameByName("ConsoleUI",0),7), true)
                    BlzFrameClearAllPoints(BlzFrameGetChild(BlzGetFrameByName("ConsoleUI",0),7))
                    BlzFrameSetAbsPoint(BlzFrameGetChild(BlzGetFrameByName("ConsoleUI",0),7), FRAMEPOINT_BOTTOMLEFT, 0.0, 0.17)
                    --мини-карта w=0.139375 h=0.138125
                    BlzFrameClearAllPoints(BlzGetFrameByName("MiniMapFrame",0))
                    BlzFrameSetAbsPoint(BlzGetFrameByName("MiniMapFrame",0), FRAMEPOINT_BOTTOMLEFT, 0.009375, 0.006875)
                    --мини-кнопки w=0.023125 h=0.020625*5
                    BlzFrameClearAllPoints(BlzGetFrameByName("MinimapSignalButton",0))
                    BlzFrameSetAbsPoint(BlzGetFrameByName("MinimapSignalButton",0), FRAMEPOINT_TOPLEFT, 0.154375, 0.14375)
                    BlzFrameClearAllPoints(BlzGetFrameByName("MiniMapTerrainButton",0))
                    BlzFrameSetAbsPoint(BlzGetFrameByName("MiniMapTerrainButton",0), FRAMEPOINT_TOPLEFT, 0.154375, 0.121875)
                    BlzFrameClearAllPoints(BlzGetFrameByName("MiniMapAllyButton",0))
                    BlzFrameSetAbsPoint(BlzGetFrameByName("MiniMapAllyButton",0), FRAMEPOINT_TOPLEFT, 0.154375, 0.1)
                    BlzFrameClearAllPoints(BlzGetFrameByName("MiniMapCreepButton",0))
                    BlzFrameSetAbsPoint(BlzGetFrameByName("MiniMapCreepButton",0), FRAMEPOINT_TOPLEFT, 0.154375, 0.0775)
                    BlzFrameClearAllPoints(BlzGetFrameByName("FormationButton",0))
                    BlzFrameSetAbsPoint(BlzGetFrameByName("FormationButton",0), FRAMEPOINT_TOPLEFT, 0.154375, 0.05)   
                    --коммандная панель w=0.1745 h=0.129 
                    BlzFrameClearAllPoints(BlzGetFrameByName("CommandBarFrame",0))
                    BlzFrameSetAbsPoint(BlzGetFrameByName("CommandBarFrame",0), FRAMEPOINT_CENTER, 0.7+0.0048, 0.146/2-0.0045) 
                    --панель SimpleInventoryCover w = 0.128 h = 0.175
                    local InventoryCover = BlzFrameGetChild(BottomCenterUI,7)
                    --BlzFrameSetVisible(InventoryCover, true)
                    BlzFrameClearAllPoints(InventoryCover)
                    BlzFrameSetAbsPoint(InventoryCover, FRAMEPOINT_BOTTOMRIGHT, 0.6, 0.0)
                    
                    GroupRemoveUnit(QueueOrders.Group,unit)
                    RemoveUnit(unit)
                    print("done")
                    DestroyTimer(GetExpiredTimer())
                end)
                
            end
        
        --библиотека скалирования экранных координат от разрешения монитора
            function PXTODPI()
                return 0.6 / BlzGetLocalClientHeight()
            end

            function DPITOPX()
                return BlzGetLocalClientHeight() / 0.6
            end

            function FrameBoundWidth()
                return (BlzGetLocalClientWidth()-BlzGetLocalClientHeight()/600*800)/2
            end

            --тут ставим разрешение экрана типа 1920x1080, то в GetScreenPosX(1920)
            function GetScreenPosX(x)
                return (-FrameBoundWidth()+x)*PXTODPI()
            end

            function GetScreenPosY(y)
                return y*PXTODPI()
            end

            --0.4 ->  0.3
            function ScreenRelativeX(x)
                return (x * DPITOPX()) * (0.8/BlzGetLocalClientWidth())
            end
            function ScreenRelativeX2(x)
                return GetScreenPosX((((x^2)^0.5)/1.088)*BlzGetLocalClientWidth())
            end
        --инициируем игру
            --прячем консоль (консольные текстуры вместе с потомками перемещены за пределы экрана, и мы их не видим)
            BlzFrameSetAbsPoint(BlzGetFrameByName("ConsoleUI", 0), FRAMEPOINT_BOTTOM, 0.4, -0.18)
            --Portrait не прячется, но в начале прячем. Тк не красиво будет, тк задержка появления нижней консоли. задержка создана из-за дурацких текстов под портретом
            BlzFrameSetVisible(BlzGetOriginFrame(ORIGIN_FRAME_PORTRAIT,0), false)
            --BlzFrameClearAllPoints(BlzGetOriginFrame(ORIGIN_FRAME_PORTRAIT,0))
            --BlzFrameSetAbsPoint(BlzGetOriginFrame(ORIGIN_FRAME_PORTRAIT,0), FRAMEPOINT_BOTTOM, 0.4, -0.18)
            --прячем неактивную кнопку рабочего
            BlzFrameSetVisible(BlzFrameGetChild(BlzGetFrameByName("ConsoleUI",0),7), false)
            --отображаем нужные элементы
            ShowInterfaceE()
            --скрываем мертвую рамку коммандной панели
            BlzFrameSetScale(BlzFrameGetChild(BlzGetFrameByName("ConsoleUI",0),5), 0.001)
        --чекаем отпускание Shift
            --https://www.hiveworkshop.com/threads/oskey-player-key-event.319903/
            local ShiftOn = 0
            TimerStart(CreateTimer(),0,false, function()
                print("Create Keys")
                for index = 8,255 do
                    local trigger = CreateTrigger()
                            
                    TriggerAddAction(trigger, function()
                        if index == 160 and ShiftOn ~= BlzGetTriggerPlayerMetaKey() then
                            if BlzGetTriggerPlayerMetaKey() == 1 then
                                ShiftOn = 1
                                print("Shift нажат")
                            elseif BlzGetTriggerPlayerMetaKey() == 0 then
                                ShiftOn = 0
                                print("Shift отпущен")
                            end
                            --if GetLocalPlayer() ~= nil then
                            --    ShiftOn = BlzGetTriggerPlayerMetaKey()
                            --end
                        end
                                
                        --print("OsKey:",index, "meta",BlzGetTriggerPlayerMetaKey())
                    end)
                    local key = ConvertOsKeyType(index)
                        for metaKey = 0,15,1 do
                            BlzTriggerRegisterPlayerKeyEvent(trigger, Player(0), key, metaKey, true)
                            BlzTriggerRegisterPlayerKeyEvent(trigger, Player(0), key, metaKey, false)
                        end

                end
                        
                print("Done")
                print("Press Keys to show the index of that oskey and its metakey")
            end)

        --чекаем принадлежность курсора в игровом поле
            local cursorInGame = true
            TimerStart(CreateTimer(),0.0, false,function()
                local parent = BlzGetFrameByName("ConsoleUIBackdrop", 0)  
                local gameUI = BlzGetOriginFrame(ORIGIN_FRAME_GAME_UI, 0)
                DestroyTimer(GetExpiredTimer())
                local Screen = BlzCreateFrameByType("FRAME", "FaceFrame", parent, "", 0)
                --левая центральная
                local ScreenFrame1 = BlzCreateFrameByType("GLUETEXTBUTTON", "MyButton", Screen, "ScriptDialogButton", 0)
                BlzFrameSetAlpha(ScreenFrame1, 50)
                BlzFrameSetAbsPoint(ScreenFrame1, FRAMEPOINT_CENTER, 0.1,0.154+((0.416)/2))
                BlzFrameSetSize(ScreenFrame1, 0.2, 0.416)
                --центральная
                local ScreenFrame2 = BlzCreateFrameByType("GLUETEXTBUTTON", "MyButton", Screen, "ScriptDialogButton", 0)
                BlzFrameSetAlpha(ScreenFrame2, 50)
                BlzFrameSetAbsPoint(ScreenFrame2, FRAMEPOINT_CENTER, 0.4,0.128+((0.442)/2))
                BlzFrameSetSize(ScreenFrame2, 0.4, 0.442)
                --правая центральная
                local ScreenFrame3 = BlzCreateFrameByType("GLUETEXTBUTTON", "MyButton", Screen, "ScriptDialogButton", 0)
                BlzFrameSetAlpha(ScreenFrame3, 50)
                BlzFrameSetAbsPoint(ScreenFrame3, FRAMEPOINT_CENTER, 0.7,0.154+((0.416)/2))
                BlzFrameSetSize(ScreenFrame3, 0.2, 0.416)
                --левая боковая
                local ScreenFrame4 = BlzCreateFrameByType("GLUETEXTBUTTON", "MyButton", Screen, "ScriptDialogButton", 0)
                BlzFrameSetAlpha(ScreenFrame4, 50)
                BlzFrameSetAbsPoint(ScreenFrame4, FRAMEPOINT_CENTER, -0.144/2,(0.164+0.410)/2)
                BlzFrameSetSize(ScreenFrame4, 0.144, 0.164+0.410)
                --правая боковая
                local ScreenFrame5 = BlzCreateFrameByType("GLUETEXTBUTTON", "MyButton", Screen, "ScriptDialogButton", 0)
                BlzFrameSetAlpha(ScreenFrame5, 50)
                BlzFrameSetAbsPoint(ScreenFrame5, FRAMEPOINT_CENTER, 0.8+0.144/2,(0.164+0.410)/2)
                BlzFrameSetSize(ScreenFrame5, 0.144, 0.164+0.410)

                        
                local Sreentools = BlzCreateFrameByType("FRAME", "FaceFrame", parent, "", 0)
                BlzFrameSetAlpha(Sreentools, 0)
                BlzFrameSetAbsPoint(Sreentools, FRAMEPOINT_BOTTOMLEFT, 0, 0)
                BlzFrameSetSize(Sreentools, 0, 0)
                BlzFrameSetTooltip(ScreenFrame1, Sreentools)
                BlzFrameSetTooltip(ScreenFrame2, Sreentools)
                BlzFrameSetTooltip(ScreenFrame3, Sreentools)
                BlzFrameSetTooltip(ScreenFrame4, Sreentools)
                BlzFrameSetTooltip(ScreenFrame5, Sreentools)
                
                local InterfaceField = BlzCreateFrameByType("FRAME", "FaceFrame", gameUI, "", 0)
            
                --левая нижняя панель
                local Interface1 = BlzCreateFrameByType("GLUETEXTBUTTON", "MyButton", InterfaceField, "ScriptDialogButton", 0)
                BlzFrameSetAlpha(Interface1, 50)
                BlzFrameSetAbsPoint(Interface1, FRAMEPOINT_CENTER, 0.1, 0.144/2)
                BlzFrameSetSize(Interface1, 0.2, 0.154) --0.176
                --центральная панель
                local Interface2 = BlzCreateFrameByType("GLUETEXTBUTTON", "MyButton", InterfaceField, "ScriptDialogButton", 0)
                BlzFrameSetAlpha(Interface2, 50)
                BlzFrameSetAbsPoint(Interface2, FRAMEPOINT_CENTER, 0.4, 0.118/2)
                BlzFrameSetSize(Interface2, 0.4, 0.128) --0.15
                --правая нижняя панель
                local Interface3 = BlzCreateFrameByType("GLUETEXTBUTTON", "MyButton", InterfaceField, "ScriptDialogButton", 0)
                BlzFrameSetAlpha(Interface3, 50)
                BlzFrameSetAbsPoint(Interface3, FRAMEPOINT_CENTER, 0.7, 0.146/2)
                BlzFrameSetSize(Interface3, 0.2, 0.154) --0.176
                --верхняя панель
                local Interface4 = BlzCreateFrameByType("GLUETEXTBUTTON", "MyButton", parent, "ScriptDialogButton", 0)
                BlzFrameSetAlpha(Interface4, 50)
                BlzFrameSetAbsPoint(Interface4, FRAMEPOINT_CENTER, 0.4, 0.6-(0.026/2))
                BlzFrameSetSize(Interface4, 1.088, 0.026) --0.176
                
                local Interfacetools = BlzCreateFrameByType("FRAME", "FaceFrame", parent, "", 0)
                BlzFrameSetAlpha(Interfacetools, 0)
                BlzFrameSetAbsPoint(Interfacetools, FRAMEPOINT_BOTTOMLEFT, 0, 0)
                BlzFrameSetSize(Interfacetools, 0, 0)
                BlzFrameSetTooltip(Interface1, Interfacetools)
                BlzFrameSetTooltip(Interface2, Interfacetools)
                BlzFrameSetTooltip(Interface3, Interfacetools)
                BlzFrameSetTooltip(Interface4, Interfacetools)
                
                TimerStart(CreateTimer(),1/64, true,function()
                    
                    if BlzFrameIsVisible(Sreentools) then
                        --print("курсор в игровом поле")
                        BlzFrameSetVisible(ScreenFrame1,false)
                        BlzFrameSetVisible(ScreenFrame2,false)
                        BlzFrameSetVisible(ScreenFrame3,false)
                        BlzFrameSetVisible(ScreenFrame4,false)
                        BlzFrameSetVisible(ScreenFrame5,false)
                        BlzFrameSetVisible(InterfaceField,true)
                        if GetLocalPlayer() ~= nil then
                            cursorInGame = true
                        end
                    elseif BlzFrameIsVisible(Interfacetools) or BlzFrameIsVisible(BlzGetOriginFrame(ORIGIN_FRAME_UBERTOOLTIP,0)) then
                        --print("курсор в поле интерфейса")
                        BlzFrameSetVisible(ScreenFrame1,true)
                        BlzFrameSetVisible(ScreenFrame2,true)
                        BlzFrameSetVisible(ScreenFrame3,true)
                        BlzFrameSetVisible(ScreenFrame4,true)
                        BlzFrameSetVisible(ScreenFrame5,true)
                        BlzFrameSetVisible(InterfaceField,false)
                        if GetLocalPlayer()~=nil then
                            cursorInGame = false
                        end                    
                    end
                
                end) 

            end)
    
                
    --функции поиска юнита интерфейса
    
         -- returns the local current main selected unit, using it in a sync gamestate relevant manner breaks the game.
         function GetMainSelectedUnitEx()
            return GetMainSelectedUnit(GetSelectedUnitIndex())
         end
   

        local containerFrame
        local frames = {}
        local group
        local units = {}
        local filterGS = Filter(function()
            local unit = GetFilterUnit()
            local prio = BlzGetUnitRealField(unit, UNIT_RF_PRIORITY)
            local found = false
            -- compare the current unit with allready found, to place it in the right slot
            for index, value in ipairs(units) do
                -- higher prio than this take it's slot
                if BlzGetUnitRealField(value, UNIT_RF_PRIORITY) < prio then
                    table.insert(units, index, unit)
                    found = true
                    break
                    -- equal prio and better colisions Value
                elseif BlzGetUnitRealField(value, UNIT_RF_PRIORITY) == prio and GetUnitOrderValue(value) > GetUnitOrderValue(unit) then
                    table.insert( units, index, unit)
                    found = true
                    break
                end
            end
            -- not found add it at the end
            if not found then
                table.insert(units, unit)
            end
            unit = nil
            return false
        end)

   
        function GetSelectedUnitIndex()
            -- local player is in group selection?
            if BlzFrameIsVisible(containerFrame) then
                -- find the first visible yellow Background Frame
                for int = 0, #frames do
                    if BlzFrameIsVisible(frames[int]) then
                        return int
                    end           
                end
            end

            return nil
        end

        function GetUnitOrderValue(unit)
            --heroes use the handleId
            if IsUnitType(unit, UNIT_TYPE_HERO) then
                return GetHandleId(unit)
            else
                --units use unitCode
                return GetUnitTypeId(unit)
            end
        end


        function GetMainSelectedUnit(index)
            if index then
                GroupEnumUnitsSelected(group, GetLocalPlayer(), filterGS)
                local unit = units[index + 1]
                --clear table
                repeat until not table.remove(units)
                return unit
            else
                GroupEnumUnitsSelected(group, GetLocalPlayer(), nil)
                return FirstOfGroup(group)
            end
        end

        --init
        local console = BlzGetFrameByName("ConsoleUI", 0)
        local bottomUI = BlzFrameGetChild(console, 1)
        local groupframe = BlzFrameGetChild(bottomUI, 5)
        local LastMainSelectedUnit 
        local NewMainSelectedUnit
        --globals
        containerFrame = BlzFrameGetChild(groupframe, 0)
        group = CreateGroup()
        -- give this frames a handleId
        for int = 0, BlzFrameGetChildrenCount(containerFrame) - 1 do
            local buttonContainer = BlzFrameGetChild(containerFrame, int)
            frames[int] = BlzFrameGetChild(buttonContainer, 0)
        end

        --demo
        TimerStart(CreateTimer(), 0.0299, true, function()
            NewMainSelectedUnit = GetMainSelectedUnit(GetSelectedUnitIndex())
            if not (NewMainSelectedUnit==LastMainSelectedUnit) then
                --Build_Button()
                LastMainSelectedUnit = NewMainSelectedUnit
                print(GetUnitName(NewMainSelectedUnit))
            end
        end)


  local getTerrainZ = function(x,y)
    MoveLocation(zTesterLocation, x, y)
    return GetLocationZ(zTesterLocation)
  end
  
  local _GetUnitZ = function(u)
    return GetUnitFlyHeight(u) + getTerrainZ(GetUnitX(u), GetUnitY(u))
  end

  local _SetUnitZ = function(u, z)
    SetUnitFlyHeight(u, z - getTerrainZ(GetUnitX(u), GetUnitY(u)), 0)
  end
  
  local _GetItemZ = function(i)
    return getTerrainZ(GetItemX(u), GetItemY(u))
  end
  
  function GetDestructableZ(d)
    return getTerrainZ(GetDestructableX(d), GetDestructableY(d))
  end    
            
        --нажимание кнопки мыши во время Shift
            
    
			local clicking_the_mouse_button = 0
            local trigger1_enabled = true
            
            local trigger = CreateTrigger()
            TriggerRegisterPlayerMouseEventBJ( trigger, Player(0), bj_MOUSEEVENTTYPE_DOWN )
            local b = Condition(function()
                return( BlzGetTriggerPlayerMouseButton() == MOUSE_BUTTON_TYPE_RIGHT )and(ShiftOn==1)and cursorInGame --and GetUnitCurrentOrder(Paladin)>0
            end)
            TriggerAddCondition(trigger, b)
            TriggerAddAction( trigger, function ()
                clicking_the_mouse_button = 1
                print("нажатие ПКМ")
                
				trigger1_enabled = false
                --DisableTrigger(detectedtrigger1)
                --PauseUnit( LastMainSelectedUnit, true )
                --BlzPauseUnitEx( LastMainSelectedUnit, true )
                --SetUnitPosition(LastMainSelectedUnit,GetUnitX(LastMainSelectedUnit),GetUnitY(LastMainSelectedUnit))
                
                IssueImmediateOrderById( LastMainSelectedUnit, 851972 ) --stop 851972
                
                --BlzPauseUnitEx( LastMainSelectedUnit, false )
                --PauseUnit( LastMainSelectedUnit, false )
                --EnableTrigger(detectedtrigger1)
				trigger1_enabled = true
                
            end)
            
        function DeleteUnit(u)
            if u ~= nil then
                RemoveUnit(u)
            end
        end

        --отслеживаем приказы
            
        --база данных
            local QueueOrders = {}
            QueueOrders.Group = CreateGroup() --группа
            QueueOrders.CurrentNumberOrder = {} --текущий номер приказа
            QueueOrders.CountOrders = {} --кол-во приказов
			QueueOrders.EffectWayPoint = {}
            QueueOrders.UnitWayPoint = {}
            
            QueueOrders.EffectObjects = {}
            
			--QueueOrders.UnitY = {}
            --двумерные таблицы [handle][number of order]
              --тип приказа: без цели, таргет-объект или таргет-объект (чтобы знать какие нативки использовать)
                QueueOrders.TypeOrder = {} 
                QueueOrders.TypeTarget = {} 
              --либо таргет-объект
                QueueOrders.TargetOrderObject = {}
              --или таргет-точка
                QueueOrders.TargetPointOrderX = {}
                QueueOrders.TargetPointOrderY = {}
              --тип объекта (по id можно получить название типа с GetObjectName)
                QueueOrders.TargetOrderTypeObject = {}
              --id приказ
                QueueOrders.Order = {} 

			--GroupAddUnit(QueueOrders.Group,Paladin)

            
            local DeleteEffects = CreateTrigger()
            TriggerAddAction(DeleteEffects,function()
                print("декорация мертва")
                local h = GetHandleId(GetTriggerWidget())
                DestroyEffect(QueueOrders.EffectObjects[h])
            end)
            
            
            --QueueOrders.UnitWayPoint[h][NumberOrder] =CrateUnitWayPoint(GetTriggerPlayer())
            function CrateUnitWayPoint(p)
                local u = nil
                if GetPlayerRace(p) == RACE_HUMAN then
                    u = CreateUnit(p,FourCC('h000'),GetOrderPointX(),GetOrderPointY(),0)
                elseif GetPlayerRace(p) == RACE_ORC then
                    u = CreateUnit(p,FourCC('o000'),GetOrderPointX(),GetOrderPointY(),0)
                elseif GetPlayerRace(p) == RACE_NIGHTELF then
                    u = CreateUnit(p,FourCC('n000'),GetOrderPointX(),GetOrderPointY(),0)
                elseif GetPlayerRace(p) == RACE_UNDEAD then    
                    u = CreateUnit(p,FourCC('u000'),GetOrderPointX(),GetOrderPointY(),0)
                end
                if not GetLocalPlayer()==p then
                   ShowUnit(u, false)
                end
                --TimerStart(CreateTimer(),0.00,false,function()
                --    UnitAddAbility(u,FourCC('Aloc'))
                --    --UnitRemoveAbility(u,FourCC('Aloc'))
                --end)
                --BlzSetUnitBooleanFieldBJ( u, UNIT_BF_SELECTION_CIRCLE_ON_WATER, false )
                
                return u
            end
            
            --local effect = CrateEffectWayPoint(GetTriggerPlayer())
            function CrateEffectWayPoint(p)
               if GetLocalPlayer()==p then                            
                  if GetPlayerRace(p) == RACE_HUMAN then
                     return "UI\\Feedback\\WaypointFlags\\WaypointFlag.mdl"
                  elseif GetPlayerRace(p) == RACE_ORC then
                     return "UI\\Feedback\\WaypointFlags\\OrcWaypointFlag.mdl"
                  elseif GetPlayerRace(p) == RACE_NIGHTELF then
                     return "UI\\Feedback\\WaypointFlags\\NightElfWaypointFlag.mdl"
                  elseif GetPlayerRace(p) == RACE_UNDEAD then    
                     return "UI\\Feedback\\WaypointFlags\\UndeadWaypointFlag.mdl"
                  end
               end
            end
            
            
            function DestroyWayPointFlags(max)
                --удаляем спецэффекты пред приказов, если они были
                for a = 1,max do
                    if QueueOrders.TypeOrder[h][a]==1 then
                        DeleteUnit(QueueOrders.UnitWayPoint[h][a])
                    elseif QueueOrders.TypeOrder[h][a]==2 or QueueOrders.TypeOrder[h][a]==3 then
                        DeleteUnit(QueueOrders.UnitWayPoint[h][a])
                    end
                end
            end
            
            
            

            TimerStart(CreateTimer(),0.03,true,function()
                local count = BlzGroupGetSize(QueueOrders.Group)
                
				if count > 0 then
					--for i = -1, count do
					for i=count-1,0,-1 do
						local u = BlzGroupUnitAt(QueueOrders.Group, i)
                        local h = GetHandleId(u)
                        
                        local current_target = QueueOrders.TargetOrderObject[h][1]
                        local type_order = QueueOrders.TypeOrder[h][1]
                        local type_target = QueueOrders.TypeTarget[h][1]
                        
						print(i..") "..GetUnitName(u)..", кол-во приказов: "..QueueOrders.CountOrders[GetHandleId(u)])
						if GetUnitCurrentOrder(u) == 0 then --or (GetWidgetLife(current_target) <= 0 and type_order==1) then -- or GetUnitCurrentOrder(u) == 851972 then
							
                            if QueueOrders.CountOrders[h] <= 1 then
                                local type_order = QueueOrders.TypeOrder[h][1]
                                local type_target = QueueOrders.TypeTarget[h][1]
                                if type_target == 1 then
                                    DestroyEffect(QueueOrders.EffectWayPoint[h][1])
                                elseif type_target == 2 then
                                    DeleteUnit(QueueOrders.UnitWayPoint[h][1])
                                end
                                
                                --обнуляем текущий приказ
								QueueOrders.CurrentNumberOrder[h]=0
								--обнуляем счетчик приказов
								QueueOrders.CountOrders[h]=0
                                
							elseif QueueOrders.CountOrders[h] > 1 then
								--QueueOrders.CurrentNumberOrder[h]=1
								

                                local type_order = QueueOrders.TypeOrder[h][1]
                                local type_target = QueueOrders.TypeTarget[h][1]
                                if type_target == 1 then
                                    DestroyEffect(QueueOrders.EffectWayPoint[h][1])
                                elseif type_target == 2 then
                                    DeleteUnit(QueueOrders.UnitWayPoint[h][1])
                                end
                                
								for a = 1,QueueOrders.CountOrders[h] do
									QueueOrders.TargetOrderObject[h][a] = QueueOrders.TargetOrderObject[h][a+1]
									QueueOrders.TargetPointOrderX[h][a] = QueueOrders.TargetPointOrderX[h][a+1]
									QueueOrders.TargetPointOrderY[h][a] = QueueOrders.TargetPointOrderY[h][a+1]
									QueueOrders.TargetOrderTypeObject[h][a] = QueueOrders.TargetOrderTypeObject[h][a+1]
									QueueOrders.Order[h][a]=QueueOrders.Order[h][a+1]
									QueueOrders.TypeOrder[h][a]=QueueOrders.TypeOrder[h][a+1]
                                    QueueOrders.TypeTarget[h][a]=QueueOrders.TypeTarget[h][a+1]
                                    QueueOrders.EffectWayPoint[h][a]=QueueOrders.EffectWayPoint[h][a+1]
                                    QueueOrders.UnitWayPoint[h][a]=QueueOrders.UnitWayPoint[h][a+1]
								end 
								QueueOrders.CountOrders[h]=QueueOrders.CountOrders[h]-1
								--QueueOrders.CurrentNumberOrder[h]=1
								
								
								local CurrentOrder = 1
								local type_order = QueueOrders.TypeOrder[h][CurrentOrder]
								local id_order = QueueOrders.Order[h][CurrentOrder]
								local id_object = QueueOrders.TargetOrderTypeObject[h][CurrentOrder]
														
								if type_order == 1 then
									local target = QueueOrders.TargetOrderObject[h][CurrentOrder]
									DisableTrigger(detectedtrigger1)
                                    trigger1_enabled = false
									IssueTargetOrderById(u,id_order, target)
                                    --DestroyEffect(QueueOrders.EffectWayPoint[h][CurrentOrder])
                                    trigger1_enabled = true
									EnableTrigger(detectedtrigger1)
									print("|cffa6373a"..GetUnitName(u).." перенаправляет "..type_order.."-приказ "..OrderId2String(id_order).." в цель "..id_object.."|r")
								elseif type_order == 2 then
									local x = QueueOrders.TargetPointOrderX[h][CurrentOrder]
									local y = QueueOrders.TargetPointOrderY[h][CurrentOrder]
								
									DisableTrigger(detectedtrigger1)
                                    trigger1_enabled = false
									IssuePointOrderById(u,id_order, x,y)
                                    --DeleteUnit(QueueOrders.UnitWayPoint[h][CurrentOrder])
                                    trigger1_enabled = true
									EnableTrigger(detectedtrigger1)
									print("|cffa6373a"..GetUnitName(u).." перенаправляет "..type_order.."-приказ "..OrderId2String(id_order).." в точку "..x..","..y.."|r")
								elseif type_order == 3 then
									local x = QueueOrders.TargetPointOrderX[h][CurrentOrder]
									local y = QueueOrders.TargetPointOrderY[h][CurrentOrder]
									DisableTrigger(detectedtrigger1)
                                    trigger1_enabled = false
									IssueBuildOrderById(u,id_order, x,y)
                                    --DeleteUnit(QueueOrders.UnitWayPoint[h][CurrentOrder])
                                    trigger1_enabled = true
									EnableTrigger(detectedtrigger1)
									print("|cffa6373a"..GetUnitName(u).." перенаправляет "..type_order.."-приказ "..OrderId2StringBJ(id_order).." строить в точке "..x..","..y.."|r")
								elseif type_order == 4 then
									DisableTrigger(detectedtrigger1)
                                    trigger1_enabled = false
									IssueImmediateOrderById(u,id_order)
                                    trigger1_enabled = true
									EnableTrigger(detectedtrigger1)
									print("|cffa6373a"..GetUnitName(u).." перенаправляет "..type_order.."-приказ "..OrderId2StringBJ(id_order).."|r")
								end
							end
						end
					end
				end
            end)



            --получаем текущий приказ
                local detectedtrigger1 = CreateTrigger()
                TriggerRegisterPlayerUnitEventSimple( detectedtrigger1, Player(0), EVENT_PLAYER_UNIT_ISSUED_TARGET_ORDER )
                TriggerRegisterPlayerUnitEventSimple( detectedtrigger1, Player(0), EVENT_PLAYER_UNIT_ISSUED_POINT_ORDER )
                TriggerRegisterPlayerUnitEventSimple( detectedtrigger1, Player(0), EVENT_PLAYER_UNIT_ISSUED_ORDER )
                local gb1 = Condition(function()
                    return trigger1_enabled --and (clicking_the_mouse_button==0)
                end)
                TriggerAddCondition(detectedtrigger1, gb1)
                TriggerAddAction(detectedtrigger1, function()
                    
                    local h = GetHandleId(GetTriggerUnit())
                    local id
                    --инициируем таблицы для юнита
                    if not IsUnitInGroup(GetTriggerUnit(),QueueOrders.Group)then--QueueOrders.Order[h] == nil then
                        QueueOrders.Order[h]={}
                        QueueOrders.TargetOrderObject[h]={}
						QueueOrders.TargetOrderTypeObject[h] = {}
                        QueueOrders.TypeTarget[h] = {} 
						QueueOrders.TargetPointOrderX[h] = {}
						QueueOrders.TargetPointOrderY[h] = {}
                        QueueOrders.TypeOrder[h] = {}
                        QueueOrders.EffectWayPoint[h] = {}
                        QueueOrders.UnitWayPoint[h] = {}
                        QueueOrders.CountOrders[h]=0
						GroupAddUnit(QueueOrders.Group,GetTriggerUnit())
                    end
                    
                    --получаем тек приказ
                    local count = QueueOrders.CountOrders[h]
                    if (ShiftOn==0) or (ShiftOn>0 and count==0) then
                    
                        DestroyWayPointFlags(QueueOrders.CountOrders[h])

                    
                        if GetTriggerEventId()==EVENT_PLAYER_UNIT_ISSUED_TARGET_ORDER then
                            local NumberOrder = 1
                            QueueOrders.TargetOrderObject[h][NumberOrder] = GetOrderTarget()
							QueueOrders.TargetPointOrderX[h][NumberOrder] = nil
							QueueOrders.TargetPointOrderY[h][NumberOrder] = nil
                            QueueOrders.Order[h][NumberOrder]=GetIssuedOrderId()
                            QueueOrders.TypeOrder[h][NumberOrder]=1
                            
                            
                            QueueOrders.CurrentNumberOrder[h]=NumberOrder
                            QueueOrders.CountOrders[h]=NumberOrder
            
                            if GetOrderTargetUnit() ~= nil then
                                id = GetUnitTypeId(GetOrderTargetUnit())
								QueueOrders.TargetOrderTypeObject[h][NumberOrder] = GetObjectName(id)
                                print("|cff00b899"..GetUnitName(GetTriggerUnit()).." получил тек приказ "..OrderId2String(GetIssuedOrderId()).." в цель "..GetObjectName(id).."|r")
                            elseif GetOrderTargetDestructable() ~= nil then
								QueueOrders.TargetOrderTypeObject[h][NumberOrder] = GetDestructableName(GetOrderTargetDestructable())
                                print("|cff00b899"..GetUnitName(GetTriggerUnit()).." получил тек приказ "..OrderId2String(GetIssuedOrderId()).." в цель "..GetDestructableName(GetOrderTargetDestructable()).."|r")
                            
                            elseif GetOrderTargetItem() ~= nil then
                                id = GetItemTypeId(GetOrderTargetItem())
								QueueOrders.TargetOrderTypeObject[h][NumberOrder] = GetObjectName(id)
                                print("|cff00b899"..GetUnitName(GetTriggerUnit()).." получил тек приказ "..OrderId2String(GetIssuedOrderId()).." в цель "..GetObjectName(id).."|r")
                            end

                            
                        elseif GetTriggerEventId()==EVENT_PLAYER_UNIT_ISSUED_POINT_ORDER then
                            local NumberOrder = 1
                            QueueOrders.TargetOrderObject[h][NumberOrder] = nil
							QueueOrders.TargetPointOrderX[h][NumberOrder] = GetOrderPointX()
							QueueOrders.TargetPointOrderY[h][NumberOrder] = GetOrderPointY()
                            QueueOrders.Order[h][NumberOrder]=GetIssuedOrderId()
                            
                            if GetIssuedOrderId()>850000 and GetIssuedOrderId()<860000 then
                                QueueOrders.TypeOrder[h][NumberOrder]=2
                                print("|cff00b899"..GetUnitName(GetTriggerUnit()).." получил тек приказ "..OrderId2String(GetIssuedOrderId()).." в точку "..GetOrderPointX()..","..GetOrderPointY().."|r")
                            else
                                QueueOrders.TypeOrder[h][NumberOrder]=3
                                print("|cff00b899"..GetUnitName(GetTriggerUnit()).." получил тек приказ строить "..OrderId2String(GetIssuedOrderId()).." в точку "..GetOrderPointX()..","..GetOrderPointY().."|r")
                            end
                            
                            QueueOrders.CurrentNumberOrder[h]=NumberOrder
                            QueueOrders.CountOrders[h]=NumberOrder
                            
                        elseif GetTriggerEventId()==EVENT_PLAYER_UNIT_ISSUED_ORDER then
                            local NumberOrder = 1
                            QueueOrders.TargetOrderObject[h][NumberOrder] = nil
							QueueOrders.TargetPointOrderX[h][NumberOrder] = nil
							QueueOrders.TargetPointOrderY[h][NumberOrder] = nil
                            QueueOrders.Order[h][NumberOrder]=GetIssuedOrderId()
                            QueueOrders.TypeOrder[h][NumberOrder]=4
                            
                            QueueOrders.CurrentNumberOrder[h]=NumberOrder
                            QueueOrders.CountOrders[h]=NumberOrder

                            print("|cff00b899"..GetUnitName(GetTriggerUnit()).." получил тек приказ "..OrderId2String(GetIssuedOrderId()).."|r")
                        end
					
            -- ========тут большой код
					else
						
						if GetTriggerEventId()==EVENT_PLAYER_UNIT_ISSUED_TARGET_ORDER then
							local NumberOrder = QueueOrders.CountOrders[h]+1
							QueueOrders.TargetOrderObject[h][NumberOrder] = GetOrderTarget()
							QueueOrders.TargetPointOrderX[h][NumberOrder] = nil
							QueueOrders.TargetPointOrderY[h][NumberOrder] = nil
							QueueOrders.Order[h][NumberOrder]=GetIssuedOrderId()
							QueueOrders.TypeOrder[h][NumberOrder]=1
                            

									
							QueueOrders.CountOrders[h]=NumberOrder
											
					
							if GetOrderTargetUnit() ~= nil then
								
                                --тип цели (какие эффекты вешают на цели. 1 - это спецэффекты)
                                QueueOrders.TypeTarget[h][NumberOrder] = 1
                                
                                --спецэффект
                                local effect = CrateEffectWayPoint(GetTriggerPlayer())
                                QueueOrders.EffectWayPoint[h][NumberOrder] = AddSpecialEffectTarget( effect, GetOrderTarget(), "overhead")
                                
                                --имя цели
                                id = GetUnitTypeId(GetOrderTargetUnit())
								QueueOrders.TargetOrderTypeObject[h][NumberOrder] = GetObjectName(id)
                                
                            elseif GetOrderTargetDestructable() ~= nil then
                                local d = GetOrderTargetDestructable()
                                
                                BlzPauseUnitEx( LastMainSelectedUnit, true )
                                BlzPauseUnitEx( LastMainSelectedUnit, false )
                                --тип цели (какие эффекты вешают на цели. 1  - это спецэффекты)
                                QueueOrders.TypeTarget[h][NumberOrder] = 1
                                
                                --спецэффект
                                local effect = CrateEffectWayPoint(GetTriggerPlayer())
                                QueueOrders.EffectWayPoint[h][NumberOrder] = AddSpecialEffect(effect, GetDestructableX(d), GetDestructableY(d))   --CrateUnitWayPoint(GetTriggerPlayer())
                                
								--имя цели (по id сложно выявить имя декора, поэтому запоминаем так)
                                QueueOrders.TargetOrderTypeObject[h][NumberOrder] = GetDestructableName(d)
                                
                                --вешаем событие смерти
                                TriggerRegisterDeathEvent(DeleteEffects, d)
                                QueueOrders.EffectObjects[GetHandleId(d)]= QueueOrders.EffectWayPoint[h][NumberOrder]
                                
                            elseif GetOrderTargetItem() ~= nil then
                                
                                --тип цели (какие эффекты вешают на цели. 2 - это dummy-units. к предметам сложно прицепить специээфект)
                                QueueOrders.TypeTarget[h][NumberOrder] = 2
                                
                                --юнит в качестве спецэффекта
                                QueueOrders.UnitWayPoint[h][NumberOrder] =CrateUnitWayPoint(GetTriggerPlayer())
                                
                                --имя предмета
								id = GetItemTypeId(GetOrderTargetItem())
								QueueOrders.TargetOrderTypeObject[h][NumberOrder] = GetObjectName(id)
                            end

							print("|cff00bfff"..GetUnitName(GetTriggerUnit()).." (кол-во:"..count..") получил след приказ "..OrderId2String(GetIssuedOrderId()).." в цель "..GetObjectName(id).."|r")
						elseif GetTriggerEventId()==EVENT_PLAYER_UNIT_ISSUED_POINT_ORDER then
							local NumberOrder = QueueOrders.CountOrders[h]+1
							QueueOrders.TargetOrderObject[h][NumberOrder] = nil
							QueueOrders.TargetPointOrderX[h][NumberOrder] = GetOrderPointX()
							QueueOrders.TargetPointOrderY[h][NumberOrder] = GetOrderPointY()
								
							QueueOrders.Order[h][NumberOrder]=GetIssuedOrderId()
                            
                            --тип цели (какие эффекты вешают на цели. 2 - это dummy-units. к предметам сложно прицепить специээфект)
                                QueueOrders.TypeTarget[h][NumberOrder] = 2
                                
                            --юнит в качестве спецэффекта
                                QueueOrders.UnitWayPoint[h][NumberOrder] =CrateUnitWayPoint(GetTriggerPlayer())

                            if GetIssuedOrderId()>850000 and GetIssuedOrderId()<860000 then
								QueueOrders.TypeOrder[h][NumberOrder]=2
								print("|cff00bfff"..GetUnitName(GetTriggerUnit()).." (кол-во:"..count..") получил след приказ "..OrderId2String(GetIssuedOrderId()).." в точку "..GetOrderPointX()..","..GetOrderPointY().."|r")
							else
								QueueOrders.TypeOrder[h][NumberOrder]=3
								print("|cff00bfff"..GetUnitName(GetTriggerUnit()).." (кол-во:"..count..") получил след приказ строить "..OrderId2String(GetIssuedOrderId()).." в точку "..GetOrderPointX()..","..GetOrderPointY().."|r")
							end
									
							QueueOrders.CountOrders[h]=NumberOrder
									
						elseif GetTriggerEventId()==EVENT_PLAYER_UNIT_ISSUED_ORDER and GetIssuedOrderId()==851972 then
							local NumberOrder = QueueOrders.CountOrders[h]+1
							QueueOrders.TargetOrderObject[h][NumberOrder] = nil
							QueueOrders.TargetPointOrderX[h][NumberOrder] = nil
							QueueOrders.TargetPointOrderY[h][NumberOrder] = nil
							QueueOrders.Order[h][NumberOrder]=GetIssuedOrderId()
							QueueOrders.TypeOrder[h][NumberOrder]=4
									
							QueueOrders.CountOrders[h]=NumberOrder

							print("|cff00bfff"..GetUnitName(GetTriggerUnit()).." (кол-во:"..count..") получил след приказ "..OrderId2String(GetIssuedOrderId()).."|r")
						end
								
						print("запись")
						clicking_the_mouse_button = 0
								
						local CurrentOrder = QueueOrders.CurrentNumberOrder[h]
						local type_order = QueueOrders.TypeOrder[h][CurrentOrder]
						local id_order = QueueOrders.Order[h][CurrentOrder]
						local id_object = QueueOrders.TargetOrderTypeObject[h][CurrentOrder]
														
									
						if type_order == 1 then
							local target = QueueOrders.TargetOrderObject[h][CurrentOrder]
							DisableTrigger(detectedtrigger1)
							IssueTargetOrderById(GetTriggerUnit(),id_order, target)
							EnableTrigger(detectedtrigger1)
							print("|cff660099"..GetUnitName(GetTriggerUnit()).." получил продолжить "..type_order.."-приказ "..OrderId2String(id_order).." в цель "..GetObjectName(id).."|r")
						elseif type_order == 2 then
							local x = QueueOrders.TargetPointOrderX[h][CurrentOrder]
							local y = QueueOrders.TargetPointOrderY[h][CurrentOrder]
								
							DisableTrigger(detectedtrigger1)
							IssuePointOrderById(GetTriggerUnit(),id_order, x,y)
							EnableTrigger(detectedtrigger1)
							print("|cff660099"..GetUnitName(GetTriggerUnit()).." получил продолжить "..type_order.."-приказ "..OrderId2String(id_order).." в точку "..x..","..y.."|r")
						elseif type_order == 3 then
							local x = QueueOrders.TargetPointOrderX[h][CurrentOrder]
							local y = QueueOrders.TargetPointOrderY[h][CurrentOrder]
							DisableTrigger(detectedtrigger1)
							IssueBuildOrderById(GetTriggerUnit(),id_order, x,y)
							EnableTrigger(detectedtrigger1)
							print("|cff660099"..GetUnitName(GetTriggerUnit()).." получил продолжить "..type_order.."-приказ "..OrderId2StringBJ(id_order).." строить в точке "..x..","..y.."|r")
						else
							DisableTrigger(detectedtrigger1)
							IssueImmediateOrderById(GetTriggerUnit(),id_order)
							EnableTrigger(detectedtrigger1)
							print("|cff660099"..GetUnitName(GetTriggerUnit()).." получил продолжить "..type_order.."-приказ "..OrderId2StringBJ(id_order).."|r")
						end
								
								
					end


				end)
            



    end

end
Загруженные файлы
23
МрачныйВорон, что значит задержка?
моментальный отклик
Если у вас спецэффект моментально не удаляется значит анимации смерти нет, бленд на 0% или размер на 0% устанавливай, а затем уничтожай
Загруженные файлы
27
кажется понял че надо делать. У спецэффектов waypoints нет анимации исчезновения-destroy, и поэтому их тоже надо в углу карты уничтожать

Obelick, спасибо)) что бы без вас делал)
23
Я делаю проще просто через
call BlzSetSpecialEffectScale( effect, 0.0 )
call DestroyEffect(effect)
Принятый ответ
Чтобы оставить комментарий, пожалуйста, войдите на сайт.