30

» WarCraft 3 / Козырная пешка (RPG)

8gabriel8, мне тут вообще не дали отыграть злобного упыря, так что о переходе во тьму можете не мечтать(
30

» Защитники Хелерии / Обзор героя: Оури - Егерь

Пират призывал свой корабль стрелять по врагам, почему егерь не может призывать бешенных кроликов кусать врагов за пятки и покупать мухоморы у говорящей гусеницы усиливая обзор союзникам и заставляя врагов задуматься о бренности бытия?
30

» WarCraft 3 / Tooltip предмета

Roflan, если сильно нужно, можете также позаменять киррилические буквы сходными по начертанию латинскими.
30

» WarCraft 3 / JASS фаербол

У него же indexer
Два фаербола от одного юнита и привет перезапись переменной. Нужно в хэштаблице на id таймера все данные сохранять.
30

» WarCraft 3 / JASS фаербол

PT153, на каждый фаербол нужно хранить группу, чтоб повторно не дамажить юнитов, как её хранить в глобалках? хэштаблицы конечно идеально подойдут.
30

» WarCraft 3 / Tooltip предмета

Ищите текст в игровом интерфейсе или переходите на последние патчи, там убран лимит.
30

» WarCraft 3 / JASS фаербол

Смотришь наработки NazarPunk, учишься по ним
Фаербол на lua очень просто реализуется, если нужно могу вечером опубликовать.
30

» Защитники Хелерии / Обзор героя: Трейм - Повелитель Бурь

не понял про сфера
Вокруг пуза героя крутятся сферы, которые блокируют урон. При получении достаточного урона сферы взрываются/исчезают/уходят покурить.
30

» WarCraft 3 / JASS фаербол

Roflan, без хэштаблиц или структур у вас всёравно MUI не получится, а так можете через глобалки перебросить. Но лучше ненужно.
30

» Защитники Хелерии / Обзор героя: Трейм - Повелитель Бурь

в идеале заряды на активной абилке = хп щита
Это вообще в идеале)
Bergi_Bear:
но я про такое знаю только на мемхаке
А какже 100500 способностей с разными иконками?

Ещё можно отображать сферами, на подобии жезла молний, где каждая сфера, например, поглощает 25/50/75/100/125 урона и количетво сфер равно 1*уровень способности. Когда сферы закончатся, щит спадает.
30

» WarCraft 3 / allocate возвращает 0

Не нашёл документации по class, но можете попробоывать
local PHS_Stack this = PHS_Stack.allocate();
30

» WarCraft 3 / JASS фаербол

Принятый ответ
если да то как это должно выглядеть
Посмотрите в этой наработке, там структуры с хэштаблицами а таймерами.
Не используйте точки
local location point1 = GetUnitLoc(u)
local location point2 = GetSpellTargetLoc()
// Где RemoveLocation() ?
Лучше координаты
local real casterX = GetUnitX(caster)
local real casterY = GetUnitY(caster)
local real targetX = GetSpellTargetX()
local real targetY = GetSpellTargetY()

Или переходите на lua, там всё в разы проще))
30

» Защитники Хелерии / Обзор героя: Трейм - Повелитель Бурь

здоровье щита отображается над героем в виде текстага
Зачем колхозить с текстагом, если можно красивый бар сделать?)
30

» Защитники Хелерии / Обзор героя: Трейм - Повелитель Бурь

Герой создаёт напряжение своей энергии в области
Какието нездоровые ассоциации на ум приходят)
30

» WarCraft 3 / Самый производительный Bullet Hell

а на луа есть какие нить аналоги таймеров?
Есть Sleep Function, но врятли они работать будут.
30

» WarCraft 3 / Самый производительный Bullet Hell

Начал тестить и вообще какая-то магия происходит. Если из другого таймера делать print(timer), то timer не остановится. Но отпадут действия триггеров или новые таймеры не смогут запуститься. Ещё нужно будет попробовать тупо пересоздавать таймер каждые неколько секунд и насыпать оптимизации.
30

» WarCraft 3 / Самый производительный Bullet Hell

