Сейчас 17:35:29 Пятница, 19 апреля, 2024 год
[ x ] Главная ⇒ Форум ⇐ RSS Файлы Cтатьи Картинки В о й т и   или   з а р е г и с т р и р о в а т ь с я


[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: PUVer, SirNikolas, Ty3uK  
Форум о Warcraft 3 » Раздел для картостроителей » GUI / Jass » [Вопрос] Не работает массовый дамаг (Триггерный спелл на урон пикнутым юнитам)
[Вопрос] Не работает массовый дамаг
FatalBladeДата: Пятница, 28 Декабря 2012, 16:51:44 | Сообщение # 1
10 уровень
Группа: Проверенные
Сообщений: 1523
Награды: 0
Репутация: 439
Блокировки:
У меня тут 2 проблемы.
1) Есть скилл на основе Slow Aura (как у торнадо), который триггерно даётся и удаляется. Я выставил ему вот такие возможные цели:
enemies,ground,invulnerable,notself,vulnerable
Но он почему то действует на союзников. Хотя в других случаях, с другими спеллами, такая же замедлялка с такими же параметрами действует только на врагов.

2) Обычный триггерный спелл, который при включение периодически замедляет и дамажть близжаших врагов, в течение 30 секунд. Но почему то, то ли юниты не пикаются, то ли урон не наносится, но факт в том, что урона нету ВООБЩЕ.


 

SirNikolasДата: Пятница, 28 Декабря 2012, 17:55:55 | Сообщение # 2
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
Код
//globals
    //constant group udg_G = CreateGroup()
//endglobals

constant function BattleOrder_Spell takes nothing returns integer
    return 'A0BE'
endfunction

constant function BattleOrder_Ability takes nothing returns integer
    return 'A04T'
endfunction

constant function BattleOrder_DummyId takes nothing returns integer
    return 'hkni'
endfunction

constant function BattleOrder_Effect takes nothing returns string
    return "war3mapImported\\BattleCryCaster.mdx"
endfunction

constant function BattleOrder_LoopEffect takes nothing returns string
    return "Abilities\\Spells\\Human\\ThunderClap\\ThunderClapCaster.mdl"
endfunction

constant function BattleOrder_Range takes nothing returns real
    return 200.
endfunction

constant function BattleOrder_Tacts takes nothing returns integer
    return 30
endfunction

constant function BattleOrder_Period takes nothing returns real
    return 1.
endfunction

constant function BattleOrder_Delay takes nothing returns real
    return .3
endfunction

function BattleOrder_Damage takes integer n returns real
    //1 => 10
    //2 => 11.5
    //3 => 13.5
    //4 => 16
    //etc
    local real d = (n - 1) * .5
    return d * (2.5 + d) + 10.
endfunction

function Trig_Battle_Orders_Conditions takes nothing returns boolean
    return GetSpellAbilityId() == BattleOrder_Spell()
endfunction

function SeismicDamagingFilter takes nothing returns boolean
    return GetOwningPlayer(GetFilterUnit()) != Player(PLAYER_NEUTRAL_PASSIVE) and GetWidgetLife(GetFilterUnit()) > .405 and IsUnitType(GetFilterUnit(), UNIT_TYPE_STRUCTURE) == false
endfunction

function BOLooping takes nothing returns nothing
    local timer t = GetExpiredTimer()
    local integer id = GetHandleId(t)
    local unit u = LoadUnitHandle(udg_Hash, id, 0)
    local unit ud = LoadUnitHandle(udg_Hash, id, 1)
    local integer c = LoadInteger(udg_Hash, id, 2)
    local real d = LoadReal(udg_Hash, id, 3)
    local unit uc
    local player p1 = GetOwningPlayer(u)
    local player p2
    local real x = GetWidgetX(u)
    local real y = GetWidgetY(u)
    call SetUnitPosition(ud, x, y)
    call GroupEnumUnitsInRange(udg_G, x, y, BattleOrder_Range(), Filter(function SeismicDamagingFilter))
    loop
        set uc = FirstOfGroup(udg_G)
        exitwhen uc == null
        call GroupRemoveUnit(udg_G, uc)
        set p2 = GetOwningPlayer(uc)
        if p2 != p1 and IsPlayerEnemy(p1, p2) then
            call UnitDamageTarget(ud, uc, d, true, false, ATTACK_TYPE_MAGIC, DAMAGE_TYPE_FORCE, null)
        endif
    endloop
    call DestroyEffect(AddSpecialEffectTarget(BattleOrder_LoopEffect(), u, "origin"))
    call SaveInteger(udg_Hash, id, 2, c + 1)
    if c > BattleOrder_Tacts() or GetWidgetLife(u) <= .405 then
        call UnitRemoveAbility(u, BattleOrder_Ability())
        call RemoveUnit(ud)
        call PauseTimer(t)
        call DestroyTimer(t)
        call FlushChildHashtable(udg_Hash, id)
    endif
    set t = null
    set ud = null
    set u = null
    set p1 = null
    set p2 = null
