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

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

Ответ
 
Cheguevara

offline
Опыт: 383
Активность:
Неправильно работает таймер.
Уже мучаюсь целый час=((

короче вот такой скил: при касте всем юнитам в радиусе хилитса некое кол-во хп и даетса зашита на 8 сек. проблема в том, что если использовать хотябы 2 таких каста бонус брони будут обнуляца по первому вышедшому таймеру=((

вот лолкод=(:

Код:
library VampHeal

     #define private cpID=0

     private integer ARMOR_BONUS=0
     private unit array u
     private integer count 

     
private boolean CastFilter () {
    return GetSpellAbilityId() == 'A008' 
}
    
private boolean FilterUnit () {
    unit un=GetSpellAbilityUnit()
    return IsUnitAlly(GetFilterUnit(), GetOwningPlayer(un)) and GetWidgetLife(GetFilterUnit())>0.405 and not IsUnitType(GetFilterUnit(),UNIT_TYPE_STRUCTURE)
}

private nothing RemoveBonus () {
    timer tm=GetExpiredTimer()
        whilenot count < 0 {
            UnitAddBonus(u[count], 0, -ARMOR_BONUS)
            u[count]=null
            count--  }
    DestroyTimer(tm)
    tm=null  
}

private nothing Action () { 
    unit cu=GetSpellAbilityUnit()
    unit tu
    integer m=GetHeroLevel(cu)*200
    group gr=CreateGroup()
    boolexpr b=Condition(function FilterUnit)
    timer tm=CreateTimer()
    integer p=GetPlayerId(GetOwningPlayer(cu))
    
    ARMOR_BONUS=GetHeroLevel(cu)*10

    if m <= GetUnitState(cu,UNIT_STATE_MANA)  {
        SetUnitState(cu,UNIT_STATE_MANA,(GetUnitState(cu,UNIT_STATE_MANA)- m))
        DestroyEffect(AddSpecialEffectTarget("Objects\\Spawnmodels\\Undead\\UndeadDissipate\\UndeadDissipate.mdl" ,cu,"origin"))
        GroupEnumUnitsInRange(gr, GetUnitX(cu), GetUnitY(cu), 600+25*GetHeroLevel(cu), b)
        loop
            set tu=FirstOfGroup(gr)
            exitwhen tu==null
            if tu != cu {
                u[count]=tu
                DestroyEffect(AddSpecialEffectTarget("Objects\\Spawnmodels\\Orc\\Orcblood\\OrdBloodWyvernRider.mdl" ,tu,"origin"))
                UnitAddBonus(tu, 0, ARMOR_BONUS)
                Heal(tu,GetHeroLevel(cu)*750)
                GroupRemoveUnit(gr,tu)
            else
                u[count]=tu
                UnitAddBonus(tu, 0, ARMOR_BONUS)
                Heal(tu,GetHeroLevel(cu)*750)
                GroupRemoveUnit(gr,tu) }
            count++
        endloop         
        TimerStart(tm, 8., false, function RemoveBonus)
    else
        SimError(GetOwningPlayer(cu),"There is not enought mana")
        IssueImmediateOrder(cu,"stop") 
    }
    call DestroyBoolExpr(b)
    call DestroyGroup(gr)
    set cu=null
    set gr=null
    set b=null
}
    
//==== Init Trigger VH ====
nothing InitTrig_VampHeal () {
    local trigger tr = CreateTrigger()
    call TriggerRegisterAnyUnitEventBJ(tr, EVENT_PLAYER_UNIT_SPELL_EFFECT)
    call TriggerAddCondition(tr, Condition(function CastFilter))
    call TriggerAddAction(tr, function Action)
    set tr=null
}

endlibrary


помогите плззз=) ато я не усну=) можно в любом исполнении=) разберусь если что=)

Отредактировано Cheguevara, 01.03.2010 в 00:18.
Старый 28.02.2010, 23:43
ZeToX2007

offline
Опыт: 7,009
Активность:
А ты уверен, что у тебя функция UnitAddBonus правильно работает ???

ZeToX2007 добавил:
И тут нет почти экстрассенсов, объясни, какие аргументы принимает UnitAddBonus.

И почему во втором стоит везде 0 ?

Отредактировано ZeToX2007, 01.03.2010 в 00:37.
Старый 01.03.2010, 00:27
Cheguevara

offline
Опыт: 383
Активность:
эм...[vJass]BonusMod
какбы проблма не в этих функциях. проблема иммено в таймире=( при 2 и более одновременных кастах с одних юнитов не снимаетса бонус зашиты=( или снимаетса по первому истекшему таймеру=(
Старый 01.03.2010, 00:38
ZeToX2007

offline
Опыт: 7,009
Активность:
Значит так:

Сделай структуру

struct bonus{
group g
integer br
}

Далее в начале..

bonus b = bonus.create()

Потом заносим всех юнитов в округе в эту группу... и к br присваиваем значение защиты, которую мы присвоили.

Сохраняем так:

SaveInteger(HT, GetHandleId(tm), 1, b)
...

дальше в функции RemoveBonus ->

bonus b = LoadInteger(HT, GetHandleId(tm), 1)
Ещё глобалка нужна к примеру integer BON = 0
присваиваем BON = b.br...

Потом работай с группой b.g.

И снижаешь всем бонус на BON.

В конце незабудь удалить структуру.. и почистить ХешТаблицу
Старый 01.03.2010, 00:49
Cheguevara

offline
Опыт: 383
Активность:
ХэшТаблицу надо создавать?
ато я хэш не юзал=)

Cheguevara добавил:
слушай, если не сложно, модешь плз вылодить код.
я хоть посмотрю, разбирусь=)
Старый 01.03.2010, 01:13
ZeToX2007

offline
Опыт: 7,009
Активность:
Придётся делать с нуля... если кинишь свой, я доделаю, имею ввиду карту, где этот спелл используюется, вслепую не рискну...
Старый 01.03.2010, 01:30
Cheguevara

offline
Опыт: 383
Активность:
карта изза импорта много весит - 2.5 МБ=(
ладно, ша буду мануалы читать=)
это через структуры и хэш делаетса все?
Старый 01.03.2010, 01:35
ZeToX2007

offline
Опыт: 7,009
Активность:
Цитата:
Сообщение от Cheguevara
private nothing RemoveBonus () {
timer tm=GetExpiredTimer()
whilenot count < 0 {
UnitAddBonus(u[count], 0, -ARMOR_BONUS)
u[count]=null
count-- }
DestroyTimer(tm)
tm=null
}



сам посуди, чему должна равнятся переменная ARMOR_BONUS ? это глобальная переменная, которая может измениться несколько раз за время истечения таймера
Старый 01.03.2010, 02:00
Cheguevara

offline
Опыт: 383
Активность:
блин, и про это я забыл=(

короче, я понаделал всякого, смотри:

Код:
library VampHeal

    private integer bon

private struct bonus {
    group g
    integer br
}
     
private boolean CastFilter () {
    return GetSpellAbilityId() == 'A008' 
}
    
private boolean FilterUnit () {
    unit un=GetSpellAbilityUnit()
    return IsUnitAlly(GetFilterUnit(), GetOwningPlayer(un)) and GetWidgetLife(GetFilterUnit())>0.405 and not IsUnitType(GetFilterUnit(),UNIT_TYPE_STRUCTURE)
}

//private nothing RemoveBonus () {
//    timer tm=GetExpiredTimer()
//    unit u
//    bonus b = LoadInteger(HT, GetHandleId(tm), 1)
//        whilenot u = null {
//            FirstOfGroup(b.g)==u
//            UnitAddBonus(u, 0, -b.br)
//            GroupRemoveUnit(u) 
//     }                                   
//    DestroyTimer(tm)
//    tm=null
//    bonus.destroy (b)
//}

private nothing Action () {
    bonus b=bonus.create()
    unit cu=GetSpellAbilityUnit()
    unit tu
    integer m=GetHeroLevel(cu)*200
    b.g=CreateGroup()
    boolexpr bex=Condition(function FilterUnit)
    timer tm=CreateTimer()
    integer p=GetPlayerId(GetOwningPlayer(cu))
    
    b.br=GetHeroLevel(cu)*10

    if m <= GetUnitState(cu,UNIT_STATE_MANA)  {
        SetUnitState(cu,UNIT_STATE_MANA,(GetUnitState(cu,UNIT_STATE_MANA)- m))
        DestroyEffect(AddSpecialEffectTarget("Objects\\Spawnmodels\\Undead\\UndeadDissipate\\UndeadDissipate.mdl" ,cu,"origin"))
        GroupEnumUnitsInRange(b.g, GetUnitX(cu), GetUnitY(cu), 600+25*GetHeroLevel(cu), bex)
        b.br=ARMOR_BONUS
        loop
            set tu=FirstOfGroup(b.g)
            exitwhen tu==null
            if tu != cu {
                DestroyEffect(AddSpecialEffectTarget("Objects\\Spawnmodels\\Orc\\Orcblood\\OrdBloodWyvernRider.mdl" ,tu,"origin"))
                UnitAddBonus(tu, 0, b.br)
                Heal(tu,GetHeroLevel(cu)*750)
                GroupRemoveUnit(b.g,tu)
            else
                UnitAddBonus(tu, 0, b.br)
                Heal(tu,GetHeroLevel(cu)*750)
                GroupRemoveUnit(b.g,tu) }
        endloop
        SaveInteger(HT, GetHandleId(tm), 1, b)
//        TimerStart(tm, 8., false, function RemoveBonus)
    else
        SimError(GetOwningPlayer(cu),"There is not enought mana")
        IssueImmediateOrder(cu,"stop") 
    }
    call DestroyBoolExpr(bex)
    call DestroyGroup(b.g)
    set cu=null
    set b.g=null
    set bex=null
}
    
//==== Init Trigger VH ====
nothing InitTrig_VampHeal () {
    local trigger tr = CreateTrigger()
    call TriggerRegisterAnyUnitEventBJ(tr, EVENT_PLAYER_UNIT_SPELL_EFFECT)
    call TriggerAddCondition(tr, Condition(function CastFilter))
    call TriggerAddAction(tr, function Action)
    set tr=null
}

endlibrary


но почему-то функция RemoveBonus стала выдавать ситакс еррор на строке "FirstOfGroup(b.g)==u" оО если их выключить все робит.
Старый 01.03.2010, 02:06
ZeToX2007

offline
Опыт: 7,009
Активность:
FirstOfGroup(b.g)==u <---------- Это что такое ??! точнее где это стоит ?

ZeToX2007 добавил:
а вообще надо:

integer BON = 0




void Remove()
{
UnitAddBonus(GetEnumUnit(), 0, -BON)
}




private nothing RemoveBonus () {
timer tm=GetExpiredTimer()
bonus b = LoadInteger(HT, GetHandleId(tm), 1)
BON = b.br
ForGroup(b.g,function Remove)

DestroyTimer(tm)
tm=null
bonus.destroy (b)
}

ZeToX2007 добавил:
и ещё группу удалить..
Старый 01.03.2010, 02:24
Cheguevara

offline
Опыт: 383
Активность:
в функции RemoveBonus =))
ну вибираю каждого юнита в группе и делаю через цикл действия=)
Старый 01.03.2010, 02:25
ZeToX2007

