stackType - нужна помощь

VoDela

Прославленный
Местный
Сообщения
478
Розыгрыши
0
Репутация
312
Реакции
156
Баллы
1 438
Здравствуйте. Сегодня ковыряюсь в исходах и хочу добиться желаемого, а точней:
Хочу сделать баф, который стакает до 5 бафов.
В итоге что-то я намудрил:
Код:
protected void attachEffect(Node n, Object template)
    {
        NamedNodeMap attrs = n.getAttributes();
        StatsSet set = new StatsSet();

        set.set("name", attrs.getNamedItem("name").getNodeValue());
        set.set("object", template);
        if (attrs.getNamedItem("count") != null)
            set.set("count", parseNumber(attrs.getNamedItem("count").getNodeValue()).intValue());
        if (attrs.getNamedItem("time") != null)
            set.set("time", parseNumber(attrs.getNamedItem("time").getNodeValue()).intValue());

        set.set("value", attrs.getNamedItem("val") != null ? parseNumber(attrs.getNamedItem("val").getNodeValue()).doubleValue() : 0.);

        set.set("abnormal", AbnormalEffect.NULL);
        set.set("abnormal2", AbnormalEffect.NULL);
        set.set("abnormal3", AbnormalEffect.NULL);
        if (attrs.getNamedItem("abnormal") != null)
        {
            AbnormalEffect ae = AbnormalEffect.getByName(attrs.getNamedItem("abnormal").getNodeValue());
            if (ae.isSpecial())
                set.set("abnormal2", ae);
            if (ae.isEvent())
                set.set("abnormal3", ae);
            else
                set.set("abnormal", ae);
        }

        if (attrs.getNamedItem("stackType") != null)
            set.set("stackType", attrs.getNamedItem("stackType").getNodeValue());
        if (attrs.getNamedItem("stackType2") != null)
            set.set("stackType2", attrs.getNamedItem("stackType2").getNodeValue());
        if (attrs.getNamedItem("stackType2") != null)
            set.set("stackType3", attrs.getNamedItem("stackType3").getNodeValue());
        if (attrs.getNamedItem("stackType4") != null)
            set.set("stackType2", attrs.getNamedItem("stackType4").getNodeValue());
        if (attrs.getNamedItem("stackType5") != null)
            set.set("stackType2", attrs.getNamedItem("stackType5").getNodeValue());
        if (attrs.getNamedItem("stackOrder") != null)
            set.set("stackOrder", parseNumber(attrs.getNamedItem("stackOrder").getNodeValue()).intValue());

        if (attrs.getNamedItem("applyOnCaster") != null)
            set.set("applyOnCaster", Boolean.valueOf(attrs.getNamedItem("applyOnCaster").getNodeValue()));
        if (attrs.getNamedItem("applyOnSummon") != null)
            set.set("applyOnSummon", Boolean.valueOf(attrs.getNamedItem("applyOnSummon").getNodeValue()));

        if (attrs.getNamedItem("displayId") != null)
            set.set("displayId", parseNumber(attrs.getNamedItem("displayId").getNodeValue()).intValue());
        if (attrs.getNamedItem("displayLevel") != null)
            set.set("displayLevel", parseNumber(attrs.getNamedItem("displayLevel").getNodeValue()).intValue());
        if (attrs.getNamedItem("chance") != null)
            set.set("chance", parseNumber(attrs.getNamedItem("chance").getNodeValue()).intValue());
        if (attrs.getNamedItem("cancelOnAction") != null)
            set.set("cancelOnAction", Boolean.valueOf(attrs.getNamedItem("cancelOnAction").getNodeValue()));
        if (attrs.getNamedItem("isOffensive") != null)
            set.set("isOffensive", Boolean.valueOf(attrs.getNamedItem("isOffensive").getNodeValue()));
        if (attrs.getNamedItem("isReflectable") != null)
            set.set("isReflectable", Boolean.valueOf(attrs.getNamedItem("isReflectable").getNodeValue()));

        EffectTemplate lt = new EffectTemplate(set);

        parseTemplate(n, lt);
        for (Node n1 = n.getFirstChild(); n1 != null; n1 = n1.getNextSibling())
        {
            if ("triggers".equalsIgnoreCase(n1.getNodeName()))
                parseTrigger(n1, lt);
        }

        if (template instanceof Skill)
            ((Skill) template).attach(lt);
    }
