скил "поддержка мафр" L2J mobius

art

Путник
Пользователь
Сообщения
26
Розыгрыши
0
Репутация
0
Реакции
0
Баллы
0
Кто-то реализовал на мобиусе повышение шанса заточки скил? для камней или свитков, для рубашки мафр...поделитесь плз примером.
 
эм... а что сложного то?

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

ввел новую стату, прописал в скилл, и просто вычисляешь ее значение в пакете заточки и прибавляешь к общему шансу.
в таблице xsd стату вводить? пишу ее в скиле, с пакетами беда...
 
в таблице xsd стату вводить? пишу ее в скиле, с пакетами беда...
а пакеты тут при чем? это сугубо серверный параметр который в клиент не как не передается.
 
блин код не могу прописать. skill.java я так понимаю, туда пишется новая стата?
 
блин код не могу прописать. skill.java я так понимаю, туда пишется новая стата?
Stats.java по пути java\com\l2jmobius\gameserver\model\stats

пример у меня было на другом сурсе,
Код:
BONUS_ENCHANT("bonusEnchant"),                  // Бонус Заточки            (add/sub)
 
Stats.java по пути java\com\l2jmobius\gameserver\model\stats

пример у меня было на другом сурсе,
Код:
BONUS_ENCHANT("bonusEnchant"),                  // Бонус Заточки            (add/sub)
да не, я понимаю что название статы любое можно назначить, как в код все это вписать. Вот например
public Skill(StatsSet set)
{
_id = set.getInt("skill_id");
_level = set.getInt("level");
_displayId = set.getInt("displayId", _id);
_displayLevel = set.getInt("displayLevel", _level);
_name = set.getString("name", "");
_operateType = set.getEnum("operateType", SkillOperateType.class);
походу это тут объявляют переменные, если взять стату "name", то она не только здесь встречается, так то я мог бы написать тут _enchant_chance_modifier = set.getInt("enchant_chance_modifier"); и все...
но _name по всему class раскидано

Line 76: private static final Logger _log = Logger.getLogger(Skill.class.getName());
Line 88: /** Skill client's name. */
Line 89: private final String _name;
Line 231: _name = set.getString("name", "");
Line 231: _name = set.getString("name", "");
Line 281: _log.info("*** Skill " + _name + " (" + _level + ") changed reuse from " + set.getInt("reuseDelay", 0) + " to " + Config.SKILL_REUSE_LIST.get(_id) + " seconds.");
Line 795: * Return the skill name
Line 797: public String getName()
Line 799: return _name;
Line 991: sm.addSkillName(_id);
Line 1012: if (cond.isAddName())
Line 1014: sm.addSkillName(_id);
Line 1192: if (player.isGood() && ((L2Npc) target).getTemplate().isClan(Config.FACTION_GOOD_TEAM_NAME))
Line 1196: if (player.isEvil() && ((L2Npc) target).getTemplate().isClan(Config.FACTION_EVIL_TEAM_NAME))
Line 1612: return "Skill " + _name + "(" + _id + "," + _level + ")";
Line 1637: public String getAttributeName()
Line 1799: final AbnormalVisualEffect ave = AbnormalVisualEffect.findByName(aveString);
а это темный лес(

сюда внес стату
Код:
<skill id="9369" levels="2" name="Power of Maphr">
        <!-- AUTO GENERATED SKILL -->
        <!-- Enchant success rate + 10%. Not for No-grade items. -->
        <table name="#enchantChanceModifier">10 15</table>
        <set name="icon" val="icon.pi_shirt_of_wolf_2nd_earth" />
        <set name="operateType" val="PASSIVE" />
        <set name="targetType" val="SELF" />
        <for>
            <mul order="0x30" stat="enchantChanceModifier" value="#enchantChanceModifier"/>
        </for>
    </skill>
в xsd <xs:attribute type="xs:string" name="enchantChanceModifier" use="optional" />

в класс private final int _enchantChanceModifier; и _enchantChanceModifier = set.getInt("enchantChanceModifier", 0);
компил без ошибок
гс дает Unknown name 'enchantChanceModifier' for enum Stats
 
Последнее редактирование модератором:
да не, я понимаю что название статы любое можно назначить, как в код все это вписать. Вот например
public Skill(StatsSet set)
{
_id = set.getInt("skill_id");
_level = set.getInt("level");
_displayId = set.getInt("displayId", _id);
_displayLevel = set.getInt("displayLevel", _level);
_name = set.getString("name", "");
_operateType = set.getEnum("operateType", SkillOperateType.class);
походу это тут объявляют переменные, если взять стату "name", то она не только здесь встречается, так то я мог бы написать тут _enchant_chance_modifier = set.getInt("enchant_chance_modifier"); и все...
но _name по всему class раскидано

Line 76: private static final Logger _log = Logger.getLogger(Skill.class.getName());
Line 88: /** Skill client's name. */
Line 89: private final String _name;
Line 231: _name = set.getString("name", "");
Line 231: _name = set.getString("name", "");
Line 281: _log.info("*** Skill " + _name + " (" + _level + ") changed reuse from " + set.getInt("reuseDelay", 0) + " to " + Config.SKILL_REUSE_LIST.get(_id) + " seconds.");
Line 795: * @return the skill name
Line 797: public String getName()
Line 799: return _name;
Line 991: sm.addSkillName(_id);
Line 1012: if (cond.isAddName())
Line 1014: sm.addSkillName(_id);
Line 1192: if (player.isGood() && ((L2Npc) target).getTemplate().isClan(Config.FACTION_GOOD_TEAM_NAME))
Line 1196: if (player.isEvil() && ((L2Npc) target).getTemplate().isClan(Config.FACTION_EVIL_TEAM_NAME))
Line 1612: return "Skill " + _name + "(" + _id + "," + _level + ")";
Line 1637: public String getAttributeName()
Line 1799: final AbnormalVisualEffect ave = AbnormalVisualEffect.findByName(aveString);
а это темный лес(

В чем проблема открыть файл Stats.java взять название статы той же П. Атаки и сделать поиск по сборке и посмотреть как используется ?
В классе Skill, поле name - это Имя Умения, а не стата.

сюда внес стату
Код:
<skill id="9369" levels="2" name="Power of Maphr">
        <!-- AUTO GENERATED SKILL -->
        <!-- Enchant success rate + 10%. Not for No-grade items. -->
        <table name="#enchantChanceModifier">10 15</table>
        <set name="icon" val="icon.pi_shirt_of_wolf_2nd_earth" />
        <set name="operateType" val="PASSIVE" />
        <set name="targetType" val="SELF" />
        <for>
            <mul order="0x30" stat="enchantChanceModifier" value="#enchantChanceModifier"/>
        </for>
    </skill>
в xsd <xs:attribute type="xs:string" name="enchantChanceModifier" use="optional" />

в класс private final int _enchantChanceModifier; и _enchantChanceModifier = set.getInt("enchantChanceModifier", 0);
компил без ошибок
гс дает Unknown name 'enchantChanceModifier' for enum Stats

Вам же выше сказали, где находятся статы, вписываете новую в Stats.java и потом там где нужно, на сколько помню, вызываете calcStat(Stats.ВАША_СТАТА, ....);

P.S. А вообще советую изучить хотя бы основы Java и разобраться в структуре сборки.
 
  • Мне нравится
Реакции: kick
В чем проблема открыть файл Stats.java взять название статы той же П. Атаки и сделать поиск по сборке и посмотреть как используется ?
В классе Skill, поле name - это Имя Умения, а не стата.



Вам же выше сказали, где находятся статы, вписываете новую в Stats.java и потом там где нужно, на сколько помню, вызываете calcStat(Stats.ВАША_СТАТА, ....);

P.S. А вообще советую изучить хотя бы основы Java и разобраться в структуре сборки.

не внимательно прочел про Stats.java сори. А основы Java курю. С нуля не так легко вникается
 
Открою страшную тайну, основы не нудно курить.
не знаю, может я не то учу,Java 7- The Complete Reference - 8th Edition - написано было Основы) и Сухов - основы программирования на Java

и потом там где нужно, на сколько помню, вызываете calcStat(Stats.ВАША_СТАТА, ....);
а там где нужно, это где? CharStat, или Formulas?
 
а там где нужно, это где? CharStat, или Formulas?

Ну, выше же сказали, цитирую:
вычисляешь ее значение в пакете заточки и прибавляешь к общему шансу.

Пишите:
Код:
double value = player.calcStat(Stats.ВАША_СТАТА, ...);

И делаете с ней то, что Вам нужно.
 
  • Мне нравится
Реакции: kick
Открою страшную тайну, основы не нудно курить.
не нужно? fxd*
то есть тонкий намек на понятие логики, и на ее основе построить свой новый параметр
далеко не всем дается это, хотя думаю почти все "ява девелоперы в сфере л2" учились таким способом
 
class Player
Код:
    public double getEnchantChanceModifier()
    {
        return calcStat(Stats.ENCHANT_CHANCE_MODIFIER);
    }///
......................
    public double getEnchantChanceModifier()
    {
        return calcStat(Stats.ENCHANT_CHANCE_MODIFIER);
    }
class RequestEnchantItem
Код:
if(item.getGrade() != ItemGrade.NONE)
                chance *= player.getEnchantChanceModifier();
class Stats
Код:
ENCHANT_CHANCE_MODIFIER("enchant_chance_modifier", Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY, 1.);
 
Обратите внимание, что данный пользователь заблокирован! Не совершайте с ним никаких сделок! Перейдите в его профиль, чтобы узнать причину блокировки.
а у меня нет Player. должен тут быть же L2J_Mobius\java\com\l2jmobius\gameserver\model ну и по всем исходникам пошерстил, не нашлось ничего. Последняя рева
совсем не додуматься? не пошевелить мозгами, как еще может называться player?
\java\com\l2jmobius\gameserver\model\actor > L2Character - логично ведь?)
 
совсем не додуматься? не пошевелить мозгами, как еще может называться player?
\java\com\l2jmobius\gameserver\model\actor > L2Character - логично ведь?)
первый раз что-то с ядром делаю, не обессудьте) спасибо за L2Character
 
