XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Академия: форум для вопросов> Jass
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Ответ
 
Variecs

offline
Опыт: 2,508
Активность:
Оглушение по площади
Пытаюсь создать следующую триггерную способность: строение при атаке оглушает всех в определенном радиусе от атакованной цели, кроме тех, кто в последние 6 секунд уже был оглушен этим типом строений.

Код:
function Attacker takes nothing returns boolean
    if ( GetUnitTypeId( GetAttacker() ) == 't001' ) then
        return true
    else
        return false
    endif
endfunction

function Stun takes nothing returns nothing
    call GroupAddUnit( udg_StunGroup, GetFilterUnit() )
    call CreateUnitAtLoc( GetOwningPlayer( GetAttacker() ), 'h004', GetUnitLoc( GetFilterUnit() ), bj_UNIT_FACING )
    call UnitAddAbilityBJ( 'A001', GetLastCreatedUnit() )
    call IssueTargetOrderBJ( GetLastCreatedUnit(), "creepthunderbolt", GetFilterUnit() )
    call UnitApplyTimedLifeBJ( 1.00, 'BTLF', GetLastCreatedUnit() )
    call TriggerSleepAction( 6.00 )
    call GroupRemoveUnit( udg_StunGroup, GetFilterUnit() )
endfunction

function InGroup takes nothing returns boolean
    return not IsUnitInGroup( GetFilterUnit(), udg_StunGroup )
endfunction

function Stunning_Explosion_Actions takes nothing returns nothing
    call ForGroup( GetUnitsInRangeOfLocMatching( 100, GetUnitLoc( GetTriggerUnit() ), Condition( function InGroup ) ), function Stun )
endfunction
    
//===========================================================================
function InitTrig_Stunning_Explosion takes nothing returns nothing
    set gg_trg_Stunning_Explosion = CreateTrigger()
    call TriggerRegisterAnyUnitEventBJ( gg_trg_Stunning_Explosion, EVENT_PLAYER_UNIT_ATTACKED )
    call TriggerAddCondition( gg_trg_Stunning_Explosion, Condition( function Attacker ) )
    call TriggerAddAction( gg_trg_Stunning_Explosion, function Stunning_Explosion_Actions )
endfunction


Принцип действия: отслеживаем событие атаки этим типом строений. Берём все юниты в радиусе 100 от атакованного, не принадлежащие к группе. Создаем для каждого из них дамми, даём способность стана, заставляем использовать и ставим срок жизни в 1с. Затем добавляем застаненную цель в группу, а через 6 секунд удаляем её оттуда.
Однако, вопреки ожиданиям, способность не станит никого ни при каких условиях. Какие типичные ошибки могут это вызвать?
Даже давая дамми модель, я её увидеть не могу, возможно, дамми вообще не создается.
Старый 06.06.2012, 16:52
quq_CCCP
Я белый и пушистый!
online
Опыт: 93,279
Активность:
Variecs, мб отказаться от локейшенов и БЖ функций, мб использовать не wait а не хештаблицу и таймер, то "call TriggerSleepAction( 6.00 )" не работает в функции "Stun"
Старый 06.06.2012, 16:55
Variecs

offline
Опыт: 2,508
Активность:
quq_CCCP, отказаться в пользу чего? координат?
UPD:
Цитата:
Сообщение от quq_CCCP
использовать не wait а не хештаблицу и таймер

а тут мне кажется засела очепятка
Старый 06.06.2012, 16:59
quq_CCCP
Я белый и пушистый!
online
Опыт: 93,279
Активность:
Variecs, у тебя иначе будут утечки, так как ты юзаеш координаты, так делать нельзя...
И еще нафиг и использовать БЖ функции и вейты в jass?
Старый 06.06.2012, 17:34
Variecs

offline
Опыт: 2,508
Активность:
quq_CCCP, как умеем, так и делаем D:
сейчас попробую под хештаблицу переделать, бж функции уже убрал
Старый 06.06.2012, 17:41
quq_CCCP
Я белый и пушистый!
online
Опыт: 93,279
Активность:
Variecs, сначало нужно научится а потом делать, и тогда таких тем создавать такие придётся, читай статьи.
Старый 06.06.2012, 18:02
JugHead

