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

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

Закрытая тема
 
respect_gg

offline
Опыт: 3,950
Активность:
Произвести действие функции
Всем здрасьте.
Передо мной встала такая проблема, точнее не совсем проблема, но суть не в этом. Приведу пример и станет все ясно, я надеюсь. У меня есть множество заклинаний, а так же готовых идей, в которых эффект практически похож - вешается бафф/дебафф на союзника и на противника соответственно, эффекты разные - нанесение увс, увеличение макс. запаса здоровья, здоровья/сек. и т.д. Так вот, мне уже порядком поднадоело каждый раз писать одно и тоже, а точнее все эти функции по добавлению/удалению баффов и т.д. И я подумал, можно сделать одну общую функцию, которая будет добавлять бафф и удалять его через то время, которое необходимо. Но тут встала вот такая проблема - ведь по сути в большинстве случаях мне еще нужно проводить некоторые действия с этим баффом/дэбаффом например каждую секунду. Вот тут и главный вопрос - как реализовать вот такое действие (примерное)
Например юнит кастует на противника магию, вешается дэбафф на нанесение увс, через функцию я вешаю тот самый дэбафф, но как мне еще наносить ему ежесекундный урон? Не писать же мне действие по нанесению урона в универсальной функции (напомню это та, которая вешает дэбафф), получится слишком громоздко и чрезвычайно неудобно.
Я не прошу написать за меня это все, я прошу, чтобы вы мне подсказали в каком направлении мне двигаться, ну и если кто может поделитесь чем то связанным с этим.
Буду крайне благодарен.
Старый 10.11.2012, 15:44
quq_CCCP
Я белый и пушистый!
offline
Опыт: 93,279
Активность:
respect_gg, ну наносить урон можно таймером, а так же кастовать на юнита другой дебафф (Ярость Проклятых) наносящий урон цели каждую секунду...
Можно вопрос, ты пишеш на GUI или на Jass (vjas,cjass)
Старый 10.11.2012, 16:11
Hate
конь вакуумный
offline
Опыт: 43,033
Активность:
писать собственный движок скиллов на jass. И да, универсальная функция с ветвлением ифов, идеяльно на мой взгляд.
Старый 10.11.2012, 16:21
respect_gg

offline
Опыт: 3,950
Активность:
Скорее vJass.
Стандартные способы нанесения урона сразу "НЕТ", ибо использую буржуйскую наработку (Intuitive Damage Detection System) - то есть весь урон должен наноситься триггерно, точнее любой урон от стандартной магии будет отслеживаться как "урон от обычной атака". Но суть не в этом.
Так вот в том то и проблема, как же мне запустить таймер уже из другой функции.... Блин я не знаю как донести это до Вас так, чтобы вы поняли на все 100%.
Попробую так -
Например есть функцию
function blablabla takes nothing returns nothing
local unit u = CastingUnit
local unit t = Target
.....
call AddBuff(u,t,10.00,......) (например это функцию по добавлению бафа, который будет висеть на противнике 10 секунд и т.д.)
endfunction
Но кроме этого мне еще нужно наносить ему ежесекундный урон. Как я сказал выше, в функции (AddBuff пр.) дописывать это для каждого спелла как минимум будет слишком не удобно. Вот мне и нужно как то обратиться к уже новой функции, причем из AddBuff :) Думаю опять я написал чушь, которую способен понять только я сам :)
Мне нужно, например, из функции AddBuff каждые 1 секунду обращаться к новой функции, которая будет наносить урон.
Блин я надеюсь, что хоть как то это будет понятно :) Просто я не знаю, каким еще способом объяснить :)
respect_gg добавил:
Hate:
писать собственный движок скиллов на jass. И да, универсальная функция с ветвлением ифов, идеяльно на мой взгляд.
Поверь, слишком много If'ов будет, невероятно много :) По-этому я и отбросил этот вариант сразу
Старый 10.11.2012, 16:23
Hate
конь вакуумный
offline
Опыт: 43,033
Активность:
» кусок моей наработки, вот о чем я говорю.
void MyBuffDuration() {
timer t = GetExpiredTimer()
MyBuffData n = GetData(t)
int C1 = 1
UD src = GetData(n.u)
    if (n.duration <= 0. or GetUnitState(n.u,ConvertUnitState(0)) <= 0.45)
       if n.ABLVL == 1{
            while ( ValueTypeLvl1[n.Cell][C1] != 0 ) {
                FindStats(ValueTypeLvl1[n.Cell][C1],ValueLvl1[n.Cell][C1], ValueLvl1I[n.Cell][C1], false, src )
                C1++
            }
        }
        
        if n.slc == phys_silence { src.IsPhysSilenced = false }
        elseif n.slc == mag_silence { src.IsMagSilenced = false }
        elseif n.slc == all_silence { src.IsPhysSilenced = false; src.IsMagSilenced = false }
        
        RefreshMult(GetPlayerId(GetOwningPlayer(n.u)), src,n.u)
        UnitRemoveAbility(n.u, n.ideff)
        n.u = null
        n.u2 = null
        n.destroy()
        clearD(GetHandleId(t))
        DestroyTimer(t)
    else
        if n.ABLVL == 1{
            while ( ValueTypeLvl1[n.Cell][C1] != 0 ) {
                FindStats(ValueTypeLvl1[n.Cell][C1],ValueLvl1[n.Cell][C1], ValueLvl1I[n.Cell][C1], false, src )
                FindStats(ValueTypeLvl1[n.Cell][C1],ValueLvl1[n.Cell][C1], ValueLvl1I[n.Cell][C1], true, src )
            C1++
            }
        }
        if n.IsFear 
        {IssuePointOrder(n.u,"move",GetUnitX(n.u)+(110.* Cos((ABU(n.u2,n.u)+GetRandomReal(-5.,5.))* bj_DEGTORAD)),GetUnitY(n.u)+(110.* Sin((ABU(n.u2,n.u)+GetRandomReal(-5.,5.))* bj_DEGTORAD))) 
        DestroyEffect(AddSpecialEffectTarget("Abilities\\Spells\\Undead\\CarrionSwarm\\CarrionSwarmDama​ge.mdl",n.u,"chest"))
        }
        
        RefreshMult(GetPlayerId(GetOwningPlayer(n.u)), src,n.u)
        UnitAddAbility(n.u, n.ideff)
        n.duration -= 0.5
    endif
t = null
}