Код:
public EffectTemplate getTemplate()
    {
        return _template;
    }

    public String getStackType()
    {
        return getTemplate()._stackType;
    }

    public String getStackType2()
    {
        return getTemplate()._stackType2;
    }

    public String getStackType3()
    {
        return getTemplate()._stackType3;
    }

    public String getStackType4()
    {
        return getTemplate()._stackType4;
    }

    public String getStackType5()
    {
        return getTemplate()._stackType5;
    }

    public boolean checkStackType(String param)
    {
        return getStackType().equalsIgnoreCase(param) || getStackType2().equalsIgnoreCase(param) || getStackType3().equalsIgnoreCase(param) || getStackType4().equalsIgnoreCase(param) || getStackType5().equalsIgnoreCase(param);
    }

    public boolean checkStackType(Effect param)
    {
        return checkStackType(param.getStackType()) || checkStackType(param.getStackType2()) || checkStackType(param.getStackType3()) || checkStackType(param.getStackType4()) || checkStackType(param.getStackType5());
    }

    public int getStackOrder()
    {
        return getTemplate()._stackOrder;
    }
Код:
public static boolean checkStackType(EffectTemplate ef1, EffectTemplate ef2)
    {
        if (!ef1._stackType.equals(EffectTemplate.NO_STACK) && ef1._stackType.equalsIgnoreCase(ef2._stackType))
        {
            return true;
        }
        if (!ef1._stackType.equals(EffectTemplate.NO_STACK) && ef1._stackType.equalsIgnoreCase(ef2._stackType2))
        {
            return true;
        }
        if (!ef1._stackType.equals(EffectTemplate.NO_STACK) && ef1._stackType.equalsIgnoreCase(ef2._stackType3))
        {
            return true;
        }
        if (!ef1._stackType.equals(EffectTemplate.NO_STACK) && ef1._stackType.equalsIgnoreCase(ef2._stackType4))
        {
            return true;
        }
        if (!ef1._stackType.equals(EffectTemplate.NO_STACK) && ef1._stackType.equalsIgnoreCase(ef2._stackType5))
        {
            return true;
        }
        if (!ef1._stackType2.equals(EffectTemplate.NO_STACK) && ef1._stackType2.equalsIgnoreCase(ef2._stackType))
        {
            return true;
        }
        if (!ef1._stackType2.equals(EffectTemplate.NO_STACK) && ef1._stackType2.equalsIgnoreCase(ef2._stackType2))
        {
            return true;
        }
        if (!ef1._stackType2.equals(EffectTemplate.NO_STACK) && ef1._stackType2.equalsIgnoreCase(ef2._stackType3))
        {
            return true;
        }
        if (!ef1._stackType2.equals(EffectTemplate.NO_STACK) && ef1._stackType2.equalsIgnoreCase(ef2._stackType4))
        {
            return true;
        }
        if (!ef1._stackType2.equals(EffectTemplate.NO_STACK) && ef1._stackType2.equalsIgnoreCase(ef2._stackType5))
        {
            return true;
        }
        if (!ef1._stackType3.equals(EffectTemplate.NO_STACK) && ef1._stackType3.equalsIgnoreCase(ef2._stackType))
        {
            return true;
        }
        if (!ef1._stackType3.equals(EffectTemplate.NO_STACK) && ef1._stackType3.equalsIgnoreCase(ef2._stackType2))
        {
            return true;
        }
        if (!ef1._stackType3.equals(EffectTemplate.NO_STACK) && ef1._stackType3.equalsIgnoreCase(ef2._stackType3))
        {
            return true;
        }
        if (!ef1._stackType3.equals(EffectTemplate.NO_STACK) && ef1._stackType3.equalsIgnoreCase(ef2._stackType4))
        {
            return true;
        }
        if (!ef1._stackType3.equals(EffectTemplate.NO_STACK) && ef1._stackType3.equalsIgnoreCase(ef2._stackType5))
        {
            return true;
        }
        if (!ef1._stackType4.equals(EffectTemplate.NO_STACK) && ef1._stackType4.equalsIgnoreCase(ef2._stackType))
        {
            return true;
        }
        if (!ef1._stackType4.equals(EffectTemplate.NO_STACK) && ef1._stackType4.equalsIgnoreCase(ef2._stackType2))
        {
            return true;
        }
        if (!ef1._stackType4.equals(EffectTemplate.NO_STACK) && ef1._stackType4.equalsIgnoreCase(ef2._stackType3))
        {
            return true;
        }
        if (!ef1._stackType4.equals(EffectTemplate.NO_STACK) && ef1._stackType4.equalsIgnoreCase(ef2._stackType4))
        {
            return true;
        }
        if (!ef1._stackType4.equals(EffectTemplate.NO_STACK) && ef1._stackType4.equalsIgnoreCase(ef2._stackType5))
        {
            return true;
        }
        if (!ef1._stackType5.equals(EffectTemplate.NO_STACK) && ef1._stackType5.equalsIgnoreCase(ef2._stackType))
        {
            return true;
        }
        if (!ef1._stackType5.equals(EffectTemplate.NO_STACK) && ef1._stackType5.equalsIgnoreCase(ef2._stackType2))
        {
            return true;
        }
        if (!ef1._stackType5.equals(EffectTemplate.NO_STACK) && ef1._stackType5.equalsIgnoreCase(ef2._stackType3))
        {
            return true;
        }
        if (!ef1._stackType5.equals(EffectTemplate.NO_STACK) && ef1._stackType5.equalsIgnoreCase(ef2._stackType4))
        {
            return true;
        }
        if (!ef1._stackType5.equals(EffectTemplate.NO_STACK) && ef1._stackType5.equalsIgnoreCase(ef2._stackType5))
        {
            return true;
        }
        return false;
    }
