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 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

        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)
            else
                DestroyEffect(BULLETS[i].effect)
                table.remove(BULLETS, i)
            end
            
        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 true end))
    TriggerAddAction(trigger, function()
        TimerStart(CreateTimer(), 0.5, true, function()
            local caster = GetTriggerUnit()
            local x = GetUnitX(caster)
            local y = GetUnitY(caster)
            local angle = GetUnitFacing(caster)

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

end
//! endusercode
Вечером тесты напишу и буду над уроном думать.
Загруженные файлы
30

» WarCraft 3 / Заклинание: Вихрь Иллюзий

GetLocalPlayer, а как прикрепить к weapon эффекта другой эффект? И как получить модель юнита?

И как проиграть анимацию эффекта?
30

» WarCraft 3 / как создать свой GetUnitUserData

и тут нет метода delete, он потерялся =)
Метод create тоже потерялся)
А на lua всё ещё проще)
30

» WarCraft 3 / Заклинание: Вихрь Иллюзий

Причем не важно где Jump объявлена, хоть вначале хоть в конце кода?
Да. Я же приводил пример:
TimerStart(CreateTimer(), 0, false, function()
    test() --> test  
end)

function test()
    test1()
end
function test1()
    print('test')
end

Только первый вызов должен быть после инициализации.
30

» WarCraft 3 / как создать свой GetUnitUserData

Bergi_Bear, к структуре же id юнита привязать нужно через таблицы или использовать unit indexer.
local CustomUnitData u = GetUnitUserData(GetTriggerUnit())
u.data1 = 'data1'
u.data2 = 'data2'
30

» WarCraft 3 / Заклинание: Вихрь Иллюзий

новый таймер на отдельную иллюзию верно же?
Да, решил не переусложнять.
А как сделать чтобы функцию Jump можно было использовать в других триггерах? просто убрать local?
Да
А все эти прыжки адекватно реагируют на склон/глубокую воду?
Из-за того, что у юнита не убран угол крена, на склонах немного подёргивается. Как допилят SetUserField, зафиксится.
30

» WarCraft 3 / Заклинание: Вихрь Иллюзий

если можно с тем-же успехом все через эффекты сделать в 1.31
А как проиграть нужную анимацию эффекта с нужной скоростью?
30

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

Bergi_Bear, всё никак немогу привыкнуть, что в новом патче эффекты можно в трёх плокостях вращать. Можно ещё оптимизировать и икать столкновения таймером помедленнее, держа координаты эффектов в таблице.
30

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

Из детекта, мне тоже больше нравится аура жара
А таймеры я бы создавал на группу снарядов, например: кольцо снарядов, линия снарядов, змейка и т.д. Так меньше мороки с кодом и по хэндлу таймера например, можно менять поведение всей группе, не заморачиваясь с лишними переборами.
30

» WarCraft 3 / Как найти наибольшее из нескольких чисел?

Очень сложные виды сортировок для не программиста
Тогда можно вообще не сортировать))
  • Создаёшь группу игроков
  • Проходиш циклом и находишь максимального по рейтингу
  • Удаляешь из группы
  • Назначаешь его ИгрокА
  • Проходиш циклом и находишь максимального по рейтингу
  • Назначаешь его ИгрокБ
  • Начинаешь дуель, обнуляешь ИгрокА, ИгрокБ
  • Повторить, пока игроки не закончатся

Если игроков нечётное количество, предлагаешь последнему покурить))
30

» WarCraft 3 / Подсветка синтаксиса 1.31

а каким образом файлы .lua передаются в карту?
На данный момент Ctrl+C Ctrl+V
30

» WarCraft 3 / Заклинание: Вихрь Иллюзий

Кстати, а почему для перевода равкода везде используется хитрая функция AbilityId
А какая разница, если в обоих случаях идёт работа со строками?
30

» WarCraft 3 / [lua] Математические функции

PornoMishka, это я себе шпаргалку оставляю, как напримерс приказами. А так сам подумал о фрэймворке, который бы реализовал нужный функционал. Но пока нет IDE, которая бы из него подтягивала справку.
30

» WarCraft 3 / Способности и алгоритмы на заказ

Bergi_Bear, я пытался наиболее кратко от фонаря написать. Так бы я создал группу и For Group одним таймером ганял.
30

» WarCraft 3 / Способности и алгоритмы на заказ

а если потом книгу забвения использовать, ммм =) неоднократно
Не для публикации же готовил, зачем тестить))
PT153:
Так на 1.26 проще простого сделать
Можно вообще в лоб перебирать всех юнитов на карте и регенить по способности)
30

» WarCraft 3 / Способности и алгоритмы на заказ

Вот блин, я на 1.26. Как мне быть тогда?
  • Переходить на 1.31
  • Ждать, пока кто-то напишет для 1.26
  • Почитать статьи и реализовать самому
30

» WarCraft 3 / Способности и алгоритмы на заказ

Даже MUI получилось
//! 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 ABILITY_ID = AbilityId('AEev')

    -- Код
    local trigger = CreateTrigger()
    for i = 0, bj_MAX_PLAYER_SLOTS - 1, 1 do
        TriggerRegisterPlayerUnitEvent(trigger, Player(i), EVENT_PLAYER_HERO_SKILL)
    end
    TriggerAddAction(trigger, function()
        local caster = GetTriggerUnit()
        TimerStart(CreateTimer(), 1, true, function()
            if 
                not UnitAlive(caster)
                or
                BlzGetUnitMaxHP(caster) == GetWidgetLife(caster)
            then return end
            local hp = 0.01 * GetUnitAbilityLevel(caster, ABILITY_ID) * GetHeroStr(caster, true) * (100 - GetWidgetLife(caster)/BlzGetUnitMaxHP(caster)*100)
            SetWidgetLife(caster, GetWidgetLife(caster) + hp)
        end)
    end)
end
//! endusercode
Сделал из Змеиной ловкости.
Загруженные файлы
30

» WarCraft 3 / Способности и алгоритмы на заказ

1 - PercentHP
Отрицательный реген?
Zikok247:
Я немного не знаю как его добавить в формулу
А зачем тогда заказываете, если даже ТЗ описать не можете?