void TryToCatch(int id, UD src){
MyBuffData CatchedTimer
int c = 0, C1 = 1
    while (c <= 15) {
        if src.BuffCode[c] == id {
            CatchedTimer = GetData(src.BuffTimer[c])
            src.BuffCode[c] = 0
            if CatchedTimer.ABLVL == 1{
                while ( ValueTypeLvl1[CatchedTimer.Cell][C1] != 0 ) {
                    FindStats(ValueTypeLvl1[CatchedTimer.Cell][C1],ValueLvl1[CatchedTimer.Cell][C1], ValueLvl1I[CatchedTimer.Cell][C1], false, src )
                    C1++
                }
            }
            //debug msg("buff unregistred with number "+I2S(c))
            if CatchedTimer.slc == phys_silence { src.IsPhysSilenced = false }
            elseif CatchedTimer.slc == mag_silence { src.IsMagSilenced = false }
            elseif CatchedTimer.slc == all_silence { src.IsPhysSilenced = false; src.IsMagSilenced = false }
            
            RefreshMult(GetPlayerId(GetOwningPlayer(CatchedTimer.u)), src,src.Owner)
            UnitRemoveAbility(CatchedTimer.u, CatchedTimer.ideff)
            CatchedTimer.u = null
            CatchedTimer.u2 = null
            CatchedTimer.destroy()
            clearD(GetHandleId(src.BuffTimer[c]))
            DestroyTimer(src.BuffTimer[c])
            break
        }
        c++
    }
}

void MyBuffCancel(unit A,unit B, int Count, int AbilLvl, int Const, int bufftype){
UD a = GetData(A)
UD src = GetData(B)
BuffData CatchedTimer
real prep_chance, Real_chance
int c1 = 16, c = 0

    while (c1-- >= 0){
        if Count == 0 { break }
        if (src.BuffCode[c1] != 0 and src.BuffPolarity[c1] == bufftype){  
            CatchedTimer = GetData(src.BuffTimer[c1])
            prep_chance = (2 *(AbilLvl-GetUnitAbilityLevel(src.Owner,src.BuffCode[c1]))+ Const + CatchedTimer.duration/120. ) * src.CancelRes
                if prep_chance <= 25. { Real_chance = 25. }
                elseif prep_chance >= 75. { Real_chance = 75. }
                elseif (prep_chance > 25. and prep_chance < 75.) { Real_chance = prep_chance }
            if GetRandomReal(0.01, 100.) <= Real_chance { TryToCatch(src.BuffCode[c1],src) }
            Count--
        }
    }
    
}

