21

» WarCraft 3 / Создать декорацию гуи или jass

prog, я тоже так делал, но эффекты не видны в тумане войны. Это выглядит ужасно, когда раскрывается туман войны и декорации начинают прорисовываться. Пришлось делать на разрушаемых объектах.
21

» WarCraft 3 / О критических ударах и уклонениях...

PrincePhoenix, разве уклонения не складываются? По-моему они складываются. Если есть две способности увернуться с шансом 50%, то общая вероятность уклонения равняется 75%.
50% + 50% = 75%
21

» WarCraft 3 / Триггерный приказ каста "массовой телепортации"

crusader556, можно сделать, чтобы целью была постройка, которая ещё не построена. Но на гуи я вряд ли помогу. Нужно сделать функцию, которая будет возвращать постройку игрока.
21

» WarCraft 3 / Триггерный приказ каста "массовой телепортации"

Удалите "Unit type of triggering unit равно солнечный колодец". И укажите целью солнечный колодец.
21

» WarCraft 3 / [Lua] Инжект функций

Стоит добавить хук функции InitBlizzard, так можно будет хукать не только InitGlobals, но и InitCustomTriggers, RunTriggerInitialization, CreateAllUnits и т.д.
21

» WarCraft 3 / Событие - игрок ливает

TeX13, с точки зрения оптимизации станет лишь хуже, потому что события также будут создаваться для всех 24 игроков, но только это будет делаться через ForForce( ), которая будет создавать те же события для каждого игрока, запуская для каждого отдельный поток. А если делать через GUI, то еще и утечки подъедут.
21

» WarCraft 3 / Длина массива.

PT153, там вроде сперва создаётся 1024 ячеек, если они все полносьб заполнятся, то выделяются еще 1024 и так до 8192.
21

» WarCraft 3 / Длина массива.

Нельзя, когда заносите новые данные просто сохраняйте новую длину в другой переменной. Также учитывайте, что максимальный размер массива для патча 1.29+ = 32768, для 1.29- = 8192.
21

» WarCraft 3 / Событие - игрок ливает

Можно, создаёте все 24 события лива для одного тригоера. А в действии триггера узнаете ливнувшего игрока с помощью функций: GetTriggeringPlayer(), GetLeavingPlayer().
21

» WarCraft 3 / [lua] Воскрешаем героя

NazarPunk, нет, там суть была в том, что противники могут сбить процесс вокрешения, чтобы воскрешающие начинали процесс воскрешения с самого начала. Если посмотрите мой код, там идёт постоянная проверка на то, что могила ремонтируется, в случае прерывания воскрешения весь прогресс сбрасывается. А способность ремонта, вроде, можно настроить на то, чтобы он работал только на могилы.
21

» WarCraft 3 / [lua] Воскрешаем героя

или вы знаете интересные способы воскрешения
Знаю весьма интересный способ воскрешения героев, который обычно используется во всяких ивентах от вальв в дота 2. Суть заключается в том, что после смерти героя, на месте умершего героя появляется крест перерождения. Если союзные герои нажимают ПКМ по кресту перерождения, то герой начинает воскрешаться. Естесственно процесс можно ускорить, если будут воскрешать мертвого героя сразу несколько союзных героев. В случае, когда процесс воскрешения прерывается, прогресс воскрешения так же обнуляется.

Сделал для своей карты такую же систему. Крест сделан из обычного здания, который ремонтируют союзные герои. В течении всей жизни креста тикает таймер, который проверяет здоровье креста, если он фуловый, то воскрешаем героя и удаляем крест перерождения.
Код
-----------------------------------------------------------------------------
--  H E R O E S :   R E V I V E                                            --
-----------------------------------------------------------------------------

function RestoreHero( player )
    if hero[ player ] ~= nil then

        if UnitAlive( hero[ player ] ) then
            SetUnitState( hero[ player ], UNIT_STATE_LIFE, GetUnitState( hero[ player ], UNIT_STATE_MAX_LIFE ) )
            SetUnitState( hero[ player ], UNIT_STATE_MANA, GetUnitState( hero[ player ], UNIT_STATE_MAX_MANA ) )
            
        else
            ShowUnit( grave[ player ], false )
            ReviveHero( hero[ player ], GetUnitX( hero[ player ] ), GetUnitY( hero[ player ] ), true )
            SetUnitState( hero[ player ], UNIT_STATE_LIFE, GetUnitState( hero[ player ], UNIT_STATE_MAX_LIFE ) )
            SetUnitState( hero[ player ], UNIT_STATE_MANA, GetUnitState( hero[ player ], UNIT_STATE_MAX_MANA ) )
                                            
            if IsUnitSelected( grave[ player ], GetLocalPlayer( ) ) then
                SelectUnit( grave[ player ], false )
                SelectUnit( hero[ player ], true )
            end
            
            PauseTimer( heroReviveTimer[ player ] )
        end
    end