Код:
public EffectTemplate(StatsSet set)
    {
        _value = set.getDouble("value");
        _count = set.getInteger("count", 1) < 0 ? Integer.MAX_VALUE : set.getInteger("count", 1);
        _period = Math.min(Integer.MAX_VALUE, 1000 * (set.getInteger("time", 1) < 0 ? Integer.MAX_VALUE : set.getInteger("time", 1)));
        _abnormalEffect = set.getEnum("abnormal", AbnormalEffect.class);
        _abnormalEffect2 = set.getEnum("abnormal2", AbnormalEffect.class);
        _abnormalEffect3 = set.getEnum("abnormal3", AbnormalEffect.class);
        _stackType = set.getString("stackType", NO_STACK);
        _stackType2 = set.getString("stackType2", NO_STACK);
        _stackType3 = set.getString("stackType3", NO_STACK);
        _stackType4 = set.getString("stackType4", NO_STACK);
        _stackType5 = set.getString("stackType5", NO_STACK);
        _stackOrder = set.getInteger("stackOrder", _stackType.equals(NO_STACK) &&  _stackType2.equals(NO_STACK) &&  _stackType3.equals(NO_STACK) &&  _stackType4.equals(NO_STACK) &&  _stackType5.equals(NO_STACK) ? 4 : 3 : 2 : 1 : 0);
        _applyOnCaster = set.getBool("applyOnCaster", false);
        _applyOnSummon = set.getBool("applyOnSummon", true);
        _cancelOnAction = set.getBool("cancelOnAction", false);
        _isReflectable = set.getBool("isReflectable", true);
        _isSaveable = set.isSet("isSaveable") ? set.getBool("isSaveable") : null;
        _isCancelable = set.isSet("isCancelable") ? set.getBool("isCancelable") : null;
        _isOffensive = set.isSet("isOffensive") ? set.getBool("isOffensive") : null;
        _displayId = set.getInteger("displayId", 0);
        _displayLevel = set.getInteger("displayLevel", 0);
        _effectType = set.getEnum("name", EffectType.class);
        _chance = set.getInteger("chance", Integer.MAX_VALUE);
        _paramSet = set;
    }
Код:
compile:
    [javac] Compiling 2076 source files to C:\Users\server\Desktop\server\source\Trunk\Build\Core Build\bin
    [javac] C:\Users\server\Desktop\server\source\Trunk\java\l2f\gameserver\skills\effects\EffectTemplate.java:70: error: ')' expected
    [javac]         _stackOrder = set.getInteger("stackOrder", _stackType.equals(NO_STACK) &&  _stackType2.equals(NO_STACK) &&  _stackType3.equals(NO_STACK) &&  _stackType4.equals(NO_STACK) &&  _stackType5.equals(NO_STACK) ? 4 : 3 : 2 : 1 : 0);
    [javac]                                                                                                                                                                                                                          ^
    [javac] C:\Users\server\Desktop\server\source\Trunk\java\l2f\gameserver\skills\effects\EffectTemplate.java:70: error: not a statement
    [javac]         _stackOrder = set.getInteger("stackOrder", _stackType.equals(NO_STACK) &&  _stackType2.equals(NO_STACK) &&  _stackType3.equals(NO_STACK) &&  _stackType4.equals(NO_STACK) &&  _stackType5.equals(NO_STACK) ? 4 : 3 : 2 : 1 : 0);
    [javac]                                                                                                                                                                                                                             ^
    [javac] C:\Users\server\Desktop\server\source\Trunk\java\l2f\gameserver\skills\effects\EffectTemplate.java:70: error: ';' expected
    [javac]         _stackOrder = set.getInteger("stackOrder", _stackType.equals(NO_STACK) &&  _stackType2.equals(NO_STACK) &&  _stackType3.equals(NO_STACK) &&  _stackType4.equals(NO_STACK) &&  _stackType5.equals(NO_STACK) ? 4 : 3 : 2 : 1 : 0);
    [javac]                                                                                                                                                                                                                              ^
    [javac] 3 errors