offline
Опыт: 7,009
Активность:
ну я уже показ пример, вообще надо ставить не == а одно и вообще вот так:

u = FirstOfGroup(b.g)
Старый 01.03.2010, 02:29
Cheguevara

offline
Опыт: 383
Активность:
УХУХУ, спс тебе=))
все заработало=)
вот конечный код:

Код:
library VampHeal

    private integer bon

private struct bonus {
    group g
    integer br
}
     
private boolean CastFilter () {
    return GetSpellAbilityId() == 'A008' 
}
    
private boolean FilterUnit () {
    unit un=GetSpellAbilityUnit()
    return IsUnitAlly(GetFilterUnit(), GetOwningPlayer(un)) and GetWidgetLife(GetFilterUnit())>0.405 and not IsUnitType(GetFilterUnit(),UNIT_TYPE_STRUCTURE)
}

private nothing AddBonus () {
    unit u=GetSpellAbilityUnit()
    DestroyEffect(AddSpecialEffectTarget("Objects\\Spawnmodels\\Orc\\Orcblood\\OrdBloodWyvernRider.mdl" ,GetEnumUnit(),"origin"))
    UnitAddBonus(GetEnumUnit(), 0, GetHeroLevel(u)*10)
    Heal(GetEnumUnit(),GetHeroLevel(u)*750)
}

