18

» WarCraft 3 / Какой лучший вариант для системы эволюций в карте?

Еще есть способность "Тёмный", можно попробовать с ней. С ней знаю только один баг, когда способность меняет одинаковый тип юнитов, она сумирует их здоровье
18

» WarCraft 3 / Как сделать так чтобы способность ушла в кд от действия?

Как вариант, ты можешь скрыть способность телепоота, а выдать "берсерк" и отдать приказ его скастовать
18

» WarCraft 3 / АОЕ хил

Способность "Канал", на любой случай для способности пустышки
18

» WarCraft 3 / Анимация во время движения.

jasonrus96, у меня есть простая системка, работает по одному юниту на каждого игрока. Если понадобится, могу после работы скинуть
18

» WarCraft 3 / Анимация во время движения.

jasonrus96, Одна анимация прервет другую. Для движения можно делать через смещение юнитов по Х, У и воспроизводить анимацию ходьбы, но две анимации не сработают одновременно
18

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

Надо поправить функцию onDamage на:
function onDamage takes nothing returns nothing
    local spellBleeding spb
    local unit source = GetEventDamageSource()
	local unit target = GetTriggerUnit()
    
        if GetUnitAbilityLevel(source, SOURCE_BLEEDING_BUFF_ID) > 0 and isTypeTarget(target) then
			set spb = spellBleeding.create()
            call spb.addBleeding(source,target,GetEventDamage())
        endif
    
    set source = null
	set target = null
endfunction
18

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

Название: Кровавая баня
Метод: GUI/Jass/cJass/vJass
MUI: Обязательно
Цель: Другой юнит
Количество уровней: 1
Описание: В течение 10 сек, ваши атаки и способности вызывают у цели кровотечение, наносящее 40% дополнительного урона в течение 6 сек.
Технические характеристики: Нужны параметры для указания от каких способностей наносить урон.
Код
library SpellBleeding
//-----------------------     OPTION     ------------------------------------------
globals
    private real DURATION                                   = 6.0 // длительность кровотечения
    private real DAMAGE_AMOUNT                              = 0.40 // нанесенный урон за всю длительность, в %
    
    private constant integer SOURCE_BLEEDING_BUFF_ID        = 'BHds' // ид баффа под которым будет наносится урон кровотечением
    private constant integer TARGET_BLEEDING_ABILITY_ID     = 'Aasl' // ид способности у цели под кровотечением. Для создания эффекта на цели
    private constant integer SPELL_FOR_BLEEDING_IMMUNE      = 0 // ид способности которая добавит иммунитет к кровотечению
    private constant attacktype ATTACK_TYPE                 = ATTACK_TYPE_NORMAL // тип аттаки
    private constant damagetype DAMAGE_TYPE                 = DAMAGE_TYPE_NORMAL // тип урона
    private constant real TIME_FREQUENCY                       = 1.0 // частота срабативания кровотечения
endglobals

// функция фильтр для целей

private function isTypeTarget takes unit target returns boolean
    return GetWidgetLife(target) > 0 and not IsUnitType(target, UNIT_TYPE_MECHANICAL)
endfunction
//-----------------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------------
globals
    private trigger damageEvent = CreateTrigger()
    private timer tickBleeding = CreateTimer()
endglobals

private struct spellBleeding
    static spellBleeding array spB
    static integer stash = 0
    real getDamage
    unit getSource
    unit getTarget
    real remainingTime
    
        private method clone takes spellBleeding dest returns nothing
            set getDamage = dest.getDamage
            set getSource = dest.getSource
            set getTarget = dest.getTarget
            set remainingTime = dest.remainingTime
        endmethod
    
        static method checkRemainingTime takes nothing returns nothing
            local integer i = 1
            local real bleedDamage = 0.
                loop
                    exitwhen i > stash
                        if spB[i].remainingTime <= 0.0 or GetWidgetLife(spB[i].getTarget) <= 0.0 then 
                            call UnitRemoveAbility(spB[i].getTarget, TARGET_BLEEDING_ABILITY_ID)
                            call spB[i].clone(spB[stash])
                            call spB[stash].destroy()
                            set stash = stash - 1
                        else
                            set bleedDamage = spB[i].getDamage / DURATION * DAMAGE_AMOUNT * TIME_FREQUENCY
                            if isTypeTarget(spB[i].getTarget) and GetUnitAbilityLevel(spB[i].getTarget, SPELL_FOR_BLEEDING_IMMUNE) < 1 then
                                call DisableTrigger(damageEvent)
                                call UnitDamageTarget(spB[i].getSource, spB[i].getTarget, bleedDamage, true, true, ATTACK_TYPE, DAMAGE_TYPE, WEAPON_TYPE_WHOKNOWS)
                                call EnableTrigger(damageEvent)
                            endif
                            set spB[i].remainingTime = spB[i].remainingTime - TIME_FREQUENCY
                        endif
                    set i = i + 1
                endloop
            
        endmethod
        
        method addBleeding takes unit source, unit target, real damage returns nothing
            set stash = stash + 1
            set spB[stash] = this
            set getSource = source
            set getTarget = target
            set getDamage = damage
            set remainingTime = 6.0
            
            if GetUnitAbilityLevel(getTarget, TARGET_BLEEDING_ABILITY_ID) <= 0 then
                call UnitAddAbility(getTarget, TARGET_BLEEDING_ABILITY_ID)
            endif
        endmethod