Ошибка указывает сюда: ? 4 : 3 : 2 : 1 : 0);
Что тут надо написать? куда копать? почему не ставится такой приоритет? где нехватает кода?
 
Последнее редактирование:
Редактировал
Код:
       if (attrs.getNamedItem("stackType") != null)
           set.set("stackType", attrs.getNamedItem("stackType").getNodeValue());
       if (attrs.getNamedItem("stackType2") != null)
           set.set("stackType2", attrs.getNamedItem("stackType2").getNodeValue());
       if (attrs.getNamedItem("[s]stackType2[/s] stackType3") != null)
           set.set("stackType3", attrs.getNamedItem("stackType3").getNodeValue());
       if (attrs.getNamedItem("stackType4") != null)
           set.set("stackType2", attrs.getNamedItem("stackType4").getNodeValue());
       if (attrs.getNamedItem("stackType5") != null)
           set.set("stackType2", attrs.getNamedItem("stackType5").getNodeValue());
       if (attrs.getNamedItem("stackOrder") != null)
А в EffectTemplate.java поставил
Код:
       _stackOrder = set.getInteger("stackOrder", _stackType.equals(NO_STACK) &&  _stackType2.equals(NO_STACK) &&  _stackType3.equals(NO_STACK) &&  _stackType4.equals(NO_STACK) &&  _stackType5.equals(NO_STACK) ? [s]4 : 3 : 2 : 1 : 0[/s] 1 : 0);
скомпилилось, запустилось без ошибок, но заменяет 3 бафа вместо 5ти... в конфиге умения поставил
stackType="mAtk" stackType2="MagicDefUp" stackType3="magicCritUp" stackType4="clarity" time="7200" stackType5="unholyRcpt" (ну для теста)
 
Последнее редактирование:
Я нуб но так понимаю хотите реализовать что то типа Шилки у шк? мб ступил и ошибаюсь)
 
Редактировал
Код:
       if (attrs.getNamedItem("stackType") != null)
           set.set("stackType", attrs.getNamedItem("stackType").getNodeValue());
       if (attrs.getNamedItem("stackType2") != null)
           set.set("stackType2", attrs.getNamedItem("stackType2").getNodeValue());
       if (attrs.getNamedItem("[s]stackType2[/s] stackType3") != null)
           set.set("stackType3", attrs.getNamedItem("stackType3").getNodeValue());
       if (attrs.getNamedItem("stackType4") != null)
           set.set("stackType2", attrs.getNamedItem("stackType4").getNodeValue());
       if (attrs.getNamedItem("stackType5") != null)
           set.set("stackType2", attrs.getNamedItem("stackType5").getNodeValue());
При выполнении двух последних условий, они попросту будут переопределять 2-ой stackType, так как в обеих случаях ты указал, чтобы значению по ключу stackType2 установилось распарсенное значение stackType4 и stackType5.
Проще говоря, вместо stackType2 (именно в двух последних условиях) тебе нужно заменить на соответствующие stackType4 и stackType5.
 

    VoDela

    Баллов: 13
    Спасибо! Я даже не заметил что там не поменял значения!
Я дико извиняюсь, а где такая п**н*г**афия с эффектами?
Код:
stackType="mAtk" stackType2="MagicDefUp" stackType3="magicCritUp" stackType4="clarity" time="7200" stackType5="unholyRcpt"
 
Я дико извиняюсь, а где такая п**н*г**афия с эффектами?
Код:
stackType="mAtk" stackType2="MagicDefUp" stackType3="magicCritUp" stackType4="clarity" time="7200" stackType5="unholyRcpt"
На овероподобных сборках, если не ошибаюсь.
 