private nothing Remove() {
    UnitAddBonus(GetEnumUnit(), 0, -bon)
}

private nothing RemoveBonus () {
    timer tm=GetExpiredTimer()
    bonus b = LoadInteger(HT, GetHandleId(tm), 1)
    bon = b.br
    ForGroup(b.g,function Remove)
    DestroyTimer(tm)
    DestroyGroup(b.g)
    b.g=null
    tm=null
    bonus.destroy (b)
}

private nothing Action () {
    bonus b=bonus.create()
    unit cu=GetSpellAbilityUnit()
    unit tu
    integer m=GetHeroLevel(cu)*200
    boolexpr bex=Condition(function FilterUnit)
    timer tm=CreateTimer()
    integer p=GetPlayerId(GetOwningPlayer(cu))
    
    b.g=CreateGroup()
    b.br=GetHeroLevel(cu)*10

    if m <= GetUnitState(cu,UNIT_STATE_MANA)  {
        SetUnitState(cu,UNIT_STATE_MANA,(GetUnitState(cu,UNIT_STATE_MANA)- m))
        DestroyEffect(AddSpecialEffectTarget("Objects\\Spawnmodels\\Undead\\UndeadDissipate\\UndeadDissipate.mdl" ,cu,"origin"))
        GroupEnumUnitsInRange(b.g, GetUnitX(cu), GetUnitY(cu), 600+25*GetHeroLevel(cu), bex)
        ForGroup(b.g, function AddBonus)
        SaveInteger(HT, GetHandleId(tm), 1, b)
        TimerStart(tm, 8., false, function RemoveBonus)
    else
        SimError(GetOwningPlayer(cu),"There is not enought mana")
        IssueImmediateOrder(cu,"stop") 
    }
    call DestroyBoolExpr(bex)
    set cu=null
    set bex=null
}
    
