Welcome to RUSaCis - эмулятор Interlude

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

EnchantBoost v2.0 - RusAcis v3.8

Atrein

Вассал
INTERLUDE
INTERFACE
Регистрация
16 Янв 2022
Сообщения
71
Реакции
38
Баллы
18
RaCoin
5
ItemHandler.java:
import net.sf.l2j.gameserver.handler.itemhandlers.Elixirs;
+import net.sf.l2j.gameserver.handler.itemhandlers.EnchantBoost;
import net.sf.l2j.gameserver.handler.itemhandlers.EnchantScrolls;



        registerHandler(new Elixirs());
       
+        // Регистрация кастомного буста следующей заточки.
+        registerHandler(new EnchantBoost());
       
        registerHandler(new EnchantScrolls());

Config.java:
   public static int FAKE_ONLINE_AMOUNT;
   
    public static String BUFFS_CATEGORY;
    public static List<String> PREMIUM_BUFFS_CATEGORY = new ArrayList<>();
    public static int PREMIUM_BUFF_ITEM_ID;
    public static int PREMIUM_BUFF_ITEM_COUNT;
   
   
+    /**
+     * By Atrein:
+     * Enchant Boost activation and visual feedback settings.
+     */
+    public static long ENCHANT_BOOST_REUSE_DELAY;
+    public static int ENCHANT_BOOST_ACTIVATION_SKILL_ID;
+    public static int ENCHANT_BOOST_ACTIVATION_SKILL_LEVEL;
+    public static int ENCHANT_BOOST_ACTIVATION_HIT_TIME;
   
    public static boolean ANTIFEED_ENABLE;
    public static boolean ANTIFEED_DUALBOX;
   

        BUFFS_CATEGORY = rusacis.getProperty("PremiumBuffsCategory", "");
        PREMIUM_BUFFS_CATEGORY = new ArrayList<>();
        for (String category : BUFFS_CATEGORY.split(","))
        {
            category = category.trim();
            if (!category.isEmpty())
                PREMIUM_BUFFS_CATEGORY.add(category);
        }
        PREMIUM_BUFF_ITEM_ID = rusacis.getProperty("PremiumBuffItemId", 4037);
        PREMIUM_BUFF_ITEM_COUNT = Math.max(1, rusacis.getProperty("PremiumBuffItemCount", 1));
       
+        ENCHANT_BOOST_REUSE_DELAY = Math.max(0L, rusacis.getProperty("EnchantBoostReuseDelay", 2000));
+        ENCHANT_BOOST_ACTIVATION_SKILL_ID = Math.max(0, rusacis.getProperty("EnchantBoostActivationSkillId", 2025));
+        ENCHANT_BOOST_ACTIVATION_SKILL_LEVEL = Math.max(1, rusacis.getProperty("EnchantBoostActivationSkillLevel", 1));
+        ENCHANT_BOOST_ACTIVATION_HIT_TIME = Math.max(0, rusacis.getProperty("EnchantBoostActivationHitTime", 1000));
       
        ANTIFEED_ENABLE = rusacis.getProperty("AntiFeedEnable", false);
        ANTIFEED_DUALBOX = rusacis.getProperty("AntiFeedDualbox", true);
 
Последнее редактирование:

Atrein

Вассал
INTERLUDE
INTERFACE
Регистрация
16 Янв 2022
Сообщения
71
Реакции
38
Баллы
18
RaCoin
5
\data\xml\items\9704-9706:
<item id="9704" type="EtcItem" name="Enchant Boost Scroll +5%">
        <set name="icon" val="icon.etc_roll_of_paper_black_i00" />
        <set name="default_action" val="skill_reduce" />
        <set name="etcitem_type" val="SCROLL" />
        <set name="immediate_effect" val="true" />
        <set name="material" val="PAPER" />
        <set name="weight" val="120" />
        <set name="price" val="0" />
        <set name="is_stackable" val="true" />
        <set name="is_sellable" val="false" />
        <set name="is_dropable" val="false" />
        <set name="is_tradable" val="false" />
        <set name="is_depositable" val="false" />
        <set name="is_destroyable" val="true" />
        <set name="handler" val="EnchantBoost" />
        <set name="enchantBonus" val="5" />
    </item>
    <item id="9705" type="EtcItem" name="Enchant Boost Scroll +10%">
        <set name="icon" val="icon.etc_roll_of_paper_black_i00" />
        <set name="default_action" val="skill_reduce" />
        <set name="etcitem_type" val="SCROLL" />
        <set name="immediate_effect" val="true" />
        <set name="material" val="PAPER" />
        <set name="weight" val="120" />
        <set name="price" val="0" />
        <set name="is_stackable" val="true" />
        <set name="is_sellable" val="false" />
        <set name="is_dropable" val="false" />
        <set name="is_tradable" val="false" />
        <set name="is_depositable" val="false" />
        <set name="is_destroyable" val="true" />
        <set name="handler" val="EnchantBoost" />
        <set name="enchantBonus" val="10" />
    </item>
    <item id="9706" type="EtcItem" name="Enchant Boost Scroll +15%">
        <set name="icon" val="icon.etc_roll_of_paper_black_i00" />
        <set name="default_action" val="skill_reduce" />
        <set name="etcitem_type" val="SCROLL" />
        <set name="immediate_effect" val="true" />
        <set name="material" val="PAPER" />
        <set name="weight" val="120" />
        <set name="price" val="0" />
        <set name="is_stackable" val="true" />
        <set name="is_sellable" val="false" />
        <set name="is_dropable" val="false" />
        <set name="is_tradable" val="false" />
        <set name="is_depositable" val="false" />
        <set name="is_destroyable" val="true" />
        <set name="handler" val="EnchantBoost" />
        <set name="enchantBonus" val="15" />
    </item>

EnchantBoost.java:
package net.sf.l2j.gameserver.handler.itemhandlers;

import net.sf.l2j.Config;
import net.sf.l2j.gameserver.handler.IItemHandler;
import net.sf.l2j.gameserver.model.actor.Playable;
import net.sf.l2j.gameserver.model.actor.Player;
import net.sf.l2j.gameserver.model.enchant.EnchantBoostService;
import net.sf.l2j.gameserver.model.enchant.EnchantBoostService.ActivationResult;
import net.sf.l2j.gameserver.model.item.instance.ItemInstance;
import net.sf.l2j.gameserver.model.item.kind.Item;
import net.sf.l2j.gameserver.network.serverpackets.ActionFailed;
import net.sf.l2j.gameserver.network.serverpackets.MagicSkillUse;

/**
 * By Atrein:
 * {@link EnchantBoostService}.
 */
public final class EnchantBoost implements IItemHandler
{
    private static final EnchantBoostService SERVICE = EnchantBoostService.getInstance();
    
    @Override
    public void useItem(Playable playable, ItemInstance item, boolean forceUse)
    {
        if (!(playable instanceof Player player) || item == null)
            return;
        
        final int validationError = validate(player, item);
        if (validationError != 0)
        {
            fail(player, validationError);
            return;
        }
        
        final Item template = item.getItem();
        final int bonus = template == null ? 0 : template.getEnchantBonus();
        final ActivationResult result = SERVICE.activate(player, item, bonus);
        
        switch (result.status())
        {
            case SUCCESS:
                broadcastActivationEffect(player);
                player.sendMessage(player.getSysString(10_274, result.activeBonus()));
                break;
            case INVALID_BONUS:
                fail(player, 10_265);
                break;
            case REUSE_BLOCKED:
                fail(player, 10_263);
                break;
            case ALREADY_ACTIVE:
                player.sendMessage(player.getSysString(10_264, result.activeBonus()));
                player.sendPacket(ActionFailed.STATIC_PACKET);
                break;
            case CONSUME_FAILED:
                fail(player, 10_266);
                break;
        }
    }
    
    private static int validate(Player player, ItemInstance item)
    {
        if (item.getOwnerId() != player.getObjectId())
            return 10_266;
        if (player.isDead() || player.isAlikeDead())
            return 10_267;
        if (player.isProcessingTransaction() || player.isOperating() || player.isInStoreMode() || player.isInManageStoreMode())
            return 10_268;
        if (player.isFishing())
            return 10_269;
        if (player.isMounted())
            return 10_270;
        if (player.getCast().isCastingNow())
            return 10_271;
        if (player.getActiveEnchantItem() != null)
            return 10_272;
        if (player.isInventoryDisabled())
            return 10_273;
        return 0;
    }
    
    private static void broadcastActivationEffect(Player player)
    {
        if (Config.ENCHANT_BOOST_ACTIVATION_SKILL_ID <= 0 || Config.ENCHANT_BOOST_ACTIVATION_SKILL_LEVEL <= 0)
            return;
        
        player.broadcastPacket(new MagicSkillUse(player, player, Config.ENCHANT_BOOST_ACTIVATION_SKILL_ID, Config.ENCHANT_BOOST_ACTIVATION_SKILL_LEVEL, Config.ENCHANT_BOOST_ACTIVATION_HIT_TIME, 0));
    }
    
    private static void fail(Player player, int sysStringId)
    {
        player.sendMessage(player.getSysString(sysStringId));
        player.sendPacket(ActionFailed.STATIC_PACKET);
    }
}

EnchantBoostService.java:
package net.sf.l2j.gameserver.model.enchant;

import java.util.Collections;
import java.util.Map;
import java.util.WeakHashMap;

import net.sf.l2j.commons.logging.CLogger;

import net.sf.l2j.Config;
import net.sf.l2j.gameserver.model.actor.Player;
import net.sf.l2j.gameserver.model.item.instance.ItemInstance;
import net.sf.l2j.gameserver.model.records.custom.EnchantScroll;

/**
 * By Atrein:
 * The boost is stored in {@code character_memo}, activated atomically with item
 * consumption and consumed only by an explicitly allowed enchant scroll when it
 * actually increases the final enchant chance.
 */
public final class EnchantBoostService
{
    private static final CLogger LOGGER = new CLogger(EnchantBoostService.class.getName());
    
    private static final String MEMO_KEY = "enchant_boost_rate";
    private static final int MAX_BONUS = 100;
    
    private final Map<Player, PlayerState> _states = Collections.synchronizedMap(new WeakHashMap<>());
    
    private EnchantBoostService()
    {
    }
    
    /**
     * Activates a persistent enchant boost and consumes its source item as one
     * synchronized player operation.
     * @param player The player activating the boost.
     * @param item The source item to consume.
     * @param bonus The configured chance bonus in percentage points.
     * @return The activation result and the currently active bonus when relevant.
     */
    public ActivationResult activate(Player player, ItemInstance item, int bonus)
    {
        if (player == null || item == null || bonus <= 0 || bonus > MAX_BONUS)
            return new ActivationResult(ActivationStatus.INVALID_BONUS, 0);
        
        final PlayerState state = getState(player);
        synchronized (state)
        {
            final int activeBonus = readActiveBonus(player);
            if (activeBonus > 0)
                return new ActivationResult(ActivationStatus.ALREADY_ACTIVE, activeBonus);
            
            final long now = System.currentTimeMillis();
            if (now - state.lastSuccessfulUse < Config.ENCHANT_BOOST_REUSE_DELAY)
                return new ActivationResult(ActivationStatus.REUSE_BLOCKED, 0);
            
            if (item.getOwnerId() != player.getObjectId() || !player.destroyItem(item, 1, true))
                return new ActivationResult(ActivationStatus.CONSUME_FAILED, 0);
            
            player.getMemos().set(MEMO_KEY, bonus);
            state.lastSuccessfulUse = now;
            return new ActivationResult(ActivationStatus.SUCCESS, bonus);
        }
    }
    