всего лиш одна цыфра а какая головоломка)
 
господи... ну и кодопорнуха...
в офф сервере все сделано совсем не так - там в любых хрониках юзается один стэктайп для скилла, без всяких стэктайп 2, стэктайп 3 и т.д.
советую поизучать птсовскую skilldata.txt на эту тему, необязательно даже ту что для глори - пойдет и к примеру от гф/фреи/хф, т.к. там это тоже используется - для improved-баффов.
там для подобных скиллов в них используется эффект p_block_buff_slot, в котором перечисляются те стэктайпы, скиллы с которыми запрещено накладывать пока висит бафф с этим самым эффектом.

для примера, скилл с птс скриптов
Код:
skill_begin    skill_name = [s_enchanter_defence_spirit1]    /* [가디언스 하모니] */    skill_id = 11523    level = 1    operate_type = A2    magic_level = 85    special_level = 0    magic_critical_rate = 5    change_skill_id = 0    self_effect = {}    effect = {{p_shield_defence_rate;30};{p_physical_shield_defence;50;per};{p_physical_attack;{all};12;per};{p_physical_defence;{all};45;per};{p_critical_damage;{all};35;per};{p_critical_rate;{all};100;per};{i_dispel_by_slot;song_of_champion;-1};{i_dispel_by_slot;song_of_earth;-1};{i_dispel_by_slot;song_of_hunter;-1};{i_dispel_by_slot;song_of_life;-1};{i_dispel_by_slot;song_of_meditation;-1};{i_dispel_by_slot;song_of_renewal;-1};{i_dispel_by_slot;song_of_vengeance;-1};{i_dispel_by_slot;song_of_vitality;-1};{i_dispel_by_slot;song_of_warding;-1};{i_dispel_by_slot;song_of_water;-1};{i_dispel_by_slot;song_of_wind;-1};{i_dispel_by_slot;dance_of_berserker;-1};{i_dispel_by_slot;dance_of_concentration;-1};{i_dispel_by_slot;dance_of_fire;-1};{i_dispel_by_slot;dance_of_fury;-1};{i_dispel_by_slot;dance_of_inspiration;-1};{i_dispel_by_slot;dance_of_mystic;-1};{i_dispel_by_slot;dance_of_siren;-1};{i_dispel_by_slot;dance_of_vampire;-1};{i_dispel_by_slot;dance_of_warrior;-1};{i_dispel_by_slot;song_of_purification;-1};{i_dispel_by_slot;wispering_of_battle;-1};{i_dispel_by_slot;song_of_windstorm;-1};{i_dispel_by_slot;motion_of_defence;-1};{i_dispel_by_slot;instinct;-1};{i_dispel_by_slot;berserker;-1};{i_dispel_by_slot;pa_pd_up;-1};{i_dispel_by_slot;improve_shield_rate_defence_up;-1};{i_dispel_by_slot;shield_prob_up;-1};{i_dispel_by_slot;shield_defence_up;-1};{i_dispel_by_slot;cancel_prob_down;-1};{i_dispel_by_slot;ma_up_special;-1};{i_dispel_by_slot;dance_of_bladestorm;-1};{p_block_buff_slot;{dance_of_bladestorm;song_of_champion;song_of_earth;song_of_hunter;song_of_life;song_of_meditation;song_of_renewal;song_of_vengeance;song_of_vitality;song_of_warding;song_of_water;song_of_wind;dance_of_berserker;dance_of_concentration;dance_of_fire;dance_of_fury;dance_of_inspiration;dance_of_mystic;dance_of_siren;dance_of_vampire;dance_of_warrior;song_of_purification;wispering_of_battle;song_of_windstorm;motion_of_defence;instinct;berserker;pa_pd_up;improve_shield_rate_defence_up;shield_prob_up;shield_defence_up;cancel_prob_down;ma_up_special}}}    end_effect = {}    operate_cond = {{target_my_party;include_me}}    is_magic = 22    is_double = 0    mp_consume1 = 28    mp_consume2 = 112    cast_range = 900    effective_range = 1100    skill_hit_time = 0.7    skill_cool_time = 0.3    skill_hit_cancel_time = 0.5    reuse_delay = 2    activate_rate = -1    lv_bonus_rate = 0    basic_property = none    abnormal_time = 1800    abnormal_lv = 1    abnormal_type = buff_special_class    abnormal_instant = 0    irreplaceable_buff = 0    buff_protect_level = 0    attribute = {attr_none;0}    trait = {trait_none}    effect_point = 687    target_type = target    affect_scope = single    affect_limit = {0;0}    next_action = none    debuff = 0    ride_state = {@ride_none;@ride_strider;@ride_wyvern;@ride_wolf}    multi_class = 0    olympiad_use = 1    skill_end
и как это описано у меня
Код:
    <skill id="11523" levels="1" name="Knight's Harmony">
        <!-- Для выбранного члена группы: Физ. Атк. +12%, сила Крит. Атк. +35%, шанс Крит. Атк. +100%, Физ. Защ. +45%, шанс блока щитом +30%, Защита Щитом +50%. Время действия: 30 мин. -->
        <table name="#time">1800</table>
        <table name="#shockPower">0</table>
        <table name="#reuseDelay">2000</table>
        <table name="#mpConsume2">140</table>
        <table name="#magicLevel">85</table>
        <table name="#effectPoint">687</table>
        <set name="icon" val="icon.skill11523" />
        <set name="reuseDelay" val="#reuseDelay" />
        <set name="hitTime" val="700" />
        <set name="mpConsume2" val="#mpConsume2" />
        <set name="target" val="PARTY_ONE" />
        <set name="skillType" val="BUFF" />
        <set name="operateType" val="OP_ACTIVE" />
        <set name="coolTime" val="300" />
        <set name="castRange" val="900" />
        <set name="nextAction" val="NONE" />
        <set name="magicLevel" val="#magicLevel" />
        <set name="effectPoint" val="#effectPoint" />
        <set name="blockSlot" val="dance_of_bladestorm;song_of_champion;song_of_earth;song_of_hunter;song_of_life;song_of_meditation;song_of_renewal;song_of_vengeance;song_of_vitality;song_of_warding;song_of_water;song_of_wind;dance_of_berserker;dance_of_concentration;dance_of_fire;dance_of_fury;dance_of_inspiration;dance_of_mystic;dance_of_siren;dance_of_vampire;dance_of_warrior;song_of_purification;wispering_of_battle;song_of_windstorm;motion_of_defence;instinct;berserker;pa_pd_up;improve_shield_rate_defence_up;shield_prob_up;shield_defence_up;cancel_prob_down;ma_up_special" />
        <enchant1 levels="10" name="Cost">
            <table name="#magicLevel">99</table>
            <table name="#effectPoint">712</table>
            <table name="#mpConsume2">133 128 122 117 111 106 100 95 88 83</table>
        </enchant1>
        <enchant2 levels="10" name="Time">
            <table name="#magicLevel">99</table>
            <table name="#effectPoint">712</table>
            <table name="#time">1980 2160 2340 2520 2700 2880 3060 3240 3420 3600</table>
        </enchant2>
        <enchant3 levels="10" name="Chance Stun">
            <table name="#magicLevel">99</table>
            <table name="#effectPoint">712</table>
            <table name="#shockPower">1 2 3 4 5 6 7 8 9 10</table>
        </enchant3>
        <for>
            <effect name="Buff" stackOrder="1" stackType="buff_special_class" time="#time" val="0">
                <mul order="0x30" stat="pAtk" val="1.12" />
                <mul order="0x30" stat="pDef" val="1.45" />
                <mul order="0x30" stat="sDef" val="1.50" />
                <mul order="0x30" stat="pCritDamage" val="1.35" />
                <mul order="0x30" stat="pCritRate" val="2" />
                <add order="0x40" stat="rShld" val="30" />
                <add order="0x40" stat="shockPower" val="#shockPower" />
            </effect>
        </for>
    </skill>