end

function InitHeroRevive( )
    grave           = { }
    graveLife       = { }
    heroReviveTimer = { }

    ForForce( HEROES_FORCE, 
        function( )
            local enumPlayer = GetEnumPlayer( )

            grave[ enumPlayer ]           = CreateUnit( enumPlayer, BUILDING_GRAVE, HIDDEN_X, HIDDEN_Y, 0.0 )
            heroReviveTimer[ enumPlayer ] = CreateTimer( )

            ShowUnit( grave[ enumPlayer ], false )
            SetUnitPathing( grave[ enumPlayer ], false )
        end 
    )

    TriggerRegisterForceUnitEvent( CreateTrigger( ), HEROES_FORCE, EVENT_PLAYER_UNIT_DEATH, nil, 
        function( )
            if IsUnitHero( GetDyingUnit( ) ) then
                local player = GetOwningPlayer( GetDyingUnit( ) )

                graveLife[ player ] = 1.0

                SetWidgetLife( grave[ player ], graveLife[ player ] )
                SetUnitX( grave[ player ], GetUnitX( hero[ player ] ) )
                SetUnitY( grave[ player ], GetUnitY( hero[ player ] ) )
                ShowUnit( grave[ player ], true )

                if IsUnitSelected( hero[ player ],  GetLocalPlayer( ) ) then
                    SelectUnit( hero[ player ], false )
                    SelectUnit( grave[ player ], true )
                end
                    
                TimerStart( heroReviveTimer[ player ], 0.1, true, 
                    function( ) 
                        if GetWidgetLife( grave[ player ] ) > graveLife[ player ] and GetWidgetLife( grave[ player ] ) < 100.0 then
                            graveLife[ player ] = GetWidgetLife( grave[ player ] )
                    
                        elseif GetWidgetLife( grave[ player ] ) <= graveLife[ player ] and GetWidgetLife( grave[ player ] ) < 100.0 then
                            graveLife[ player ] = 1.0
                            SetWidgetLife( grave[ player ], graveLife[ player ] )
                    
                        elseif GetWidgetLife( grave[ player ] ) >= 100.0 then
                            RestoreHero( hero[ player ] )
                        end
                    end 
                )
            end
        end 
    )
end
21

» WarCraft 3 / Утекает ли плавающий текст?

Yury13, что значит изображение? Плавающий текст - это объект. У которого имеются такие параметры как: текст, размер, расположение на карте, цвет, видимость и т. д.
а родная функция редактора "Уничтожить последний созданный текст"
Совершенно верно. Данная функция удаляет текстаг. Также тексттагу можно задать время жизни, как указал NazarPunk. После истечении указанного времени тексттаг самоуничтожится, главное не забудьте обнулить переменную, если работаете в jass.
21

» WarCraft 3 / Утекает ли плавающий текст?

Его можно создать ~100 раз на одного игрока, дальше они перестанут создаваться. Поэтому их лучше удалять. call DestroyTextTag( имя_переменной).
21

» WarCraft 3 / [lua] Двигаем снаряды

NazarPunk, чтобы получить урон героя, по-моему, нужно к базовому урону еще добавить основную характеристику героя. А зелёный бонус еще нельзя определить.
21

» WarCraft 3 / Lua: функции в таблице

prog, понятно. А цикл разве так плох? Если на карте максимум штук 50 способностей будет?
21

» WarCraft 3 / Lua: функции в таблице

prog, prog, неужели обращение к ячейке таблицы настолько тяжелый процесс, что лучше сохранять её значение в локалку?
21

» WarCraft 3 / Lua: функции в таблице

prog, сделал так:
сама способность:
do
    Ability.DeathCoil = { }
    Ability.DeathCoil.id = FourCC( "A00I" ) -- < обязательная переменная для работы системы.
    
    function Ability.DeathCoil.onSpellCast( )
    end 

    function Ability.DeathCoil.onSpellEffect( )
    end 

    function Ability.DeathCoil.onInit( )
        -- preload...
    end

end
вызов функций:
function InitAllAbilities( )
    for key, value in pairs( Ability ) do

        if type( value ) == "table" then

            if value.onInit and type( value.onInit ) == "function" then value.onInit( ) end
        end
        
    end

    local trigger = CreateTrigger( )

    TriggerRegisterAnyUnitEventBJ( trigger, EVENT_PLAYER_UNIT_SPELL_EFFECT  )

    TriggerAddAction( trigger, 
        function( )
            local abilityId = GetSpellAbilityId( )
            
            for key, value in pairs( Ability ) do

                if type( value ) == "table" then

                    if value.id and value.id == abilityId then
                        if value.onSpellEffect  and type( value.onSpellEffect  ) == "function" then value.onSpellEffect ( ) end
                    end

                end

            end
        end
    )
end
Норм или нет?