endfunction

function BOBuff takes nothing returns nothing
    local timer t = GetExpiredTimer()
    local integer id = GetHandleId(t)
    local unit u = LoadUnitHandle(udg_Hash, id, 0)
    local unit ud = CreateUnit(GetOwningPlayer(u), BattleOrder_DummyId(), GetWidgetX(u), GetWidgetY(u), .0)
    call DestroyEffect(AddSpecialEffectTarget(BattleOrder_Effect(), u, "origin"))
    call UnitAddAbility(u, BattleOrder_Ability())
    call SaveAgentHandle(udg_Hash, id, 1, ud)
    call SaveInteger(udg_Hash, id, 2, 1)
    call TimerStart(t, BattleOrder_Period(), true, function BOLooping)
    set t = null
    set u = null
    set ud = null
endfunction

function Trig_Battle_Orders_Actions takes nothing returns nothing
    local timer t = CreateTimer()
    local integer id = GetHandleId(t)
    local unit u = GetTriggerUnit()
    local integer l = GetUnitAbilityLevel(u, BattleOrder_Spell())
    call SaveAgentHandle(udg_Hash, id, 0, u)
    call SaveReal(udg_Hash, id, 3, BattleOrder_Damage(l))
    call TimerStart(t, BattleOrder_Delay(), false, function BOBuff)
    set t = null
    set u = null
endfunction

function InitTrig_Battle_Orders takes nothing returns nothing
    local trigger t = CreateTrigger()
    local unit u = CreateUnit(Player(15), BattleOrder_DummyId(), .0, .0, .0)
    call TriggerRegisterAnyUnitEventBJ(t, EVENT_PLAYER_UNIT_SPELL_EFFECT)
    call TriggerAddCondition(t, Condition(function Trig_Battle_Orders_Conditions))
    call TriggerAddAction(t, function Trig_Battle_Orders_Actions)
    call Preload(BattleOrder_Effect())
    call Preload(BattleOrder_LoopEffect())
    call UnitAddAbility(u, BattleOrder_Ability())
    call RemoveUnit(u)
    set t = null
    set u = null
endfunction
Вот, немного поправил. Если не будет работать, расставь дебаги, выводи значения переменных.


 

lawsonДата: Пятница, 28 Декабря 2012, 19:04:41 | Сообщение # 3
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
Цитата (FatalBlade)
local trigger t = CreateTrigger(  )

всегда этого не понимал - зачем создавать лок триггер если глоб триггер сам по себе создается?
Или ты используешь вжасс и удаляешь глоб триггеры?


Nic nie wiem bo mam chuj.
редактирую посты! ВСЕ!
 

FatalBladeДата: Пятница, 28 Декабря 2012, 19:17:22 | Сообщение # 4
10 уровень
Группа: Проверенные
Сообщений: 1523
Награды: 0
Репутация: 439
Блокировки:
Цитата (lawson)
всегда этого не понимал - зачем создавать лок триггер если глоб триггер сам по себе создается?
Или ты используешь вжасс и удаляешь глоб триггеры?

Потому что нету этого глобального триггера. Нету у меня gg_trg_TriggerName. Триггер создаётся только в том случае, если выбран герой, который этот спелл использует, и выбран спелл (у меня спеллы героям выбираются), который запускает этот триггер. Это сделано для оптимизации. У меня так со всем Триггерными спеллами.

SirNikolas, А почему мой вариант не работал? У меня так добрая половина спелов сделана :)




Сообщение отредактировал FatalBlade - Пятница, 28 Декабря 2012, 19:20:00
 

SirNikolasДата: Пятница, 28 Декабря 2012, 19:21:40 | Сообщение # 5
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
Цитата (lawson)
Или ты используешь вжасс и удаляешь глоб триггеры?
cJass*
Да и это, по идее, оптимизатор должен делать.
Цитата (FatalBlade)
Это будет работать в обычном ВЕ?
Будет. Надо только создать глобальную группу udg_G и закомментировать первые три строки (а, они уже закомментированы).
Кстати, я тебе там формулу на урон вывел.




