использую для отображения урона и других действий при событии получения урона
Тема
17 56
28
rsfghd
хотя я посмотрел, всё равно заготовку нужно переделывать, ибо локальный триггер то не очищается от событий)
я тупой кусок бездарного говна и лучше бы сдох, как же я ненавижу свою , на локальном триггере лишь одно событие - входа юнита на карту, а регистрация события получения урона приходится на тот же триггер, что и очищается
голова совсем замучена, почему ты меня не поправил?)
28
function TriggerRegisterEnterRectSimple takes trigger trig, rect r returns event
    local region rectRegion = CreateRegion()
    call RegionAddRect(rectRegion, r)
    return TriggerRegisterEnterRegion(trig, rectRegion, null)
endfunction
Загруженные файлы
23
rsfghd, вот вот)
а еще вопрос - зачем сделано создание region вместо просто bj initial playable map rect? Ведь есть событие enter rect, вроде как
28
EugeAl, хотя я посмотрел, всё равно заготовку нужно переделывать, ибо локальный триггер то не очищается от событий)
28
EugeAl, ивенты удаляются вместе с триггером, акшона нет, а кондишн в кэше висит. Периодическое удаление сделано с целью очищать триггер от ивентов не существующих юнитов
23
Случайно наткнулся на заготовку, понравилась. Примерно понимаю , как на jass её переписать.
Но есть вопрос - в функции Regist_3 для убитых юнитов используется удаление их триггеров. Ок, а как быть с утечками event при регистрации событий в функции regist? Event нельзя удалить, к сожалению, а если будет куча юнитов, накопится куча утечек
какая-то кривая ерунда
Тема
9 689
38
Сделал генерацию смешных бошек- аватаров с помощью 9 точек безье, зерно взял как crc32 от юзернейма xgm.guru/users?sort=register
10
Простите за некропост, выражаю автору благодарочку за скилл. Переписал через хэш без триггерслипа, прилепил урон и вывел в одну функцию, заменил юнита на эффект (для UjPI)
Пример использования: call RocketStrike(caster, x, y, "Abilities\\Weapons\\BansheeMissile\\BansheeMissile.mdl", ammout, dmg, 50., 200., DAMAGE_TYPE_FIRE)
код
// проверка способности
function Trig_MilionGhost_Conditions takes nothing returns boolean
    return GetSpellAbilityId() == 'A026'
endfunction

//движение
function MilionGhostMove takes nothing returns nothing
    local timer t = GetExpiredTimer()
    local integer h = GetHandleId(t)
    local unit GT = LoadUnitHandle(hash, h, 1)
    local effect eff = LoadEffectHandle(hash, h, 2)
    local real startx = LoadReal(hash, h, 3)
    local real starty = LoadReal(hash, h, 4)
    local real startz = LoadReal(hash, h, 5)
    local real midx = LoadReal(hash, h, 6)
    local real midy = LoadReal(hash, h, 7)
    local real midz = LoadReal(hash, h, 8)
    local real endx = LoadReal(hash, h, 9)
    local real endy = LoadReal(hash, h, 10)
    local real endz = LoadReal(hash, h, 11)
    local real time = LoadReal(hash, h, 12)
    local real maxTime = LoadReal(hash, h, 13)
    local real x
    local real y
    local real z
    local real dmg = LoadReal(hash, h, 14)
    local real rng = LoadReal(hash, h, 15)
    local group g 
    local unit un
    local damagetype dmgtype = LoadDamageTypeHandle(hash, h, 16)
    //-------------
    set x = startx + ( ( 2.00 * ( midx - startx ) ) + ( startx - 2.00 * midx + endx ) * time ) * time
    set y = starty + ( ( 2.00 * ( midy - starty ) ) + ( starty - 2.00 * midy + endy ) * time ) * time
    set z = startz + ( ( 2.00 * ( midz - startz ) ) + ( startz - 2.00 * midz + endz ) * time ) * time
    //-------------
    call SetSpecialEffectX(eff, x)
    call SetSpecialEffectY(eff, y)
    call SetSpecialEffectZ(eff, z - GetAxisZ(x, y))
    set time = time + 0.025 / maxTime
    //-------------
    if time >= 1.00 then
        call DestroyEffect(eff)
        call FlushChildHashtable(hash, h)
        call DestroyTimer(t)
        // наносим урон
        //---------------------------
        set g = CreateGroup()
        call GroupEnumUnitsInRange(g, x, y, rng, null)
        loop
            set un = FirstOfGroup(g)
            exitwhen un == null
            if IsUnitEnemy(un, GetOwningPlayer(GT)) and not IsUnitType(un, UNIT_TYPE_DEAD) and not IsUnitType(un, UNIT_TYPE_STRUCTURE) then
               call UnitDamageTarget(GT, un, dmg, true, false, ATTACK_TYPE_NORMAL, dmgtype, WEAPON_TYPE_WHOKNOWS)
                //call DestroyEffect(AddSpecialEffectTarget("Abilities\\Spells\\Human\\ManaFlare\\ManaFlareBoltImpact.mdl", un , "orign"))
            endif
            call GroupRemoveUnit(g, un)
        endloop
        call DestroyGroup(g)
        //----------------------------
    else 
        call SaveReal(hash, h, 12, time)
    endif 
    
    //-------------
    set g = null 
    set un = null
    set eff = null
    set GT = null 
    set t = null
    set dmgtype = null
endfunction