Добавил урон и счётчик эффектов
//! beginusercode
do
    -- На момент патча 1.31 эта функция всегда возвращает 0. Поэтому создадим её локальный аналог.
    local function AbilityId(id)
        return id:byte(1) * 0x1000000 + id:byte(2) * 0x10000 + id:byte(3) * 0x100 + id:byte(4)
    end

    local BULLETS = {}
    local TIMER_PERIOD = 0.03125 --> 1/32
    local SPEED = 600
    local SPEED_INC = SPEED/(1/TIMER_PERIOD)

    local DAMAGE_PERIOD = 0.5
    local DAMAGE_TIME = 0
    local IS_DAMAGE = false
    local DAMAGE_GROUP = CreateGroup()
    
    local BOARD

    -- Настройки
    local ABILITY_ID = AbilityId('SIWh')
    local ARC = 0.3
    local EFFECT = 'Abilities\\Spells\\Orc\\WarStomp\\WarStompCaster.mdl'
    
    -- Код
    local GetTerrainZ_location = Location(0, 0)
    local function GetTerrainZ(x, y)
        MoveLocation(GetTerrainZ_location, x, y);
        return GetLocationZ(GetTerrainZ_location);
    end

    local function InMapXY(x, y)
        return
            x > GetRectMinX(bj_mapInitialPlayableArea)
            and
            x < GetRectMaxX(bj_mapInitialPlayableArea)
            and
            y > GetRectMinY(bj_mapInitialPlayableArea)
            and
            y < GetRectMaxY(bj_mapInitialPlayableArea)        
    end

    TimerStart(CreateTimer(), TIMER_PERIOD, true, function()
        if #BULLETS == 0 then return end

        DAMAGE_TIME = DAMAGE_TIME + TIMER_PERIOD

        IS_DAMAGE = DAMAGE_TIME >= DAMAGE_PERIOD

        if
            IS_DAMAGE
        then
            DAMAGE_TIME = 0
        end

        for i=#BULLETS, 1, -1
        do
            BULLETS[i].x = BULLETS[i].x + SPEED_INC*BULLETS[i].cos
            BULLETS[i].y = BULLETS[i].y + SPEED_INC*BULLETS[i].sin
            if
                InMapXY(BULLETS[i].x, BULLETS[i].y)
            then
                BlzSetSpecialEffectX(BULLETS[i].effect, BULLETS[i].x)
                BlzSetSpecialEffectY(BULLETS[i].effect, BULLETS[i].y)
                BlzSetSpecialEffectHeight(BULLETS[i].effect, 20)

                if
                    IS_DAMAGE
                then
                    GroupEnumUnitsInRange(DAMAGE_GROUP, BULLETS[i].x, BULLETS[i].y, 100, Filter(function()
                        local target = GetFilterUnit()
                        return
                            UnitAlive(target)
                            and
                            IsPlayerEnemy(GetOwningPlayer(BULLETS[i].caster), GetOwningPlayer(target))
                    end))
                    ForGroup(DAMAGE_GROUP, function()
                        UnitDamageTarget(BULLETS[i].caster, GetEnumUnit(), 50, false, true, ATTACK_TYPE_MAGIC, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS)
                    end)
                    GroupClear(DAMAGE_GROUP)
                end
            else
                DestroyEffect(BULLETS[i].effect)
                table.remove(BULLETS, i)
            end 
        end

        if
            BOARD ~= nil
        then
            LeaderboardSetItemValue(BOARD, 0, #BULLETS)
        end
    end)


    local trigger = CreateTrigger()
    for i = 0, bj_MAX_PLAYER_SLOTS - 1, 1 do
        TriggerRegisterPlayerUnitEvent(trigger, Player(i), EVENT_PLAYER_UNIT_SPELL_EFFECT)
    end
    TriggerAddCondition(trigger, Condition(function() return
        GetOwningPlayer(GetTriggerUnit()) == Player(0)
    end))
    TriggerAddAction(trigger, function()
        local caster = GetTriggerUnit()
        local x
        local y
        local angle
        UnitRemoveAbility(caster, GetSpellAbilityId())

        TimerStart(CreateTimer(), 0.1, true, function()
            x = GetUnitX(caster)
            y = GetUnitY(caster)
            angle = Deg2Rad(GetUnitFacing(caster))

            table.insert(BULLETS, {
                effect = AddSpecialEffect('units\\nightelf\\Wisp\\Wisp.mdl', x, y),
                caster = caster,
                x = x,
                y = y,
                angle = angle,
                cos = Cos(angle),
                sin = Sin(angle)
            })
        end)
    end)


    -- Board
    TimerStart(CreateTimer(), 1, false, function()
        BOARD = CreateLeaderboard()

        PlayerSetLeaderboard(GetLocalPlayer(), BOARD)
        LeaderboardSetLabel(BOARD, 'Статистика')
        LeaderboardDisplay(BOARD, true)
        
        LeaderboardAddItem(BOARD, "Эффекты", #BULLETS, Player(0))

        LeaderboardSetSizeByItemCount(BOARD, 1)
        
        DestroyTimer(GetExpiredTimer())
    end)

end
//! endusercode
В районе 150-200 эффектов общий таймер может тупо остановиться. Хотя таймеры добавления эффектов исправно работают.
Загруженные файлы
30

» WarCraft 3 / Самый производительный Bullet Hell

а insert и remove это стандартный методы структур lua
В lua таблицы) И да, это стандартные методы для таблиц.
Загруженные файлы
30

» WarCraft 3 / Самый производительный Bullet Hell

prog, это только начало, потом как определюсь с функциями добавления снарядов, переделаю.
TimerStart(CreateTimer(), 0, false, function() print('test') end) выполнится после инициализации карты.