endstruct

function everyTickBleeding takes nothing returns nothing
    call spellBleeding.checkRemainingTime()
endfunction

function onDamage takes nothing returns nothing
    local spellBleeding spb
    local unit source = GetEventDamageSource()
	local unit target = GetTriggerUnit()
    
        if GetUnitAbilityLevel(source, SOURCE_BLEEDING_BUFF_ID) > 0 and isTypeTarget(target) then
			set spb = spellBleeding.create()
            call spb.addBleeding(source,target,GetEventDamage())
        endif
    
    set source = null
	set target = null
endfunction
//===========================================================================
function Trig_Bleeding_Actions takes nothing returns nothing
    call TriggerRegisterUnitEvent(damageEvent, GetTriggerUnit(), EVENT_UNIT_DAMAGED )
endfunction

function InitTrig_Bleeding takes nothing returns nothing
    local group g = CreateGroup()
    local unit e
    set gg_trg_Bleeding = CreateTrigger()
    
    call TriggerRegisterEnterRectSimple(gg_trg_Bleeding, GetPlayableMapRect())
    call TriggerAddAction( gg_trg_Bleeding, function Trig_Bleeding_Actions)
    call TriggerAddAction(damageEvent, function onDamage)
    
    call GroupEnumUnitsInRange(g, 0., 0., 99999., null)
        loop
            set e = FirstOfGroup(g)
            exitwhen e == null
                call TriggerRegisterUnitEvent(damageEvent, e, EVENT_UNIT_DAMAGED )
                call GroupRemoveUnit(g,e)
        endloop
        
        call GroupClear(g)
        call DestroyGroup(g)
        call TimerStart(tickBleeding, TIME_FREQUENCY, true, function everyTickBleeding)
    set g = null
    set e = null
endfunction

endlibrary
Загруженные файлы
18

» WarCraft 3 / Дополнительные ресурсы

Komkozavr, Используй переменные у которых тип - целочислинные
Триггер на завершение тренировки юнита с условием что юнит "Автодобыча"
Увеличиваеш переменую на 1ед.
Создаешь переменные для каждого ресурса
В триггере с периодическим срабативанием
Ресурс = Ресурс + (Количество с автодобычи * кол "Автодобычи")
СОздать таблицу лидеров и подставить туда свои переменные
18

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

Название: Cyclop Grab and Throw
Метод: GUI/Jass
MUI: Да
Цель: Нет
Количество уровней: 1
Описание: Циклоп хватает цель и бросает в случайную точку вокруг себя (от 600 до 1200 дальности) нанося цели урон при столкновении в размере 80% от текущего здоровья и замедляет на 25%. (Если перед целью есть клиф нужно его ударить об клиф и замедлить на 50% при ударе)
Если метод на Jass , хотелось бы возможность настроить переменные на GUI при нужном мне действии , в карте есть некоторые юниты на которых не должна работать данная способность
Настройки вверху триггера. Если понадобится ГУИ,вместо значения после присваивания дописать udg_название переменной
Загруженные файлы
18

» Программирование / 1-но событие для функций или несколько событий для каж.функции?

Есть еще способ, функция call ExecuteFunc( конвертация имени способности в строку). А все способности назвать по вызываемой функции.
Плюс - удобно, просто
Минусы - вроде как, немного медленей. С другими минусами не знаком
18

» WarCraft 3 / [RenderEdge] Memory Hack: Помогите найти фрейм золота

KaneThaumaturge, в мемхаке unryze, есть готовые функции для UI. Только разобратся с некоторими сложнее будет. Но можно создавать свои фреймы с "блекджеком и шлюхами".
18

» WarCraft 3 / Не срабатывает событие на изменение real var. Игнор строки кода.

NatriY, Если выводит число 11 у тебя, то тут все работает. Нужен код того как ты событие регистрируешь...
18

» WarCraft 3 / Не срабатывает событие на изменение real var. Игнор строки кода.

NatriY, Вставь код в функцию UpDown_Act() после udg_ToMove = 1
Если выводит TRUE 1, тогда ошибка в регистрации события и вызова функции для этого триггера
	if udg_W then 
        call BJDebugMsg("TRUE "+R2S(udg_ToMove))
	else
		call BJDebugMsg("FALSE "+R2S(udg_ToMove))
    endif
18

» WarCraft 3 / Не срабатывает событие на изменение real var. Игнор строки кода.

NatriY, Выводи лог на экран значений udg_S, udg_W и udg_ToMove, когда нажал и когда отпустил клавишу. Возможно причина в них
18

» WarCraft 3 / Странное поведение функции

Не уверен что понял...
Выводи имя убившего и его уровень, также имя умершего и его уровень. Есть вероятность, что у них разница в уровнях больше 7, в пользу того кто убил
18

» WarCraft 3 / Странное поведение функции

Выведи имена и их уровни в строчку, возможно там сбой происходит