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

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

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

offline
Опыт: 12,714
Активность:
Неадекватные библиотеки
library A {
	public void F {
		...
	}
}

library B {
	private void F {
		A_F()
	}
}

library C {
	private void F {
		A_F()
	}
}
На вызов из библиотеки C ругается (undeclared function). В чем может быть проблема?

Название ф-ции скопировано из B, ошибок быть не может.
Старый 02.01.2012, 12:07
Lipen

offline
Опыт: 1,550
Активность:
Мб ты забыл скобки?
void F()
library A {
    public void F() {}
}

library B {
    private void F() { A_F() }
}

library C {
    private void F() { A_F() }
}
У меня так работает.
Старый 02.01.2012, 12:21
vladfaust

offline
Опыт: 12,714
Активность:
не, не забыл. Блин. Придется выставить на оборзение:
library DamageLib initializer DamageLib_Init {

    define {
        private DMG_TT_TIME = 0.6
        private DEC_PER_INT = 0.5
    }
    
    globals
        private trigger Damage_Trg_Var = null
        private group  All_Units_Group = CreateGroup()
        public integer array Damage_Per_Second [MAX_PLAYERS]
        public integer array Total_Damage_Done [MAX_PLAYERS]
        private constant real Normal_Size = 8.
        private constant real   Crit_Size = 12.
        private constant real Spell_Damage_Height = 0.
        private constant real   Spell_Heal_Height = 0.
        private constant real Usual_Damage_Height = 0.
    endglobals
    
    public void AddToDamageGroup (unit u) {
        GroupAddUnit(All_Units_Group, u)
        TriggerRegisterUnitEvent(Damage_Trg_Var, u, EVENT_UNIT_DAMAGED)
        TriggerRegisterUnitEvent(INQSp6Lib_Trg, u, EVENT_UNIT_DAMAGED)
        TriggerRegisterUnitEvent(DPSLib_DPS_Trg, u, EVENT_UNIT_DAMAGED)
    }
    
    private void DamagePerSecondNulling () {
    }
    
    private void UsualDamageTextTag (unit u, real dmg, integer dmgOwnPlayerId) {
        local texttag tt = CreateTextTagUnitBJ(I2S(R2I(dmg)), u, Usual_Damage_Height, Normal_Size, 0., 0., 0., 0.)
        SetTextTagVelocity(tt, 0.03, 0.03)
        SetTextTagColor(tt, 255, 255, 255, 255)
        SetTextTagFadepoint(tt, DMG_TT_TIME/2)
        SetTextTagLifespan(tt, DMG_TT_TIME)
        SetTextTagPermanent(tt, false)
        
        tt = null
    }
    
    public void DamageTextTag (unit u, real dmg, integer dmgOwnPlayerId, boolean crit) {
        local real size = 0.
        local real time = DMG_TT_TIME
        if not crit {
            size = Normal_Size
        else 
            size = Crit_Size
            time = time*2
        }
        local texttag tt = CreateTextTagUnitBJ(I2S(R2I(dmg)), u, Spell_Damage_Height, size, 0., 0., 0., 0.)
        SetTextTagVelocity(tt, 0.03, 0.03)
        SetTextTagColor(tt, Color_Dec_1[5], Color_Dec_2[5], Color_Dec_3[5], 255)
        SetTextTagFadepoint(tt, time/2)
        SetTextTagLifespan(tt, time)
        SetTextTagPermanent(tt, false)
        
        tt = null
    }
    
    public void HealTextTag (unit u, real heal, integer dmgOwnPlayerId, boolean crit) {
        local real size = 0.
        local real time = DMG_TT_TIME
        if not crit {
            size = Normal_Size
        else 
            size = Crit_Size
            time = time*2
        }
        local texttag tt = CreateTextTagUnitBJ("+"+I2S(R2I(-heal)), u, Spell_Heal_Height, size, 0., 0., 0., 0.)
        SetTextTagVelocity(tt, 0.03, 0.03)
        SetTextTagColor(tt, 0, 255, 0, 255)
        SetTextTagFadepoint(tt, time/2)
        SetTextTagLifespan(tt, time)
        SetTextTagPermanent(tt, false)
        
        tt = null
    }
    
    public void SpellDamage (unit cst, unit target, real dmg) {
        local real r_dmg = 0.
        local bool crit  = FALSE
        local real life  = 0.
        
        crit  = Crit_IsCrit(cst)
        r_dmg = Crit_GetDamage(dmg, crit)-GetHeroInt(target, TRUE)*DEC_PER_INT
        life  = GetUnitState(target, UNIT_STATE_LIFE)
        DisableTrigger(Damage_Trg_Var)
        UnitDamageTarget(cst, target, r_dmg, true, false, ATTACK_TYPE_HERO, DAMAGE_TYPE_DIVINE, WEAPON_TYPE_WHOKNOWS)
        EnableTrigger(Damage_Trg_Var)
        DamageTextTag (target, life-GetUnitState(target, UNIT_STATE_LIFE), GetConvertedPlayerId(GetOwningPlayer(cst)), crit)
    }
    
    public void SpellHeal (unit cst, unit target, real heal) {
        local real r_heal = 0.
        local bool   crit = FALSE
        local real   life = 0.
        
        crit   = Crit_IsCrit(cst)
        r_heal = Crit_GetDamage(heal, crit)
        life   = GetUnitState(target, UNIT_STATE_LIFE)
        DisableTrigger(Damage_Trg_Var)
        UnitDamageTarget(cst, target, r_heal, true, false, null, null, WEAPON_TYPE_WHOKNOWS)
        EnableTrigger(Damage_Trg_Var)
        HealTextTag (target, life-GetUnitState(target, UNIT_STATE_LIFE), GetConvertedPlayerId(GetOwningPlayer(cst)), crit)
    }
    
    private void Damage_Act () {
        local unit u = GetTriggerUnit()
        local unit a = GetEventDamageSource()
        local real d = GetEventDamage()
        
        if d > 0 {
            UsualDamageTextTag (u, d, GetConvertedPlayerId(GetOwningPlayer(a)))
        }
        
        a = null
        u = null
    }
    
    private void DamageLib_Init () {
        trigger Damage_Trg = CreateTrigger()
        TriggerAddAction(Damage_Trg, function Damage_Act)
        Damage_Trg_Var = Damage_Trg
        trigger DamagePerSecondNulling_Trg = CreateTrigger()
        TriggerRegisterTimerEvent(DamagePerSecondNulling_Trg, 1., true)
        TriggerAddAction(DamagePerSecondNulling_Trg, function DamagePerSecondNulling)
    }
    
}