void AddBuffToUnit(unit uTarg, unit uCaster,int Cell,int LVL,bool EffOverTime) {
timer t = CreateTimer()
int c = 0, C1 = 1
UD src = GetData(uTarg)
UD src2 = GetData(uCaster)
MyBuffData CatchedTimer
MyBuffData n = MyCastData.create()
n.ABLVL = LVL
n.u = uTarg
// debug msg("ability name "+SkillName[Cell]+" with value1(real) "+R2S(ValueLvl1[Cell][1])+" with value2(real) "+R2S(ValueLvl1[Cell][2])+" with value3(real) "+R2S(ValueLvl1[Cell][3])+" value1(int) "+I2S(ValueLvl1I[Cell][1])+" value2(int) "+I2S(ValueLvl1I[Cell][2])+" and skill lvl "+I2S(LVL))
    if uCaster == null { // caster->self
        TryToCatch(BuffId[Cell], src)
        UnitAddAbility(uTarg, BuffId[Cell])
        if LVL == 1{
            while (ValueTypeLvl1[Cell][C1] != 0) {
                FindStats(ValueTypeLvl1[Cell][C1],ValueLvl1[Cell][C1], ValueLvl1I[Cell][C1], true, src)
                C1++
            }
        }
        src.BuffPolarity[src.BuffsCount] = positive
        RefreshMult(GetPlayerId(GetOwningPlayer(uTarg)), src,uTarg)
        n.duration = BuffTime[Cell][LVL]
        n.ideff = BuffId[Cell]
    }
    else { // caster->target
        if SkillType[Cell] { // physical
         // debug // msg("physical")
            if BuffId[Cell] > 0 { // buff
             // debug // msg("buff")
                TryToCatch(BuffId[Cell], src)
                UnitAddAbility(uTarg, BuffId[Cell])
                if LVL == 1{
                    while (ValueTypeLvl1[Cell][C1] != 0) {
                        FindStats(ValueTypeLvl1[Cell][C1],ValueLvl1[Cell][C1], ValueLvl1I[Cell][C1], true, src)
                        C1++
                    }
                }
                src.BuffPolarity[src.BuffsCount] = positive
                RefreshMult(GetPlayerId(GetOwningPlayer(uTarg)), src,uTarg)
                n.duration = BuffTime[Cell][LVL]
                n.ideff = BuffId[Cell]
            }
            elseif DebuffId[Cell] > 0 { // debuff
            // debug  msg("debuff")
                if DebuffResist[Cell] == stunRes { setdef NeededResist = src.StunRes }
                elseif DebuffResist[Cell] == pbleedRes { setdef NeededResist = src.PBleedRes }
                elseif DebuffResist[Cell] == poisonRes { setdef NeededResist = src.PoisonRes }
                elseif DebuffResist[Cell] == rootRes { setdef NeededResist = src.RootRes }
                elseif DebuffResist[Cell] == paralyzeRes { setdef NeededResist = src.ParalyzeRes }
                elseif DebuffResist[Cell] == miscRes { setdef NeededResist = src.MiscRes }
                
                if DebuffState[Cell] == stun { // if phys stun
                    SetState(uCaster,uTarg,DebuffDuration[Cell][LVL],stun,DebuffChance[Cell][LVL])
                    // debug // msg("stun")
                }
                elseif (DebuffState[Cell] == phys_silence or DebuffState[Cell] == mag_silence or DebuffState[Cell] == all_silence) {
                    // debug // msg("silence")
                    if IsDebuff(DebuffChance[Cell][LVL], src.CON ,src.MiscRes,GetUnitLevel(uCaster), GetUnitLevel(uTarg),-7777,-7777){
                        TryToCatch(DebuffId[Cell], src)
                        UnitAddAbility(uTarg, DebuffId[Cell])
                        GroupRemoveUnit(CastGroup,uTarg)
                        
                            if DebuffState[Cell] == phys_silence { src.IsPhysSilenced = true }
                            elseif DebuffState[Cell] == mag_silence { src.IsMagSilenced = true }
                            elseif DebuffState[Cell] == all_silence { src.IsPhysSilenced = true; src.IsMagSilenced = true }
                        
                        src.BuffPolarity[src.BuffsCount] = negative
                        n.duration = DebuffDuration[Cell][LVL]
                        n.ideff = DebuffId[Cell]
                    }
                }
                elseif DebuffState[Cell] == fear { // if phys fear
                    // debug msg("fear")
                    if IsDebuff(DebuffChance[Cell][LVL], src.CON ,src.MiscRes,GetUnitLevel(uCaster), GetUnitLevel(uTarg),-7777,-7777){
                        TryToCatch(DebuffId[Cell], src)
                        UnitAddAbility(uTarg, DebuffId[Cell])
                        n.IsFear = true
                        GroupRemoveUnit(CastGroup,uTarg)
                        if LVL == 1{
                            while (ValueTypeLvl1[Cell][C1] != 0) {
                                FindStats(ValueTypeLvl1[Cell][C1],ValueLvl1[Cell][C1], ValueLvl1I[Cell][C1], true, src)
                            // debug msg("current number in loop "+I2S(C1))
                            C1++
                            }
                        }
                        n.u2 = uCaster
                        src.BuffPolarity[src.BuffsCount] = negative
                        n.duration = DebuffDuration[Cell][LVL]
                        n.ideff = DebuffId[Cell]
                        // debug msg("fear succeed")
                    }
                }
                else { 
                // debug msg("else")
                    if IsDebuff(DebuffChance[Cell][LVL], src.CON ,src.MiscRes,GetUnitLevel(uCaster), GetUnitLevel(uTarg),-7777,-7777){
                        // debug msg("success")
                        TryToCatch(DebuffId[Cell], src)
                        UnitAddAbility(uTarg, DebuffId[Cell])
                            if LVL == 1{
                                while (ValueTypeLvl1[Cell][C1] != 0) {
                                    FindStats(ValueTypeLvl1[Cell][C1],ValueLvl1[Cell][C1], ValueLvl1I[Cell][C1], true, src)
                                C1++
                                }
                            }
                        src.BuffPolarity[src.BuffsCount] = negative
                        RefreshMult(GetPlayerId(GetOwningPlayer(uTarg)), src,uTarg)
                        n.duration = DebuffDuration[Cell][LVL]
                        n.ideff = DebuffId[Cell]
                    }
                    else {
                        // debug msg("fail")
                        n.destroy()
                        DestroyTimer(t)
                        t = null
                        return
                    }
                }
            }
        }
        elseif not SkillType[Cell] { // magical
        // debug msg("magical")
            if BuffId[Cell] > 0 { // buff
                // debug msg("buff")
                TryToCatch(BuffId[Cell], src)
                UnitAddAbility(uTarg, BuffId[Cell])
                    if LVL == 1 {
                        while (ValueTypeLvl1[Cell][C1] != 0) {
                            FindStats(ValueTypeLvl1[Cell][C1],ValueLvl1[Cell][C1], ValueLvl1I[Cell][C1], true, src)
                            C1++
                        }
                    }
                src.BuffPolarity[src.BuffsCount] = positive
                RefreshMult(GetPlayerId(GetOwningPlayer(uTarg)), src,uTarg)
                n.duration = BuffTime[Cell][LVL]
                n.ideff = BuffId[Cell]
            }
            elseif DebuffId[Cell] > 0 {
                
                if DebuffResist[Cell] == stunRes { setdef NeededResist = src.StunRes }
                elseif DebuffResist[Cell] == mbleedRes { setdef NeededResist = src.MBleedRes }
                elseif DebuffResist[Cell] == sleepRes { setdef NeededResist = src.SleepRes }
                elseif DebuffResist[Cell] == poisonRes { setdef NeededResist = src.PoisonRes }
                elseif DebuffResist[Cell] == rootRes { setdef NeededResist = src.RootRes }
                elseif DebuffResist[Cell] == paralyzeRes { setdef NeededResist = src.ParalyzeRes }
                elseif DebuffResist[Cell] == miscRes { setdef NeededResist = src.MiscRes }
                
                if DebuffState[Cell] == sleep
                    {SetState(uCaster,uTarg, DebuffDuration[Cell][LVL], sleep, DebuffChance[Cell][LVL]) }
                
                elseif DebuffState[Cell] == cancel
                    {MyBuffCancel(uCaster,uTarg, CancelBuffAmout[Cell][LVL], LVL, CancelConstant[Cell][LVL], CancelPolarity[Cell])}
                
                elseif (DebuffState[Cell] == phys_silence or DebuffState[Cell] == mag_silence or DebuffState[Cell] == all_silence) {
                    if IsDebuff(DebuffChance[Cell][LVL], src.MEN ,src.MiscRes,GetUnitLevel(uCaster), GetUnitLevel(uTarg),src2.matk,src.mdef){
                        TryToCatch(DebuffId[Cell], src)
                        UnitAddAbility(uTarg, DebuffId[Cell])
                            if DebuffState[Cell] == phys_silence { src.IsPhysSilenced = true }
                            elseif DebuffState[Cell] == mag_silence { src.IsMagSilenced = true }
                            elseif DebuffState[Cell] == all_silence { src.IsPhysSilenced = true; src.IsMagSilenced = true }
                        src.BuffPolarity[src.BuffsCount] = negative
                        n.duration = DebuffDuration[Cell][LVL]
                        n.ideff = DebuffId[Cell]
                    }
                }
                else {
                // debug msg("else")
                    if IsDebuff(DebuffChance[Cell][LVL], src.MEN ,NeededResist,GetUnitLevel(uCaster), GetUnitLevel(uTarg),src2.matk,src.mdef){
                        // debug msg("succes")
                        TryToCatch(DebuffId[Cell], src)
                        UnitAddAbility(uTarg, DebuffId[Cell])
                            if LVL == 1{
                                while (ValueTypeLvl1[Cell][C1] != 0) {
                                    FindStats(ValueTypeLvl1[Cell][C1],ValueLvl1[Cell][C1], ValueLvl1I[Cell][C1], true, src)
                                C1++
                                }
                            }
                        src.BuffPolarity[src.BuffsCount] = negative
                        RefreshMult(GetPlayerId(GetOwningPlayer(uTarg)), src, uTarg)
                        n.duration = DebuffDuration[Cell][LVL]
                        n.ideff = DebuffId[Cell]
                    }
                    else {
                        n.destroy()
                        DestroyTimer(t)
                        t = null
                        return
                    }
                }
            }
        }
    }
    
    n.Cell = Cell
    src.BuffTimer[src.BuffsCount] = t
    
    if BuffId[Cell] > 0 { src.BuffCode[src.BuffsCount] = BuffId[Cell] }
    elseif DebuffId[Cell] > 0 { src.BuffCode[src.BuffsCount] = DebuffId[Cell] }
    
    n.SpecialNumber = src.BuffsCount
    src.BuffsCount++
    
    if src.BuffsCount > 15 { src.BuffsCount = 0 }
        
    SetData(t,n)
    TimerStart(t, 0.5, true, function MyBuffDuration)
    // ------------------------------
t = null
}
Старый 10.11.2012, 16:35
respect_gg