    /**
     * Resolves the active boost for an actual enchant attempt.
     * <p>
     * The boost remains active for unsupported scrolls and for attempts whose
     * base chance is already 100%.
     * @param player The player performing the enchant.
     * @param scroll The server-side enchant scroll definition.
     * @param baseChance The unmodified server-side enchant chance.
     * @return The immutable application result, including the final chance.
     */
    public ApplicationResult applyToAttempt(Player player, EnchantScroll scroll, double baseChance)
    {
        if (player == null || scroll == null)
            return ApplicationResult.none(baseChance);
        
        final PlayerState state = getState(player);
        synchronized (state)
        {
            final int configuredBonus = readActiveBonus(player);
            if (configuredBonus <= 0)
                return ApplicationResult.none(baseChance);
            
            if (!scroll.allowEnchantBoost())
                return new ApplicationResult(ApplicationStatus.SCROLL_NOT_ALLOWED, configuredBonus, 0, baseChance);
            
            final double finalChance = Math.min(100D, baseChance + configuredBonus);
            final int effectiveBonus = Math.max(0, (int) Math.round(finalChance - baseChance));
            if (effectiveBonus == 0)
                return new ApplicationResult(ApplicationStatus.CHANCE_ALREADY_MAXIMUM, configuredBonus, 0, baseChance);
            
            player.getMemos().unset(MEMO_KEY);
            return new ApplicationResult(ApplicationStatus.APPLIED, configuredBonus, effectiveBonus, finalChance);
        }
    }
    
    /**
     * @param player The player to inspect.
     * @return The persisted active boost, or {@code 0} when no valid boost exists.
     */
    public int getActiveBonus(Player player)
    {
        if (player == null)
            return 0;
        
        final PlayerState state = getState(player);
        synchronized (state)
        {
            return readActiveBonus(player);
        }
    }
    
    private int readActiveBonus(Player player)
    {
        final String storedValue = player.getMemos().get(MEMO_KEY);
        if (storedValue == null)
            return 0;
        
        try
        {
            final int bonus = Integer.parseInt(storedValue);
            if (bonus > 0 && bonus <= MAX_BONUS)
                return bonus;
        }
        catch (NumberFormatException e)
        {
            // The invalid memo is removed below and reported once.
        }
        
        player.getMemos().unset(MEMO_KEY);
        LOGGER.warn("Removed invalid enchant boost memo [{}] for player [{}].", storedValue, player.getName());
        return 0;
    }
    
    /**
     * Notifies a player that a previously activated boost survived relog.
     * @param player The entering player.
     */
    public void notifyActiveBoost(Player player)
    {
        final int bonus = getActiveBonus(player);
        if (bonus > 0)
            player.sendMessage(player.getSysString(10_278, bonus));
    }
    
    private PlayerState getState(Player player)
    {
        synchronized (_states)
        {
            return _states.computeIfAbsent(player, key -> new PlayerState());
        }
    }
    
    public static EnchantBoostService getInstance()
    {
        return SingletonHolder.INSTANCE;
    }
    
    public enum ActivationStatus
    {
        SUCCESS,
        INVALID_BONUS,
        REUSE_BLOCKED,
        ALREADY_ACTIVE,
        CONSUME_FAILED
    }
    
    public enum ApplicationStatus
    {
        NONE,
        APPLIED,
        SCROLL_NOT_ALLOWED,
        CHANCE_ALREADY_MAXIMUM
    }
    
    public record ActivationResult(ActivationStatus status, int activeBonus)
    {
    }
    
    public record ApplicationResult(ApplicationStatus status, int configuredBonus, int effectiveBonus, double finalChance)
    {
        private static ApplicationResult none(double baseChance)
        {
            return new ApplicationResult(ApplicationStatus.NONE, 0, 0, baseChance);
        }
    }
    
    private static final class PlayerState
    {
        private long lastSuccessfulUse;
    }
    
    private static class SingletonHolder
    {
        private static final EnchantBoostService INSTANCE = new EnchantBoostService();
    }
}

EnchantScroll.java:
package net.sf.l2j.gameserver.model.records.custom;

import net.sf.l2j.commons.data.StatSet;
import net.sf.l2j.commons.util.ArraysUtil;

import net.sf.l2j.gameserver.enums.items.CrystalType;
import net.sf.l2j.gameserver.model.item.instance.ItemInstance;
import net.sf.l2j.gameserver.model.item.kind.Item;
import net.sf.l2j.gameserver.model.item.kind.Weapon;

/**
 * Server-side enchant scroll definition.
 * <p>
 * By Atrein:
 * {@code allowEnchantBoost} explicitly controls whether a one-shot chance boost
 * may be consumed by this scroll. The policy is data-driven and independent
 * from failure behavior such as crystalization or enchant-level rollback.
 *
 * @param scrollId The item ID of the enchant scroll.
 * @param grade The crystal grade accepted by the scroll.
 * @param isWeapon {@code true} when the scroll targets weapons; {@code false} for armor and accessories.
 * @param cristalize {@code true} when a failed enchant crystallizes the target item.
 * @param returnVal The enchant level restored after a non-crystallizing failure.
 * @param chance The standard enchant chances indexed by current enchant level.
 * @param chanceF The physical-weapon enchant chances indexed by current enchant level.
 * @param chanceM The magical-weapon enchant chances indexed by current enchant level.
 * @param allowEnchantBoost {@code true} when the scroll may consume an active Enchant Boost.
 * @param message {@code true} when configured enchant milestones should be announced.
 * @param enchants The enchant levels that trigger an announcement.
 */
public record EnchantScroll(int scrollId, CrystalType grade, boolean isWeapon, boolean cristalize, int returnVal, int[] chance, int[] chanceF, int[] chanceM, boolean allowEnchantBoost, boolean message, int[] enchants)
{
    public EnchantScroll(StatSet set)
    {
        this(set.getInteger("id"), set.getEnum("grade", CrystalType.class, CrystalType.NONE), set.getBool("isWeapon"), set.getBool("crystalize", true), set.getInteger("return", 0), set.getIntegerArray("rate", ArraysUtil.EMPTY_INT_ARRAY), set.getIntegerArray("rateF", ArraysUtil.EMPTY_INT_ARRAY), set.getIntegerArray("rateM", ArraysUtil.EMPTY_INT_ARRAY), set.getBool("allowEnchantBoost", false), set.getBool("message", false), set.getIntegerArray("enchants", ArraysUtil.EMPTY_INT_ARRAY));
    }
    
    public int getChance(ItemInstance item)
    {
        int level = item.getEnchantLevel();
        
        if (item.getItem().getBodyPart() == Item.SLOT_FULL_ARMOR && level <= 4)
            return 100;
        
        if (chance == ArraysUtil.EMPTY_INT_ARRAY && item.getItem().getType2() == Item.TYPE2_WEAPON && isWeapon && item.isWeapon())
            return ((Weapon) item.getItem()).isMagical() ? level >= chanceM.length ? 0 : chanceM[level] : level >= chanceF.length ? 0 : chanceF[level];
        
        return level >= chance.length ? 0 : chance[level];
    }
    
    public boolean announceTheEnchant(ItemInstance item)
    {
        return item != null && message && ArraysUtil.contains(enchants, item.getEnchantLevel());
    }
    
    public boolean isValid(ItemInstance item)
    {
        if (grade != item.getItem().getCrystalType())
            return false;
        
        if (getChance(item) == 0)
            return false;
        
        switch (item.getItem().getType2())
        {
            case Item.TYPE2_WEAPON:
                return isWeapon;
            case Item.TYPE2_SHIELD_ARMOR:
            case Item.TYPE2_ACCESSORY:
                return !isWeapon;
            default:
                return false;
        }
    }
}

EnterWorld.java:
import net.sf.l2j.gameserver.model.actor.instance.ClassMaster;
+import net.sf.l2j.gameserver.model.enchant.EnchantBoostService;
import net.sf.l2j.gameserver.model.entity.events.capturetheflag.CTFEvent;






        // Clan notice, if active.
        if (Config.ENABLE_COMMUNITY_BOARD && clan != null && clan.isNoticeEnabled())
        {
            final NpcHtmlMessage html = new NpcHtmlMessage(0);
            html.setFile(player.getLocale(), "html/clan_notice.htm");
            html.replace("%clan_name%", clan.getName());
            html.replace("%notice_text%", clan.getNotice().replaceAll("\r\n", "<br>").replace("action", "").replace("bypass", ""));
            sendPacket(html);
        }
        else if (Config.SERVER_NEWS)
        {
            final NpcHtmlMessage html = new NpcHtmlMessage(0);
            html.setFile(player.getLocale(), "html/servnews.htm");
            sendPacket(html);
        }
        
+        EnchantBoostService.getInstance().notifyActiveBoost(player);
        
        if (player.getPremiumService() == 1)
            onEnterPremium(player);

Item.java:
package net.sf.l2j.gameserver.model.item.kind;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import net.sf.l2j.commons.data.StatSet;

import net.sf.l2j.gameserver.enums.items.ActionType;
import net.sf.l2j.gameserver.enums.items.ArmorType;
import net.sf.l2j.gameserver.enums.items.CrystalType;
import net.sf.l2j.gameserver.enums.items.EtcItemType;
import net.sf.l2j.gameserver.enums.items.ItemType;
import net.sf.l2j.gameserver.enums.items.MaterialType;
import net.sf.l2j.gameserver.enums.items.WeaponType;
import net.sf.l2j.gameserver.model.WorldObject;
import net.sf.l2j.gameserver.model.actor.Creature;
import net.sf.l2j.gameserver.model.actor.Player;
import net.sf.l2j.gameserver.model.actor.Summon;
import net.sf.l2j.gameserver.model.holder.IntIntHolder;
import net.sf.l2j.gameserver.model.item.instance.ItemInstance;
import net.sf.l2j.gameserver.network.SystemMessageId;
import net.sf.l2j.gameserver.network.serverpackets.SystemMessage;
import net.sf.l2j.gameserver.scripting.Quest;
import net.sf.l2j.gameserver.skills.basefuncs.Func;
import net.sf.l2j.gameserver.skills.basefuncs.FuncTemplate;
import net.sf.l2j.gameserver.skills.conditions.Condition;
import net.sf.l2j.gameserver.skills.conditions.ConditionLogicOr;
import net.sf.l2j.gameserver.skills.conditions.ConditionPetType;

/**
 * This container contains all informations concerning an item (weapon, armor, etc).
 */
public abstract class Item
{
    public static final int TYPE1_WEAPON_RING_EARRING_NECKLACE = 0;
    public static final int TYPE1_SHIELD_ARMOR = 1;
    public static final int TYPE1_ITEM_QUESTITEM_ADENA = 4;
    
    public static final int TYPE2_WEAPON = 0;
    public static final int TYPE2_SHIELD_ARMOR = 1;
    public static final int TYPE2_ACCESSORY = 2;
    public static final int TYPE2_QUEST = 3;
    public static final int TYPE2_MONEY = 4;
    public static final int TYPE2_OTHER = 5;
    
    public static final int STRIDER = 0x1;
    public static final int HATCHLING_GROUP = 0x4;
    public static final int ALL_WOLF_GROUP = 0x8;
    public static final int BABY_PET_GROUP = 0x16;
    public static final int ITEM_EQUIP_PET_GROUP = 0x64;
    
    public static final int SLOT_NONE = 0x0000;
    public static final int SLOT_UNDERWEAR = 0x0001;
    public static final int SLOT_R_EAR = 0x0002;
    public static final int SLOT_L_EAR = 0x0004;
    public static final int SLOT_LR_EAR = 0x0006;
    public static final int SLOT_NECK = 0x0008;
    public static final int SLOT_R_FINGER = 0x0010;
    public static final int SLOT_L_FINGER = 0x0020;
    public static final int SLOT_LR_FINGER = 0x0030;
    public static final int SLOT_HEAD = 0x0040;
    public static final int SLOT_R_HAND = 0x0080;
    public static final int SLOT_L_HAND = 0x0100;
    public static final int SLOT_GLOVES = 0x0200;
    public static final int SLOT_CHEST = 0x0400;
    public static final int SLOT_LEGS = 0x0800;
    public static final int SLOT_FEET = 0x1000;
    public static final int SLOT_BACK = 0x2000;
    public static final int SLOT_LR_HAND = 0x4000;
    public static final int SLOT_FULL_ARMOR = 0x8000;
    public static final int SLOT_FACE = 0x010000;
    public static final int SLOT_ALLDRESS = 0x020000;
    public static final int SLOT_HAIR = 0x040000;
    public static final int SLOT_HAIRALL = 0x080000;
    
    public static final int SLOT_ALLWEAPON = SLOT_LR_HAND | SLOT_R_HAND;
    