library DRASp1Lib initializer DRASp1Lib_Init {
    
    define {
        private       AR = 'A00F'   // Abil raw.
        private     D_AR = 'A00H'   // Dummy abil rc.
        private    DUMMY = 'hfoo'
        private    SPEED = 2500.
        private      AOE = 800.
        private    ORDER = order_creepthunderbolt
        private      INT = 1        // How much is absorbed.
        private      TIM = 0.3      // Waiting to make effect.
        private TEXT_INT = " ИНТ"
        private      EFF = "Abilities\\Spells\\Items\\TomeOfRetraining\\TomeOfRetrainingCaster.mdl"
        private   ATTACH = "chest"
    }
    
    globals
        private player ch_p = null
        private integer Count_Absorbed = 0
        private unit array Absorbed_Unit
    endglobals
    
    private void TT (unit u, string t, boolean plus) {
        local texttag tt = CreateTextTagUnitBJ(t, u, -3., 8., 0., 0., 0., 0.)
        if plus {
            SetTextTagColor(tt, 128, 255, 128, 200)
        else
            SetTextTagColor(tt, 255, 128, 128, 200)
        }
        SetTextTagVelocity(tt, 0.00, 0.03)
        SetTextTagFadepoint(tt, 1./2)
        SetTextTagLifespan(tt, 1.)
        SetTextTagPermanent(tt, false)
        tt = null
}
    
    private boolean Cond1 () {
        local unit    u = GetFilterUnit()
        local boolean b = IsPlayerEnemy(GetOwningPlayer(u), ch_p) and GetUnitState(u, UNIT_STATE_LIFE) > 0.405 and IsUnitType(u, UNIT_TYPE_HERO)
        u = null
        return b
    }
    
    private void DRASp1_Death_A () {
        local unit u = GetDyingUnit()
        
        if GetUnitAbilityLevel(u, AR) > 0 {
            local integer i = Count_Absorbed
            local unit  trg = null
            
            whilenot (i == 0) {
                trg = Absorbed_Unit[i]
                SetHeroInt(trg, GetHeroInt(trg, true)+INT, TRUE)
                TT (trg, "+"+I2S(INT)+TEXT_INT, TRUE)
                DestroyEffect(AddSpecialEffectTarget(EFF, trg, ATTACH))
                SetHeroInt(u, GetHeroInt(u, true)-INT, TRUE)
                i--
            }
            
            Count_Absorbed = 0
            trg = null
        }
        
        u = null
    }
    
    private void DRASp1_Act () {
        if GetSpellAbilityId() == AR {
        
            local unit       cst = GetTriggerUnit()
            local real      cstX = GetUnitX(cst)
            local real      cstY = GetUnitY(cst)
            local group        g = CreateGroup()
            local unit       FoG
            local integer      i = 0
            local real      dist = 0.
            local integer damage = 0
            
            ch_p = GetOwningPlayer(cst)
            GroupEnumUnitsInRange(g, cstX, cstY, AOE, function Cond1)
            FoG = FirstOfGroup(g)
            if FoG != null {
                TriggerSleepAction(TIM)
                whilenot (FoG == null) {
                    TriggerSleepAction(0.01)
                    
                    SetHeroInt(FoG, GetHeroInt(FoG, TRUE)-INT, TRUE)
                    TT (FoG, "-"+I2S(INT)+TEXT_INT, FALSE)
                    Count_Absorbed++
                    Absorbed_Unit[Count_Absorbed] = FoG
                    
                    SetHeroInt(cst, GetHeroInt(cst, true)+INT, TRUE)
                    TT (cst, "+"+I2S(INT)+TEXT_INT, TRUE)
                    
                    if IsUnitType(FoG, UNIT_TYPE_HERO) {
                        damage = GetHeroInt(cst, TRUE) - GetHeroInt(FoG, TRUE)
                    else
                        damage = GetHeroInt(cst, TRUE)
                    }
                    if damage > 0 {
                        DamageLib_SpellDamage (cst, FoG, damage)
                    }
                    GroupRemoveUnit(g, FoG)
                    FoG = FirstOfGroup(g)
                }
            }
            GroupClear(g)
            
            cst = null
            FoG = null
            GroupClear(g)
            DestroyGroup(g)
            g   = null
        }
    }
    
    private void DRASp1Lib_Init () {
        trigger DRASp1_Trg = CreateTrigger()
        TriggerRegisterAnyUnitEventBJ(DRASp1_Trg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
        TriggerAddAction(DRASp1_Trg,function DRASp1_Act)
        trigger DRASp1_Death = CreateTrigger()
        TriggerRegisterAnyUnitEventBJ(DRASp1_Death, EVENT_PLAYER_UNIT_DEATH)
        TriggerAddAction(DRASp1_Death,function DRASp1_Death_A)
        Preload("EFF")
        PreloadEnd(0.01)
    }
    
}
inadequate_ добавил:
if damage > 0 {
    DamageLib_SpellDamage (cst, FoG, damage)
}
Старый 02.01.2012, 12:31
Lipen

offline
Опыт: 1,550
Активность:
Попробуй поменять либы на скопы.
И ещё у меня ругается на
public integer array Damage_Per_Second [MAX_PLAYERS]
MAX_PLAYERS не объявлен.
Старый 02.01.2012, 12:39
vladfaust

offline
Опыт: 12,714
Активность:
Объявлен...
inadequate_ добавил:
Lipen,
поменять либы на скопы
Слишком много перелопачивать.
Старый 02.01.2012, 12:43
Elf_Stratigo

offline
Опыт: 4,699
Активность:
добавьте в заколовок uses:
library A {
	public void F {
		...
	}
}

library B uses A {
	private void F {
		A_F()
	}
}

library C uses A {
	private void F {
		A_F()
	}
}
Старый 02.01.2012, 12:45
vladfaust

offline
Опыт: 12,714
Активность:
Elf_Stratigo, помогло, спасибо. Но! Для другой библиотеки (В), uses не понадобилось. Странно?
Старый 02.01.2012, 12:55
Faion
Noblesse Oblige
offline
Опыт: 30,395
Активность:
%libName_%funcName
Старый 02.01.2012, 14:15
Doc

offline
Опыт: 63,163
Активность:
Библиотеки полурандомненько так расставляются. И да, читайте мануалы.
Старый 02.01.2012, 14:48
Закрытая тема

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

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

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

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



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