offline
Опыт: 3,950
Активность:
cJass , абсолютно ничего не понял...
Старый 10.11.2012, 16:50
Hate
конь вакуумный
offline
Опыт: 43,033
Активность:
прочтите мануал по сЖассу, ничего замудренного там нет.
Старый 10.11.2012, 16:59
respect_gg

offline
Опыт: 3,950
Активность:
Извини конечно, но я создавал этот тред не с целью выучить cJass. Я прекрасно знаю, что на vJass Такое реализовать реально, так как уже видел такое, но найти этого я никак не могу, уже не помню где я качал эту наработку, так как прошло уже более года, а на компе ничего не сохранилось с тех времен.
Старый 10.11.2012, 17:03
Hate
конь вакуумный
offline
Опыт: 43,033
Активность:
зачем прямо изучать сЖасс? я имел ввиду прочитать мануал что бы стало понятно что в коде.
Старый 10.11.2012, 17:05
DioD

offline
Опыт: 45,134
Активность:
или реализовывать goto через систему методов или карусель на основе цикла или серию ифов, последнее самое быстрое и понятное
так чтобы кинуть руки на клавиатуру и всё готово - не будет.
Старый 10.11.2012, 17:06
Doc

offline
Опыт: 63,163
Активность:
DioD, no.
respect_gg, потрудитесь хотя-бы прочитать мануал по вжассу, там это есть.
Старый 11.11.2012, 13:01
Закрытая тема

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

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

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

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



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