Сообщение отредактировал SirNikolas - Пятница, 28 Декабря 2012, 19:27:51
 

FatalBladeДата: Пятница, 28 Декабря 2012, 19:24:13 | Сообщение # 6
10 уровень
Группа: Проверенные
Сообщений: 1523
Награды: 0
Репутация: 439
Блокировки:
Цитата (SirNikolas)
IsPlayerEnemy(p1, p2)

IsPlayerEnemy(p1, p2) != not(IsPlayerAlly(p1, p2)) :)


 

SirNikolasДата: Пятница, 28 Декабря 2012, 19:27:05 | Сообщение # 7
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
Я подумал, у тебя нейтралов нет.
И да, в функции действий убери локалку l и сразу подставь уровень способности в _Damage.


 

FatalBladeДата: Пятница, 28 Декабря 2012, 19:27:12 | Сообщение # 8
10 уровень
Группа: Проверенные
Сообщений: 1523
Награды: 0
Репутация: 439
Блокировки:
Цитата (SirNikolas)
Кстати, я тебе там формулу на урон вывел.

o_O действительно :) Я всегда ломал голову, как её записать НЕ циклом :)

А зачем все константные значения выводить в отдельные функции?

Но мне всё же интересно почему не работало? У меня вседь большая часть триггеров так сделана, и всё норм.
Возможно из-за этого?
call UnitDamageTarget(ud, uc, d, true, false, ATTACK_TYPE_MAGIC, DAMAGE_TYPE_FORCE, null)
Но у меня так же везде WEAPON_TYPE_WHOKNOWS, и всё норм.

Вообщем спс




Сообщение отредактировал FatalBlade - Пятница, 28 Декабря 2012, 19:39:05
 

[SeKtOR]Дата: Пятница, 28 Декабря 2012, 19:35:07 | Сообщение # 9
Группа: Проверенные
Сообщений: 1143
Награды: 0
Репутация: 1168
Блокировки:
Можно и через cJass дефайны(в некоторых случаях), можно и через глобальные переменные, как тебе удобно. По сабжу для настройки

 

SirNikolasДата: Пятница, 28 Декабря 2012, 19:42:36 | Сообщение # 10
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
Цитата (FatalBlade)
Я всегда ломал голову, как её записать НЕ циклом
Смотри:

dmg(1) = 10 = 9 + 1
dmg(2) = 11.5 = dmg(1) + 1.5
dmg(3) = 13.5 = dmg(2) + 2
dmg(4) = 16 = dmg(3) + 2.5
dmg(5) = 19 = dmg(4) + 3
...

Замечаем, что разности составляют арифметическую прогрессию. Тогда
dmg(1) = base + diff(1)
dmg(2) = dmg(1) + diff(2) = base + diff(1) + diff(2)
dmg(3) = dmg(2) + diff(3) = base + diff(1) + diff(2) + diff(3)
...
dmg(n) = dmg(n - 1) + diff(n) = base + diff(1) + ... + diff(n)

(diff(1) + ... + diff(n)) - это сумма первых n членов арифметической прогрессии, вычисляется по формуле: S = (2 * a1 + (n - 1) * d) / 2 * n.
Цитата (FatalBlade)
А зачем все константные значения выводить в отдельные функции?
Цитата (|SeKtOR|)
для настройки

Цитата (|SeKtOR|)
Можно и через cJass-дефайны (в некоторых случаях), можно и через глобальные переменные, как тебе удобно.
FatalBlade пишет на JASS2, так что ему не подходит ни один из этих двух вариантов.
Цитата (FatalBlade)
null
Нет, это я просто, чтоб короче было. Ты там что-то с таймерами после задержки мудрил.


 

FatalBladeДата: Пятница, 28 Декабря 2012, 19:51:36 | Сообщение # 11
10 уровень
Группа: Проверенные
Сообщений: 1523
Награды: 0
Репутация: 439
Блокировки:
SirNikolas, этот прирост я строил сам, знаю как работает. :) Просто я никак не мог придумать как её записать не циклом.
Это называется Факториал, не?

Цитата (SirNikolas)
Ты там что-то с таймерами после задержки мудрил.