offline
Опыт: 1,612
Активность:
Variecs, вот пробуй:
фасткод, не проверял но должен работать.
((код jass
globals
unit temp
endglobals
function Attacker takes nothing returns boolean
return GetUnitTypeId( GetAttacker() ) == 't001'
endfunction
function InGroup takes nothing returns boolean
return not IsUnitInGroup( GetFilterUnit(), udg_StunGroup )
endfunction
function Group_clear takes nothing returns nothing
local timer t = GetExpiredTimer()
call GroupRemoveUnit(udg_StunGroup, temp)
call DestroyTimer(t)
set t = null
endfunction
function Stun takes nothing returns nothing
local timer t = CreateTimer()
local unit u = GetEnumUnit()
local unit d = CreateUnit(GetOwningPlayer(GetAttacker()), 'h004', GetUnitX(u),GetUnitY(u), 0 )
call ShowUnitHide(d)
call GroupAddUnit( udg_StunGroup, u )
call UnitAddAbility( d ,'A001' )
call UnitApplyTimedLife(d,'BTLF', 1.00)
call IssueTargetOrder( d, "creepthunderbolt", u)
set temp = u
call TimerStart(t, 6.00, false, function Group_clear)
set t = null
set d = null
endfunction
function Stunning_Explosion_Actions takes nothing returns nothing
local group g = CreateGroup()
local unit u = GetAttacker()
local unit t = GetAttackedUnitBJ()
local boolexpr b = Condition(function InGroup)
call GroupEnumUnitsInRange(g, GetUnitX(t), GetUnitY(t), 100, b)
call ForGroup(g, function Stun )
call DestroyBoolExpr(b)
call DestroyGroup(g)
set t = null
set b = null
set u = null
set g = null
endfunction

function InitTrig_Stunning_Explosion takes nothing returns nothing
set gg_trg_Stunning_Explosion = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ( gg_trg_Stunning_Explosion, EVENT_PLAYER_UNIT_ATTACKED )
call TriggerAddCondition( gg_trg_Stunning_Explosion, Condition( function Attacker ) )
call TriggerAddAction( gg_trg_Stunning_Explosion, function Stunning_Explosion_Actions )
endfunction
))
JugHead добавил:
quq_CCCP, ну тут не совсем ты прав, практика это тоже хорошо, хоть и на ошибках, но учишься :3
ведь знать теорию недостаточно чтобы уметь что-то делать :)

Отредактировано JugHead, 06.06.2012 в 18:22.
Старый 06.06.2012, 18:16
ScorpioT1000
Работаем
offline
Опыт: отключен
function Attacker takes nothing returns boolean
    if ( GetUnitTypeId( GetAttacker() ) == 't001' ) then
        return true
    else
        return false
    endif
endfunction
Так писать неправильно.
Правильно так:
function Attacker takes nothing returns boolean
    if ( GetUnitTypeId( GetAttacker() ) == 't001' ) then
        if not ( GetUnitTypeId( GetAttacker() ) != 't001' ) then
            return true
        else
            return false
        endif
    else
        if not GetUnitTypeId( GetAttacker() ) == 't001' ) then
            return false
        else
            return true
        endif
    endif
endfunction
» ?
На самом деле так:
function IsAttacker takes nothing returns boolean
    return GetUnitTypeId( GetAttacker() ) == 't001'
endfunction
Старый 06.06.2012, 18:20
JugHead

offline
Опыт: 1,612
Активность:
ScorpioT1000, точно забыл кодишн подправить :D
Старый 06.06.2012, 18:21
Faion
Noblesse Oblige
offline
Опыт: 30,395
Активность:
Надергал из разных библиотек своих, могут быть ошибки.
» тык

#define SPELL_DUMMY = ''
#define STUN_ID = ''

private  unit tempUnit = null;
    
    private bool GetEnemyInRange_Filter()
    {
        return IsUnitEnemy(GetFilterUnit(),GetOwningPlayer(tempUnit)) && !IsUnitType(GetFilterUnit(),UNIT_TYPE_DEAD)
    }

    
    group GetEnemyInRangeByCoords(unit u,float x, float y, float r)
    {
        tempUnit = u;
        group g = CreateGroup() 
        GroupEnumUnitsInRange(g,GetUnitX(tempUnit),GetUnitY(tempUnit),r,Filter(function GetEnemyInRange_Filter))
        tempUnit = null;
        return g
    }

void CastToTarget(unit u, unit t, real x, real y, integer a, int l, string o)
{
    unit d = CreateUnit(GetOwningPlayer(u),SPELL_DUMMY,x,y,0)
    UnitAddAbility(d,a)
    SetUnitAbilityLevel(d,a,l)
    IssueTargetOrder(d,o,t)
    UnitApplyTimedLife(d, 'BTLF',1.0)
    d = null
}

void StunUnit(unit uc, unit u, float stun_time)
    {
        CastToTarget(uc,u,GetUnitX(u),GetUnitY(u), STUN_ID,R2I(stun_time*10),"thunderbolt")
    }

void StunEnemyArea(unit uc, float x, float y, float range, float time)
    {
        group g = GetEnemyInRangeByCoords(uc,x,y,range)
        loop
        {
            unit u = FirstOfGroup(g)
            exitwhen u == null
            StunUnit(uc,u,time)
            GroupRemoveUnit(g,u)
            u = null
        }
        DestroyGroup(g)
        g = null
    }
Старый 06.06.2012, 18:38
Variecs

offline
Опыт: 2,508
Активность:
Интересно, каким образом я должен учиться, если понятия иметь не буду, в чём я не прав? -_-
Дамми не появлялись из-за GetFilterUnit, а то кривое условие - в таком виде его генерирует гуи, а я его не переделал.
UPD:
Faion, что это за смесь синтаксиса джасса и с++? о.О UPD#2: cJass чтоли? я им не пользовался просто
JugHead, внёс исправления соответственно твоему примеру, работает, всем спасибо.

Отредактировано Variecs, 06.06.2012 в 19:46.
Старый 06.06.2012, 19:23
Msey
????
offline
Опыт: 67,346
Активность:
это cjass
call IssueTargetOrderBJ( GetLastCreatedUnit(), "creepthunderbolt", GetFilterUnit() )
эта строка скорее всего не позволяет застанить юнитов
"creepthunderbolt"
используй "thunderbolt"
и фильтрюниты напрягают

Отредактировано Nerevar, 06.06.2012 в 20:28.
Старый 06.06.2012, 19:44
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы можете скачивать файлы

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 08:52.