принцип простой - при наложении баффа проверяются все наложенные баффы на наличие их стэктайпа в списке перечисленном в blockSlot и если их стэктайп обнаруживается в этом списке - такой бафф снимается.
ну и само собой при наложении любых баффов/дебаффов надо проверять эти самые списки блокировки от всех наложенных баффов.
 
господи... ну и кодопорнуха...
в офф сервере все сделано совсем не так - там в любых хрониках юзается один стэктайп для скилла, без всяких стэктайп 2, стэктайп 3 и т.д.
советую поизучать птсовскую skilldata.txt на эту тему, необязательно даже ту что для глори - пойдет и к примеру от гф/фреи/хф, т.к. там это тоже используется - для improved-баффов.
там для подобных скиллов в них используется эффект p_block_buff_slot, в котором перечисляются те стэктайпы, скиллы с которыми запрещено накладывать пока висит бафф с этим самым эффектом.

для примера, скилл с птс скриптов
Код:
skill_begin    skill_name = [s_enchanter_defence_spirit1]    /* [가디언스 하모니] */    skill_id = 11523    level = 1    operate_type = A2    magic_level = 85    special_level = 0    magic_critical_rate = 5    change_skill_id = 0    self_effect = {}    effect = {{p_shield_defence_rate;30};{p_physical_shield_defence;50;per};{p_physical_attack;{all};12;per};{p_physical_defence;{all};45;per};{p_critical_damage;{all};35;per};{p_critical_rate;{all};100;per};{i_dispel_by_slot;song_of_champion;-1};{i_dispel_by_slot;song_of_earth;-1};{i_dispel_by_slot;song_of_hunter;-1};{i_dispel_by_slot;song_of_life;-1};{i_dispel_by_slot;song_of_meditation;-1};{i_dispel_by_slot;song_of_renewal;-1};{i_dispel_by_slot;song_of_vengeance;-1};{i_dispel_by_slot;song_of_vitality;-1};{i_dispel_by_slot;song_of_warding;-1};{i_dispel_by_slot;song_of_water;-1};{i_dispel_by_slot;song_of_wind;-1};{i_dispel_by_slot;dance_of_berserker;-1};{i_dispel_by_slot;dance_of_concentration;-1};{i_dispel_by_slot;dance_of_fire;-1};{i_dispel_by_slot;dance_of_fury;-1};{i_dispel_by_slot;dance_of_inspiration;-1};{i_dispel_by_slot;dance_of_mystic;-1};{i_dispel_by_slot;dance_of_siren;-1};{i_dispel_by_slot;dance_of_vampire;-1};{i_dispel_by_slot;dance_of_warrior;-1};{i_dispel_by_slot;song_of_purification;-1};{i_dispel_by_slot;wispering_of_battle;-1};{i_dispel_by_slot;song_of_windstorm;-1};{i_dispel_by_slot;motion_of_defence;-1};{i_dispel_by_slot;instinct;-1};{i_dispel_by_slot;berserker;-1};{i_dispel_by_slot;pa_pd_up;-1};{i_dispel_by_slot;improve_shield_rate_defence_up;-1};{i_dispel_by_slot;shield_prob_up;-1};{i_dispel_by_slot;shield_defence_up;-1};{i_dispel_by_slot;cancel_prob_down;-1};{i_dispel_by_slot;ma_up_special;-1};{i_dispel_by_slot;dance_of_bladestorm;-1};{p_block_buff_slot;{dance_of_bladestorm;song_of_champion;song_of_earth;song_of_hunter;song_of_life;song_of_meditation;song_of_renewal;song_of_vengeance;song_of_vitality;song_of_warding;song_of_water;song_of_wind;dance_of_berserker;dance_of_concentration;dance_of_fire;dance_of_fury;dance_of_inspiration;dance_of_mystic;dance_of_siren;dance_of_vampire;dance_of_warrior;song_of_purification;wispering_of_battle;song_of_windstorm;motion_of_defence;instinct;berserker;pa_pd_up;improve_shield_rate_defence_up;shield_prob_up;shield_defence_up;cancel_prob_down;ma_up_special}}}    end_effect = {}    operate_cond = {{target_my_party;include_me}}    is_magic = 22    is_double = 0    mp_consume1 = 28    mp_consume2 = 112    cast_range = 900    effective_range = 1100    skill_hit_time = 0.7    skill_cool_time = 0.3    skill_hit_cancel_time = 0.5    reuse_delay = 2    activate_rate = -1    lv_bonus_rate = 0    basic_property = none    abnormal_time = 1800    abnormal_lv = 1    abnormal_type = buff_special_class    abnormal_instant = 0    irreplaceable_buff = 0    buff_protect_level = 0    attribute = {attr_none;0}    trait = {trait_none}    effect_point = 687    target_type = target    affect_scope = single    affect_limit = {0;0}    next_action = none    debuff = 0    ride_state = {@ride_none;@ride_strider;@ride_wyvern;@ride_wolf}    multi_class = 0    olympiad_use = 1    skill_end
и как это описано у меня
Код:
    <skill id="11523" levels="1" name="Knight's Harmony">
        <!-- Для выбранного члена группы: Физ. Атк. +12%, сила Крит. Атк. +35%, шанс Крит. Атк. +100%, Физ. Защ. +45%, шанс блока щитом +30%, Защита Щитом +50%. Время действия: 30 мин. -->
        <table name="#time">1800</table>
        <table name="#shockPower">0</table>
        <table name="#reuseDelay">2000</table>
        <table name="#mpConsume2">140</table>
        <table name="#magicLevel">85</table>
        <table name="#effectPoint">687</table>
        <set name="icon" val="icon.skill11523" />
        <set name="reuseDelay" val="#reuseDelay" />
        <set name="hitTime" val="700" />
        <set name="mpConsume2" val="#mpConsume2" />
        <set name="target" val="PARTY_ONE" />
        <set name="skillType" val="BUFF" />
        <set name="operateType" val="OP_ACTIVE" />
        <set name="coolTime" val="300" />
        <set name="castRange" val="900" />
        <set name="nextAction" val="NONE" />
        <set name="magicLevel" val="#magicLevel" />
        <set name="effectPoint" val="#effectPoint" />
        <set name="blockSlot" val="dance_of_bladestorm;song_of_champion;song_of_earth;song_of_hunter;song_of_life;song_of_meditation;song_of_renewal;song_of_vengeance;song_of_vitality;song_of_warding;song_of_water;song_of_wind;dance_of_berserker;dance_of_concentration;dance_of_fire;dance_of_fury;dance_of_inspiration;dance_of_mystic;dance_of_siren;dance_of_vampire;dance_of_warrior;song_of_purification;wispering_of_battle;song_of_windstorm;motion_of_defence;instinct;berserker;pa_pd_up;improve_shield_rate_defence_up;shield_prob_up;shield_defence_up;cancel_prob_down;ma_up_special" />
        <enchant1 levels="10" name="Cost">
            <table name="#magicLevel">99</table>
            <table name="#effectPoint">712</table>
            <table name="#mpConsume2">133 128 122 117 111 106 100 95 88 83</table>
        </enchant1>
        <enchant2 levels="10" name="Time">
            <table name="#magicLevel">99</table>
            <table name="#effectPoint">712</table>
            <table name="#time">1980 2160 2340 2520 2700 2880 3060 3240 3420 3600</table>
        </enchant2>
        <enchant3 levels="10" name="Chance Stun">
            <table name="#magicLevel">99</table>
            <table name="#effectPoint">712</table>
            <table name="#shockPower">1 2 3 4 5 6 7 8 9 10</table>
        </enchant3>
        <for>
            <effect name="Buff" stackOrder="1" stackType="buff_special_class" time="#time" val="0">
                <mul order="0x30" stat="pAtk" val="1.12" />
                <mul order="0x30" stat="pDef" val="1.45" />
                <mul order="0x30" stat="sDef" val="1.50" />
                <mul order="0x30" stat="pCritDamage" val="1.35" />
                <mul order="0x30" stat="pCritRate" val="2" />
                <add order="0x40" stat="rShld" val="30" />
                <add order="0x40" stat="shockPower" val="#shockPower" />
            </effect>
        </for>
    </skill>
принцип простой - при наложении баффа проверяются все наложенные баффы на наличие их стэктайпа в списке перечисленном в blockSlot и если их стэктайп обнаруживается в этом списке - такой бафф снимается.
ну и само собой при наложении любых баффов/дебаффов надо проверять эти самые списки блокировки от всех наложенных баффов.
Я знаю эту систему, она на л2ж тоже стоит, у меня знаний не хватает так сделать и примерных аналогов под рукой нет чтоб сделать так... :(
 
Последнее редактирование:
ниче что сырцы л2ж всем доступны? :)

что мешает их изучить?
 
кстати в некоторых сборках видел еще другую реализацию множественных стэктайпов - когда параметр стэктайпа один, но в нем можно перечислять несколько стэктайпов например через точку с запятой
и в самом сервере естественно стэктайп хранится не в виде строки, а в виде массива или списка строк и сравнение/поиск на совпадения стэктайпов ведется в этом массиве/списке.

одна из таких сборок - это вон выложенная на днях мной сборка таути, которую я брал когда-то за основу при начале работы над GoD.
я правда там такую реализацию стэктайпов выпилил сразу и переделал по оффу.

вобщем можешь оттуда сдернуть это, тем более что сборка базируется на овере опять же.
 
Назад
Сверху Снизу