    private static final Map<String, Integer> SLOTS = HashMap.newHashMap(20);
    static
    {
        SLOTS.put("chest", SLOT_CHEST);
        SLOTS.put("fullarmor", SLOT_FULL_ARMOR);
        SLOTS.put("alldress", SLOT_ALLDRESS);
        SLOTS.put("head", SLOT_HEAD);
        SLOTS.put("hair", SLOT_HAIR);
        SLOTS.put("face", SLOT_FACE);
        SLOTS.put("hairall", SLOT_HAIRALL);
        SLOTS.put("underwear", SLOT_UNDERWEAR);
        SLOTS.put("back", SLOT_BACK);
        SLOTS.put("neck", SLOT_NECK);
        SLOTS.put("legs", SLOT_LEGS);
        SLOTS.put("feet", SLOT_FEET);
        SLOTS.put("gloves", SLOT_GLOVES);
        SLOTS.put("chest,legs", SLOT_CHEST | SLOT_LEGS);
        SLOTS.put("rhand", SLOT_R_HAND);
        SLOTS.put("lhand", SLOT_L_HAND);
        SLOTS.put("lrhand", SLOT_LR_HAND);
        SLOTS.put("rear;lear", SLOT_R_EAR | SLOT_L_EAR);
        SLOTS.put("rfinger;lfinger", SLOT_R_FINGER | SLOT_L_FINGER);
        SLOTS.put("none", SLOT_NONE);
    }
    
    private final int _itemId;
    private final String _name;
    protected int _type1; // needed for item list (inventory)
    protected int _type2; // different lists for armor, weapon, etc
    private final int _weight;
    private final boolean _stackable;
    private final MaterialType _materialType;
    private final CrystalType _crystalType;
    private final int _duration;
    private final int _bodyPart;
    private final int _referencePrice;
    private final int _crystalCount;
    
    private final boolean _sellable;
    private final boolean _dropable;
    private final boolean _destroyable;
    private final boolean _tradable;
    private final boolean _depositable;
    private final boolean _enchantable;
    
    /**
     * By Atrein:
     * Chance bonus in percentage points granted by an Enchant Boost consumable.
     */
    private final int _enchantBonus;
    
    private final boolean _heroItem;
    private final boolean _isOlyRestricted;
    
    private final ActionType _defaultAction;
    
    protected List<FuncTemplate> _funcTemplates;
    
    protected List<Condition> _preConditions;
    private IntIntHolder[] _skillHolder;
    
    private final String _icon;
    
    private List<Quest> _questEvents = Collections.emptyList();
    
    private int _skinId;
    
    protected Item(StatSet set)
    {
        _itemId = set.getInteger("item_id");
        _name = set.getString("name");
        _icon = set.getString("icon", "icon.noimage");
        _weight = set.getInteger("weight", 0);
        _materialType = set.getEnum("material", MaterialType.class, MaterialType.STEEL);
        _duration = set.getInteger("duration", -1);
        _bodyPart = SLOTS.get(set.getString("bodypart", "none"));
        _referencePrice = set.getInteger("price", 0);
        _crystalType = set.getEnum("crystal_type", CrystalType.class, CrystalType.NONE);
        _crystalCount = set.getInteger("crystal_count", 0);
        
        _stackable = set.getBool("is_stackable", false);
        _sellable = set.getBool("is_sellable", true);
        _dropable = set.getBool("is_dropable", true);
        _destroyable = set.getBool("is_destroyable", true);
        _tradable = set.getBool("is_tradable", true);
        _depositable = set.getBool("is_depositable", true);
        _enchantable = set.getBool("is_enchantable", true);
        
        // By Atrein: item XML parameter used by the Enchant Boost handler.
        _enchantBonus = Math.max(0, set.getInteger("enchantBonus", 0));
        
        _heroItem = (_itemId >= 6611 && _itemId <= 6621) || _itemId == 6842;
        _isOlyRestricted = set.getBool("is_oly_restricted", false);
        
        _defaultAction = set.getEnum("default_action", ActionType.class, ActionType.none);
        
        if (set.containsKey("item_skill"))
            _skillHolder = set.getIntIntHolderArray("item_skill");
        
        String equip_condition = set.getString("equip_condition", null);
        if (equip_condition != null)
        {
            ConditionLogicOr cond = new ConditionLogicOr();
            if (equip_condition.contains("strider"))
                cond.add(new ConditionPetType(STRIDER));
            
            if (equip_condition.contains("hatchling_group"))
                cond.add(new ConditionPetType(HATCHLING_GROUP));
            
            if (equip_condition.contains("all_wolf_group"))
                cond.add(new ConditionPetType(ALL_WOLF_GROUP));
            
            if (equip_condition.contains("baby_pet_group"))
                cond.add(new ConditionPetType(BABY_PET_GROUP));

            if (cond.conditions.length > 0)
                attach(cond);
        }
    }
    
    /**
     * @return Enum the itemType.
     */
    public abstract ItemType getItemType();
    
    /**
     * @return int the duration of the item
     */
    public final int getDuration()
    {
        return _duration;
    }
    
    /**
     * @return int the ID of the item
     */
    public final int getItemId()
    {
        return _itemId;
    }
    
    public final boolean isSkin()
    {
        return _skinId > 0;
    }

    public final int getSkinId()
    {
        return _skinId;
    }

    public void setSkin(int id)
    {
        _skinId = id;
    }
    
    public abstract int getItemMask();
    
    /**
     * @return int the type of material of the item
     */
    public final MaterialType getMaterialType()
    {
        return _materialType;
    }
    
    /**
     * @return int the type 2 of the item
     */
    public final int getType2()
    {
        return _type2;
    }
    
    /**
     * @return int the weight of the item
     */
    public final int getWeight()
    {
        return _weight;
    }
    
    /**
     * @return boolean if the item is crystallizable
     */
    public final boolean isCrystallizable()
    {
        return _crystalType != CrystalType.NONE && _crystalCount > 0;
    }
    
    /**
     * @return CrystalType the type of crystal if item is crystallizable
     */
    public final CrystalType getCrystalType()
    {
        return _crystalType;
    }
    
    /**
     * @return int the type of crystal if item is crystallizable
     */
    public final int getCrystalItemId()
    {
        return _crystalType.getCrystalId();
    }
    
    /**
     * @return int the quantity of crystals for crystallization
     */
    public final int getCrystalCount()
    {
        return _crystalCount;
    }
    
    /**
     * @param enchantLevel
     * @return int the quantity of crystals for crystallization on specific enchant level
     */
    public final int getCrystalCount(int enchantLevel)
    {
        if (enchantLevel > 3)
        {
            switch (_type2)
            {
                case TYPE2_SHIELD_ARMOR, TYPE2_ACCESSORY:
                    return _crystalCount + getCrystalType().getCrystalEnchantBonusArmor() * (3 * enchantLevel - 6);
                
                case TYPE2_WEAPON:
                    return _crystalCount + getCrystalType().getCrystalEnchantBonusWeapon() * (2 * enchantLevel - 3);
                
                default:
                    return _crystalCount;
            }
        }
        else if (enchantLevel > 0)
        {
            switch (_type2)
            {
                case TYPE2_SHIELD_ARMOR, TYPE2_ACCESSORY:
                    return _crystalCount + getCrystalType().getCrystalEnchantBonusArmor() * enchantLevel;
                case TYPE2_WEAPON:
                    return _crystalCount + getCrystalType().getCrystalEnchantBonusWeapon() * enchantLevel;
                default:
                    return _crystalCount;
            }
        }
        else
            return _crystalCount;
    }
    
    /**
     * @return String the name of the item
     */
    public final String getName()
    {
        return _name;
    }
    
    /**
     * @return int the part of the body used with the item.
     */
    public final int getBodyPart()
    {
        return _bodyPart;
    }
    
    /**
     * @return int the type 1 of the item
     */
    public final int getType1()
    {
        return _type1;
    }
    
    /**
     * @return boolean if the item is stackable
     */
    public final boolean isStackable()
    {
        return _stackable;
    }
    
    /**
     * @return boolean if the item is consumable
     */
    public boolean isConsumable()
    {
        return false;
    }
    
    public boolean isEquipable()
    {
        return getBodyPart() != 0 && !(getItemType() instanceof EtcItemType);
    }
    
    /**
     * @return int the price of reference of the item
     */
    public final int getReferencePrice()
    {
        return _referencePrice;
    }

    /**
     * By Atrein:
     * @return The additional enchant chance in percentage points.
     */
    public final int getEnchantBonus()
    {
        return _enchantBonus;
    }
    
    /**
     * Returns if the item can be sold
     * @return boolean
     */
    public final boolean isSellable()
    {
        return _sellable;
    }
    
    /**
     * Returns if the item can dropped
     * @return boolean
     */
    public final boolean isDropable()
    {
        return _dropable;
    }
    
    /**
     * Returns if the item can destroy
     * @return boolean
     */
    public final boolean isDestroyable()
    {
        return _destroyable;
    }
    
    /**
     * Returns if the item can add to trade
     * @return boolean
     */
    public final boolean isTradable()
    {
        return _tradable;
    }
    
    /**
     * Returns if the item can be put into warehouse
     * @return boolean
     */
    public final boolean isDepositable()
    {
        return _depositable;
    }
    
    /**
     * Returns if the item can be enchanted
     * @return boolean
     */
    public final boolean isEnchantable()
    {
        return _enchantable;
    }
    
    /**
     * Get the functions used by this item.
     * @param item : ItemInstance pointing out the item
     * @param player : Creature pointing out the player
     * @return the list of functions
     */
    public final List<Func> getStatFuncs(ItemInstance item, Creature player)
    {
        if (_funcTemplates == null || _funcTemplates.isEmpty())
            return Collections.emptyList();
        
        final List<Func> funcs = new ArrayList<>(_funcTemplates.size());
        
        for (FuncTemplate template : _funcTemplates)
        {
            final Func func = template.getFunc(player, player, item, item);
            if (func != null)
                funcs.add(func);
        }
        return funcs;
    }
    
    /**
     * Add the FuncTemplate f to the list of functions used with the item
     * @param f : FuncTemplate to add
     */
    public void attach(FuncTemplate f)
    {
        if (_funcTemplates == null)
            _funcTemplates = new ArrayList<>(1);
        
        _funcTemplates.add(f);
    }
    
    public final void attach(Condition c)
    {
        if (_preConditions == null)
            _preConditions = new ArrayList<>();
        
        if (!_preConditions.contains(c))
            _preConditions.add(c);
    }
    
    /**
     * Method to retrieve skills linked to this item
     * @return Skills linked to this item as SkillHolder[]
     */
    public final IntIntHolder[] getSkills()
    {
        return _skillHolder;
    }
    
    public boolean checkCondition(Creature creature, WorldObject object, boolean sendMessage)
    {
        // Don't allow hero equipment and restricted items during Olympiad
        if ((isOlyRestrictedItem() || isHeroItem()) && creature instanceof Player player && player.isInOlympiadMode())
        {
            if (isEquipable())
                player.sendPacket(SystemMessageId.THIS_ITEM_CANT_BE_EQUIPPED_FOR_THE_OLYMPIAD_EVENT);
            else
                player.sendPacket(SystemMessageId.THIS_ITEM_IS_NOT_AVAILABLE_FOR_THE_OLYMPIAD_EVENT);
            
            return false;
        }
        
        if (_preConditions == null)
            return true;
        
        final Creature target = (object instanceof Creature targetCreature) ? targetCreature : null;
        for (Condition preCondition : _preConditions)
        {
            if (preCondition == null)
                continue;
            
            if (!preCondition.test(creature, target, null, null))
            {
                if (creature instanceof Summon summon)
                {
                    summon.sendPacket(SystemMessageId.PET_CANNOT_USE_ITEM);
                    return false;
                }
                
                if (sendMessage)
                {
                    final String msg = preCondition.getMessage();
                    if (msg != null)
                        creature.sendMessage(msg);
                    else
                    {
                        final int msgId = preCondition.getMessageId();
                        if (msgId != 0)
                        {
                            final SystemMessage sm = SystemMessage.getSystemMessage(msgId);
                            if (preCondition.isAddName())
                                sm.addItemName(_itemId);
                            
                            creature.sendPacket(sm);
                        }
                    }
                }
                return false;
            }
        }
        return true;
    }
    
    public boolean isConditionAttached()
    {
        return _preConditions != null && !_preConditions.isEmpty();
    }
    
    public boolean isQuestItem()
    {
        return (getItemType() == EtcItemType.QUEST);
    }
    