// создание эффектов
function MilionGhostCreate takes nothing returns nothing
    local timer t = GetExpiredTimer()
    local integer h = GetHandleId(t)
    local unit GT = LoadUnitHandle(hash, h, 1)
    local integer AmountRocket = LoadInteger(hash, h, 2)
    local real x = LoadReal(hash, h, 3) // центр конечной области
    local real y = LoadReal(hash, h, 4)// центр конечной области
    local timer t1
    local integer h1
    local effect eff
    local real xstart = GetUnitX(GT)
    local real ystart = GetUnitY(GT)
    local real zstart = GetAxisZ(xstart, ystart) + 50
    local real xend //конечная точка способности
    local real yend //конечная точка способности
    local real zend //конечная точка способности
    local real angle
    local real distance
    local real midx // средняя точка способности
    local real midy // средняя точка способности
    local real midz // средняя точка способности
    local real time 
    local real maxtime
    local real Scatter = LoadReal(hash, h, 8)
    local damagetype dmgtype = LoadDamageTypeHandle(hash, h, 9)
    //-------------
    
    if AmountRocket > 0 then
        call SaveInteger(hash, h, 2, AmountRocket-1)
        set t1 = CreateTimer()
        set h1 = GetHandleId(t1)
        //---------       
        set eff = AddSpecialEffect(LoadStr(hash, h, 5), xstart, ystart)
        call SetSpecialEffectZ(eff, zstart)
        
        //высчитываем начало и конец
        set xend = x + GetRandomReal( -Scatter, Scatter ) * Cos( GetRandomReal( 0.00, 360.00 ) * bj_DEGTORAD ) 
        set yend = y + GetRandomReal( -Scatter, Scatter ) * Sin( GetRandomReal( 0.00, 360.00 ) * bj_DEGTORAD )
        set zend = GetAxisZ(xend, yend)
        set angle     = Atan2( yend - ystart, xend - xstart )
        set distance  = SquareRoot( ( xend - xstart ) * ( xend - xstart ) + ( yend - ystart ) * ( yend - ystart ) )
        
        //высчитываем середину
        set midx = xstart + ( distance / 2 ) * Cos( angle + GetRandomReal( -90.00, 90.00 ) * bj_DEGTORAD )
        set midy = ystart + ( distance / 2 ) * Sin( angle + GetRandomReal( -90.00, 90.00 ) * bj_DEGTORAD )
        set midz = GetAxisZ( midx, midy )
        
        // проверка на высоты
        if zstart < zend then
            set midz = midz + zend
        else
            set midz = midz + zstart
        endif
        
        set midz = midz + distance
        
        // время 
        set time = 0
        set maxtime = distance * ( 0.025 / 10.00 )
        
        // всё сохраняем
        call SaveUnitHandle(hash, h1, 1, GT)
        call SaveEffectHandle(hash, h1, 2, eff)
        call SaveReal(hash, h1, 3, xstart)
        call SaveReal(hash, h1, 4, ystart)
        call SaveReal(hash, h1, 5, zstart)
        call SaveReal(hash, h1, 6, midx)
        call SaveReal(hash, h1, 7, midy)
        call SaveReal(hash, h1, 8, midz)
        call SaveReal(hash, h1, 9, xend)
        call SaveReal(hash, h1, 10, yend)
        call SaveReal(hash, h1, 11, zend)
        call SaveReal(hash, h1, 12, time)
        call SaveReal(hash, h1, 13, maxtime)
        call SaveReal(hash, h1, 14, LoadReal(hash, h, 6))
        call SaveReal(hash, h1, 15, LoadReal(hash, h, 7))
        call SaveDamageTypeHandle(hash, h1, 16, dmgtype)
        
        //стартуем
        call TimerStart( t1, 0.025, true, function MilionGhostMove )
        //---------
    else 
        call FlushChildHashtable(hash, h)
        call DestroyTimer(t)
    endif 
    //-------------
    set eff = null
    set t1 = null
    set GT = null 
    set t = null
    set dmgtype = null
endfunction

// функция ракетной атаки
function RocketStrike takes unit GT, real x, real y, string RocketEff, integer AmountRocket, real RocketDmg, real RocketScatter1, real RocketScatterMax, damagetype dmgtype returns nothing
    local timer t = CreateTimer()
    local integer h = GetHandleId(t)
    //-------------------
    call SaveUnitHandle(hash, h, 1,GT)
    call SaveInteger(hash, h, 2, AmountRocket)
    call SaveReal(hash, h, 3, x)
    call SaveReal(hash, h, 4, y)
    call SaveStr(hash, h, 5, RocketEff)
    call SaveReal(hash, h, 6, RocketDmg)
    call SaveReal(hash, h, 7, RocketScatter1)
    call SaveReal(hash, h, 8, RocketScatterMax)
    call SaveDamageTypeHandle(hash, h, 9, dmgtype)
    call TimerStart(t, 0.1, true, function MilionGhostCreate)
    //-------------------
    set t = null 
endfunction

// основная функция
function Trig_MilionGhost_Actions takes nothing returns nothing
    local unit GT = GetTriggerUnit()
    local real x = GetSpellTargetX( )
    local real y = GetSpellTargetY( )
    local real dmg = 50.
    local integer kol = 10
    //-------------
    call RocketStrike(GT, x, y, "Abilities\\Weapons\\BansheeMissile\\BansheeMissile.mdl", kol, dmg, 50., 200., DAMAGE_TYPE_FIRE)
    //-------------
    set GT = null 
endfunction

//===========================================================================
function InitTrig_MilionGhost takes nothing returns nothing
    set gg_trg_MilionGhost = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_MilionGhost, EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddCondition( gg_trg_MilionGhost, Condition( function Trig_MilionGhost_Conditions ) )
    call TriggerAddAction( gg_trg_MilionGhost, function Trig_MilionGhost_Actions )
endfunction
какой-то ещё один кал
Тема
2 279
22
Очень круто. Красиво как отвечает траектория снарядов анимации мага.
2 models of confetti
Тема
3 226