совсем не додуматься? не пошевелить мозгами, как еще может называться player?
\java\com\l2jmobius\gameserver\model\actor > L2Character - логично ведь?)
нет не логично, логичнее будет L2PcInstance.java, L2Character - Creature в овере.
 
а зачем пихать еще метод в Player, если данные то нужны в однмо месте всего - так и считать все в самом пакете заточки

Код:
int safeEnchantLevel = enchantScroll.getSafe(item.getTemplate().getBodyPart() != ItemTemplate.SLOT_FULL_ARMOR);
int chance = enchantScroll.getChance(item.isMagic());

if (chance < 100)
{
	// для заточки до +3 (до +4 для цельной брони) шанс всегда 100% 
	if (item.getEnchantLevel() < safeEnchantLevel)
		chance = 100;
	// Иначе для заточки +5 (+6 для цельной брони) и выше, по необходимости проводим коррекцию базового шанса
	else if (item.getEnchantLevel() > (safeEnchantLevel + 1) && enchantScroll.getChanceMod() > 0.)
		chance = (int) Math.max((1 - enchantScroll.getChanceMod() * (item.getEnchantLevel() - safeEnchantLevel - 1)) * chance, enchantScroll.getChanceMin());

	// Бонус от прибавки в самом свитке (свитки "+10% к шансу" и все такое)
	chance += enchantScroll.getChanceAdd();

	// Бонус от камня, если он есть
	if (enchantStone != null)
		chance += enchantStone.getChanceAdd();

	// Бонус от ПА, если он есть
	if (player.getRateBonusExpire() > 0)
		chance += enchantScroll.getPremiumBonus();

	// Бонус от всего остального (Рубашка Мафр и т.п.)
	if (item.getCrystalType() != Grade.NONE)
		chance += player.calcStat(Stats.ENCHANT_BONUS, 0);
}