    public final boolean isHeroItem()
    {
        return _heroItem;
    }
    
    public boolean isOlyRestrictedItem()
    {
        return _isOlyRestricted;
    }
    
    public boolean isPetItem()
    {
        return (getItemType() == ArmorType.PET || getItemType() == WeaponType.PET);
    }
    
    public boolean isPotion()
    {
        return (getItemType() == EtcItemType.POTION);
    }
    
    public boolean isElixir()
    {
        return (getItemType() == EtcItemType.ELIXIR);
    }
    
    public ActionType getDefaultAction()
    {
        return _defaultAction;
    }
    
    /**
     * Returns the name of the item
     * @return String
     */
    @Override
    public String toString()
    {
        return _name + " (" + _itemId + ")";
    }
    
    public void addQuestEvent(Quest quest)
    {
        if (_questEvents.isEmpty())
            _questEvents = new ArrayList<>(3);
        
        _questEvents.add(quest);
    }
    
    public List<Quest> getQuestEvents()
    {
        return _questEvents;
    }
    
    public String getIcon()
    {
        return _icon;
    }
    
    public boolean isNightLure()
    {
        return ((_itemId >= 8505 && _itemId <= 8513) || _itemId == 8485);
    }
    
    public final boolean isJewel()
    {
        final String name = _name.toLowerCase();
        return this instanceof Armor && (name.contains("necklace") || name.contains("earring") || name.contains("ring"));
    }
    
    public final boolean isEnchantScroll()
    {
        switch (_itemId)
        {
            case 959: // Scroll: Enchant Weapon (Grade S)
            case 960: // Scroll: Enchant Armor (Grade S)
            case 729: // Scroll: Enchant Weapon (Grade A)
            case 730: // Scroll: Enchant Armor (Grade A)
            case 947: // Scroll: Enchant Weapon (Grade B)
            case 948: // Scroll: Enchant Armor (Grade B)
            case 951: // Scroll: Enchant Weapon (Grade C)
            case 952: // Scroll: Enchant Armor (Grade C)
            case 955: // Scroll: Enchant Weapon (Grade D)
            case 956: // Scroll: Enchant Armor (Grade D)
            case 6577: // Blessed Scroll: Enchant Weapon (Grade S)
            case 6578: // Blessed Scroll: Enchant Armor (Grade S)
            case 6569: // Blessed Scroll: Enchant Weapon (Grade A)
            case 6570: // Blessed Scroll: Enchant Armor (Grade A)
            case 6571: // Blessed Scroll: Enchant Weapon (Grade B)
            case 6572: // Blessed Scroll: Enchant Armor (Grade B)
            case 6573: // Blessed Scroll: Enchant Weapon (Grade C)
            case 6574: // Blessed Scroll: Enchant Armor (Grade C)
            case 6575: // Blessed Scroll: Enchant Weapon (Grade D)
            case 6576: // Blessed Scroll: Enchant Armor (Grade D)
                return true;
        }
        return false;
    }
    
    public final boolean isShot()
    {
        switch (_itemId)
        {
            case 1835: // Soulshot: No Grade
            case 1463: // Soulshot: D-grade
            case 1464: // Soulshot: C-grade
            case 1465: // Soulshot: B-grade
            case 1466: // Soulshot: A-grade
            case 1467: // Soulshot: S-grade
            case 2509: // Spiritshot: No Grade
            case 2510: // Spiritshot: D-grade
            case 2511: // Spiritshot: C-grade
            case 2512: // Spiritshot: B-grade
            case 2513: // Spiritshot: A-grade
            case 2514: // Spiritshot: S-grade
            case 3947: // Blessed Spiritshot: No Grade
            case 3948: // Blessed Spiritshot: D-Grade
            case 3949: // Blessed Spiritshot: C-Grade
            case 3950: // Blessed Spiritshot: B-Grade
            case 3951: // Blessed Spiritshot: A-Grade
            case 3952: // Blessed Spiritshot: S Grade
            case 6645: // Beast Soulshot
            case 6646: // Beast Spiritshot
            case 6647: // Blessed Beast Spiritshot
                return true;
        }
        return false;
    }
}
 

Atrein

Вассал
INTERLUDE
INTERFACE
Регистрация
16 Янв 2022
Сообщения
71
Реакции
38
Баллы
18
RaCoin
5
Player.java:
import net.sf.l2j.gameserver.enums.items.WeaponType;
-import net.sf.l2j.gameserver.enums.skills.AbnormalEffect;
 import net.sf.l2j.gameserver.enums.skills.EffectFlag;
 
 
 
  private ItemInstance _activeEnchantItem;

-// Одноразовый бонус к следующей заточке, активируемый специальным предметом.
-private int _bonusEnchantRate;
-
-// Короткий reuse для anti-spam использования предмета EnchantBoost.
-private long _lastEnchantBoostUse;

 protected boolean _inventoryDisable;
 
 
 
 
-public int getBonusEnchantRate()
-public boolean hasBonusEnchantRate()
-public void setBonusEnchantRate(int bonusEnchantRate)
-public void clearBonusEnchantRate()
-public boolean tryEnterEnchantBoostReuse(long now, long reuseDelayMillis)
-private void refreshEnchantBoostVisual()

RequestEnchantItem.java:
import net.sf.l2j.gameserver.model.World;
 import net.sf.l2j.gameserver.model.actor.Player;
+import net.sf.l2j.gameserver.model.enchant.EnchantBoostService;
+import net.sf.l2j.gameserver.model.enchant.EnchantBoostService.ApplicationResult;
+import net.sf.l2j.gameserver.model.enchant.EnchantBoostService.ApplicationStatus;



 final double baseChance = enchant.getChance(item);

 // last validation check
 if (item.getOwnerId() != player.getObjectId() || !isEnchantable(item) || baseChance < 0)
 {
     player.sendPacket(SystemMessageId.INAPPROPRIATE_ENCHANT_CONDITION);
     player.setActiveEnchantItem(null);
     player.sendPacket(EnchantResult.CANCELLED);
     return;
 }

- final int enchantBoost = player.getBonusEnchantRate();
- final double finalChance = Math.min(100D, baseChance + Math.max(0, enchantBoost));
- if (enchantBoost > 0)
- {
-     player.clearBonusEnchantRate();
-     player.sendMessage("Enchant boost applied: +" + enchantBoost + "%. Final chance: " + finalChance + "%.");
- }

+// By Atrein: resolve and consume the persistent boost only for an explicitly
+// allowed scroll and only when it increases the actual server-side chance.
+final ApplicationResult boostResult = EnchantBoostService.getInstance().applyToAttempt(player, enchant, baseChance);
+final double finalChance = boostResult.finalChance();
+
+if (boostResult.status() == ApplicationStatus.APPLIED)
+    player.sendMessage(player.getSysString(10_275, boostResult.configuredBonus(), boostResult.effectiveBonus(), (int) finalChance));
+else if (boostResult.status() == ApplicationStatus.SCROLL_NOT_ALLOWED)
+    player.sendMessage(player.getSysString(10_276));
+else if (boostResult.status() == ApplicationStatus.CHANCE_ALREADY_MAXIMUM)
+    player.sendMessage(player.getSysString(10_277, boostResult.configuredBonus()));
 

Atrein

Вассал
INTERLUDE
INTERFACE
Регистрация
16 Янв 2022
Сообщения
71
Реакции
38
Баллы
18
RaCoin
5
enchants.xml:
<scroll id="959" grade="S" isWeapon="true"> <!-- Scrolls: Enchant Weapon (Grade S) -->
        <settings crystalize="true" return="0" allowEnchantBoost="true"/>
        <chances rate="100;100;100;50;35;35;35;30;30;30;25;25;25;20;15;10"/>
        <announce message="false" enchants="8;9;10;11;12;13;14;15;16"/>
    </scroll>
    <scroll id="729" grade="A" isWeapon="true"> <!-- Scrolls: Enchant Weapon (Grade A) -->
        <settings crystalize="true" return="0" allowEnchantBoost="true"/>
        <chances rate="100;100;100;50;35;35;35;30;30;30;25;25;25;20;15;10"/>
    </scroll>
    <scroll id="947" grade="B" isWeapon="true"> <!-- Scrolls: Enchant Weapon (Grade B) -->
        <settings crystalize="true" return="0" allowEnchantBoost="true"/>
        <chances rate="100;100;100;50;35;35;35;30;30;30;25;25;25;20;15;10"/>
    </scroll>
    <scroll id="951" grade="C" isWeapon="true"> <!-- Scrolls: Enchant Weapon (Grade C) -->
        <settings crystalize="true" return="0" allowEnchantBoost="true"/>
        <chances rate="100;100;100;50;35;35;35;30;30;30;25;25;25;20;15;10"/>
    </scroll>
    <scroll id="955" grade="D" isWeapon="true"> <!-- Scrolls: Enchant Weapon (Grade D) -->
        <settings crystalize="true" return="0" allowEnchantBoost="true"/>
        <chances rate="100;100;100;50;35;35;35;30;30;30;25;25;25;20;15;10"/>
    </scroll>
    <scroll id="960" grade="S" isWeapon="false"> <!-- Scrolls: Enchant Armor (Grade S) -->
        <settings crystalize="true" return="0" allowEnchantBoost="true"/>
        <chances rate="100;100;100;50;35;35;35;30;30;30;25;25;25;20;15;10"/>
    </scroll>
    <scroll id="730" grade="A" isWeapon="false"> <!-- Scrolls: Enchant Armor (Grade A) -->
        <settings crystalize="true" return="0" allowEnchantBoost="true"/>
        <chances rate="100;100;100;50;35;35;35;30;30;30;25;25;25;20;15;10"/>
    </scroll>
    <scroll id="948" grade="B" isWeapon="false"> <!-- Scrolls: Enchant Armor (Grade B) -->
    <settings crystalize="true" return="0" allowEnchantBoost="true"/>
        <chances rate="100;100;100;50;35;35;35;30;30;30;25;25;25;20;15;10"/>
    </scroll>
    <scroll id="952" grade="C" isWeapon="false"> <!-- Scrolls: Enchant Armor (Grade C) -->
        <settings crystalize="true" return="0" allowEnchantBoost="true"/>
        <chances rate="100;100;100;50;35;35;35;30;30;30;25;25;25;20;15;10"/>
    </scroll>
    <scroll id="956" grade="D" isWeapon="false"> <!-- Scrolls: Enchant Armor (Grade D) -->
    <settings crystalize="true" return="0" allowEnchantBoost="true"/>
        <chances rate="100;100;100;50;35;35;35;30;30;30;25;25;25;20;15;10"/>
    </scroll>
    <scroll id="6577" grade="S" isWeapon="true"> <!-- Scrolls: Blessed Enchant Weapon (Grade S) -->
        <settings crystalize="false" return="0" allowEnchantBoost="true"/>
        <chances rate="100;100;100;50;35;35;35;30;30;30;25;25;25;20;15;10"/>
        <announce message="false" enchants="8;9;10;11;12;13;14;15;16"/>
    </scroll>
    <scroll id="6569" grade="A" isWeapon="true"> <!-- Scrolls: Blessed Enchant Weapon (Grade A) -->
        <settings crystalize="false" return="0" allowEnchantBoost="true"/>
        <chances rate="100;100;100;50;35;35;35;30;30;30;25;25;25;20;15;10"/>
    </scroll>
    <scroll id="6571" grade="B" isWeapon="true"> <!-- Scrolls: Blessed Enchant Weapon (Grade B) -->
        <settings crystalize="false" return="0" allowEnchantBoost="true"/>
        <chances rate="100;100;100;50;35;35;35;30;30;30;25;25;25;20;15;10"/>
    </scroll>
    <scroll id="6573" grade="C" isWeapon="true"> <!-- Scrolls: Blessed Enchant Weapon (Grade C) -->
        <settings crystalize="false" return="0" allowEnchantBoost="true"/>
        <chances rate="100;100;100;50;35;35;35;30;30;30;25;25;25;20;15;10"/>
    </scroll>
    <scroll id="6575" grade="D" isWeapon="true"> <!-- Scrolls: Blessed Enchant Weapon (Grade D) -->
        <settings crystalize="false" return="0" allowEnchantBoost="true"/>
        <chances rate="100;100;100;50;35;35;35;30;30;30;25;25;25;20;15;10"/>
    </scroll>
    <scroll id="6578" grade="S" isWeapon="false"> <!-- Scrolls: Blessed Enchant Armor (Grade S) -->
        <settings crystalize="false" return="0" allowEnchantBoost="true"/>
        <chances rate="100;100;100;50;35;35;35;30;30;30;25;25;25;20;15;10"/>
    </scroll>
    <scroll id="6570" grade="A" isWeapon="false"> <!-- Scrolls: Blessed Enchant Armor (Grade A) -->
        <settings crystalize="false" return="0" allowEnchantBoost="true"/>
        <chances rate="100;100;100;50;35;35;35;30;30;30;25;25;25;20;15;10"/>
    </scroll>
    <scroll id="6572" grade="B" isWeapon="false"> <!-- Scrolls: Blessed Enchant Armor (Grade B) -->
        <settings crystalize="false" return="0" allowEnchantBoost="true"/>
        <chances rate="100;100;100;50;35;35;35;30;30;30;25;25;25;20;15;10"/>
    </scroll>
    <scroll id="6574" grade="C" isWeapon="false"> <!-- Scrolls: Blessed Enchant Armor (Grade C) -->
        <settings crystalize="false" return="0" allowEnchantBoost="true"/>
        <chances rate="100;100;100;50;35;35;35;30;30;30;25;25;25;20;15;10"/>
    </scroll>
    <scroll id="6576" grade="D" isWeapon="false"> <!-- Scrolls: Blessed Enchant Armor (Grade D) -->
        <settings crystalize="false" return="0" allowEnchantBoost="true"/>
        <chances rate="100;100;100;50;35;35;35;30;30;30;25;25;25;20;15;10"/>
    </scroll>
    <scroll id="961" grade="S" isWeapon="true"> <!-- Scrolls: Crystal Enchant Weapon (Grade S) -->
        <settings crystalize="true" return="-1"/>
        <chances rate="100;100;100;50;35;35;35;30;30;30;25;25;25;20;15;10"/>
        <announce message="false" enchants="8;9;10;11;12;13;14;15;16"/>
    </scroll>
    <scroll id="731" grade="A" isWeapon="true"> <!-- Scrolls: Crystal Enchant Weapon (Grade A) -->
        <settings crystalize="true" return="-1"/>
        <chances rate="100;100;100;50;35;35;35;30;30;30;25;25;25;20;15;10"/>
    </scroll>
    <scroll id="949" grade="B" isWeapon="true"> <!-- Scrolls: Crystal Enchant Weapon (Grade B) -->
        <settings crystalize="true" return="-1"/>
        <chances rate="100;100;100;50;35;35;35;30;30;30;25;25;25;20;15;10"/>
    </scroll>
    <scroll id="953" grade="C" isWeapon="true"> <!-- Scrolls: Crystal Enchant Weapon (Grade C) -->
        <settings crystalize="true" return="-1"/>
        <chances rate="100;100;100;50;35;35;35;30;30;30;25;25;25;20;15;10"/>
    </scroll>
    <scroll id="957" grade="D" isWeapon="true"> <!-- Scrolls: Crystal Enchant Weapon (Grade D) -->
        <settings crystalize="true" return="-1"/>
        <chances rate="100;100;100;50;35;35;35;30;30;30;25;25;25;20;15;10"/>
    </scroll>
    <scroll id="962" grade="S" isWeapon="false"> <!-- Scrolls: Crystal Enchant Armor (Grade S) -->
        <settings crystalize="true" return="-1"/>
        <chances rate="100;100;100;50;35;35;35;30;30;30;25;25;25;20;15;10"/>
        <announce message="false" enchants="8;9;10;11;12;13;14;15;16"/>
    </scroll>
    <scroll id="732" grade="A" isWeapon="false"> <!-- Scrolls: Crystal Enchant Armor (Grade A) -->
        <settings crystalize="true" return="-1"/>
        <chances rate="100;100;100;50;35;35;35;30;30;30;25;25;25;20;15;10"/>
    </scroll>
    <scroll id="950" grade="B" isWeapon="false"> <!-- Scrolls: Crystal Enchant Armor (Grade B) -->
        <settings crystalize="true" return="-1"/>
        <chances rate="100;100;100;50;35;35;35;30;30;30;25;25;25;20;15;10"/>
    </scroll>
    <scroll id="954" grade="C" isWeapon="false"> <!-- Scrolls: Crystal Enchant Armor (Grade C) -->
        <settings crystalize="true" return="-1"/>
        <chances rate="100;100;100;50;35;35;35;30;30;30;25;25;25;20;15;10"/>
    </scroll>
    <scroll id="958" grade="D" isWeapon="false"> <!-- Scrolls: Crystal Enchant Armor (Grade D) -->
        <settings crystalize="true" return="-1"/>
        <chances rate="100;100;100;50;35;35;35;30;30;30;25;25;25;20;15;10"/>
    </scroll>