//==== Init Trigger VH ====
nothing InitTrig_VampHeal () {
    local trigger tr = CreateTrigger()
    call TriggerRegisterAnyUnitEventBJ(tr, EVENT_PLAYER_UNIT_SPELL_EFFECT)
    call TriggerAddCondition(tr, Condition(function CastFilter))
    call TriggerAddAction(tr, function Action)
    set tr=null
}

endlibrary
Старый 01.03.2010, 02:47
Cheguevara

offline
Опыт: 383
Активность:
блин, еще проблема, надо создать спецэффект на юните на время повышения брони...
и создать эффект молнии от кастер к юнитам=(
Старый 01.03.2010, 10:28
XOR

offline
Опыт: 38,159
Активность:
AddSpecialEffectTarget
AddLightningEx
Где проблема?
XiMiKs добавил:
+ AngleBetweenCoords
Старый 01.03.2010, 10:41
Cheguevara

offline
Опыт: 383
Активность:
надо убрать по таймеру также как и бонусную броню..
также структуру чтолои еще 1 создавать?
Старый 01.03.2010, 10:53
ZeToX2007

offline
Опыт: 7,009
Активность:
Cheguevara, Зачем ещё струтуру ? просто в этой добавь новые переменные
Старый 01.03.2010, 17:38
Cheguevara

offline
Опыт: 383
Активность:
а как переменные на молнии создать или тоже хэш?

можешь плз наводяший код написать плзззз=)
научи=)
Старый 01.03.2010, 23:18
ZeToX2007

offline
Опыт: 7,009
Активность:
struct bonus{
group g
integer br
lightning l
}
Старый 02.03.2010, 00:12
Cheguevara

offline
Опыт: 383
Активность:
неее мне моллнию нужно через 1.5 сек унччтожить, т.е это новый таймер.
а почему молния не массив? мне же не 1 надо создавать.
Старый 02.03.2010, 01:26
Ответ

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

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

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

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



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