chance = Math.min(chance, 100);
 
понимаю что все разжевали уже мне, положили на тарелку, но хоть убейте не знаю как сделать.
Код:
/*
* This file is part of the L2J Mobius project.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.l2jmobius.gameserver.network.clientpackets;

import java.util.logging.Level;
import java.util.logging.LogRecord;
import java.util.logging.Logger;

import com.l2jmobius.Config;
import com.l2jmobius.gameserver.data.xml.impl.EnchantItemData;
import com.l2jmobius.gameserver.enums.UserInfoType;
import com.l2jmobius.gameserver.model.L2World;
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
import com.l2jmobius.gameserver.model.actor.request.EnchantItemRequest;
import com.l2jmobius.gameserver.model.items.L2Item;
import com.l2jmobius.gameserver.model.items.enchant.EnchantResultType;
import com.l2jmobius.gameserver.model.items.enchant.EnchantScroll;
import com.l2jmobius.gameserver.model.items.enchant.EnchantSupportItem;
import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance;
import com.l2jmobius.gameserver.model.items.type.EtcItemType;
import com.l2jmobius.gameserver.model.skills.CommonSkill;
import com.l2jmobius.gameserver.model.skills.Skill;
import com.l2jmobius.gameserver.network.SystemMessageId;
import com.l2jmobius.gameserver.network.serverpackets.EnchantResult;
import com.l2jmobius.gameserver.network.serverpackets.ExAdenaInvenCount;
import com.l2jmobius.gameserver.network.serverpackets.ExUserInfoInvenWeight;
import com.l2jmobius.gameserver.network.serverpackets.InventoryUpdate;
import com.l2jmobius.gameserver.network.serverpackets.ItemList;
import com.l2jmobius.gameserver.network.serverpackets.MagicSkillUse;
import com.l2jmobius.gameserver.network.serverpackets.SystemMessage;
import com.l2jmobius.gameserver.util.Util;
import com.l2jmobius.util.Rnd;

public final class RequestEnchantItem extends L2GameClientPacket
{
    protected static final Logger _logEnchant = Logger.getLogger("enchant");

    private static final String _C__5F_REQUESTENCHANTITEM = "[C] 5F RequestEnchantItem";

    private int _objectId;
    private int _supportId;

    @Override
    protected void readImpl()
    {
        _objectId = readD();
        _supportId = readD();
    }

    @Override
    protected void runImpl()
    {
        final L2PcInstance activeChar = getClient().getActiveChar();
        if (activeChar == null)
        {
            return;
        }
     
        final EnchantItemRequest request = activeChar.getRequest(EnchantItemRequest.class);
        if ((request == null) || request.isProcessing())
        {
            return;
        }
     
        request.setEnchantingItem(_objectId);
        request.setProcessing(true);
     
        if (!activeChar.isOnline() || getClient().isDetached())
        {
            activeChar.removeRequest(request.getClass());
            return;
        }
     
        if (activeChar.isProcessingTransaction() || activeChar.isInStoreMode())
        {
            activeChar.sendPacket(SystemMessageId.YOU_CANNOT_ENCHANT_WHILE_OPERATING_A_PRIVATE_STORE_OR_PRIVATE_WORKSHOP);
            activeChar.removeRequest(request.getClass());
            return;
        }
     
        final L2ItemInstance item = request.getEnchantingItem();
        final L2ItemInstance scroll = request.getEnchantingScroll();
        final L2ItemInstance support = request.getSupportItem();
        if ((item == null) || (scroll == null))
        {
            activeChar.removeRequest(request.getClass());
            return;
        }
     
        // template for scroll
        final EnchantScroll scrollTemplate = EnchantItemData.getInstance().getEnchantScroll(scroll);
        if (scrollTemplate == null)
        {
            return;
        }
     
        // template for support item, if exist
        EnchantSupportItem supportTemplate = null;
        if (support != null)
        {
            if (support.getObjectId() != _supportId)
            {
                activeChar.removeRequest(request.getClass());
                return;
            }
            supportTemplate = EnchantItemData.getInstance().getSupportItem(support);
        }
        if(item.getGrade() != ItemGrade.NONE)
                chance *= player.getBonusEnchRate();
     
        // first validation check - also over enchant check
        if (!scrollTemplate.isValid(item, supportTemplate) || (Config.DISABLE_OVER_ENCHANTING && (item.getEnchantLevel() == scrollTemplate.getMaxEnchantLevel())))
        {
            activeChar.sendPacket(SystemMessageId.INAPPROPRIATE_ENCHANT_CONDITIONS);
            activeChar.removeRequest(request.getClass());
            activeChar.sendPacket(new EnchantResult(EnchantResult.ERROR, 0, 0));
            return;
        }
     
        // fast auto-enchant cheat check
        if ((request.getTimestamp() == 0) || ((System.currentTimeMillis() - request.getTimestamp()) < 2000))
        {
            Util.handleIllegalPlayerAction(activeChar, "Player " + activeChar.getName() + " use autoenchant program ", Config.DEFAULT_PUNISH);
            activeChar.removeRequest(request.getClass());
            activeChar.sendPacket(new EnchantResult(EnchantResult.ERROR, 0, 0));
            return;
        }
     
        // attempting to destroy scroll
        if (activeChar.getInventory().destroyItem("Enchant", scroll.getObjectId(), 1, activeChar, item) == null)
        {
            activeChar.sendPacket(SystemMessageId.INCORRECT_ITEM_COUNT);
            Util.handleIllegalPlayerAction(activeChar, "Player " + activeChar.getName() + " tried to enchant with a scroll he doesn't have", Config.DEFAULT_PUNISH);
            activeChar.removeRequest(request.getClass());
            activeChar.sendPacket(new EnchantResult(EnchantResult.ERROR, 0, 0));
            return;
        }
     
        // attempting to destroy support if exist
        if ((support != null) && (activeChar.getInventory().destroyItem("Enchant", support.getObjectId(), 1, activeChar, item) == null))
        {
            activeChar.sendPacket(SystemMessageId.INCORRECT_ITEM_COUNT);
            Util.handleIllegalPlayerAction(activeChar, "Player " + activeChar.getName() + " tried to enchant with a support item he doesn't have", Config.DEFAULT_PUNISH);
            activeChar.removeRequest(request.getClass());
            activeChar.sendPacket(new EnchantResult(EnchantResult.ERROR, 0, 0));
            return;
        }
     
        final InventoryUpdate iu = new InventoryUpdate();
        synchronized (item)
        {
            // last validation check
            if ((item.getOwnerId() != activeChar.getObjectId()) || (item.isEnchantable() == 0))
            {
                activeChar.sendPacket(SystemMessageId.INAPPROPRIATE_ENCHANT_CONDITIONS);
                activeChar.removeRequest(request.getClass());
                activeChar.sendPacket(new EnchantResult(EnchantResult.ERROR, 0, 0));
                return;
            }
         
            final EnchantResultType resultType = scrollTemplate.calculateSuccess(activeChar, item, supportTemplate);
            switch (resultType)
            {
                case ERROR:
                {
                    activeChar.sendPacket(SystemMessageId.INAPPROPRIATE_ENCHANT_CONDITIONS);
                    activeChar.removeRequest(request.getClass());
                    activeChar.sendPacket(new EnchantResult(EnchantResult.ERROR, 0, 0));
                    break;
                }
                case SUCCESS:
                {
                    Skill enchant4Skill = null;
                    final L2Item it = item.getItem();
                    // Increase enchant level only if scroll's base template has chance, some armors can success over +20 but they shouldn't have increased.
                    if (scrollTemplate.getChance(activeChar, item) > 0)
                    {
                        if (scrollTemplate.isGiant() && ((supportTemplate == null) || (supportTemplate.getItem().getItemType() != EtcItemType.GIANT2_SCRL_BLESS_INC_ENCHANT_PROP_AM) || (supportTemplate.getItem().getItemType() != EtcItemType.GIANT2_SCRL_BLESS_INC_ENCHANT_PROP_WP)))
                        {
                            item.setEnchantLevel(item.getEnchantLevel() + Rnd.get(1, 3));
                        }
                        else if (scrollTemplate.isGiant() && (supportTemplate != null) && ((supportTemplate.getItem().getItemType() == EtcItemType.GIANT2_SCRL_BLESS_INC_ENCHANT_PROP_AM) || (supportTemplate.getItem().getItemType() == EtcItemType.GIANT2_SCRL_BLESS_INC_ENCHANT_PROP_WP)))
                        {
                            item.setEnchantLevel(item.getEnchantLevel() + Rnd.get(2, 4));
                        }
                        else
                        {
                            item.setEnchantLevel(item.getEnchantLevel() + 1);
                        }
                        item.updateDatabase();
                    }
                    activeChar.sendPacket(new EnchantResult(EnchantResult.SUCCESS, item));
                 
                    if (Config.LOG_ITEM_ENCHANTS)
                    {
                        final LogRecord record = new LogRecord(Level.INFO, "Success");
                        record.setParameters(new Object[]
                        {
                            activeChar,
                            item,
                            scroll,
                            support,
                        });
                        record.setLoggerName("item");
                        _logEnchant.log(record);
                    }
                 
                    // announce the success
                    final int minEnchantAnnounce = item.isArmor() ? 6 : 7;
                    final int maxEnchantAnnounce = item.isArmor() ? 0 : 15;
                    if ((item.getEnchantLevel() == minEnchantAnnounce) || (item.getEnchantLevel() == maxEnchantAnnounce))
                    {
                        final SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.C1_HAS_SUCCESSFULLY_ENCHANTED_A_S2_S3);
                        sm.addCharName(activeChar);
                        sm.addInt(item.getEnchantLevel());
                        sm.addItemName(item);
                        activeChar.broadcastPacket(sm);
                     
                        final Skill skill = CommonSkill.FIREWORK.getSkill();
                        if (skill != null)
                        {
                            activeChar.broadcastPacket(new MagicSkillUse(activeChar, activeChar, skill.getId(), skill.getLevel(), skill.getHitTime(), skill.getReuseDelay()));
                        }
                    }
                 
                    if (item.isArmor() && (item.getEnchantLevel() >= 4) && item.isEquipped())
                    {
                        enchant4Skill = it.getEnchant4Skill();
                        if (enchant4Skill != null)
                        {
                            // add skills bestowed from +4 armor
                            activeChar.addSkill(enchant4Skill, false);
                            activeChar.sendSkillList();
                        }
                    }
                    break;
                }
                case FAILURE:
                {
                    if (scrollTemplate.isSafe())
                    {
                        // safe enchant - remain old value
                        activeChar.sendPacket(SystemMessageId.ENCHANT_FAILED_THE_ENCHANT_SKILL_FOR_THE_CORRESPONDING_ITEM_WILL_BE_EXACTLY_RETAINED);
                        activeChar.sendPacket(new EnchantResult(EnchantResult.SAFE_FAIL, item));
                     
                        if (Config.LOG_ITEM_ENCHANTS)
                        {
                            final LogRecord record = new LogRecord(Level.INFO, "Safe Fail");
                            record.setParameters(new Object[]
                            {
                                activeChar,
                                item,
                                scroll,
                                support,
                            });
                            record.setLoggerName("item");
                            _logEnchant.log(record);
                        }
                    }
                    else
                    {
                        // unequip item on enchant failure to avoid item skills stack
                        if (item.isEquipped())
                        {
                            final SystemMessage sm;
                            if (item.getEnchantLevel() > 0)
                            {
                                sm = SystemMessage.getSystemMessage(SystemMessageId.THE_EQUIPMENT_S1_S2_HAS_BEEN_REMOVED);
                                sm.addInt(item.getEnchantLevel());
                            }
                            else
                            {
                                sm = SystemMessage.getSystemMessage(SystemMessageId.S1_HAS_BEEN_UNEQUIPPED);
                            }
                            sm.addItemName(item);
                            activeChar.sendPacket(sm);
                         
                            final L2ItemInstance[] unequiped = activeChar.getInventory().unEquipItemInSlotAndRecord(item.getLocationSlot());
                            for (L2ItemInstance itm : unequiped)
                            {
                                iu.addModifiedItem(itm);
                            }
                         
                            activeChar.sendPacket(iu);
                            activeChar.broadcastUserInfo();
                        }
                     
                        if (scrollTemplate.isBlessed() && (supportTemplate != null) && ((supportTemplate.getItem().getItemType() == EtcItemType.BLESS_DROP_SCRL_INC_ENCHANT_PROP_AM) || (supportTemplate.getItem().getItemType() == EtcItemType.BLESS_DROP_SCRL_INC_ENCHANT_PROP_WP)))
                        {
                            // blessed enchant + using special stone - drop enchant value by 1
                            activeChar.sendPacket(SystemMessageId.FAILURE_WILL_DEDUCT_YOUR_ENCHANT_VALUE_BY_1);
                         
                            item.setEnchantLevel(item.getEnchantLevel() - 1);
                            item.updateDatabase();
                            activeChar.sendPacket(new EnchantResult(EnchantResult.BLESSED_FAIL, 0, 0));
                         
                            if (Config.LOG_ITEM_ENCHANTS)
                            {
                                final LogRecord record = new LogRecord(Level.INFO, "Blessed Fail");
                                record.setParameters(new Object[]
                                {
                                    activeChar,
                                    item,
                                    scroll,
                                    support,
                                });
                                record.setLoggerName("item");
                                _logEnchant.log(record);
                            }
                        }
                        else if (scrollTemplate.isBlessed() || ((supportTemplate != null) && ((supportTemplate.getItem().getItemType() == EtcItemType.GIANT_SCRL_BLESS_INC_ENCHANT_PROP_AM) || (supportTemplate.getItem().getItemType() == EtcItemType.GIANT_SCRL_BLESS_INC_ENCHANT_PROP_WP) || (supportTemplate.getItem().getItemType() == EtcItemType.SCRL_BLESS_INC_ENCHANT_PROP_AM) || (supportTemplate.getItem().getItemType() == EtcItemType.SCRL_BLESS_INC_ENCHANT_PROP_WP))))
                        {
                            // blessed enchant - clear enchant value
                            activeChar.sendPacket(SystemMessageId.THE_BLESSED_ENCHANT_FAILED_THE_ENCHANT_VALUE_OF_THE_ITEM_BECAME_0);
                         
                            item.setEnchantLevel(0);
                            item.updateDatabase();
                            activeChar.sendPacket(new EnchantResult(EnchantResult.BLESSED_FAIL, 0, 0));
                         
                            if (Config.LOG_ITEM_ENCHANTS)
                            {
                                final LogRecord record = new LogRecord(Level.INFO, "Blessed Fail");
                                record.setParameters(new Object[]
                                {
                                    activeChar,
                                    item,
                                    scroll,
                                    support,
                                });
                                record.setLoggerName("item");
                                _logEnchant.log(record);
                            }
                        }
                        else
                        {
                            // enchant failed, destroy item
                            if (activeChar.getInventory().destroyItem("Enchant", item, activeChar, null) == null)
                            {
                                // unable to destroy item, cheater ?
                                Util.handleIllegalPlayerAction(activeChar, "Unable to delete item on enchant failure from player " + activeChar.getName() + ", possible cheater !", Config.DEFAULT_PUNISH);
                                activeChar.removeRequest(request.getClass());
                                activeChar.sendPacket(new EnchantResult(EnchantResult.ERROR, 0, 0));
                             
                                if (Config.LOG_ITEM_ENCHANTS)
                                {
                                    final LogRecord record = new LogRecord(Level.INFO, "Unable to destroy");
                                    record.setParameters(new Object[]
                                    {
                                        activeChar,
                                        item,
                                        scroll,
                                        support,
                                    });
                                    record.setLoggerName("item");
                                    _logEnchant.log(record);
                                }
                                return;
                            }
                         
                            L2World.getInstance().removeObject(item);
                         
                            final int crystalId = item.getItem().getCrystalItemId();
                            if ((crystalId != 0) && item.getItem().isCrystallizable())
                            {
                                int count = item.getCrystalCount() - ((item.getItem().getCrystalCount() + 1) / 2);
                                count = count < 1 ? 1 : count;
                                activeChar.getInventory().addItem("Enchant", crystalId, count, activeChar, item);
                             
                                final SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.YOU_HAVE_EARNED_S2_S1_S);
                                sm.addItemName(crystalId);
                                sm.addLong(count);
                                activeChar.sendPacket(sm);
                                activeChar.sendPacket(new EnchantResult(EnchantResult.NO_CRYSTAL, crystalId, count));
                            }
                            else
                            {
                                activeChar.sendPacket(new EnchantResult(EnchantResult.FAIL, 0, 0));
                            }
                         
                            if (Config.LOG_ITEM_ENCHANTS)
                            {
                                final LogRecord record = new LogRecord(Level.INFO, "Fail");
                                record.setParameters(new Object[]
                                {
                                    activeChar,
                                    item,
                                    scroll,
                                    support,
                                });
                                record.setLoggerName("item");
                                _logEnchant.log(record);
                            }
                        }
                    }
                    break;
                }
            }
         
            if (!Config.FORCE_INVENTORY_UPDATE)
            {
                if (scroll.getCount() == 0)
                {
                    iu.addRemovedItem(scroll);
                }
                else
                {
                    iu.addModifiedItem(scroll);
                }
             
                if (item.getCount() == 0)
                {
                    iu.addRemovedItem(item);
                }
                else
                {
                    iu.addModifiedItem(item);
                }
             
                if (support != null)
                {
                    if (support.getCount() == 0)
                    {
                        iu.addRemovedItem(support);
                    }
                    else
                    {
                        iu.addModifiedItem(support);
                    }
                }
             
                activeChar.sendPacket(iu);
            }
            else
            {
                activeChar.sendPacket(new ItemList(activeChar, true));
            }
         
            request.setProcessing(false);
            activeChar.broadcastUserInfo(UserInfoType.ENCHANTLEVEL);
            activeChar.sendPacket(new ExUserInfoInvenWeight(activeChar));
            activeChar.sendPacket(new ExAdenaInvenCount(activeChar));
        }
    }

    @Override
    public String getType()
    {
        return _C__5F_REQUESTENCHANTITEM;
    }
}
нашел один комент про шанс, но этот шанс getChance самого итема, не бонуса. А ниже описание свитков гиганта, блески или простой точки, что она дает.
а зачем пихать еще метод в Player, если данные то нужны в одном месте всего - так и считать все в самом пакете заточки

Код:
int safeEnchantLevel = enchantScroll.getSafe(item.getTemplate().getBodyPart() != ItemTemplate.SLOT_FULL_ARMOR);
int chance = enchantScroll.getChance(item.isMagic());

if (chance < 100)
{
    // для заточки до +3 (до +4 для цельной брони) шанс всегда 100%
    if (item.getEnchantLevel() < safeEnchantLevel)
        chance = 100;
    // Иначе для заточки +5 (+6 для цельной брони) и выше, по необходимости проводим коррекцию базового шанса
    else if (item.getEnchantLevel() > (safeEnchantLevel + 1) && enchantScroll.getChanceMod() > 0.)
        chance = (int) Math.max((1 - enchantScroll.getChanceMod() * (item.getEnchantLevel() - safeEnchantLevel - 1)) * chance, enchantScroll.getChanceMin());

    // Бонус от прибавки в самом свитке (свитки "+10% к шансу" и все такое)
    chance += enchantScroll.getChanceAdd();

    // Бонус от камня, если он есть
    if (enchantStone != null)
        chance += enchantStone.getChanceAdd();

    // Бонус от ПА, если он есть
    if (player.getRateBonusExpire() > 0)
        chance += enchantScroll.getPremiumBonus();

    // Бонус от всего остального (Рубашка Мафр и т.п.)
    if (item.getCrystalType() != Grade.NONE)
        chance += player.calcStat(Stats.ENCHANT_BONUS, 0);
}

chance = Math.min(chance, 100);
как приспособить этот код к пакету энчанта?
Оффтоп:
вангую фэйспалмы и сообщения "убейте тс". Хелло ворлд скучно писать, тут намного интересней. Учусь я, учусь
 
Назад
Сверху Снизу