</list>
 

Atrein

Вассал
INTERLUDE
INTERFACE
Регистрация
16 Янв 2022
Сообщения
71
Реакции
38
Баллы
18
RaCoin
5
rus_acis.properties:
# Накрутка онлайна в .menu
FakeOnlineAmount = 1

# Название категории для премиум баффа. (пример Premium,Dances и тд).
PremiumBuffsCategory = Premium
# Item consumed once when a regular player uses one premium buff or a complete premium scheme.
PremiumBuffItemId = 4037
PremiumBuffItemCount = 1

+# Параметры предметов Enchant Boost.
+# Задержка защищает от двойного клика и учитывается только после успешной активации.
+EnchantBoostReuseDelay = 2000
+
+# Визуальный эффект при успешной активации. Укажите 0, чтобы отключить анимацию.
+EnchantBoostActivationSkillId = 2025
+EnchantBoostActivationSkillLevel = 1
+EnchantBoostActivationHitTime = 1000

 # =================================================================
 # Сабкласс
 # =================================================================

sysstring.xml [en_US]:
<list>
    <!-- gameserver.handler.voicedcommandhandlers.Menu -->
    <string key="10000">You can gain experience by killing mobs.</string>
    <string key="10001">You can't gain experience by killing mobs.</string>
    <string key="10002">Use trade is enabled.</string>
    <string key="10003">Use trade is disabled.</string>
    <string key="10004">Use autoloot is enabled.</string>
    <string key="10005">Use autoloot is disabled.</string>
    <string key="10006">You cannot logout to offline player.</string>
    <string key="10007">Your private store has been flagged as an offline shop and will remain active forever.</string>
    <string key="10008">ON</string>
    <string key="10009">OFF</string>
    
    <!-- gameserver.data.manager.BotsPreventionManager -->
    <string key="10010">Congratulations, number match!</string>
    
    <!-- gameserver.model.actor.Player -->
    <string key="10011">The spawn protection has ended.</string>
    <string key="10012">You declined your partner's marriage request.</string>
    <string key="10013">Your partner declined your marriage request.</string>
    <string key="10014">Entering world in Invulnerable mode.</string>
    <string key="10015">Entering world in Invisible mode.</string>
    <string key="10016">Entering world in Refusal mode.</string>
    <string key="10017">As you acted, you are no longer under spawn protection.</string>
    
    <!-- gameserver.scripting.script.event.Christmas -->
    <string key="10018">Need 10 Christmas Tree.</string>
    <string key="10019">Need 20 Special Christmas Tree.</string>
    
    <!-- gameserver.model.actor.instance.Service && gameserver.communitybbs.custom.ServiceBBSManager -->
    <string key="10020">You have to get a 3rd profession.</string>
    <string key="10021">You already have the status of a Noblesse.</string>
    <string key="10022">You are already a hero.</string>
    <string key="10023">Incorrect item count. You need %s</string>
    <string key="10024">You are now a Hero for the next %s days.</string>
    <string key="10025">Your hero status has expired.</string>
    <string key="10026">The color of the nickname has been successfully changed.</string>
    <string key="10027">The color of the title has been successfully changed.</string>
    <string key="10028">You entered an incorrect nickname.</string>
    <string key="10029">This name is taken.</string>
    <string key="10030">Name successfully changed.</string>
    <string key="10031">This feature is currently unavailable.</string>
    <string key="10032">You already have a premium account.</string>
    <string key="10033">You have purchased a premium account.\nNumber of days: %s.</string>
    <string key="10034">Your gender has been successfully changed.</string>
    <string key="10035">You have nothing to clean up.</string>
    <string key="10036">Your PK and karma counters have been successfully reset.</string>
    <string key="10037">You have maximum clan level.</string>
    <string key="10038">This operation is only available to the clan leader.</string>
    <string key="10039">Your clan level has been successfully upgraded to maximum.</string>
    <string key="10040">This operation is only available to the clan leader.</string>
    <string key="10041">The clan must be level 5 or higher.</string>
    <string key="10042">All clan skills are already available to your clan.</string>
    <string key="10043">Your clan has been successfully issued all clan skills.</string>
    <string key="10044">Your clan's reputation %s</string>
    
    <!-- gameserver.network.clientpackets.EnterWorld -->
    <!-- <string key="10045">null</string> -->
    <string key="10046">Your Premium privileges granted until %s</string>
    
    <!-- gameserver.model.spawn.MultiSpawn -->
    <string key="10047">Raid boss %s has appeared in the world!</string>
    
    <!-- gameserver.handler.voicedcommandhandlers.EventCommand -->
    <string key="10048">Capture the Flag event is not in progress.</string>
    <string key="10049">You are already registered.</string>
    <string key="10050">You are not registered.</string>
    
    <string key="10051">Deathmatch fight is not in progress.</string>
    <string key="10052">You are already registered.</string>
    <string key="10053">You are not registered.</string>

    <string key="10054">Last Man fight is not in progress.</string>
    <string key="10055">You are already registered.</string>
    <string key="10056">You are not registered.</string>

    <string key="10057">Team vs Team fight is not in progress.</string>
    <string key="10058">You are already registered.</string>
    <string key="10059">You are not registered.</string>
    
    <!-- gameserver.network.clientpackets.RequestEnchantItem -->
    <string key="10060">%s has successfully enchanted +%s %s</string>
    
    <!-- gameserver.model.actor.instance.WeddingManagerNpc -->
    <string key="10061">Your partner can't be found.</string>
    <string key="10062">Your partner is not online.</string>
    <string key="10063">Due to the current partner's status, the teleportation failed.</string>
    <string key="10064">As your partner is in siege, you can't go to him/her.</string>
    <string key="10065">Congratulations, you are now married with %s!</string>
    <string key="10066">Congratulations, you are now married with %s!</string>
    <string key="10067">Congratulations to %s and %s! They have been married.</string>
    <string key="10068">will</string>
    <string key="10069">won't</string>
    
    <!-- gameserver.handler.admincommandhandlers.AdminInfo -->
    <string key="10070">master</string>
    <string key="10071">minion</string>
    
    <!-- null
    <string key="null">null</string> -->
    
    <!-- gameserver.handler.voicedcommandhandlers.Epic && Raid -->
    <string key="10073">Decay (%s min.)</string>
    <string key="10074">Alive</string>
    
    <!-- gameserver.model.actor.Npc -->
    <string key="10075"> (In Progress)]</string>
    <string key="10076"> ((Done)]</string>
    
    <!-- gameserver.handler.itemhandlers.CapsuleBox -->
    <string key="10077">You will need a level %s to use this Capsule Box.</string>
    
    <!-- gameserver.handler.itemhandlers.ItemSkill -->
    <string key="10078">Forbidden use scrolls.</string>
    <string key="10079">Forbidden use potion.</string>
    
    <!-- gameserver.handler.voicedcommandhandlers.OfflinePlayer -->
    <string key="10080">You are not running a private store or private work shop.</string>
    <string key="10081">Your buy list is empty.</string>
    <string key="10082">Your sell list is empty.</string>
    <string key="10083">You cannot Logout while is in Combat mode.</string>
    <string key="10084">You cannot Logout while is Teleporting.</string>
    <string key="10085">You can't Logout in Olympiad mode.</string>
    <string key="10086">You cannot Logout while you are a participant in a Festival.</string>
    <string key="10087">You cannot logout to offline player.</string>
    
    <!-- gameserver.handler.voicedcommandhandlers.Online -->
    <string key="10088">Now online: %s players.</string>
    
    <!-- gameserver.handler.admincommandhandlers.AdminCTFEvent && AdminDMEvent && AdminLMEvent && AdminTvTEvent -->
    <string key="10089">You should select a player!</string>
    <string key="10090">Player already participated in the event!</string>
    <string key="10091">Player instance could not be added, it seems to be null!</string>
    <string key="10092">Player is not part of the event!</string>
    
    <!-- gameserver.handler.admincommandhandlers.AdminPremium -->
    <string key="10093">Enable UsePremiumServices config.</string>
    <string key="10094">Invalid account!</string>
    <string key="10095">Invalid month!</string>
    <string key="10096">Invalid day!</string>
    <string key="10097">Invalid hour!</string>
    <string key="10098">The premium has been set until: %s for account: %s</string>
    
    <!-- gameserver.model.actor.instance.SchemeBuffer -->
    <string key="10099">Me</string>
    <string key="10100">Pet</string>
    <string key="10101">Edit</string>
    <string key="10102">Delete</string>
    
    <!-- gameserver.model.olympiad.AbstractOlympiadGame -->
    <string key="10103">You are registered in another event!</string>
    
    <!-- gameserver.model.olympiad.OlympiadManager -->
    <string key="10104">You can't join olympiad while participating on Event.</string>
    
    <!-- gameserver.data.manager.CoupleManager -->
    <string key="10105">You are now divorced.</string>
    
    <!-- gameserver.data.manager.FestivalOfDarknessManager -->
    <string key="10106">The festival has ended. Your party leader must now register your score before the next festival takes place.</string>
    <string key="10107">You have been removed from the festival arena.</string>
    
    <!-- gameserver.model.actor.conteiner.player.Punishment -->
    <string key="10108">Chatting is now available.</string>
    <string key="10109">Chatting has been suspended for %s minute(s).</string>
    <string key="10110">Chatting has been suspended.</string>
    <string key="10111">You are jailed for %s minutes.</string>
    <string key="10112">You are still %s for %s minutes.</string>
    
    <!-- gameserver.network.clientpackets.Say2 -->
    <string key="10113">General chat is available from level %s.</string>
    <string key="10114">Private chat is available from level %s.</string>
    <string key="10115">Shout chat is available from level %s.</string>
    <string key="10116">Trade chat is available from level %s.</string>
    
    <!-- gameserver.handler.admincommandhandlers.AdminEvent -->
    <string key="10116">Event %s started.</string>
    <string key="10117">Event %s is already started!</string>
    <string key="10118">Event %s stopped.</string>
    <string key="10119">Event %s is already stopped!</string>
    <string key="10120">Usage </string>
    
    <!-- gameserver.scripting.script.event.Squash -->
    <string key="10121">You can't kill me without Souvenir</string>
    <string key="10122">Haha... continue to try...</string>
    <string key="10123">Good attempt...</string>
    <string key="10124">Were tired?</string>
    <string key="10125">Forward forward! haha...</string>
    <string key="10126">Aaaa... Souvenir Weapon...</string>
    <string key="10127">My end approaches...</string>
    <string key="10128">Please, leave me!</string>
    <string key="10129">Help...</string>
    <string key="10130">Somebody help me, please...</string>
    <string key="10131">The tasty... Nectar...</string>
    <string key="10132">Please give me still...</string>
    <string key="10133">Hmm. It is more. I want more...</string>
    <string key="10134">You to me will be it is pleasant more if you give me more...</string>
    <string key="10135">Hmmmmm...</string>
    <string key="10136">My darling...</string>
    <string key="10152">At you remained 30sec. on kill.</string>
    <string key="10153">At you remained 20sec. on kill.</string>
    <string key="10154">Time on an outcome... 9 ... 8 ... 7 ...</string>
    <string key="10155">I need more nectar to survive.</string>
    <string key="10156">Nectar...</string>
    <string key="10157">I will disappear through %s sec. time on an outcome.</string>
    <string key="10158">I want Nectar!</string>
    
    <!-- gameserver.scripting.script.event.* -->
    <string key="10159">Event %s started!</string>
    <string key="10160">Event %s finished!</string>
    
    <!-- gameserver.scripting.script.ai.individual.Monster.RaidBoss.RaidBossParty.RaidBossType4 -->
    <string key="10161">You were too far away from Barakiel. You've missed the chance of becoming Noblesse!</string>
    <string key="10162">Congratulations! All party members have obtained Noblesse Status</string>
    <string key="10163">You are already Noblesse!</string>
    
    <!-- gameserver.data.manager.FestivalOfDarknessManager -->
    <string key="10164">This is the Seal Validation period. Festivals will resume next week.</string>
    <string key="10165">The next festival will begin in %s minute(s).</string>
    
    <!-- gameserver.model.residence.castle.Siege -->
    <string key="10166">REGISTRATION_OPENED</string>
    <string key="10167">REGISTRATION_OVER</string>
    <string key="10168">IN_PROGRESS</string>
    <string key="10169">UNKNOWN_STATUS</string>
    
    <!-- gameserver.handler.admincommandhandlers.AdminSiege -->
    <string key="10170">View Info.</string>
    
    <!-- gameserver.model.actor.Npc -->
    <string key="10171">Return</string>
    <string key="10172">The winner selected the numbers above.</string>
    
    <!-- gameserver.handler.voicedcommandhandlers.OfflinePlayer -->
    <string key="10173">%s has been removed from the upcoming Festival.</string>
    
    <!-- gameserver.communitybbs.manager.RegionBBSManager -->
    <string key="10174">None</string>
    
    <!-- gameserver.model.entity.Events -->
    <string key="10175">The spawn protection has 15 seconds.</string>
    
    <!-- gameserver.communitybbs.custom.BuffBBSManager && SchemeBuffer -->
    <string key="10176">Previous</string>
    <string key="10177">Next</string>
    <string key="10178">Page</string>
    <string key="10179">You haven't defined any scheme.</string>
    <string key="10180">This scheme has reached the maximum amount of buffs.</string>
    <string key="10181">Scheme's name must contain up to 14 chars. Spaces are trimmed.</string>
    <string key="10182">Maximum schemes amount is already reached.</string>
    <string key="10183">The scheme name already exists.</string>
    <string key="10184">This scheme name is invalid.</string>
    <string key="10185">That group doesn't contain any skills.</string>
    
    <!-- gameserver.handler.voicedcommandhandlers.Menu -->
    <string key="10186">Buff protection is enabled.</string>
    <string key="10187">Buff protection is disabled.</string>
    
    <!-- gameserver.handler.voicedcommandhandlers.Acp -->
    <string key="10188">You need to be at least %s to use auto potions.</string>
    <string key="10189">Auto potions is enabled.</string>
    <string key="10190">Auto potions is disabled.</string>
    <string key="10191">Enter a number.</string>
    <string key="10192">Specify the percentage from 0 to 100.</string>
    <string key="10193">Value changed.</string>
    
    <!-- gameserver.handler.voicedcommandhandlers.Banking -->
    <string key="10194">.deposit (%s Adena = %s Goldbar) / .withdraw (%s Goldbar = %s Adena)</string>
    <string key="10195">Now you have %s Goldbar(s), and %s less adena.</string>
    <string key="10196">You do not have enough Adena to convert to Goldbar(s), you need %s Adena.</string>
    <string key="10197">You do not have enough space for all the adena in inventory!</string>
    <string key="10198">Now you have %s Adena, and %s less Goldbar(s).</string>
    <string key="10199">You do not have any Goldbars to turn into %s Adena.</string>
    
    <!-- gameserver.handler.voicedcommandhandlers.ALLVOICEDCOMMAND -->
    <string key="10200">The command is disabled on the server.</string>
    
    <!-- gameserver.communitybbs.custom.BuffBBSManager && SchemeBuffer -->
    <string key="10201">The summon has not been called. Please summon it before changing the target.</string>
    
    <!-- gameserver.communitybbs.custom.AuctionBBSManager -->
    <string key="10202">Selected item no longer exists on Auction.</string>
    <string key="10203">You do not have the selected item in your inventory.</string>
    <string key="10204">You have reach the limit of %s items listed.</string>
    <string key="10205">%s is not allowed on Auction.</string>
    <string key="10206">This item is not longer on your inventory.</string>
    <string key="10207">Incorrect item quantity.</string>
    <string key="10208">Incorrect item price.</string>
    <string key="10209">You have not %s %s to pay auction fee.</string>
    <string key="10210">You have successfully listed %s.</string>
    
    <!-- gameserver.communitybbs.custom.model.Auction -->
    <string key="10211">There are more than 24 hours remaining until the Auction.</string>
    <string key="10212">You have update duration util %s.</string>
    <string key="10213">There is no such quantity of the item.</string>
    <string key="10214">You have successfully purchased the Auction lot.</string>
    <string key="10215">You have successfully sold the Auction lot.</string>
    <string key="10216">You have removed Auction item.</string>
    
    <!-- gameserver.communitybbs.custom.AuctionBBSManager -->
    <string key="10217">Apply</string>
    <string key="10218">Each</string>
    <string key="10219">OWNER</string>
    <string key="10220">Purchase</string>
    <string key="10221">Yes</string>
    <string key="10222">Cancel</string>
    <string key="10223">You are missing %s - [%s], to purchase the item.</string>
    <string key="10224">Clear</string>
    <string key="10225">Search</string>
    <string key="10226">Auction Duration:</string>
    <string key="10227">All Item For Sale</string>
    <string key="10228">Remove</string>
    <string key="10229">Add</string>
    <string key="10230">You haven't added anything.</string>
    <string key="10231">You items</string>
    <string key="10232">Has Expired</string>
    
    <!-- gameserver.model.actor.instance.RaidBoss -->
    <string key="10233">RaidBoss %s [%s] has been killed. \nLast hit: %s. Clan: %s</string>
    <string key="10234">RaidBoss %s [%s] has been killed. \nLast hit: %s</string>
    
    <!-- gameserver.model.actor.instance.GrandBoss -->
    <string key="10235">GrandBoss %s [%s] has been killed. \nLast hit: %s. Clan: %s</string>
    <string key="10236">GrandBoss %s [%s] has been killed. \nLast hit: %s</string>
    
    <!-- gameserver.model.spawn.MultiSpawn -->
    <string key="10237">RaidBoss %s [%s] has appeared in the world!</string>
    <string key="10238">GrandBoss %s [%s] has appeared in the world!</string>
    
    <!-- gameserver.handler.admincommandhandlers.AdminTest -->
    <string key="10239">Usage : //test setquest || ssq_change || manor_change || augment</string>
    <string key="10240">Unknown augment type: %s</string>
    <string key="10241">Usage: //test augment active|passive value</string>
    <string key="10242">Invalid number format!</string>
    <string key="10243">You must specify three parameters!</string>
    <string key="10244">Invalid command format. Use //test augment param1 param2 param3 OR //test augment active|passive type</string>
    <string key="10245">Quest with id: %s not found</string>
    <string key="10246">Cannot initialize new quest state with cond %s for player %s. To initialize new quest state, use cond 0.</string>
    <string key="10247">%s's %s quest condition set to %s</string>
    <string key="10248">%s's %s quest has been created. To start it, use //test setquest %s 1"</string>
    <string key="10249">Invalid command format. Use //test setquest questId cond</string>
    <string key="10250">You can't augment under %s Grade Weapon!</string>
    <string key="10251">You Cannot be add Augment On %s !</string>
    <string key="10252">Successfully To Add %s.</string>
    <string key="10253">This weapon has already augment.</string>
    <string key="10254">You do not have any weapon in hands.</string>

    <!-- gameserver.data.manager.BufferService -->
    <string key="10255">You need %s %s to use premium buffs.</string>
    <string key="10256">The buffer price is invalid. Please contact an administrator.</string>
    <string key="10257">The premium buff could not be applied. Your payment item has been returned.</string>
    <string key="10258">The requested buff could not be applied.</string>

    <!-- gameserver.communitybbs.custom.ServiceBBSManager -->
    <string key="10259">The Community Board service shop is currently disabled.</string>
    <string key="10260">Premium Account services are currently disabled.</string>
    <string key="10261">The requested Community Board service is unavailable. Please contact an administrator.</string>
    <string key="10262">The Community Board service request is invalid.</string>

    <!-- gameserver.handler.itemhandlers.EnchantBoost && gameserver.model.enchant.EnchantBoostService -->
    <string key="10263">You're using this item too quickly. Please wait a moment.</string>
    <string key="10264">An enchant boost of +%s%% is already active.</string>
    <string key="10265">Invalid enchant boost configuration. Please contact an administrator.</string>
    <string key="10266">The enchant boost item could not be consumed.</string>
    <string key="10267">You cannot use this item while dead.</string>
    <string key="10268">You cannot use this item while trading or crafting.</string>
    <string key="10269">You cannot use this item while fishing.</string>
    <string key="10270">You cannot use this item while mounted.</string>
    <string key="10271">You cannot use this item while casting.</string>
    <string key="10272">Close the enchant window before using this item.</string>
    <string key="10273">You cannot use this item right now.</string>
    <string key="10274">Enchant bonus +%s%% has been activated. It will apply to the next eligible enchant.</string>
    <string key="10275">Enchant boost +%s%% activated; +%s%% was effective. Final chance: %s%%.</string>
    <string key="10276">Enchant boost does not apply to this scroll and remains active.</string>
    <string key="10277">The enchant chance is already 100%%. Your +%s%% boost remains active.</string>
    <string key="10278">Your active enchant boost +%s%% has been restored.</string>