Ну я создал новый таймер, и не ре-юзал старый, потому что не уверен насчёт того, что НЕ периодический таймер можно реюзать как периодический. Да и периодическая функция то запускалась, эффект работал. Тут дело значит либо в пикание юнитов, либо в самом нанесение урона. Хотя я не понимаю почему, ведь всё тут так просто.

И
Цитата (FatalBlade)
1) Есть скилл на основе Slow Aura (как у торнадо), который триггерно даётся и удаляется. Я выставил ему вот такие возможные цели:
enemies,ground,invulnerable,notself,vulnerable
Но он почему то действует на союзников. Хотя в других случаях, с другими спеллами, такая же замедлялка с такими же параметрами действует только на врагов.


 

SirNikolasДата: Пятница, 28 Декабря 2012, 19:55:16 | Сообщение # 12
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
Цитата (FatalBlade)
Это называется Факториал, не?
Не.
n! = 1 * 2 * 3 * ... * n
Либо рекуррентным соотношением:
0! = 1
n! = n * (n - 1)!
Код
function fact takes integer n returns integer
    local integer result = 1
    loop
        exitwhen n <= 1
        set result = result * n
        set n = n - 1
    endloop
    return result
endfunction

function fact_rcsv takes integer n returns integer
    if n <= 1 then
        return 1
    endif
    return n * fact_rcsv(n - 1)
endfunction


 

H_A_PKДата: Пятница, 28 Декабря 2012, 19:58:40 | Сообщение # 13
Быдлокодер
Группа: Проверенные
Сообщений: 2605
Награды: 1
Репутация: 822
Блокировки:
Цитата (FatalBlade)
Это называется Факториал, не?

нет
это называется геометрическая прогрессия
n=1
x=10
x = x+((0,5*(n+1)))


проклятье ляжет на любого
кто дочитает до конца
нет не дочитывай не надо
остановись ну всё капец


Сообщение отредактировал H_A_PK - Пятница, 28 Декабря 2012, 19:59:54
 

SirNikolasДата: Пятница, 28 Декабря 2012, 20:00:03 | Сообщение # 14
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
Сумма арифметической прогрессии != геометрическая прогрессия.

 

H_A_PKДата: Пятница, 28 Декабря 2012, 20:06:28 | Сообщение # 15
Быдлокодер
Группа: Проверенные
Сообщений: 2605
Награды: 1
Репутация: 822
Блокировки:
в арифмитической прогрессии разность как констанкта

Добавлено (28 Декабря 2012, 20:06:28)
---------------------------------------------
или я лох


проклятье ляжет на любого
кто дочитает до конца
нет не дочитывай не надо
остановись ну всё капец
 

FatalBladeДата: Пятница, 28 Декабря 2012, 20:07:09 | Сообщение # 16
10 уровень
Группа: Проверенные
Сообщений: 1523
Награды: 0
Репутация: 439
Блокировки:
SirNikolas, ок и последний вопрос. Ты вместо нуля, использовал 0.405
Это имеет значение?


 

SirNikolasДата: Пятница, 28 Декабря 2012, 20:10:46 | Сообщение # 17
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
Цитата (H_A_PK)
в арифмитической прогрессии разность как констанкта

Добавлено (28 Декабря 2012, 20:06:28)
---------------------------------------------
или я лох
Цитата (H_A_PK)
Быдлокодер
:)

FatalBlade, когда здоровье юнита становится равным или меньше .405, он объявляется как мертвый. Проигрывается анимация смерти, все такое, после чего жизнь ставится в ноль. В принципе, .405 - это лишняя защита от чьей-либо тупости. Вдруг кто-нибудь захочет мертвому юниту поставить жизнь в .1?
На Хайве все сравнивают с .405.


 

FatalBladeДата: Пятница, 28 Декабря 2012, 20:28:19 | Сообщение # 18
10 уровень
Группа: Проверенные
Сообщений: 1523
Награды: 0
Репутация: 439
Блокировки:
SirNikolas, ясн. Вообщем спс, ща проверю как работает. :)

Добавлено (28 Декабря 2012, 20:28:19)
---------------------------------------------
Спс большое работает :)


 

Форум о Warcraft 3 » Раздел для картостроителей » GUI / Jass » [Вопрос] Не работает массовый дамаг (Триггерный спелл на урон пикнутым юнитам)
  • Страница 1 из 1
  • 1
Поиск:

Copyright © 2006 - 2024 Warcraft3FT.info При копировании материалов c сайта ставьте, пожалуйста, активную обратную ссылку на нас • Design by gReeB04ki ©
Хостинг от uCoz