</list>

sysstring.xml [ru_RU]:
<list>
    <!-- gameserver.handler.voicedcommandhandlers.Menu -->
    <string key="10000">Вы можете получать опыт, убивая монстров.</string>
    <string key="10001">Вы не можете получать опыт, убивая монстров.</string>
    <string key="10002">Использование торговли включено.</string>
    <string key="10003">Использование торговли выключено.</string>
    <string key="10004">Автосбор добычи включен.</string>
    <string key="10005">Автосбор добычи выключен.</string>
    <string key="10006">Вы не можете выйти из игры как оффлайн игрок.</string>
    <string key="10007">Ваш личный магазин был отмечен как оффлайн магазин и будет активен постоянно.</string>
    <string key="10008">ВКЛ</string>
    <string key="10009">ВЫКЛ</string>

    <!-- gameserver.data.manager.BotsPreventionManager -->
    <string key="10010">Поздравляем, цифры совпали!</string>

    <!-- gameserver.model.actor.Player -->
    <string key="10011">Защита от спауна завершена.</string>
    <string key="10012">Вы отклонили запрос на брак от вашего партнера.</string>
    <string key="10013">Ваш партнер отклонил ваш запрос на брак.</string>
    <string key="10014">Вход в мир в режиме невосприимчивости.</string>
    <string key="10015">Вход в мир в режиме невидимости.</string>
    <string key="10016">Вход в мир в режиме отказа.</string>
    <string key="10017">После вашего действия вы больше не находитесь под защитой спауна.</string>

    <!-- gameserver.scripting.script.event.Christmas -->
    <string key="10018">Необходимо 10 Рождественских деревьев.</string>
    <string key="10019">Необходимо 20 Специальных Рождественских деревьев.</string>

    <!-- gameserver.model.actor.instance.Service && gameserver.communitybbs.custom.ServiceBBSManager -->
    <string key="10020">Вы должны получить 3-й профессии.</string>
    <string key="10021">У вас уже есть статус нублеса.</string>
    <string key="10022">Вы уже являетесь героем.</string>
    <string key="10023">Неверное количество предметов. Вам нужно %s</string>
    <string key="10024">Теперь вы герой на %s дней.</string>
    <string key="10025">Ваш статус героя истек.</string>
    <string key="10026">Цвет ника успешно изменен.</string>
    <string key="10027">Цвет заголовка успешно изменен.</string>
    <string key="10028">Вы ввели неверное имя.</string>
    <string key="10029">Это имя уже занято.</string>
    <string key="10030">Имя успешно изменено.</string>
    <string key="10031">Эта функция в настоящее время недоступна.</string>
    <string key="10032">У вас уже есть премиум-аккаунт.</string>
    <string key="10033">Вы приобрели премиум-аккаунт.\nКоличество дней: %s.</string>
    <string key="10034">Ваш пол успешно изменен.</string>
    <string key="10035">У вас нет предметов для очистки.</string>
    <string key="10036">Ваши счетчики PK и кармы успешно сброшены.</string>
    <string key="10037">У вас максимальный уровень клана.</string>
    <string key="10038">Эта операция доступна только лидеру клана.</string>
    <string key="10039">Ваш уровень клана успешно повышен до максимального.</string>
    <string key="10040">Эта операция доступна только лидеру клана.</string>
    <string key="10041">Клан должен быть 5 уровня или выше.</string>
    <string key="10042">Все клановые умения уже доступны вашему клану.</string>
    <string key="10043">Все клановые умения успешно выданы вашему клану.</string>
    <string key="10044">Репутация вашего клана: %s</string>

    <!-- gameserver.network.clientpackets.EnterWorld -->
    <!-- <string key="10045">null</string> -->
    <string key="10046">Ваши привилегии премиум-аккаунта действуют до %s</string>

    <!-- gameserver.model.spawn.MultiSpawn -->
    <string key="10047">Рейд-босс %s появился в мире!</string>

    <!-- gameserver.handler.voicedcommandhandlers.EventCommand -->
    <string key="10048">Ивент "Захват Флага" не запущен.</string>
    <string key="10049">Вы уже зарегистрированы.</string>
    <string key="10050">Вы не зарегистрированы.</string>

    <string key="10051">Ивент дезматч не запущен.</string>
    <string key="10052">Вы уже зарегистрированы.</string>
    <string key="10053">Вы не зарегистрированы.</string>

    <string key="10054">Ивент последний человек не запущен.</string>
    <string key="10055">Вы уже зарегистрированы.</string>
    <string key="10056">Вы не зарегистрированы.</string>

    <string key="10057">Ивент "Команда против Команды" не запущен.</string>
    <string key="10058">Вы уже зарегистрированы.</string>
    <string key="10059">Вы не зарегистрированы.</string>

    <!-- gameserver.network.clientpackets.RequestEnchantItem -->
    <string key="10060">%s успешно заточил предмет +%s %s</string>

    <!-- gameserver.model.actor.instance.WeddingManagerNpc -->
    <string key="10061">Ваш партнер не может быть найден.</string>
    <string key="10062">Ваш партнер не в сети.</string>
    <string key="10063">Из-за текущего статуса партнера не удалось выполнить телепортацию.</string>
    <string key="10064">Поскольку ваш партнер участвует в осаде, вы не можете к нему/ей попасть.</string>
    <string key="10065">Поздравляем, теперь вы замужем/женаты на %s!</string>
    <string key="10066">Поздравляем, теперь вы замужем/женаты на %s!</string>
    <string key="10067">Поздравляем %s и %s! Они поженились.</string>
    <string key="10068">будет</string>
    <string key="10069">не будет</string>

    <!-- gameserver.handler.admincommandhandlers.AdminInfo -->
    <string key="10070">главный</string>
    <string key="10071">помощник</string>

    <!-- null
    <string key="null">null</string> -->

    <!-- gameserver.handler.voicedcommandhandlers.Epic && gameserver.handler.voicedcommandhandlers.Raid -->
    <string key="10073">Распад (%s мин.)</string>
    <string key="10074">Жив</string>

    <!-- gameserver.model.actor.Npc -->
    <string key="10075"> (В процессе)]</string>
    <string key="10076"> (Завершено)]</string>

    <!-- gameserver.handler.itemhandlers.CapsuleBox -->
    <string key="10077">Для использования этой капсульной коробки вам нужен уровень %s.</string>

    <!-- gameserver.handler.itemhandlers.ItemSkill -->
    <string key="10078">Запрещено использование свитков.</string>
    <string key="10079">Запрещено использование зелий.</string>

    <!-- gameserver.handler.voicedcommandhandlers.OfflinePlayer -->
    <string key="10080">Вы не ведете частный магазин или частную мастерскую.</string>
    <string key="10081">Ваш список покупок пуст.</string>
    <string key="10082">Ваш список продаж пуст.</string>
    <string key="10083">Вы не можете выйти из игры в режиме боя.</string>
    <string key="10084">Вы не можете выйти из игры во время телепортации.</string>
    <string key="10085">Вы не можете выйти из игры в режиме Олимпиады.</string>
    <string key="10086">Вы не можете выйти из игры, находясь на фестивале.</string>
    <string key="10087">Вы не можете выйти из игры как оффлайн игрок.</string>

    <!-- gameserver.handler.voicedcommandhandlers.Online -->
    <string key="10088">Сейчас в сети: %s игроков.</string>
    
    <!-- gameserver.handler.admincommandhandlers.AdminCTFEvent && AdminDMEvent && AdminLMEvent && AdminTvTEvent -->
    <string key="10089">Вы должны выбрать игрока!</string>
    <string key="10090">Игрок уже участвовал в событии!</string>
    <string key="10091">Экземпляр игрока не может быть добавлен, похоже, он равен null!</string>
    <string key="10092">Игрок не является частью события!</string>

    <!-- gameserver.handler.admincommandhandlers.AdminPremium -->
    <string key="10093">Включите конфигурацию UsePremiumServices.</string>
    <string key="10094">Неверная учетная запись!</string>
    <string key="10095">Неверный месяц!</string>
    <string key="10096">Неверный день!</string>
    <string key="10097">Неверный час!</string>
    <string key="10098">Премиум установлен до: %s для учетной записи: %s</string>

    <!-- gameserver.model.actor.instance.SchemeBuffer -->
    <string key="10099">Я</string>
    <string key="10100">Питомец</string>
    <string key="10101">Изменить</string>
    <string key="10102">Удалить</string>

    <!-- gameserver.model.olympiad.AbstractOlympiadGame -->
    <string key="10103">Вы зарегистрированы в другом событии!</string>

    <!-- gameserver.model.olympiad.OlympiadManager -->
    <string key="10104">Вы не можете присоединиться к Олимпиаде, участвуя в другом событии.</string>

    <!-- gameserver.data.manager.CoupleManager -->
    <string key="10105">Вы теперь разведены.</string>

    <!-- gameserver.data.manager.FestivalOfDarknessManager -->
    <string key="10106">Фестиваль завершился. Ваш лидер группы должен теперь зарегистрировать ваш счет перед началом следующего фестиваля.</string>
    <string key="10107">Вас исключили из фестивальной арены.</string>

    <!-- gameserver.model.actor.container.player.Punishment -->
    <string key="10108">Чат снова доступен.</string>
    <string key="10109">Чат временно приостановлен на %s минут(у/ы).</string>
    <string key="10110">Чат приостановлен.</string>
    <string key="10111">Вы находитесь в тюрьме на %s минут(у/ы).</string>
    <string key="10112">Вы все еще находитесь в режиме %s в течение %s минут(у/ы).</string>
    
    <!-- gameserver.network.clientpackets.Say2 -->
    <string key="10113">Общий чат доступен с %s уровня.</string>
    <string key="10114">Приватный чат доступен с %s уровня.</string>
    <string key="10115">Шаут чат доступен с %s уровня.</string>
    <string key="10116">Торговый чат доступен с %s уровня."</string>
    
    <!-- gameserver.handler.admincommandhandlers.AdminEvent -->
    <string key="10116">Эвент %s запущен.</string>
    <string key="10117">Эвент %s уже запущен!</string>
    <string key="10118">Эвент %s остановлен.</string>
    <string key="10119">Эвент %s уже остановлен!</string>
    <string key="10120">Применение </string>
    
    <!-- gameserver.scripting.script.event.Squash -->
    <string key="10121">Вы не можете убить меня без Сувенира</string>
    <string key="10122">Ха-ха...продолжайте пробовать...</string>
    <string key="10123">Хорошая попытка...</string>
    <string key="10124">Устали?</string>
    <string key="10125">Вперед вперед! ха-ха...</string>
    <string key="10126">Аааа... Сувенирное Оружие...</string>
    <string key="10127">Мой конец близится...</string>
    <string key="10128">Пожалуйста, оставьте меня!</string>
    <string key="10129">Помогите...</string>
    <string key="10130">Кто-нибудь помогите мне, пожалуйста...</string>
    <string key="10131">Вкусный... Нектар...</string>
    <string key="10132">Пожалуйста дайте мне еще...</string>
    <string key="10133">Хмм.. Больше.. Я хочу больше...</string>
    <string key="10134">Вы мне больше будете нравится, если дадите мне больше...</string>
    <string key="10135">Хммммм...</string>
    <string key="10136">Мой любимый...</string>
    <string key="10137">Вы добились своего...</string>
    <string key="10138">.....",</string>
    <string key="10139">Получите призи, которые заслужили.</string>
    <string key="10140">Моя жизнь была так коротка...</string>
    <string key="10141">Вы все-таки осилили меня</string>
    <string key="10142">...Где это я?</string>
    <string key="10143">Что Вы хотите сделать со мной?</string>
    <string key="10144">Что происходит...</string>
    <string key="10145">Для чего я здесь?</string>
    <string key="10146">Вы очень подозрительный тип!</string>
    <string key="10147">Очень хорошо, дайте мне еще нектара.</string>
    <string key="10148">Ммм... Весьма не плохо...</string>
    <string key="10149">... Это еще не конец...</string>
    <string key="10150">Вы отлично справляетесь с поставленной задачей.</string>
    <string key="10151">Думаю, Вы способны на большее...</string>
    <string key="10152">У Вас осталось 30 сек. на убийство.</string>
    <string key="10153">У Вас осталось 20 сек. на убийство.</string>
    <string key="10154">Время на исходе... 9 ... 8 ... 7 ...</string>
    <string key="10155">Мне нужно больше нектара, чтобы выжить.</string>
    <string key="10156">Нектар...</string>
    <string key="10157">Я исчезну через %s сек. время на исходе.</string>
    <string key="10158">Я хочу Нектара!</string>
    
    <!-- gameserver.scripting.script.event.* -->
    <string key="10159">Событие %s запущено!</string>
    <string key="10160">Событие %s закончено!</string>
    
    <!-- gameserver.scripting.script.ai.individual.Monster.RaidBoss.RaidBossParty.RaidBossType4 -->
    <string key="10161">Вы были слишком далеки от Баракиеля. Вы упустили шанс стать Ноблессом!</string>
    <string key="10162">Поздравляем! Все члены группы получили статус Ноблесса</string>
    <string key="10163">Вы уже Ноблесс!</string>
    
    <!-- gameserver.data.manager.FestivalOfDarknessManager -->
    <string key="10164">Это период проверки печати. Фестивали возобновятся на следующей неделе.</string>
    <string key="10165">Следующий фестиваль начнется через %s минут(ы).</string>
    
    <!-- gameserver.model.residence.castle.Siege -->
    <string key="10166">РЕГИСТР_ОТКРЫТА</string>
    <string key="10167">РЕГИСТР_ЗАВЕРШЕНА</string>
    <string key="10168">В_ПРОЦЕССЕ</string>
    <string key="10169">НЕИЗВ_СТАТУС</string>
    
    <!-- gameserver.handler.admincommandhandlers.AdminSiege -->
    <string key="10170">Посм. инфо.</string>
    
    <!-- gameserver.model.actor.Npc -->
    <string key="10171">Назад</string>
    <string key="10172">Победитель выбрал числа выше.</string>
    
    <!-- gameserver.handler.voicedcommandhandlers.OfflinePlayer -->
    <string key="10173">%s был исключен из предстоящего фестиваля.</string>
    
    <!-- gameserver.communitybbs.manager.RegionBBSManager -->
    <string key="10174">Никто</string>
    
    <!-- gameserver.model.entity.Events -->
    <string key="10175">Защиты длится 15 секунд.</string>
    
    <!-- gameserver.communitybbs.custom.BuffBBSManager && SchemeBuffer -->
    <string key="10176">Предыдущая</string>
    <string key="10177">Следующая</string>
    <string key="10178">Страница</string>
    <string key="10179">Вы не сделали ни одного профиля.</string>
    <string key="10180">Эта схема достигла максимального количества баффов.</string>
    <string key="10181">Название схемы должно содержать не более 14 символов. Пробелы обрезаются.</string>
    <string key="10182">Достигнуто максимальное количество схем.</string>
    <string key="10183">Название схемы уже существует.</string>
    <string key="10184">Это недопустимое название схемы.</string>
    <string key="10185">Эта группа не содержит никаких навыков.</string>
    
    <!-- gameserver.handler.voicedcommandhandlers.Menu -->
    <string key="10186">Защита от баффов включена.</string>
    <string key="10187">Защита от баффов отключена.</string>
    
    <!-- gameserver.handler.voicedcommandhandlers.Acp -->
    <string key="10188">Вам нужно быть как минимум %s уровня, чтобы использовать авто-зелья.</string>
    <string key="10189">Авто-зелья включены.</string>
    <string key="10190">Авто-зелья отключены.</string>
    <string key="10191">Введите число.</string>
    <string key="10192">Укажите кол-во процентов от 0 до 100.</string>
    <string key="10193">Значение изменено.</string>
    
    <!-- gameserver.handler.voicedcommandhandlers.Banking -->
    <string key="10194">.deposit (%s аден = %s золотых слитков) / .withdraw (%s золотых слитков = %s аден)</string>
    <string key="10195">Теперь у вас %s золотых слитков и на %s адены меньше.</string>
    <string key="10196">У вас недостаточно адены для конвертации в золотые слитки, вам нужно %s адены.</string>
    <string key="10197">У вас недостаточно места в инвентаре для всей адены!</string>
    <string key="10198">Теперь у вас %s адены и на %s меньше золотых слитков.</string>
    <string key="10199">У вас нет золотых слитков, чтобы обменять их на %s адены.</string>
    
    <!-- gameserver.handler.voicedcommandhandlers. ALLVOICEDCOMMAND -->
    <string key="10200">Команда отключена на сервере.</string>

    <!-- gameserver.communitybbs.custom.BuffBBSManager && SchemeBuffer -->
    <string key="10201">Сумон не вызван. Пожалуйста, вызовите сумона перед изменением цели.</string>
    
    <!-- gameserver.communitybbs.custom.AuctionBBSManager -->
    <string key="10202">Выбранный товар больше недоступен на Аукционе.</string>
    <string key="10203">У вас нет выбранного предмета в инвентаре.</string>
    <string key="10204">Вы достигли лимита в %s выставленных предметов.</string>
    <string key="10205">%s не разрешено на Аукционе.</string>
    <string key="10206">Этот предмет больше не находится в вашем инвентаре.</string>
    <string key="10207">Некорректное количество предметов.</string>
    <string key="10208">Некорректная цена предмета.</string>
    <string key="10209">У вас нет %s %s для оплаты комиссии за Аукцион.</string>
    <string key="10210">Вы успешно выставили %s</string>
    
    <!-- gameserver.communitybbs.custom.model.Auction -->
    <string key="10211">До окончания Аукциона осталось более 24 часов.</string>
    <string key="10212">Вы обновили продолжительность до %s.</string>
    <string key="10213">Нет такого количества товара.</string>
    <string key="10214">Вы успешно приобрели аукционный лот.</string>
    <string key="10215">Вы успешно продали аукционный лот.</string>
    <string key="10216">Вы удалилили Аукционный лот.</string>
    
    <!-- gameserver.communitybbs.custom.AuctionBBSManager -->
    <string key="10217">Применить</string>
    <string key="10218">каждая</string>
    <string key="10219">ВЛАДЕЛЕЦ</string>
    <string key="10220">Покупка</string>
    <string key="10221">Да</string>
    <string key="10222">Отменить</string>
    <string key="10223">У тебя не хватает %s - [%s], чтобы купить предмет.</string>
    <string key="10224">Очистить</string>
    <string key="10225">Поиск</string>
    <string key="10226">Истечение аукциона:</string>
    <string key="10227">Товары на продажу</string>
    <string key="10228">Убрать</string>
    <string key="10229">Добавить</string>
    <string key="10230">Вы ничего не добавили</string>
    <string key="10231">Твои предметы</string>
    <string key="10232">Истек срок действия</string>
    
    <!-- gameserver.model.actor.instance.RaidBoss -->
    <string key="10233">Рейдбосс %s [%s] был убит. Последний удар: %s. Клан: %s</string>
    <string key="10234">Рейдбосс %s [%s] был убит. Последний удар: %s</string>
    
    <!-- gameserver.model.actor.instance.GrandBoss -->
    <string key="10235">Эпикбосс %s [%s] был убит. Последний удар: %s. Клан: %s</string>
    <string key="10236">Эпикбосс %s [%s] был убит. Последний удар: %s</string>
    
    <!-- gameserver.model.spawn.MultiSpawn -->
    <string key="10237">Рейдбосс %s появился в мире!</string>
    <string key="10238">Эпикбосс %s появился в мире!</string>
    
    <!-- gameserver.handler.admincommandhandlers.AdminTest -->
    <string key="10239">Использование: //test setquest || ssq_change || manor_change || augment</string>
    <string key="10240">Неизвестный тип усиления: %s</string>
    <string key="10241">Использование: //test augment active|passive value</string>
    <string key="10242">Неверный числовой формат!</string>
    <string key="10243">Вы должны указать три параметра!</string>
    <string key="10244">Неверный формат команды. Используйте //test augment param1 param2 param3 ИЛИ //test augment active|passive type</string>
    <string key="10245">Квест с ID: %s не найден</string>
    <string key="10246">Невозможно инициализировать новое состояние квеста с cond %s для игрока %s. Для инициализации нового состояния используйте cond 0.</string>
    <string key="10247">Условие квеста %s для %s установлено в %s</string>
    <string key="10248">Квест %s для %s был создан. Чтобы начать его, используйте //test setquest %s 1</string>
    <string key="10249">Неверный формат команды. Используйте //test setquest questId cond</string>
    <string key="10250">Вы не можете улучшать оружие ниже %s класса!</string>
    <string key="10251">Вы не можете добавить усиление на %s!</string>
    <string key="10252">Успешно добавлено: %s.</string>
    <string key="10253">Это оружие уже улучшено.</string>
    <string key="10254">У вас нет оружия в руках.</string>

    <!-- gameserver.data.manager.BufferService -->
    <string key="10255">Для использования премиум-бафов требуется %s %s.</string>
    <string key="10256">Стоимость бафера рассчитана некорректно. Обратитесь к администратору.</string>
    <string key="10257">Премиум-баф не был применён. Платёжный предмет возвращён.</string>
    <string key="10258">Запрошенный баф не удалось применить.</string>

    <!-- gameserver.communitybbs.custom.ServiceBBSManager -->
    <string key="10259">Магазин сервисов Community Board временно отключён.</string>
    <string key="10260">Сервисы Premium Account временно отключены.</string>
    <string key="10261">Запрошенный сервис Community Board недоступен. Обратитесь к администратору.</string>
    <string key="10262">Некорректный запрос сервиса Community Board.</string>

    <!-- gameserver.handler.itemhandlers.EnchantBoost && gameserver.model.enchant.EnchantBoostService -->
    <string key="10263">Вы используете этот предмет слишком быстро. Подождите немного.</string>
    <string key="10264">У вас уже активен бонус заточки +%s%%.</string>
    <string key="10265">Некорректная настройка бонуса заточки. Обратитесь к администратору.</string>
    <string key="10266">Не удалось использовать предмет бонуса заточки.</string>
    <string key="10267">Нельзя использовать этот предмет после смерти.</string>
    <string key="10268">Нельзя использовать этот предмет во время торговли или крафта.</string>
    <string key="10269">Нельзя использовать этот предмет во время рыбалки.</string>
    <string key="10270">Нельзя использовать этот предмет верхом.</string>
    <string key="10271">Нельзя использовать этот предмет во время применения умения.</string>
    <string key="10272">Закройте окно заточки перед использованием этого предмета.</string>
    <string key="10273">Сейчас этот предмет использовать нельзя.</string>
    <string key="10274">Бонус заточки +%s%% активирован. Он сработает при следующей подходящей заточке.</string>
    <string key="10275">Бонус заточки +%s%% применён; фактически добавлено +%s%%. Итоговый шанс: %s%%.</string>
    <string key="10276">Этот свиток не поддерживает бонус заточки. Бонус сохранён.</string>
    <string key="10277">Шанс заточки уже равен 100%%. Бонус +%s%% сохранён.</string>
    <string key="10278">Активный бонус заточки +%s%% восстановлен после входа.</string>
</list>
 
Сверху Снизу