заточка предметов

nolek

Свой человек
Пользователь
Сообщения
8
Розыгрыши
0
Репутация
0
Реакции
0
Баллы
533
Хроники
  1. Chaotic Throne: High Five
Исходники
Присутствуют
Сборка
l2jserver
проект l2jserver
хроники HF

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

например свиток усиления
<item id="951" type="EtcItem" name="Scroll: Enchant Weapon (C-Grade)">

хочу поменять сколько поинтов добавляется при заточке не 1 при заточке от 0 до 3х и не 3 от 3х и выше, а другой вариант, который описывается какой-нибудь арифметической прогрессией
 
каких пойнтов?
уровень заточки ты имеешь в виду?

если в сборке явно не расписаны в каком-то хмл свойства всех свитков заточки (сколько прибавляют, шансы и т.д.), то значит все тупо захардкодено в ядре и тебе лезть в RequestEnchantItem и дальше по цепочке в направлении нужных свойств.
 
хочу поменять сколько поинтов добавляется при заточке не 1 при заточке от 0 до 3х и не 3 от 3х и выше, а другой вариант, который описывается какой-нибудь арифметической прогрессией
У меня все ядра на 100% напряглись.
 
l2_001.jpg

бонус Ф.Атаки и М.Атаки

я хочу поменять сколько поинтов этих параметров добавляется при заточке перечисленных в описании предметов

в xml файлах этих параметров я не нашёл, у меня в них указаны доп.шансы до 9 включительно , также указаны доп. шансы которые плюсуются при добавлении камней

поиск в исходниках по EnchantItem ничего не дал

в xml файла добавлены предметы, которые не подпадают под общие правила, такие как

<item id="21580"> <!-- Olf's T-shirt -->
<options level="0" option1="24965" />
<options level="1" option1="24966" />
<options level="2" option1="24967" />
<options level="3" option1="24968" />
<options level="4" option1="24969" option2="24975" />
<options level="5" option1="24970" option2="24976" />
<options level="6" option1="24971" option2="24977" />
<options level="7" option1="24972" option2="24978" option3="24982" />
<options level="8" option1="24973" option2="24979" option3="24982" />
<options level="9" option1="24974" option2="24980" option3="24983" />
<options level="10" option1="24984" option2="24985" option3="24983" />
</item>

нашёл вот такой файл в исходниках RequestEnchantItem.java

JavaScript:
/*
 * Copyright © 2004-2021 L2J Server
 *
 * This file is part of L2J Server.
 *
 * L2J Server is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * L2J Server is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
 */
package com.l2jserver.gameserver.network.clientpackets;

import static com.l2jserver.gameserver.config.Configuration.general;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.l2jserver.gameserver.data.xml.impl.EnchantItemData;
import com.l2jserver.gameserver.model.L2World;
import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
import com.l2jserver.gameserver.model.items.L2Item;
import com.l2jserver.gameserver.model.items.enchant.EnchantResultType;
import com.l2jserver.gameserver.model.items.enchant.EnchantScroll;
import com.l2jserver.gameserver.model.items.enchant.EnchantSupportItem;
import com.l2jserver.gameserver.model.items.instance.L2ItemInstance;
import com.l2jserver.gameserver.model.skills.CommonSkill;
import com.l2jserver.gameserver.model.skills.Skill;
import com.l2jserver.gameserver.network.SystemMessageId;
import com.l2jserver.gameserver.network.serverpackets.EnchantResult;
import com.l2jserver.gameserver.network.serverpackets.InventoryUpdate;
import com.l2jserver.gameserver.network.serverpackets.ItemList;
import com.l2jserver.gameserver.network.serverpackets.MagicSkillUse;
import com.l2jserver.gameserver.network.serverpackets.StatusUpdate;
import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
import com.l2jserver.gameserver.util.Util;

public final class RequestEnchantItem extends L2GameClientPacket {
    
    private static final Logger LOG_ENCHANT_ITEM = LoggerFactory.getLogger("enchant_item");
    
    private static final String _C__5F_REQUESTENCHANTITEM = "[C] 5F RequestEnchantItem";
    
    private int _objectId;
    
    private int _supportId;
    
    @Override
    protected void readImpl() {
        _objectId = readD();
        _supportId = readD();
    }
    
    @Override
    protected void runImpl() {
        final L2PcInstance activeChar = getClient().getActiveChar();
        if ((activeChar == null) || (_objectId == 0)) {
            return;
        }
        
        if (!activeChar.isOnline() || getClient().isDetached()) {
            activeChar.setActiveEnchantItemId(L2PcInstance.ID_NONE);
            return;
        }
        
        if (activeChar.isProcessingTransaction() || activeChar.isInStoreMode()) {
            activeChar.sendPacket(SystemMessageId.CANNOT_ENCHANT_WHILE_STORE);
            activeChar.setActiveEnchantItemId(L2PcInstance.ID_NONE);
            return;
        }
        
        L2ItemInstance item = activeChar.getInventory().getItemByObjectId(_objectId);
        L2ItemInstance scroll = activeChar.getInventory().getItemByObjectId(activeChar.getActiveEnchantItemId());
        L2ItemInstance support = activeChar.getInventory().getItemByObjectId(activeChar.getActiveEnchantSupportItemId());
        
        if ((item == null) || (scroll == null)) {
            activeChar.setActiveEnchantItemId(L2PcInstance.ID_NONE);
            return;
        }
        
        // template for scroll
        final EnchantScroll scrollTemplate = EnchantItemData.getInstance().getEnchantScroll(scroll);
        
        // scroll not found in list
        if (scrollTemplate == null) {
            return;
        }
        
        // template for support item, if exist
        EnchantSupportItem supportTemplate = null;
        if (support != null) {
            if (support.getObjectId() != _supportId) {
                activeChar.setActiveEnchantItemId(L2PcInstance.ID_NONE);
                return;
            }
            supportTemplate = EnchantItemData.getInstance().getSupportItem(support);
        }
        
        // first validation check
        if (!scrollTemplate.isValid(item, supportTemplate)) {
            activeChar.sendPacket(SystemMessageId.INAPPROPRIATE_ENCHANT_CONDITION);
            activeChar.setActiveEnchantItemId(L2PcInstance.ID_NONE);
            activeChar.sendPacket(new EnchantResult(2, 0, 0));
            return;
        }
        
        // fast auto-enchant cheat check
        if ((activeChar.getActiveEnchantTimestamp() == 0) || ((System.currentTimeMillis() - activeChar.getActiveEnchantTimestamp()) < 2000)) {
            Util.handleIllegalPlayerAction(activeChar, "Player " + activeChar.getName() + " use autoenchant program ");
            activeChar.setActiveEnchantItemId(L2PcInstance.ID_NONE);
            activeChar.sendPacket(new EnchantResult(2, 0, 0));
            return;
        }
        
        // attempting to destroy scroll
        scroll = activeChar.getInventory().destroyItem("Enchant", scroll.getObjectId(), 1, activeChar, item);
        if (scroll == null) {
            activeChar.sendPacket(SystemMessageId.NOT_ENOUGH_ITEMS);
            Util.handleIllegalPlayerAction(activeChar, "Player " + activeChar.getName() + " tried to enchant with a scroll he doesn't have");
            activeChar.setActiveEnchantItemId(L2PcInstance.ID_NONE);
            activeChar.sendPacket(new EnchantResult(2, 0, 0));
            return;
        }
        
        // attempting to destroy support if exist
        if (support != null) {
            support = activeChar.getInventory().destroyItem("Enchant", support.getObjectId(), 1, activeChar, item);
            if (support == null) {
                activeChar.sendPacket(SystemMessageId.NOT_ENOUGH_ITEMS);
                Util.handleIllegalPlayerAction(activeChar, "Player " + activeChar.getName() + " tried to enchant with a support item he doesn't have");
                activeChar.setActiveEnchantItemId(L2PcInstance.ID_NONE);
                activeChar.sendPacket(new EnchantResult(2, 0, 0));
                return;
            }
        }
        
        final InventoryUpdate iu = new InventoryUpdate();
        synchronized (item) {
            // last validation check
            if ((item.getOwnerId() != activeChar.getObjectId()) || (item.isEnchantable() == 0)) {
                activeChar.sendPacket(SystemMessageId.INAPPROPRIATE_ENCHANT_CONDITION);
                activeChar.setActiveEnchantItemId(L2PcInstance.ID_NONE);
                activeChar.sendPacket(new EnchantResult(2, 0, 0));
                return;
            }
            
            final EnchantResultType resultType = scrollTemplate.calculateSuccess(activeChar, item, supportTemplate);
            switch (resultType) {
                case ERROR -> {
                    activeChar.sendPacket(SystemMessageId.INAPPROPRIATE_ENCHANT_CONDITION);
                    activeChar.setActiveEnchantItemId(L2PcInstance.ID_NONE);
                    activeChar.sendPacket(new EnchantResult(2, 0, 0));
                }
                case SUCCESS -> {
                    L2Item it = item.getItem();
                    // Increase enchant level only if scroll's base template has chance, some armors can success over +20 but they shouldn't have increased.
                    if (scrollTemplate.getChance(activeChar, item) > 0) {
                        item.setEnchantLevel(item.getEnchantLevel() + 1);
                        item.updateDatabase();
                    }
                    activeChar.sendPacket(new EnchantResult(0, 0, 0));
                    
                    if (general().logItemEnchants()) {
                        LOG_ENCHANT_ITEM.info("ENCHANTED {} using {} and {} by {}.", item, scroll, support, activeChar);
                    }
                    
                    // announce the success
                    int minEnchantAnnounce = item.isArmor() ? 6 : 7;
                    int maxEnchantAnnounce = item.isArmor() ? 0 : 15;
                    if ((item.getEnchantLevel() == minEnchantAnnounce) || (item.getEnchantLevel() == maxEnchantAnnounce)) {
                        SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.C1_SUCCESSFULY_ENCHANTED_A_S2_S3);
                        sm.addCharName(activeChar);
                        sm.addInt(item.getEnchantLevel());
                        sm.addItemName(item);
                        activeChar.broadcastPacket(sm);
                        
                        Skill skill = CommonSkill.FIREWORK.getSkill();
                        if (skill != null) {
                            activeChar.broadcastPacket(new MagicSkillUse(activeChar, activeChar, skill.getId(), skill.getLevel(), skill.getHitTime(), skill.getReuseDelay()));
                        }
                    }
                    
                    if ((item.isArmor()) && (item.getEnchantLevel() == 4) && item.isEquipped()) {
                        Skill enchant4Skill = it.getEnchant4Skill();
                        if (enchant4Skill != null) {
                            // add skills bestowed from +4 armor
                            activeChar.addSkill(enchant4Skill, false);
                            activeChar.sendSkillList();
                        }
                    }
                }
                case FAILURE -> {
                    if (scrollTemplate.isSafe()) {
                        // safe enchant - remain old value
                        activeChar.sendPacket(SystemMessageId.SAFE_ENCHANT_FAILED);
                        activeChar.sendPacket(new EnchantResult(5, 0, 0));
                        
                        if (general().logItemEnchants()) {
                            LOG_ENCHANT_ITEM.info("FAILED_SAFE_ENCHANTING {} using {} and {} by {}.", item, scroll, support, activeChar);
                        }
                    } else {
                        // unequip item on enchant failure to avoid item skills stack
                        if (item.isEquipped()) {
                            if (item.getEnchantLevel() > 0) {
                                SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.EQUIPMENT_S1_S2_REMOVED);
                                sm.addInt(item.getEnchantLevel());
                                sm.addItemName(item);
                                activeChar.sendPacket(sm);
                            } else {
                                SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.S1_DISARMED);
                                sm.addItemName(item);
                                activeChar.sendPacket(sm);
                            }
                            
                            L2ItemInstance[] unequiped = activeChar.getInventory().unEquipItemInSlotAndRecord(item.getLocationSlot());
                            for (L2ItemInstance itm : unequiped) {
                                iu.addModifiedItem(itm);
                            }
                            
                            activeChar.sendPacket(iu);
                            activeChar.broadcastUserInfo();
                        }
                        
                        if (scrollTemplate.isBlessed()) {
                            // blessed enchant - clear enchant value
                            activeChar.sendPacket(SystemMessageId.BLESSED_ENCHANT_FAILED);
                            
                            item.setEnchantLevel(0);
                            item.updateDatabase();
                            activeChar.sendPacket(new EnchantResult(3, 0, 0));
                            
                            if (general().logItemEnchants()) {
                                LOG_ENCHANT_ITEM.info("FAILED_BLESSED_ENCHANTING {} using {} and {} by {}.", item, scroll, support, activeChar);
                            }
                        } else {
                            // enchant failed, destroy item
                            item = activeChar.getInventory().destroyItem("Enchant", item, activeChar, null);
                            if (item == null) {
                                // unable to destroy item, cheater ?
                                Util.handleIllegalPlayerAction(activeChar, "Unable to delete item on enchant failure from player " + activeChar.getName() + ", possible cheater !");
                                activeChar.setActiveEnchantItemId(L2PcInstance.ID_NONE);
                                activeChar.sendPacket(new EnchantResult(2, 0, 0));
                                
                                if (general().logItemEnchants()) {
                                    LOG_ENCHANT_ITEM.warn("CANNOT_DESTROY {} using {} and {} by {}.", item, scroll, support, activeChar);
                                }
                                return;
                            }
                            
                            L2World.getInstance().removeObject(item);
                            
                            final int crystalId = item.getItem().getCrystalItemId();
                            if ((crystalId != 0) && item.getItem().isCrystallizable()) {
                                int count = item.getCrystalCount() - ((item.getItem().getCrystalCount() + 1) / 2);
                                count = Math.max(count, 1);
                                activeChar.getInventory().addItem("Enchant", crystalId, count, activeChar, item);
                                
                                final SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.EARNED_S2_S1_S);
                                sm.addItemName(crystalId);
                                sm.addLong(count);
                                activeChar.sendPacket(sm);
                                activeChar.sendPacket(new EnchantResult(1, crystalId, count));
                            } else {
                                activeChar.sendPacket(new EnchantResult(4, 0, 0));
                            }
                            
                            if (general().logItemEnchants()) {
                                LOG_ENCHANT_ITEM.warn("FAILED_ENCHANTING {} using {} and {} by {}.", item, scroll, support, activeChar);
                            }
                        }
                    }
                }
            }
            
            final StatusUpdate su = new StatusUpdate(activeChar);
            su.addAttribute(StatusUpdate.CUR_LOAD, activeChar.getCurrentLoad());
            activeChar.sendPacket(su);
            if (!general().forceInventoryUpdate()) {
                if (scroll.getCount() == 0) {
                    iu.addRemovedItem(scroll);
                } else {
                    iu.addModifiedItem(scroll);
                }
                
                if (item.getCount() == 0) {
                    iu.addRemovedItem(item);
                } else {
                    iu.addModifiedItem(item);
                }
                
                if (support != null) {
                    if (support.getCount() == 0) {
                        iu.addRemovedItem(support);
                    } else {
                        iu.addModifiedItem(support);
                    }
                }
                
                activeChar.sendPacket(iu);
            } else {
                activeChar.sendPacket(new ItemList(activeChar, true));
            }
            
            activeChar.broadcastUserInfo();
            activeChar.setActiveEnchantItemId(L2PcInstance.ID_NONE);
        }
    }
    
    @Override
    public String getType() {
        return _C__5F_REQUESTENCHANTITEM;
    }
}


но в джаве не силён, возможно кто подскажет куда дальше копать
 
Посмотреть вложение 54512

бонус Ф.Атаки и М.Атаки

я хочу поменять сколько поинтов этих параметров добавляется при заточке перечисленных в описании предметов

в xml файлах этих параметров я не нашёл, у меня в них указаны доп.шансы до 9 включительно , также указаны доп. шансы которые плюсуются при добавлении камней

поиск в исходниках по EnchantItem ничего не дал

в xml файла добавлены предметы, которые не подпадают под общие правила, такие как

<item id="21580"> <!-- Olf's T-shirt -->
<options level="0" option1="24965" />
<options level="1" option1="24966" />
<options level="2" option1="24967" />
<options level="3" option1="24968" />
<options level="4" option1="24969" option2="24975" />
<options level="5" option1="24970" option2="24976" />
<options level="6" option1="24971" option2="24977" />
<options level="7" option1="24972" option2="24978" option3="24982" />
<options level="8" option1="24973" option2="24979" option3="24982" />
<options level="9" option1="24974" option2="24980" option3="24983" />
<options level="10" option1="24984" option2="24985" option3="24983" />
</item>
Код:
/*
 * Copyright (C) 2004-2016 L2J Server
 *
 * This file is part of L2J Server.
 *
 * L2J Server is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * L2J Server is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
 */
package com.l2jserver.gameserver.model.stats.functions;

import com.l2jserver.Config;
import com.l2jserver.gameserver.model.actor.L2Character;
import com.l2jserver.gameserver.model.conditions.Condition;
import com.l2jserver.gameserver.model.items.L2Item;
import com.l2jserver.gameserver.model.items.instance.L2ItemInstance;
import com.l2jserver.gameserver.model.items.type.WeaponType;
import com.l2jserver.gameserver.model.skills.Skill;
import com.l2jserver.gameserver.model.stats.Stats;

public class FuncEnchant extends AbstractFunction
{
    public FuncEnchant(Stats stat, int order, Object owner, double value, Condition applayCond)
    {
        super(stat, order, owner, value, applayCond);
    }
  
    @Override
    public double calc(L2Character effector, L2Character effected, Skill skill, double initVal)
    {
        double value = initVal;
        if ((getApplayCond() != null) && !getApplayCond().test(effector, effected, skill))
        {
            return value;
        }
      
        L2ItemInstance item = (L2ItemInstance) getFuncOwner();
        int enchant = item.getEnchantLevel();
        if (enchant <= 0)
        {
            return value;
        }
      
        int overenchant = 0;
        if (enchant > 3)
        {
            overenchant = enchant - 3;
            enchant = 3;
        }
      
        if (effector.isPlayer())
        {
            if (effector.getActingPlayer().isInOlympiadMode() && (Config.ALT_OLY_ENCHANT_LIMIT >= 0) && ((enchant + overenchant) > Config.ALT_OLY_ENCHANT_LIMIT))
            {
                if (Config.ALT_OLY_ENCHANT_LIMIT > 3)
                {
                    overenchant = Config.ALT_OLY_ENCHANT_LIMIT - 3;
                }
                else
                {
                    overenchant = 0;
                    enchant = Config.ALT_OLY_ENCHANT_LIMIT;
                }
            }
        }
      
        if ((getStat() == Stats.MAGIC_DEFENCE) || (getStat() == Stats.POWER_DEFENCE))
        {
            return value + enchant + (3 * overenchant);
        }
      
        if (getStat() == Stats.MAGIC_ATTACK)
        {
            switch (item.getItem().getItemGradeSPlus())
            {
                case S:
                    // M. Atk. increases by 4 for all weapons.
                    // Starting at +4, M. Atk. bonus double.
                    value += (4 * enchant) + (8 * overenchant);
                    break;
                case A:
                case B:
                case C:
                    // M. Atk. increases by 3 for all weapons.
                    // Starting at +4, M. Atk. bonus double.
                    value += (3 * enchant) + (6 * overenchant);
                    break;
                case D:
                case NONE:
                    // M. Atk. increases by 2 for all weapons. Starting at +4, M. Atk. bonus double.
                    // Starting at +4, M. Atk. bonus double.
                    value += (2 * enchant) + (4 * overenchant);
                    break;
            }
            return value;
        }
      
        if (item.isWeapon())
        {
            final WeaponType type = (WeaponType) item.getItemType();
            switch (item.getItem().getItemGradeSPlus())
            {
                case S:
                    if (item.getWeaponItem().getBodyPart() == L2Item.SLOT_LR_HAND)
                    {
                        if ((type == WeaponType.BOW) || (type == WeaponType.CROSSBOW))
                        {
                            // P. Atk. increases by 10 for bows.
                            // Starting at +4, P. Atk. bonus double.
                            value += (10 * enchant) + (20 * overenchant);
                        }
                        else
                        {
                            // P. Atk. increases by 6 for two-handed swords, two-handed blunts, dualswords, and two-handed combat weapons.
                            // Starting at +4, P. Atk. bonus double.
                            value += (6 * enchant) + (12 * overenchant);
                        }
                    }
                    else
                    {
                        // P. Atk. increases by 5 for one-handed swords, one-handed blunts, daggers, spears, and other weapons.
                        // Starting at +4, P. Atk. bonus double.
                        value += (5 * enchant) + (10 * overenchant);
                    }
                    break;
                case A:
                    if (item.getWeaponItem().getBodyPart() == L2Item.SLOT_LR_HAND)
                    {
                        if ((type == WeaponType.BOW) || (type == WeaponType.CROSSBOW))
                        {
                            // P. Atk. increases by 8 for bows.
                            // Starting at +4, P. Atk. bonus double.
                            value += (8 * enchant) + (16 * overenchant);
                        }
                        else
                        {
                            // P. Atk. increases by 5 for two-handed swords, two-handed blunts, dualswords, and two-handed combat weapons.
                            // Starting at +4, P. Atk. bonus double.
                            value += (5 * enchant) + (10 * overenchant);
                        }
                    }
                    else
                    {
                        // P. Atk. increases by 4 for one-handed swords, one-handed blunts, daggers, spears, and other weapons.
                        // Starting at +4, P. Atk. bonus double.
                        value += (4 * enchant) + (8 * overenchant);
                    }
                    break;
                case B:
                case C:
                    if (item.getWeaponItem().getBodyPart() == L2Item.SLOT_LR_HAND)
                    {
                        if ((type == WeaponType.BOW) || (type == WeaponType.CROSSBOW))
                        {
                            // P. Atk. increases by 6 for bows.
                            // Starting at +4, P. Atk. bonus double.
                            value += (6 * enchant) + (12 * overenchant);
                        }
                        else
                        {
                            // P. Atk. increases by 4 for two-handed swords, two-handed blunts, dualswords, and two-handed combat weapons.
                            // Starting at +4, P. Atk. bonus double.
                            value += (4 * enchant) + (8 * overenchant);
                        }
                    }
                    else
                    {
                        // P. Atk. increases by 3 for one-handed swords, one-handed blunts, daggers, spears, and other weapons.
                        // Starting at +4, P. Atk. bonus double.
                        value += (3 * enchant) + (6 * overenchant);
                    }
                    break;
                case D:
                case NONE:
                    switch (type)
                    {
                        case BOW:
                        case CROSSBOW:
                        {
                            // Bows increase by 4.
                            // Starting at +4, P. Atk. bonus double.
                            value += (4 * enchant) + (8 * overenchant);
                            break;
                        }
                        default:
                            // P. Atk. increases by 2 for all weapons with the exception of bows.
                            // Starting at +4, P. Atk. bonus double.
                            value += (2 * enchant) + (4 * overenchant);
                            break;
                    }
                    break;
            }
        }
        return value;
    }
}
 
ELSATHESLAYER,

да, вероятно этот файл ответственен за формулу точки, у меня в он немного другой. название у меня FuncEnchant.java по пути \src\main\java\com\l2jserver\gameserver\model\stats\functions\
JavaScript:
/*
 * Copyright © 2004-2021 L2J Server
 *
 * This file is part of L2J Server.
 *
 * L2J Server is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * L2J Server is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
 */
package com.l2jserver.gameserver.model.stats.functions;

import static com.l2jserver.gameserver.config.Configuration.olympiad;

import com.l2jserver.gameserver.model.actor.L2Character;
import com.l2jserver.gameserver.model.conditions.Condition;
import com.l2jserver.gameserver.model.items.L2Item;
import com.l2jserver.gameserver.model.items.instance.L2ItemInstance;
import com.l2jserver.gameserver.model.items.type.WeaponType;
import com.l2jserver.gameserver.model.skills.Skill;
import com.l2jserver.gameserver.model.stats.Stats;

public class FuncEnchant extends AbstractFunction {
    public FuncEnchant(Stats stat, int order, Object owner, double value, Condition applyCond) {
        super(stat, order, owner, value, applyCond);
    }
    
    @Override
    public double calc(L2Character effector, L2Character effected, Skill skill, double initVal) {
        double value = initVal;
        if ((getApplyCond() != null) && !getApplyCond().test(effector, effected, skill)) {
            return value;
        }
        
        L2ItemInstance item = (L2ItemInstance) getFuncOwner();
        int enchant = item.getEnchantLevel();
        if (enchant <= 0) {
            return value;
        }
        
        int overEnchant = 0;
        if (enchant > 3) {
            overEnchant = enchant - 3;
            enchant = 3;
        }
        
        if (effector.isPlayer()) {
            if (effector.getActingPlayer().isInOlympiadMode() && (olympiad().getEnchantLimit() >= 0) && ((enchant + overEnchant) > olympiad().getEnchantLimit())) {
                if (olympiad().getEnchantLimit() > 3) {
                    overEnchant = olympiad().getEnchantLimit() - 3;
                } else {
                    overEnchant = 0;
                    enchant = olympiad().getEnchantLimit();
                }
            }
        }
        
        if ((getStat() == Stats.MAGIC_DEFENCE) || (getStat() == Stats.POWER_DEFENCE)) {
            return value + enchant + (3 * overEnchant);
        }
        
        if (getStat() == Stats.MAGIC_ATTACK) {
            // M. Atk. increases by 4 for all weapons.
            // Starting at +4, M. Atk. bonus double.
            // M. Atk. increases by 3 for all weapons.
            // Starting at +4, M. Atk. bonus double.
            // M. Atk. increases by 2 for all weapons. Starting at +4, M. Atk. bonus double.
            // Starting at +4, M. Atk. bonus double.
            switch (item.getItem().getItemGradeSPlus()) {
                case S -> value += (4 * enchant) + (8 * overEnchant);
                case A, B, C -> value += (3 * enchant) + (6 * overEnchant);
                case D, NONE -> value += (2 * enchant) + (4 * overEnchant);
            }
            return value;
        }
        
        if (item.isWeapon()) {
            final WeaponType type = (WeaponType) item.getItemType();
            switch (item.getItem().getItemGradeSPlus()) {
                case S:
                    if (item.getWeaponItem().getBodyPart() == L2Item.SLOT_LR_HAND) {
                        if ((type == WeaponType.BOW) || (type == WeaponType.CROSSBOW)) {
                            // P. Atk. increases by 10 for bows.
                            // Starting at +4, P. Atk. bonus double.
                            value += (10 * enchant) + (20 * overEnchant);
                        } else {
                            // P. Atk. increases by 6 for two-handed swords, two-handed blunts, dualswords, and two-handed combat weapons.
                            // Starting at +4, P. Atk. bonus double.
                            value += (6 * enchant) + (12 * overEnchant);
                        }
                    } else {
                        // P. Atk. increases by 5 for one-handed swords, one-handed blunts, daggers, spears, and other weapons.
                        // Starting at +4, P. Atk. bonus double.
                        value += (5 * enchant) + (10 * overEnchant);
                    }
                    break;
                case A:
                    if (item.getWeaponItem().getBodyPart() == L2Item.SLOT_LR_HAND) {
                        if ((type == WeaponType.BOW) || (type == WeaponType.CROSSBOW)) {
                            // P. Atk. increases by 8 for bows.
                            // Starting at +4, P. Atk. bonus double.
                            value += (8 * enchant) + (16 * overEnchant);
                        } else {
                            // P. Atk. increases by 5 for two-handed swords, two-handed blunts, dualswords, and two-handed combat weapons.
                            // Starting at +4, P. Atk. bonus double.
                            value += (5 * enchant) + (10 * overEnchant);
                        }
                    } else {
                        // P. Atk. increases by 4 for one-handed swords, one-handed blunts, daggers, spears, and other weapons.
                        // Starting at +4, P. Atk. bonus double.
                        value += (4 * enchant) + (8 * overEnchant);
                    }
                    break;
                case B:
                case C:
                    if (item.getWeaponItem().getBodyPart() == L2Item.SLOT_LR_HAND) {
                        if ((type == WeaponType.BOW) || (type == WeaponType.CROSSBOW)) {
                            // P. Atk. increases by 6 for bows.
                            // Starting at +4, P. Atk. bonus double.
                            value += (6 * enchant) + (12 * overEnchant);
                        } else {
                            // P. Atk. increases by 4 for two-handed swords, two-handed blunts, dualswords, and two-handed combat weapons.
                            // Starting at +4, P. Atk. bonus double.
                            value += (4 * enchant) + (8 * overEnchant);
                        }
                    } else {
                        // P. Atk. increases by 3 for one-handed swords, one-handed blunts, daggers, spears, and other weapons.
                        // Starting at +4, P. Atk. bonus double.
                        value += (3 * enchant) + (6 * overEnchant);
                    }
                    break;
                case D:
                case NONE:
                    // P. Atk. increases by 2 for all weapons with the exception of bows.
                    // Starting at +4, P. Atk. bonus double.
                    switch (type) {
                        case BOW, CROSSBOW -> {
                            // Bows increase by 4.
                            // Starting at +4, P. Atk. bonus double.
                            value += (4 * enchant) + (8 * overEnchant);
                        }
                        default -> value += (2 * enchant) + (4 * overEnchant);
                    }
                    break;
            }
        }
        return value;
    }
}

Gaikotsu, т.е. нужны исходники и клиента ?

и если есть инфа, то какая dll может содержать эти данные (по заточке)
по идее, тогда должен быть конфликт с критом при запуске исполняемого файла, если есть проверка, или же при первом обращении к заточеному предмету

Gaikotsu, или же имелось ввиду, что дамаг будет выдаваться учитывая изменения в FuncEnchant.java но при наведении курсора на предмет P.Atck в описании будет из dll (точно dll или может всё таки какая-то датка, ведь их можно редактировать)
 
или же имелось ввиду, что дамаг будет выдаваться учитывая изменения в FuncEnchant.java но при наведении курсора на предмет P.Atck в описании будет из dll (точно dll или может всё таки какая-то датка, ведь их можно редактировать)
Он имел ввиду визуально в тултипе будет все как и было ранее, это вшито на уровне клиента NWindow.dll
 
jois, - в описании предмета ничего не поменялось, но в статусе персонажа пересчитало согласно изменениям в FuncEnchant.java

при изменении численных значений всё скомпилилось и запустилось, в описании предмета ничего не поменялось, но в статусе персонажа пересчитало согласно изменениям в FuncEnchant.java, на днях попробую прописать прирост характеристик при точке формулами арифметических прогрессий в FuncEnchant.java , а не так как реализовано сейчас, только два режима enchant и overEnchant

если кто знает как ковырять NWindow.dll - буду благодарен, ибо идой с нахрапу не смог , а хех редактором пока не смог распознать нужные места.
 
jois, - в описании предмета ничего не поменялось, но в статусе персонажа пересчитало согласно изменениям в FuncEnchant.java

при изменении численных значений всё скомпилилось и запустилось, в описании предмета ничего не поменялось, но в статусе персонажа пересчитало согласно изменениям в FuncEnchant.java, на днях попробую прописать прирост характеристик при точке формулами арифметических прогрессий в FuncEnchant.java , а не так как реализовано сейчас, только два режима enchant и overEnchant

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

C#:
class Tooltip extends UICommonAPI;

const TOOLTIP_MINIMUM_WIDTH = 250;
const TOOLTIP_SETITEM_MAX = 3;

const ATTRIBUTE_FIRE     = 0;
const ATTRIBUTE_WATER     = 1;
const ATTRIBUTE_WIND     = 2;
const ATTRIBUTE_EARTH     = 3;
const ATTRIBUTE_HOLY     = 4;
const ATTRIBUTE_UNHOLY     = 5;

const DEFAULT_ATTACK = 10;

var CustomTooltip m_Tooltip;
var DrawItemInfo m_Info;

var Array<int> AttackAttLevel;
var Array<int> AttackAttCurrValue;
var Array<int> AttackAttMaxValue; //모든 공격 속성의 레벨, 현재레벨에서의 값, 현재레벨에서의 최대값을 여기에 저장한다.

var Array<int> DefAttLevel;
var Array<int> DefAttCurrValue;
var Array<int> DefAttMaxValue; //모든 방어 속성의 레벨, 현재레벨에서의 값, 현재레벨에서의 최대값을 여기에 저장한다.

var int NowAttrLv;
var int NowMaxValue;
var int NowValue;

var bool BoolSelect;


function OnRegisterEvent()
{
    RegisterEvent( EV_RequestTooltipInfo );
}

function OnLoad()
{
    BoolSelect = true;    // 숏컷 툴팁 켜기/끄기 기본값을 켜기로(TTP#41925) 2010.8.23 - winkey

    if(CREATE_ON_DEMAND==0)
        OnRegisterEvent();
}

function OnEvent(int Event_ID, string param)
{
    switch( Event_ID )
    {
    case EV_RequestTooltipInfo:
        //debug("툴팁이벤트 넘어오냐");
        HandleRequestTooltipInfo(param);
        break;
    }
}

function setBoolSelect( bool b )
{
    BoolSelect = b;
}

function HandleRequestTooltipInfo(string param)
{
    local String TooltipType;
    local int SourceType;
    local ETooltipSourceType eSourceType;
    
    ClearTooltip();
    
    if (!ParseString(param, "TooltipType", TooltipType))
        return;
        
    if (!ParseInt(param, "SourceType", SourceType))
        return;
    
    //GetChatWindowHandle( "ChatWnd.NormalChat" ).AddStringToChatWindow("TT:" $ TooltipType, GetChatColorByType(0) );
    
    eSourceType = ETooltipSourceType(SourceType);
    
    //////////////////////////////////////////////////////////////////////////////////////////////////////////
    ///////////////////////////////////////////////////// Normal Tooltip /////////////////////////////////////
    //////////////////////////////////////////////////////////////////////////////////////////////////////////
    //debug("Tooltip타입:"$TooltipType);
    if (TooltipType == "Text")
    {
        ReturnTooltip_NTT_TEXT(param, eSourceType, false);
    }
    else if (TooltipType == "Description")
    {
        ReturnTooltip_NTT_TEXT(param, eSourceType, true);
    }
    //////////////////////////////////////////////////////////////////////////////////////////////////////////
    ///////////////////////////////////////////////////// ItemWnd Tooltip ////////////////////////////////////
    //////////////////////////////////////////////////////////////////////////////////////////////////////////
    else if (TooltipType == "Action")
    {
        ReturnTooltip_NTT_ACTION(param, eSourceType);
    }
    else if (TooltipType == "Skill")
    {
        ReturnTooltip_NTT_SKILL(param, eSourceType);
    }
    else if (TooltipType == "NormalItem")
    {
        ReturnTooltip_NTT_NORMALITEM(param, eSourceType);
    }
    else if (TooltipType == "Shortcut")
    {
        ReturnTooltip_NTT_SHORTCUT(param, eSourceType);
    }
    else if (TooltipType == "AbnormalStatus")
    {
        ReturnTooltip_NTT_ABNORMALSTATUS(param, eSourceType);
    }
    else if (TooltipType == "RecipeManufacture")
    {
        ReturnTooltip_NTT_RECIPE_MANUFACTURE(param, eSourceType);
    }
    else if (TooltipType == "Recipe")
    {
        ReturnTooltip_NTT_RECIPE(param, eSourceType, false);
    }
    else if (TooltipType == "RecipePrice")
    {
        ReturnTooltip_NTT_RECIPE(param, eSourceType, true);
    }
    else if (TooltipType == "Inventory"
            || TooltipType == "InventoryPrice1"
            || TooltipType == "InventoryPrice2"
            || TooltipType == "InventoryPrice1HideEnchant"
            || TooltipType == "InventoryPrice1HideEnchantStackable"
            || TooltipType == "InventoryPrice2PrivateShop"
            || TooltipType == "InventoryWithIcon"
            || TooltipType == "InventoryPawnViewer")        // PawnViewer용 추가 - lancelot 2007. 10. 16.
    {
        //~ debug("툴팁보여주세요.");
        ReturnTooltip_NTT_ITEM(param, TooltipType, eSourceType);
    }
    //////////////////////////////////////////////////////////////////////////////////////////////////////////
    ///////////////////////////////////////////////////// ListCtrl Tooltip ///////////////////////////////////
    //////////////////////////////////////////////////////////////////////////////////////////////////////////
    //선준 수정(2010.02.22 ~ 03.08) 완료
    else if ( TooltipType == "RoomList" )
    {
        ReturnTooltip_NTT_ROOMLIST(param, eSourceType);
    }   
    else if ( TooltipType == "UserList" )
    {
        ReturnTooltip_NTT_USERLIST(param, eSourceType);
    }
    else if (TooltipType == "PartyMatch")
    {
        ReturnTooltip_NTT_PARTYMATCH(param, eSourceType);
    }
    else if (TooltipType == "UnionList")
    {
        ReturnTooltip_NTT_UNIONLIST(param, eSourceType);
    }
    else if (TooltipType == "QuestInfo")
    {
        ReturnTooltip_NTT_QUESTINFO(param, eSourceType);
    }
    else if (TooltipType == "QuestList")
    {
        ReturnTooltip_NTT_QUESTLIST(param, eSourceType);
    }
    else if (TooltipType == "RaidList")
    {
        ReturnTooltip_NTT_RAIDLIST(param, eSourceType);
    }
    else if (TooltipType == "ClanInfo")
    {
        ReturnTooltip_NTT_CLANINFO(param, eSourceType);
    }
    //선준 수정( 10.03.30 ) 완료
    //우편함에 툴팁 추가.
    else if (TooltipType == "PostInfo")
    {
        ReturnTooltip_NTT_POSTINFO(param, eSourceType);
    }
    /////////////////////////////////////////////////////
    // MANOR
    else if (TooltipType == "ManorSeedInfo"
            || TooltipType == "ManorCropInfo"
            || TooltipType == "ManorSeedSetting"
            || TooltipType == "ManorCropSetting"
            || TooltipType == "ManorDefaultInfo"
            || TooltipType == "ManorCropSell")
    {
        ReturnTooltip_NTT_MANOR(param, TooltipType, eSourceType);
    }
    // [퀘스트 아이템 툴팁 추가]
    else if (TooltipType == "QuestItem")
    {
        ReturnTooltip_NTT_QUESTREWARDS(param, eSourceType);
    }
}

function bool IsEnchantableItem(EItemParamType Type)
{
    return (Type == ITEMP_WEAPON || Type == ITEMP_ARMOR || Type == ITEMP_ACCESSARY || Type == ITEMP_SHIELD);
}

function ClearTooltip()
{
    m_Tooltip.SimpleLineCount = 0;
    m_Tooltip.MinimumWidth = 0;
    m_Tooltip.DrawList.Remove(0, m_Tooltip.DrawList.Length);
}

function StartItem()
{
    local DrawItemInfo infoClear;
    m_Info = infoClear;
}

function EndItem()
{
    m_Tooltip.DrawList.Length = m_Tooltip.DrawList.Length + 1;
    m_Tooltip.DrawList[m_Tooltip.DrawList.Length-1] = m_Info;
}

function TooltipInsertItemLine()
{
    AddTooltipItemBlank(4);
    StartItem();
    m_Info.eType = DIT_SPLITLINE;
    m_Info.u_nTextureUWidth = 50;
    m_Info.u_nTextureWidth = 200;           
    m_Info.u_nTextureHeight = 1;
    m_Info.u_strTexture ="L2ui_ch3.tooltip_line";
    EndItem();
    AddTooltipItemBlank(4);
}

function TooltipInsertItemLine2()
{
    StartItem();
    m_Info.eType = DIT_SPLITLINE;
    m_Info.u_nTextureUWidth = 50;
    m_Info.u_nTextureWidth = 200;           
    //m_Info.u_nTextureHeight = 1;
    m_Info.u_strTexture ="L2ui_ch3.tooltip_line";
    EndItem();
}

/////////////////////////////////////////////////////////////////////////////////
// TEXT
function ReturnTooltip_NTT_TEXT(string param, ETooltipSourceType eSourceType, bool bDesc)
{
    local string strText;
    local int ID;
    
    if (eSourceType == NTST_TEXT)
    {
        if (ParseString( param, "Text", strText))
        {
            if (Len(strText)>0)
            {
                if (bDesc)
                {
                    m_Tooltip.MinimumWidth = TOOLTIP_MINIMUM_WIDTH;
                    
                    StartItem();
                    m_Info.eType = DIT_TEXT;
                    m_Info.t_color.R = 178;
                    m_Info.t_color.G = 190;
                    m_Info.t_color.B = 207;
                    m_Info.t_color.A = 255;
                    m_Info.t_strText = strText;
                    EndItem();
                }
                else
                {
                    StartItem();
                    m_Info.eType = DIT_TEXT;
                    m_Info.t_bDrawOneLine = true;
                    m_Info.t_strText = strText;
                    EndItem();   
                }
            }
        }
        else if (ParseInt( param, "ID", ID))
        {
            if (ID>0)
            {
                StartItem();
                m_Info.eType = DIT_TEXT;
                m_Info.t_bDrawOneLine = true;
                m_Info.t_ID = ID;
                EndItem();
            }
        }
    }
    else
    {
        return;
    }
        
    ReturnTooltipInfo(m_Tooltip);
}

/////////////////////////////////////////////////////////////////////////////////
// INVENTORY Etc
function ReturnTooltip_NTT_ITEM(string param, String TooltipType, ETooltipSourceType eSourceType)
{
    local ItemInfo Item;
    
    local EItemType eItemType;
    local EEtcItemType eEtcItemType;
    
    local bool bLargeWidth;
    local string SlotString;
    local string strTmp;
    local int nTmp;
    local int idx;
    
    //제련효과
    local string ItemName;
    local int Quality;
    local int ColorR;
    local int ColorG;
    local int ColorB;
    local string strDesc1;
    local string strDesc2;
    local string strDesc3;
    
    // 보급형 아이템
    local int ItemNameClass;
    
    //셋트아이템
    //~ local array<ItemID> arrItemID;
    local int SetID;
    //~ local int SetID2;
    
    //아데나읽어주기
    local string strAdena;
    local string strAdenaComma;
    local color     AdenaColor;
    
    local ItemID tmpItemID;
    local ItemInfo    info;
    
    if (eSourceType == NTST_ITEM)
    {
        ParamToItemInfo(param, Item);
        
        eItemType = EItemType(Item.ItemType);
        eEtcItemType = EEtcItemType(Item.ItemSubType);
        
        //아이콘 표시
        if (TooltipType == "InventoryWithIcon")
        {
            StartItem();
            m_Info.eType = DIT_TEXTURE;
            m_Info.u_nTextureWidth = 32;
            m_Info.u_nTextureHeight = 32;
            m_Info.u_strTexture = Item.IconName;
            EndItem();
            
            AddTooltipItemBlank(4);
        }
        
        //아이템 이름 취득
        ItemName = class'UIDATA_ITEM'.static.GetRefineryItemName( Item.Name, Item.RefineryOp1, Item.RefineryOp2 );
        
        ItemNameClass = class'UIDATA_ITEM'.static.GetItemNameClass(Item.ID);
        
        //GetChatWindowHandle( "ChatWnd.NormalChat" ).AddStringToChatWindow("NTT_ITEM:" $ ItemNameClass, GetChatColorByType(0) );
            
        //branch
        AddPrimeItemSymbol(Item);
        //end of branch
        
        //TooltipInsertItemLine2();
        
        //인첸트 ex) "+10"
        if (TooltipType != "InventoryPrice1HideEnchant"
            && TooltipType != "InventoryPrice1HideEnchantStackable")
            AddTooltipItemEnchant(Item);
        
        //아이템 이름
        AddTooltipItemName(ItemName, Item, ItemNameClass);
        
        //Grade Mark
        AddTooltipItemGrade(Item);
        
        //아이템 갯수
        if (TooltipType != "InventoryPrice1HideEnchantStackable")
        {
            // 2009 10. 15
            // 퀘스트 보상 아이템 타입이면 아이템 개수를 표기 하지 않는다.
            if (TooltipType != "QuestReward")
            {
                AddTooltipItemCount(Item);
            }
        }
            
        //아이템이 아데나면, 읽어주기 스트링
        if (IsAdena(Item.ID))
        {
            //SimpleTooltip을 읽어주기스트링까지 보여준다.
            m_Tooltip.SimpleLineCount = 2;
            
            StartItem();
            m_Info.eType = DIT_TEXT;
            m_Info.nOffSetY = 6;
            m_Info.bLineBreak = true;
            m_Info.t_bDrawOneLine = true;
            m_Info.t_strText = "(" $ ConvertNumToText(Int64ToString(Item.ItemNum)) $ ")";
            EndItem();
        }
        
        //InventoryPrice1 타입
        if (TooltipType == "InventoryPrice1"
            || TooltipType == "InventoryPrice1HideEnchant"
            || TooltipType == "InventoryPrice1HideEnchantStackable")
        {
            strAdena = Int64ToString(Item.Price);
            strAdenaComma = MakeCostString(strAdena);
            AdenaColor = GetNumericColor(strAdenaComma);
            
            //가격 : xxx,xxx,xxx
            AddTooltipItemOption(322, strAdenaComma $ " ", true, true, false);
            SetTooltipItemColor(AdenaColor.R, AdenaColor.G, AdenaColor.B, 0);
            
            //"아데나"
            StartItem();
            m_Info.eType = DIT_TEXT;
            m_Info.nOffSetY = 6;
            m_Info.t_bDrawOneLine = true;
            m_Info.t_color = AdenaColor;
            m_Info.t_ID= 469;
            EndItem();
            
            //SimpleTooltip을 가격까지 보여준다.
            m_Tooltip.SimpleLineCount = 2;
            
            //읽어주기 스트링
            if (Item.Price>IntToInt64(0))
            {
                m_Tooltip.SimpleLineCount = 3;
                AddTooltipItemOption(0, "(" $ ConvertNumToText(strAdena) $ ")", false, true, false);
                SetTooltipItemColor(AdenaColor.R, AdenaColor.G, AdenaColor.B, 0);
            }
        }
        
        //InventoryPrice2 타입
        if (TooltipType == "InventoryPrice2"
            || TooltipType == "InventoryPrice2PrivateShop")
        {
            strAdena = Int64ToString(Item.Price);
            strAdenaComma = MakeCostString(strAdena);
            AdenaColor = GetNumericColor(strAdenaComma);
            
            //가격 : 1개당
            AddTooltipItemOption2(322, 468, true, true, false);
            SetTooltipItemColor(AdenaColor.R, AdenaColor.G, AdenaColor.B, 0);
            
            //"xxx,xxx,xxx "
            StartItem();
            m_Info.eType = DIT_TEXT;
            m_Info.nOffSetY = 6;
            m_Info.t_bDrawOneLine = true;
            m_Info.t_color = AdenaColor;
            m_Info.t_strText = " " $ strAdenaComma $ " ";
            EndItem();
            
            //"아데나"
            StartItem();
            m_Info.eType = DIT_TEXT;
            m_Info.nOffSetY = 6;
            m_Info.t_bDrawOneLine = true;
            m_Info.t_color = AdenaColor;
            m_Info.t_ID= 469;
            EndItem();
            
            //SimpleTooltip을 가격까지 보여준다.
            m_Tooltip.SimpleLineCount = 2;
            
            //읽어주기 스트링
            if (Item.Price>IntToInt64(0))
            {
                m_Tooltip.SimpleLineCount = 3;
                
                //"("
                StartItem();
                m_Info.eType = DIT_TEXT;
                m_Info.nOffSetY = 6;
                m_Info.bLineBreak = true;
                m_Info.t_bDrawOneLine = true;
                m_Info.t_color = AdenaColor;
                m_Info.t_strText = "(";
                EndItem();
                
                //"1개당"
                StartItem();
                m_Info.eType = DIT_TEXT;
                m_Info.nOffSetY = 6;
                m_Info.t_bDrawOneLine = true;
                m_Info.t_color = AdenaColor;
                m_Info.t_ID = 468;
                EndItem();
                
                StartItem();
                m_Info.eType = DIT_TEXT;
                m_Info.nOffSetY = 6;
                m_Info.t_bDrawOneLine = true;
                m_Info.t_color = AdenaColor;
                m_Info.t_strText = " " $ ConvertNumToText(strAdena) $ ")";
                EndItem();
            }
        }
        
        //InventoryPrice2PrivateShop 타입
        if (TooltipType == "InventoryPrice2PrivateShop")
        {
            if (IsStackableItem(Item.ConsumeType) && Item.Reserved64 > IntToInt64(0))
            {
                //"구매개수 : xx"
                AddTooltipItemOption(808, Int64ToString(Item.Reserved64), true, true, false);
            }
        }

        /////////////////////////////////////////////////////////////////////////////////////////
        // 아이템에 따른 각종 정보
    
        //SlotString = GetSlotTypeString(Item.ItemType, Item.SlotBitType, Item.ArmorType);
        SlotString = GetSlotTypeString2(Item.ItemType, Item.SlotBitType, Item.ArmorType);
        
        switch (eItemType)
        {
            
        // 1. WEAPON
        case ITEM_WEAPON:
            bLargeWidth = true;
            
            //Slot Type
            strTmp = GetWeaponTypeString(Item.WeaponType);
            if (Len(strTmp)>0)
            {
                AddTooltipItemOption(0, strTmp $ " / " $ SlotString, false, true, false);
            }
            
            //D Качество : 1/5     Дешовый
            addTooltipItemQuality(Item);
            
            if(DEFAULT_ATTACK != Item.PhysicalDamage)
            {
                //D Добавить пустое место.
                //AddTooltipItemBlank(12);
                TooltipInsertItemLine();

                // ################################### Физ. Характеристики ########################################
                //5092    u,<Физ. Характеристики>\0
                AddTooltipItemOption(5092, "", true, false, false);
                SetTooltipItemColor(255, 255, 255, 0);
            
                //Physical Damage
                //AddTooltipItemOption(94, String(GetPhysicalDamage(Item.WeaponType, Item.SlotBitType, Item.CrystalType, Item.Enchanted, Item.PhysicalDamage)), true, true, false);
                AddNewPhysicalDamage(Item.WeaponType, Item.SlotBitType, Item.CrystalType, Item.Enchanted, Item.PhysicalDamage);
            
                // 96    u,Физ. Точность\0
                AddTooltipItemOption(96, String((0x0000FFFF & Item.SoulshotCount)), true, true, false);
                // 113    u,Физ. Крит. Атк.\0
                AddTooltipItemOption(113, String((Item.SoulshotCount >> 16)), true, true, false);
            
                // P Attack Speed 111    u,Скор. Атк.\0
                AddTooltipItemOption(111, String((0x0000FFFF & Item.AttackSpeed)), true, true, false);
            }
            
            //SoulShot Count if (Item.SoulshotCount>0){//D 404    u,Исп. Заряд Души\0//    AddTooltipItemOption(404, "X " $ Item.SoulshotCount, true, true, false);}
            //SpiritShot Count if (Item.SpiritShotCount>0){//    AddTooltipItemOption(496, "X " $ Item.SpiritshotCount, true, true, false);}
            
            if(DEFAULT_ATTACK != Item.MagicalDamage)
            {
            
                //AddTooltipItemBlank(12);
                TooltipInsertItemLine();
            
                // ################################### Маг. Характеристики ########################################
                // 5093    u,<Маг. Характеристики>\0
                AddTooltipItemOption(5093, "", true, false, false);
                SetTooltipItemColor(255, 255, 255, 0);
            
                //Masical Damage
                //AddTooltipItemOption(98, String(GetMagicalDamage(Item.WeaponType, Item.SlotBitType, Item.CrystalType, Item.Enchanted, Item.MagicalDamage)), true, true, false);
                AddNewMagicalDamage(Item.WeaponType, Item.SlotBitType, Item.CrystalType, Item.Enchanted, Item.MagicalDamage);
            
                //5076    u,Маг. Точность\0
                AddTooltipItemOption(5076, String((0x0000FFFF & Item.SpiritShotCount)), true, true, false);
                //5078    u,Маг. Крит. Атк.\0
                AddTooltipItemOption(5078, String((Item.SpiritShotCount >> 16)), true, true, false);
            
                // M Attack Speed 112    u,Скор. Маг.\0
                AddTooltipItemOption(112, String((Item.AttackSpeed >> 16)), true, true, false);
            
                //################################################################################################
            
                //AddTooltipItemBlank(12);
            }
            
            TooltipInsertItemLine();
            
            //Weight
            if (Item.Weight==0)
            {
                AddTooltipItemOption(52, " 0 ", true, true, false);
                AddTooltipItemBlank(4);
            }
            else
            {
                AddTooltipItemOption(52, String(Item.Weight), true, true, false);
                AddTooltipItemBlank(4);
                //AddTooltipItemOption(52, String(Item.Weight), true, true, false);
            }
            
            //MP Consume
            if (Item.MpConsume != 0)
            {
                AddTooltipItemOption(320, String(Item.MpConsume), true, true, false);
            }
            
            // Уровень использования
            //.AddTooltipItemBlank(4);
            AddTooltipItemUseLevel(Item);
            //AddTooltipItemBlank(4);
            
            //제련효과
            if (Item.RefineryOp1 != 0 || Item.RefineryOp2 != 0)
            {
                //빈공간
                //AddTooltipItemBlank(12);
                TooltipInsertItemLine();
                
                // 1490    u,<Особое Свойство>\0
                AddTooltipItemOption(1490, "", true, false, false);
                SetTooltipItemColor(255, 255, 255, 0);
                
                //컬러값 취득
                if (Item.RefineryOp2 != 0)
                {
                    Quality = class'UIDATA_REFINERYOPTION'.static.GetQuality( Item.RefineryOp2 );
                    GetRefineryColor(Quality, ColorR, ColorG, ColorB);
                }
                
                if (Item.RefineryOp1 != 0)
                {
                    strDesc1 = "";
                    strDesc2 = "";
                    strDesc3 = "";
                    if (class'UIDATA_REFINERYOPTION'.static.GetOptionDescription( Item.RefineryOp1, strDesc1, strDesc2, strDesc3 ))
                    {   
                        if (Len(strDesc1)>0)
                        {
                            AddTooltipItemOption(0, strDesc1, false, true, false);
                            SetTooltipItemColor(ColorR, ColorG, ColorB, 0);
                        }
                        if (Len(strDesc2)>0)
                        {
                            AddTooltipItemOption(0, strDesc2, false, true, false);
                            SetTooltipItemColor(ColorR, ColorG, ColorB, 0);
                        }
                        if (Len(strDesc3)>0)
                        {
                            AddTooltipItemOption(0, strDesc3, false, true, false);
                            SetTooltipItemColor(ColorR, ColorG, ColorB, 0);
                        }
                    }
                }   
                
                //TooltipInsertItemLine();
                
                if (Item.RefineryOp2 != 0)
                {
                    strDesc1 = "";
                    strDesc2 = "";
                    strDesc3 = "";
                    if (class'UIDATA_REFINERYOPTION'.static.GetOptionDescription( Item.RefineryOp2, strDesc1, strDesc2, strDesc3 ))
                    {
                        if (Len(strDesc1)>0)
                        {
                            AddTooltipItemOption(0, strDesc1, false, true, false);
                            SetTooltipItemColor(ColorR, ColorG, ColorB, 0);
                            
                        }
                        if (Len(strDesc2)>0)
                        {
                            AddTooltipItemOption(0, strDesc2, false, true, false);
                            SetTooltipItemColor(ColorR, ColorG, ColorB, 0);
                        }
                        if (Len(strDesc3)>0)
                        {
                            AddTooltipItemOption(0, strDesc3, false, true, false);
                            SetTooltipItemColor(ColorR, ColorG, ColorB, 0);
                        }
                    }
                }
                
                // 1491    u,Невозможно продать/выбросить\0
                AddTooltipItemOption(1491, "", true, false, false);
                SetTooltipItemColor(ColorR, ColorG, ColorB, 0);
                
                //TooltipInsertItemLine();
                
                //빈공간
                if (Len(Item.Description)>0)
                {               
                    //AddTooltipItemBlank(12);
                    TooltipInsertItemLine();
                }
            }
        break;
        
        // 2. ARMOR
        case ITEM_ARMOR:
            bLargeWidth = true;
            
            // Sheild
            if ( Item.SlotBitType == 256 && Item.ArmorType == 4 ) // ArmorType == 4 is sigil..
            {
                if (Len(SlotString)>0)
                {
                    AddTooltipItemOption(0, SlotString, false, true, false);
                    //D Качество : 1/5     Дешовый
                    addTooltipItemQuality(Item);
                }
                if (Item.PhysicalDefense != 0)
                {
                    //AddTooltipItemOption(95, String(GetPhysicalDefense(Item.CrystalType, Item.Enchanted, Item.PhysicalDefense)), true, true, false);
                    AddNewPhysicalDefense(Item.CrystalType, Item.Enchanted, Item.PhysicalDefense);
                }
                //Avoid Modify
                if (Item.AvoidModify != 0)
                {
                    // 97    u,Физ. Уклонение\0
                    AddTooltipItemOption(97, String(Item.AvoidModify), true, true, false);
                }

                if (Item.Weight != 0)
                {
                    // 52    u,Вес\0
                    AddTooltipItemOption(52, String(Item.Weight), true, true, false);
                }
                
                AddTooltipItemUseLevel(Item);
            }
            else if (Item.SlotBitType == 256 || Item.SlotBitType == 128)    //SBT_LHAND or SBT_RHAND
            {
                if (Len(SlotString)>0)
                {
                    AddTooltipItemOption(0, SlotString, false, true, false);
                    //D Качество : 1/5     Дешовый
                    addTooltipItemQuality(Item);
                }
                //Shield Defense
                //debug("Shield Defense" $ Item.ShieldDefense);
                if (Item.ShieldDefense != 0)
                {   
                    // 95    u,Физ. Защ.\0
                    //AddTooltipItemOption(95, String(GetShieldDefense(Item.CrystalType, Item.Enchanted, Item.ShieldDefense)), true, true, false);
                    AddNewPhysicalDefense(Item.CrystalType, Item.Enchanted, Item.ShieldDefense);
                }
                
                //Shield Defense Rate
                //debug("Shield Defense Rate" $ Item.ShieldDefenseRate);
                if (Item.ShieldDefenseRate != 0)
                AddTooltipItemOption(317, String(Item.ShieldDefenseRate), true, true, false);
                
                //Avoid Modify
                //debug("Avoid Modify" $ Item.AvoidModify);
                if (Item.AvoidModify != 0)
                AddTooltipItemOption(97, String(Item.AvoidModify), true, true, false);
                
                //Weight
                //debug("Weight" $ Item.Weight);
                if (Item.Weight != 0)
                {
                    AddTooltipItemOption(52, String(Item.Weight), true, true, false);
                }
                
                AddTooltipItemUseLevel(Item);
            }
            // Magical Armor
            else if (IsMagicalArmor(Item.ID))
            {
                //Slot Type
                if (Len(SlotString)>0)
                {
                    AddTooltipItemOption(0, SlotString, false, true, false);
                    //D Качество : 1/5     Дешовый
                    addTooltipItemQuality(Item);
                }
                //MP Bonus
                AddTooltipItemOption(388, String(Item.MpBonus), true, true, false);
                
                //Physical Defense
                if (Item.SlotBitType == 65536)
                {
                    
                }
                else if (  Item.SlotBitType == 524288)
                {
                }
                else if ( Item.SlotBitType == 262144)
                {
                }
                else
                {
                    if (Item.PhysicalDefense != 0)
                    {
                        //AddTooltipItemOption(95, String(GetPhysicalDefense(Item.CrystalType, Item.Enchanted, Item.PhysicalDefense)), true, true, false);
                        AddNewPhysicalDefense(Item.CrystalType, Item.Enchanted, Item.PhysicalDefense);
                    }
                }
                    
                //Weight
                if (Item.Weight != 0)
                {
                    AddTooltipItemOption(52, String(Item.Weight), true, true, false);
                }
                    
                AddTooltipItemUseLevel(Item);
            }
            
            // Physical Armor
            else
            {
                //Slot Type
                //debug("Physical Armor1 " $ Item.SlotBitType $ Item.PhysicalDefense);
                if (Len(SlotString)>0)
                {
                    AddTooltipItemOption(0, SlotString, false, true, false);
                }
                
                //Physical Defense
                if (Item.SlotBitType == 65536)
                {
                    
                }
                else if (  Item.SlotBitType == 524288)
                {
                }
                else if ( Item.SlotBitType == 262144)
                {
                }
                else
                {
                    if (Item.PhysicalDefense != 0)
                    {
                        //D Качество : 1/5     Дешовый
                        addTooltipItemQuality(Item);
                        //AddTooltipItemOption(95, String(GetPhysicalDefense(Item.CrystalType, Item.Enchanted, Item.PhysicalDefense)), true, true, false);   
                        AddNewPhysicalDefense(Item.CrystalType, Item.Enchanted, Item.PhysicalDefense);
                    }
                }
                //Weight
                if (Item.Weight != 0)
                {
                    AddTooltipItemOption(52, String(Item.Weight), true, true, false);
                }
                
                AddTooltipItemUseLevel(Item);
            }
            //제련효과
            if (Item.RefineryOp1 != 0 || Item.RefineryOp2 != 0)
            {
                //빈공간
                AddTooltipItemBlank(12);
                
                //"[제련효과]"
                AddTooltipItemOption(1490, "", true, false, false);
                SetTooltipItemColor(255, 255, 255, 0);
                
                //컬러값 취득
                if (Item.RefineryOp2 != 0)
                {
                    Quality = class'UIDATA_REFINERYOPTION'.static.GetQuality( Item.RefineryOp2 );
                    GetRefineryColor(Quality, ColorR, ColorG, ColorB);
                }
                
                if (Item.RefineryOp1 != 0)
                {
                    strDesc1 = "";
                    strDesc2 = "";
                    strDesc3 = "";
                    if (class'UIDATA_REFINERYOPTION'.static.GetOptionDescription( Item.RefineryOp1, strDesc1, strDesc2, strDesc3 ))
                    {   
                        if (Len(strDesc1)>0)
                        {
                            AddTooltipItemOption(0, strDesc1, false, true, false);
                            SetTooltipItemColor(ColorR, ColorG, ColorB, 0);
                        }
                        if (Len(strDesc2)>0)
                        {
                            AddTooltipItemOption(0, strDesc2, false, true, false);
                            SetTooltipItemColor(ColorR, ColorG, ColorB, 0);
                        }
                        if (Len(strDesc3)>0)
                        {
                            AddTooltipItemOption(0, strDesc3, false, true, false);
                            SetTooltipItemColor(ColorR, ColorG, ColorB, 0);
                        }
                    }
                }   
                
                if (Item.RefineryOp2 != 0)
                {
                    strDesc1 = "";
                    strDesc2 = "";
                    strDesc3 = "";
                    if (class'UIDATA_REFINERYOPTION'.static.GetOptionDescription( Item.RefineryOp2, strDesc1, strDesc2, strDesc3 ))
                    {
                        if (Len(strDesc1)>0)
                        {
                            AddTooltipItemOption(0, strDesc1, false, true, false);
                            SetTooltipItemColor(ColorR, ColorG, ColorB, 0);
                            
                        }
                        if (Len(strDesc2)>0)
                        {
                            AddTooltipItemOption(0, strDesc2, false, true, false);
                            SetTooltipItemColor(ColorR, ColorG, ColorB, 0);
                        }
                        if (Len(strDesc3)>0)
                        {
                            AddTooltipItemOption(0, strDesc3, false, true, false);
                            SetTooltipItemColor(ColorR, ColorG, ColorB, 0);
                        }
                    }
                }
                //빈공간
                AddTooltipItemBlank(12);

            }
            
        break;
        
        // 3. ACCESSARY
        case ITEM_ACCESSARY:
            bLargeWidth = true;
            
            //Slot Type
            if (Len(SlotString)>0)
                AddTooltipItemOption(0, SlotString, false, true, false);
            
            //D Качество : 1/5     Дешовый
            addTooltipItemQuality(Item);
            
            //Magical Defense
            // 탈리스만은 아이템 마방을 보여주지 않는다.
            // 왼팔찌 오른팔찌도 마방을 보여주지 않는다.
            if ((Item.SlotBitType != 4194304 ) && (Item.SlotBitType != 1048576 ) && (Item.SlotBitType != 2097152 ))
            {
                if((Item.SlotBitType == 6)||(Item.SlotBitType == 8)||(Item.SlotBitType == 48))
                {
                    AddNewMagicalDefense(Item.CrystalType, Item.Enchanted, Item.MagicalDefense);
                }
                else
                {
                    AddTooltipItemOption(99, String(GetMagicalDefense(Item.CrystalType, Item.Enchanted, Item.MagicalDefense)), true, true, false);
                }
            
            //    Debug2("ITEM_ACCESSARY: " $ Item.SlotBitType);
            }
                
            
            if (Item.Weight == 0)
            {
                AddTooltipItemOption(52, " 0 ", true, true, false);
            }
            else
            {
                AddTooltipItemOption(52, String(Item.Weight), true, true, false);
            }
            
            AddTooltipItemUseLevel(Item);
            
            //debug ("Refinery Result Accessotires" @ Item.RefineryOp1);
            //제련효과
            if (Item.RefineryOp1 != 0 || Item.RefineryOp2 != 0)
            {
                //빈공간
                AddTooltipItemBlank(12);
                
                //"[제련효과]"
                AddTooltipItemOption(1490, "", true, false, false);
                SetTooltipItemColor(255, 255, 255, 0);
                
                //컬러값 취득
                if (Item.RefineryOp2 != 0)
                {
                    Quality = class'UIDATA_REFINERYOPTION'.static.GetQuality( Item.RefineryOp2 );
                    GetRefineryColor(Quality, ColorR, ColorG, ColorB);
                }
                
                if (Item.RefineryOp1 != 0)
                {
                    strDesc1 = "";
                    strDesc2 = "";
                    strDesc3 = "";
                    if (class'UIDATA_REFINERYOPTION'.static.GetOptionDescription( Item.RefineryOp1, strDesc1, strDesc2, strDesc3 ))
                    {   
                        if (Len(strDesc1)>0)
                        {
                            AddTooltipItemOption(0, strDesc1, false, true, false);
                            SetTooltipItemColor(ColorR, ColorG, ColorB, 0);
                        }
                        if (Len(strDesc2)>0)
                        {
                            AddTooltipItemOption(0, strDesc2, false, true, false);
                            SetTooltipItemColor(ColorR, ColorG, ColorB, 0);
                        }
                        if (Len(strDesc3)>0)
                        {
                            AddTooltipItemOption(0, strDesc3, false, true, false);
                            SetTooltipItemColor(ColorR, ColorG, ColorB, 0);
                        }
                    }
                }   
                
                if (Item.RefineryOp2 != 0)
                {
                    strDesc1 = "";
                    strDesc2 = "";
                    strDesc3 = "";
                    if (class'UIDATA_REFINERYOPTION'.static.GetOptionDescription( Item.RefineryOp2, strDesc1, strDesc2, strDesc3 ))
                    {
                        if (Len(strDesc1)>0)
                        {
                            AddTooltipItemOption(0, strDesc1, false, true, false);
                            SetTooltipItemColor(ColorR, ColorG, ColorB, 0);
                            
                        }
                        if (Len(strDesc2)>0)
                        {
                            AddTooltipItemOption(0, strDesc2, false, true, false);
                            SetTooltipItemColor(ColorR, ColorG, ColorB, 0);
                        }
                        if (Len(strDesc3)>0)
                        {
                            AddTooltipItemOption(0, strDesc3, false, true, false);
                            SetTooltipItemColor(ColorR, ColorG, ColorB, 0);
                        }
                    }
                }
                //빈공간
                AddTooltipItemBlank(12);
            }
            
            
                
        break;
        
        // 4. QUEST
        case ITEM_QUESTITEM:
            bLargeWidth = true;
            
            //Slot Type
            if (Len(SlotString)>0)
                AddTooltipItemOption(0, SlotString, false, true, false);
        break;
        
        // 5. ETC
        case ITEM_ETCITEM:
            bLargeWidth = true;
            
            if (eEtcItemType == ITEME_PET_COLLAR)
            {
                //Pet Name
                if (Item.Damaged == 0)
                    nTmp = 971;
                else
                    nTmp = 970;
                AddTooltipItemOption2(969, nTmp, true, true, false);
                
                //Pet Level
                AddTooltipItemOption(88, String(Item.Enchanted), true, true, false);
            }
            else if (eEtcItemType == ITEME_TICKET_OF_LORD)
            {
                AddTooltipItemOption(972, String(Item.Enchanted), true, true, false);
            }
            else if (eEtcItemType == ITEME_LOTTO)
            {
                // 복권에서는 bless가 회차, 몬스터레이스에서는 Enchant가 회차입니다. 주의하세요! - lancelot 2008. 11. 11.
                // 회차
                AddTooltipItemOption(670, String(Item.Blessed), true, true, false);
                
                // 선택번호
                AddTooltipItemOption(671, GetLottoString(Item.Enchanted, Item.Damaged), true, true, false);
            }
            else if (eEtcItemType == ITEME_RACE_TICKET)
            {
                // 회차
                AddTooltipItemOption(670, String(Item.Enchanted), true, true, false);
                
                // 선택번호
                AddTooltipItemOption(671, GetRaceTicketString(Item.Blessed), true, true, false);
                
                //Money
                AddTooltipItemOption(744, String(Item.Damaged*100), true, true, false);
            }
            //Weight
            //~ if (Item.Price!=0)
            if (Item.Weight==0)
                AddTooltipItemOption(52, " 0 ", true, true, false);
            else
                AddTooltipItemOption(52, String(Item.Weight), true, true, false);
        break;
        
        }
        /////////////////////////////////////////////////////////////////////////////////////////
        /////////////////////////////////////////////////////////////////////////////////////////
        
        // [칠월칠석, 방어구 각인] item enchant option - by jin 09/08/05
        if (Item.EnchantOption1 != 0 || Item.EnchantOption2 != 0 || Item.EnchantOption3 != 0)
        {
            //빈공간
            AddTooltipItemBlank(12);
            //TooltipInsertItemLine();
            
            // 2214    u,<Эффект Модификации>\0
            AddTooltipItemOption(2214, "", true, false, false);
            SetTooltipItemColor(255, 255, 255, 0);
            
            //컬러값 취득
            if (Item.EnchantOption1 != 0)
            {
                // [칠월칠석, 방어구각인] 각인 효과는 일단 무조건 1번 색상을 사용. - by jin 09/08/06
                GetRefineryColor(1, ColorR, ColorG, ColorB);
            }
            
            if (Item.EnchantOption1 != 0)
            {
                strDesc1 = "";
                strDesc2 = "";
                strDesc3 = "";
                if (class'UIDATA_REFINERYOPTION'.static.GetOptionDescription( Item.EnchantOption1, strDesc1, strDesc2, strDesc3 ))
                {   
                    if (Len(strDesc1)>0)
                    {
                        AddTooltipItemOption(0, strDesc1, false, true, false);
                        SetTooltipItemColor(ColorR, ColorG, ColorB, 0);
                    }
                    if (Len(strDesc2)>0)
                    {
                        AddTooltipItemOption(0, strDesc2, false, true, false);
                        SetTooltipItemColor(ColorR, ColorG, ColorB, 0);
                    }
                    if (Len(strDesc3)>0)
                    {
                        AddTooltipItemOption(0, strDesc3, false, true, false);
                        SetTooltipItemColor(ColorR, ColorG, ColorB, 0);
                    }
                }
            }   
            
            if (Item.EnchantOption2 != 0)
            {
                strDesc1 = "";
                strDesc2 = "";
                strDesc3 = "";
                if (class'UIDATA_REFINERYOPTION'.static.GetOptionDescription( Item.EnchantOption2, strDesc1, strDesc2, strDesc3 ))
                {
                    if (Len(strDesc1)>0)
                    {
                        AddTooltipItemOption(0, strDesc1, false, true, false);
                        SetTooltipItemColor(ColorR, ColorG, ColorB, 0);
                        
                    }
                    if (Len(strDesc2)>0)
                    {
                        AddTooltipItemOption(0, strDesc2, false, true, false);
                        SetTooltipItemColor(ColorR, ColorG, ColorB, 0);
                    }
                    if (Len(strDesc3)>0)
                    {
                        AddTooltipItemOption(0, strDesc3, false, true, false);
                        SetTooltipItemColor(ColorR, ColorG, ColorB, 0);
                    }
                }
            }

            if (Item.EnchantOption3 != 0)
            {
                strDesc1 = "";
                strDesc2 = "";
                strDesc3 = "";
                if (class'UIDATA_REFINERYOPTION'.static.GetOptionDescription( Item.EnchantOption3, strDesc1, strDesc2, strDesc3 ))
                {
                    if (Len(strDesc1)>0)
                    {
                        AddTooltipItemOption(0, strDesc1, false, true, false);
                        SetTooltipItemColor(ColorR, ColorG, ColorB, 0);
                        
                    }
                    if (Len(strDesc2)>0)
                    {
                        AddTooltipItemOption(0, strDesc2, false, true, false);
                        SetTooltipItemColor(ColorR, ColorG, ColorB, 0);
                    }
                    if (Len(strDesc3)>0)
                    {
                        AddTooltipItemOption(0, strDesc3, false, true, false);
                        SetTooltipItemColor(ColorR, ColorG, ColorB, 0);
                    }
                }
            }

            //빈공간
            AddTooltipItemBlank(12);
            //TooltipInsertItemLine();
        }
        
        //내구도 아이템
        if (Item.CurrentDurability >= 0 && Item.Durability > 0)
        {
            bLargeWidth = true;
            
            //빈공간
            AddTooltipItemBlank(12);
            
            //<투영 병기 정보>
            AddTooltipItemOption(1492, "", true, false, false);
            SetTooltipItemColor(255, 255, 255, 0);
            
            //사용가능 시간
            StartItem();
            m_Info.eType = DIT_TEXT;
            m_Info.nOffSetY = 6;
            m_Info.bLineBreak = true;
            m_Info.t_bDrawOneLine = true;
            m_Info.t_color.R = 163;
            m_Info.t_color.G = 163;
            m_Info.t_color.B = 163;
            m_Info.t_color.A = 255;
            m_Info.t_ID = 1493;
            EndItem();
            
            StartItem();
            m_Info.eType = DIT_TEXT;
            m_Info.nOffSetY = 6;
            m_Info.t_bDrawOneLine = true;
            if (Item.CurrentDurability+1 <= 5)
            {
                m_Info.t_color.R = 255;
                m_Info.t_color.G = 0;
                m_Info.t_color.B = 0;
            }
            else
            {
                m_Info.t_color.R = 176;
                m_Info.t_color.G = 155;
                m_Info.t_color.B = 121;
            }
            m_Info.t_color.A = 255;
            m_Info.t_strText = " " $ Item.CurrentDurability $ "/" $ Item.Durability;
            EndItem();
            
            //"교환/드롭 불가"
            AddTooltipItemOption(1491, "", true, false, false);
            
            //빈공간
            if (Len(Item.Description)>0)
            {
                AddTooltipItemBlank(12);
            }
        }
        
        //branch
        //에너지 정보
        if (Item.BR_MaxEnergy > 0)
        {
            //bLargeWidth = true;
            
            //빈공간
            AddTooltipItemBlank(12);
            //<에너지 정보>
            AddTooltipItemOption(5065, "", true, false, false);
            SetTooltipItemColor(255, 255, 255, 0);

            StartItem();
            m_Info.eType = DIT_TEXT;
            m_Info.nOffSetY = 6;
            m_Info.bLineBreak = true;
            m_Info.t_bDrawOneLine = true;
            m_Info.t_color.R = 163;
            m_Info.t_color.G = 163;
            m_Info.t_color.B = 163;
            m_Info.t_color.A = 255;
            m_Info.t_ID = 5066;
            EndItem();
                        
            StartItem();
            m_Info.eType = DIT_TEXT;
            m_Info.t_bDrawOneLine = true;
            m_Info.bLineBreak = true;
            if ( Item.BR_CurrentEnergy==0 || (Item.BR_MaxEnergy / Item.BR_CurrentEnergy > 10) )
            {
                m_Info.t_color.R = 255;
                m_Info.t_color.G = 0;
                m_Info.t_color.B = 0;
            }
            else
            {
                m_Info.t_color.R = 176;
                m_Info.t_color.G = 155;
                m_Info.t_color.B = 121;
            }
            m_Info.t_color.A = 255;
            //m_Info.t_strText = "  " $ Item.BR_CurrentEnergy $ "/" $ Item.BR_MaxEnergy;
            m_Info.t_strText = " " ;
            ParamAdd(m_Info.Condition, "Type", "CurrentEnergy");
            EndItem();
        }
        //end of branch
        

        //설명
        if (Len(Item.Description)>0)
        {
            bLargeWidth = true;
            
            StartItem();
            m_Info.eType = DIT_TEXT;
            m_Info.nOffSetY = 6;
            m_Info.bLineBreak = true;
            m_Info.t_color.R = 178;
            m_Info.t_color.G = 190;
            m_Info.t_color.B = 207;
            m_Info.t_color.A = 255;
            m_Info.t_strText = Item.Description;
            EndItem();
        }
        
        //TooltipInsertItemLine();
        
        /////////////////////////////////////////////////////////////////////////////////////////
        // 셋트 아이템 정보
        if (IsValidItemID(Item.ID))
        {
            
            for (idx=0; idx<TOOLTIP_SETITEM_MAX; idx++)
            {
                //셋트아이템 리스트
                
                for (SetID=0; SetID<class'UIDATA_ITEM'.static.GetSetItemNum(Item.ID, idx); SetID++) //0,1,2번 세트아이템효과 에 대해서 각각 몇가지의 세트가 완비되야하나..
                {                     
                    bLargeWidth = true;
                    if (!class'UIDATA_ITEM'.static.IsExistSetItem(Item.ID, idx, SetID))
                    {                   
                        tmpItemID.classID = class'UIDATA_ITEM'.static.GetSetItemFirstID(Item.ID, idx, SetID);
                
                        if (tmpItemID.classID > 0)
                        {

                            StartItem();
                            m_Info.eType = DIT_TEXT;
                            m_Info.nOffSetY = 2;
                            m_Info.bLineBreak = true;
                            m_Info.t_bDrawOneLine = true;
                            EndItem();
                            
                            class'UIDATA_ITEM'.static.GetItemInfo(tmpItemID, info );
                            
                            addItemIconSmallType(info,"");

                            strTmp = class'UIDATA_ITEM'.static.GetItemName(tmpItemID);
                            StartItem();
                            m_Info.eType = DIT_TEXT;
                            m_Info.nOffSetX = 4;
                            m_Info.nOffSetY = 4;
                            //m_Info.bLineBreak = true;
                            m_Info.t_bDrawOneLine = true;
                            m_Info.t_color.R = 112;
                            m_Info.t_color.G = 115;
                            m_Info.t_color.B = 123;
                            m_Info.t_color.A = 255;
                            m_Info.t_strText = strTmp;
                            ParamAdd(m_info.Condition, "SetItemNum", string(idx));
                            ParamAdd(m_Info.Condition, "Type", "Equip");
                            ParamAddItemID(m_Info.Condition, Item.ID);                       
                            ParamAdd(m_Info.Condition, "CurTypeID", string(SetID));        //비교할 아이템의 Type 예(0번:흉갑 1번:각반 2번:헬멧 3번:팔 4번 다리 ..ItemName.txt에 들어있는순서
                            ParamAdd(m_Info.Condition, "NormalColor", "112,115,123");
                            ParamAdd(m_Info.Condition, "EnableColor", "176,185,205");
                            EndItem();
                        }
                    }else
                    {
                        TooltipInsertItemLine();
                        AddTooltipItemOption(5098, "", true, false, false);
                        AddTooltipItemBlank(4);
                    }
                }           
        
                //셋트효과
                strTmp = class'UIDATA_ITEM'.static.GetSetItemEffectDescription(Item.ID, idx);
                if (Len(strTmp)>0)
                {
                    bLargeWidth = true;
                    
                    // оставить - полоска перед  описание бонусов сета
                    TooltipInsertItemLine();
                    
                    StartItem();
                    m_Info.eType = DIT_TEXT;
                    m_Info.nOffSetY = 6;
                    m_Info.bLineBreak = true;
                    m_Info.t_color.R = 128;
                    m_Info.t_color.G = 127;
                    m_Info.t_color.B = 103;
                    m_Info.t_color.A = 255;
                    m_Info.t_strText = strTmp;
                    ParamAdd(m_Info.Condition, "Type", "SetEffect");
                    ParamAddItemID(m_Info.Condition, Item.ID);
                    ParamAdd(m_Info.Condition, "EffectID", String(idx));
                    ParamAdd(m_Info.Condition, "NormalColor", "128,127,103");
                    ParamAdd(m_Info.Condition, "EnableColor", "183,178,122");
                    EndItem();   
                }
            }
            //인첸트 셋트효과
            strTmp = class'UIDATA_ITEM'.static.GetSetItemEnchantEffectDescription(Item.ID);
            if (Len(strTmp)>0)
            {
                bLargeWidth = true;
                
                StartItem();
                m_Info.eType = DIT_TEXT;
                m_Info.nOffSetY = 6;
                m_Info.bLineBreak = true;
                m_Info.t_color.R = 74;
                m_Info.t_color.G = 92;
                m_Info.t_color.B = 104;
                m_Info.t_color.A = 255;
                m_Info.t_strText = strTmp;
                ParamAdd(m_Info.Condition, "Type", "EnchantEffect");
                ParamAddItemID(m_Info.Condition, Item.ID);
                ParamAdd(m_Info.Condition, "NormalColor", "74,92,104");
                ParamAdd(m_Info.Condition, "EnableColor", "111,146,169");
                EndItem();
            }
        }
        
        //퀘스트 정보를 표시한다.
        AddTooltipItemQuestList(Item);
        
        // 속성 게이지를 그려준다.
        AddTooltipItemAttributeGage(Item);
        
        // 기간제 아이템
        if ( Item.CurrentPeriod > 0)
        {
            //빈공간
            AddTooltipItemBlank(12);
            
            //<기간제 아이템>
            AddTooltipItemOption(1739, "", true, false, false);
            SetTooltipItemColor(255, 255, 255, 0);
            
            StartItem();
            m_Info.eType = DIT_TEXT;
            m_Info.nOffSetY = 6;
            m_Info.bLineBreak = true;
            m_Info.t_bDrawOneLine = true;
            m_Info.t_color.R = 163;
            m_Info.t_color.G = 163;
            m_Info.t_color.B = 163;
            m_Info.t_color.A = 255;
            m_Info.t_ID = 1199;
            EndItem();
            
            StartItem();
            m_Info.eType = DIT_TEXT;
            m_Info.nOffSetY = 6;
            m_Info.t_bDrawOneLine = true;
            m_Info.t_color.R = 163;
            m_Info.t_color.G = 163;
            m_Info.t_color.B = 163;
            m_Info.t_color.A = 255;
            m_Info.t_strText = " : ";
            EndItem();
            
            StartItem();
            m_Info.eType = DIT_TEXT;
            m_Info.nOffSetY = 6;
            m_Info.bLineBreak = true;
            m_Info.t_color.R = 178;
            m_Info.t_color.G = 190;
            m_Info.t_color.B = 207;
            m_Info.t_color.A = 255;
            m_Info.t_strText = "" $ MakeTimeStr(Item.CurrentPeriod);
            ParamAdd(m_Info.Condition, "Type", "PeriodTime");
            EndItem();
        }
    }
    else
    {
        return;
    }
    
    if (bLargeWidth)
        m_Tooltip.MinimumWidth = TOOLTIP_MINIMUM_WIDTH;

    if(TooltipType == "InventoryPawnViewer")                // PawnViewer용 추가 - lancelot 2007. 10. 16.
    {
        StartItem();
        m_Info.eType = DIT_TEXT;
        m_Info.nOffSetY = 6;
        m_Info.t_bDrawOneLine = true;
        m_Info.bLineBreak = true;
        m_Info.t_strText ="ID : "$string(Item.Id.classID);
        EndItem();
    }

    ReturnTooltipInfo(m_Tooltip);
}

function addItemIconSmallType (ItemInfo item, string ForeTexture)
{
  StartItem();
  m_Info.eType = DIT_TEXTURE;
  m_Info.u_nTextureWidth = 16;
  m_Info.u_nTextureHeight = 16;
  m_Info.u_nTextureUWidth = 32;
  m_Info.u_nTextureUHeight = 32;
  m_Info.nOffSetX = 4;
  m_Info.nOffSetY = 2;
  m_Info.u_strTexture = item.IconName;
  EndItem();
  StartItem();
  m_Info.eType = DIT_TEXTURE;
  m_Info.u_nTextureWidth = 16;
  m_Info.u_nTextureHeight = 16;
  m_Info.u_nTextureUWidth = 32;
  m_Info.u_nTextureUHeight = 32;
  m_Info.nOffSetX = -16;
  m_Info.nOffSetY = 2;
  m_Info.u_strTexture = item.IconPanel;
  EndItem();
  if ( ForeTexture != "" )
  {
    StartItem();
    m_Info.eType = DIT_TEXTURE;
    m_Info.u_nTextureWidth = 14;
    m_Info.u_nTextureHeight = 14;
    m_Info.u_nTextureUWidth = 32;
    m_Info.u_nTextureUHeight = 32;
    m_Info.nOffSetX = -20;
    m_Info.nOffSetY = 2;
    m_Info.u_strTexture = ForeTexture;
    EndItem();
  }
}

function string GetSlotTypeString2(int ItemType, int SlotBitType, int ArmorType )
{
    local string SlotString;
    
    // SlotString = GetSlotTypeString(ItemType, SlotBitType, ArmorType );
    // Debug2("SlotString:" $ SlotString $" ItemType:" $ string(ItemType) $ "  SlotBitType:" $ string(SlotBitType) $ "  ArmorType:" $ string(ArmorType));
    
    if(( ArmorType== 1 || ArmorType == 2 || ArmorType == 3 ) && ( SlotBitType == 1024 || SlotBitType == 2048 || SlotBitType == 32768 || SlotBitType == 512 || SlotBitType == 4096 ))
    {
        switch(SlotBitType)
        {
            case 1024:
                SlotString = GetSystemString(235); // 235 Верх. доспех
            break;
            case 2048:
                SlotString = GetSystemString(236); // 236 Ниж. доспех
            break;
            case 32768:
                SlotString = GetSystemString(542); // 542 Ниж. и верх. доспехи
            break;
            
            case 512:
                SlotString = GetSystemString(232); // 232 Перчатки
            break;
            case 4096:
                SlotString = GetSystemString(233); // 233 Сапоги
            break;
        }

        switch(ArmorType)
        {
            case 1:
                SlotString = SlotString $ " / " $ GetSystemString(245); // 245 Легкий
            break;
            case 2:
                SlotString = SlotString $ " / " $ GetSystemString(246); // 246 Тяжелый
            break;
            case 3:
                SlotString = SlotString $ " / " $ GetSystemString(244); // 244 Роба
            break;
        }
        
        return SlotString;
    }
    
    return GetSlotTypeString(ItemType, SlotBitType, ArmorType );
}

/////////////////////////////////////////////////////////////////////////////////
// ACTION
function ReturnTooltip_NTT_ACTION(string param, ETooltipSourceType eSourceType)
{
    local ItemInfo Item;
    
    if (eSourceType == NTST_ITEM)
    {
        ParseString( param, "Name", Item.Name);
        ParseString( param, "Description", Item.Description);
        
        //액션 이름
        StartItem();
        m_Info.eType = DIT_TEXT;
        m_Info.t_bDrawOneLine = true;
        m_Info.t_strText = Item.Name;
        EndItem();
        
        //액션 설명
        if (Len(Item.Description)>0)
        {
            m_Tooltip.MinimumWidth = TOOLTIP_MINIMUM_WIDTH;
            
            StartItem();
            m_Info.eType = DIT_TEXT;
            m_Info.nOffSetY = 6;
            m_Info.t_bDrawOneLine = false;
            m_Info.bLineBreak = true;
            m_Info.t_color.R = 178;
            m_Info.t_color.G = 190;
            m_Info.t_color.B = 207;
            m_Info.t_color.A = 255;
            m_Info.t_strText = Item.Description;
            EndItem();
        }       
    }
    else
    {
        return;
    }
        
    ReturnTooltipInfo(m_Tooltip);
}

/////////////////////////////////////////////////////////////////////////////////
// SKILL
function ReturnTooltip_NTT_SKILL(string param, ETooltipSourceType eSourceType)
{
    
    local ItemInfo Item;
    
    local EItemParamType eItemParamType;
    local EShortCutItemType eShortCutType;
    local int nTmp;
    local int hitTime;
    local int reuseDelay;
    local int SkillLevel;
    
    
    //Debug2(param);
    if (eSourceType == NTST_ITEM)
    {
        ParseItemID( param, Item.ID );
        ParseString( param, "Name", Item.Name);
        ParseString( param, "AdditionalName", Item.AdditionalName);
        ParseString( param, "Description", Item.Description);
        ParseInt( param, "Level", Item.Level);
        
        eShortCutType = EShortCutItemType(Item.ItemSubType);
        eItemParamType = EItemParamType(Item.ItemType);
        SkillLevel = Item.Level;
        
        m_Tooltip.MinimumWidth = TOOLTIP_MINIMUM_WIDTH;
        
        //아이템 이름
        StartItem();
        m_Info.eType = DIT_TEXT;
        m_Info.t_bDrawOneLine = true;
        m_Info.t_strText = Item.Name;
        EndItem();
        
        // 인챈트시 변환된 레벨을 원래 레벨로 변환시켜준다.
        if (Len(Item.AdditionalName)>0)
        {           
            SkillLevel = class'UIDATA_SKILL'.static.GetEnchantSkillLevel( Item.ID, Item.Level );
        }
        
        //ex) " Lv "
        StartItem();
        m_Info.eType = DIT_TEXT;
        m_Info.t_bDrawOneLine = true;
        m_Info.t_strText = " ";
        EndItem();
        
        StartItem();
        m_Info.eType = DIT_TEXT;
        m_Info.t_bDrawOneLine = true;
        m_Info.t_color.R = 163;
        m_Info.t_color.G = 163;
        m_Info.t_color.B = 163;
        m_Info.t_color.A = 255;
        m_Info.t_ID = 88;
        EndItem();
        
        //스킬 레빌
        StartItem();
        m_Info.eType = DIT_TEXT;
        m_Info.t_bDrawOneLine = true;
        m_Info.t_color.R = 176;
        m_Info.t_color.G = 155;
        m_Info.t_color.B = 121;
        m_Info.t_color.A = 255;
        m_Info.t_strText = " " $ SkillLevel;
        EndItem();
        
        // 인챈트 내용을 뿌려주는 곳은 이곳
        if (Len(Item.AdditionalName)>0)
        {
            StartItem();
            m_Info.eType = DIT_TEXT;
            m_Info.nOffSetX = 5;
            m_Info.t_bDrawOneLine = true;
            m_Info.t_color.R = 255;
            m_Info.t_color.G = 217;
            m_Info.t_color.B = 105;
            m_Info.t_color.A = 255;
            m_Info.t_strText = Item.AdditionalName;
            EndItem();
        }
        
        //Operate Type
        StartItem();
        m_Info.eType = DIT_TEXT;
        m_Info.nOffSetY = 6;
        m_Info.bLineBreak = true;
        m_Info.t_bDrawOneLine = true;
        m_Info.t_color.R = 176;
        m_Info.t_color.G = 155;
        m_Info.t_color.B = 121;
        m_Info.t_color.A = 255;
        m_Info.t_strText = class'UIDATA_SKILL'.static.GetOperateType( Item.ID, Item.Level );
        EndItem();

        nTmp = class'UIDATA_SKILL'.static.GetHpConsume( Item.ID, Item.Level );
        if (nTmp>0)
        {
            // 1195    u,Затрата HP\0 AddTooltipItemOption(1195, String(nTmp), true, true, false);
            
            // 5095    u,Время применения\0 milliseconds'
            hitTime = ( 0x0000FFFF & nTmp );
            if( hitTime > 0 ) {
                AddTooltipItemOption(5095, MakeTimeStringsFloat((hitTime * 100)/1000), true, true, false);
            }
            
            // 5096    u,Время перезарядки\0 second
            reuseDelay = ( nTmp >> 16 );
            if( reuseDelay > 0 ) {
                AddTooltipItemOption(5096, MakeTimeStringSecond(reuseDelay), true, true, false);
            }
        }

        nTmp = class'UIDATA_SKILL'.static.GetMpConsume( Item.ID, Item.Level );
        if (nTmp>0)
        {
            // 320    a,MP\0
            AddTooltipItemOption(320, String(nTmp), true, true, false);
        }

        nTmp = class'UIDATA_SKILL'.static.GetCastRange( Item.ID, Item.Level );
        if (nTmp>=0)
        {
            // 321    u,Радиус\0
            AddTooltipItemOption(321, String(nTmp), true, true, false);
        }
        
        //설명
        if (Len(Item.Description)>0)
        {
            StartItem();
            m_Info.eType = DIT_TEXT;
            m_Info.nOffSetY = 6;
            m_Info.bLineBreak = true;
            m_Info.t_color.R = 178;
            m_Info.t_color.G = 190;
            m_Info.t_color.B = 207;
            m_Info.t_color.A = 255;
            m_Info.t_strText = Item.Description;
            EndItem();   
        }       
    }
    else
    {
        return;
    }
        
    ReturnTooltipInfo(m_Tooltip);
}

/////////////////////////////////////////////////////////////////////////////////
// ABNORMALSTATUS
function ReturnTooltip_NTT_ABNORMALSTATUS(string param, ETooltipSourceType eSourceType)
{
    local ItemInfo Item;
    local int ShowLevel;
    
    local EItemParamType eItemParamType;
    local EShortCutItemType eShortCutType;
    
    if (eSourceType == NTST_ITEM)
    {
        ParseItemID( param, Item.ID );
        ParseString( param, "Name", Item.Name);
        ParseString( param, "AdditionalName", Item.AdditionalName);
        ParseString( param, "Description", Item.Description);
        ParseInt( param, "Level", Item.Level);
        ParseInt( param, "Reserved", Item.Reserved);
        
        eShortCutType = EShortCutItemType(Item.ItemSubType);
        eItemParamType = EItemParamType(Item.ItemType);
        
        m_Tooltip.MinimumWidth = TOOLTIP_MINIMUM_WIDTH;
        
        //아이템 이름
        StartItem();
        m_Info.eType = DIT_TEXT;
        m_Info.t_bDrawOneLine = true;
        m_Info.t_strText = Item.Name;
        EndItem();
        
        ShowLevel = Item.Level;
        if (Len(Item.AdditionalName)>0)
        {
            StartItem();
            m_Info.eType = DIT_TEXT;
            m_Info.nOffSetX = 5;
            m_Info.t_bDrawOneLine = true;
            m_Info.t_color.R = 255;
            m_Info.t_color.G = 217;
            m_Info.t_color.B = 105;
            m_Info.t_color.A = 255;
            m_Info.t_strText = Item.AdditionalName;
            EndItem();
            
            ShowLevel = class'UIDATA_SKILL'.static.GetEnchantSkillLevel( Item.ID, Item.Level );
        }
        
        //ex) " Lv "
        StartItem();
        m_Info.eType = DIT_TEXT;
        m_Info.t_bDrawOneLine = true;
        m_Info.t_strText = " ";
        EndItem();
        
        StartItem();
        m_Info.eType = DIT_TEXT;
        m_Info.t_bDrawOneLine = true;
        m_Info.t_color.R = 163;
        m_Info.t_color.G = 163;
        m_Info.t_color.B = 163;
        m_Info.t_color.A = 255;
        m_Info.t_ID = 88;
        EndItem();
        
        //스킬 레벨
        StartItem();
        m_Info.eType = DIT_TEXT;
        m_Info.t_bDrawOneLine = true;
        m_Info.t_color.R = 176;
        m_Info.t_color.G = 155;
        m_Info.t_color.B = 121;
        m_Info.t_color.A = 255;
        m_Info.t_strText = " " $ ShowLevel;
        EndItem();
        
        //남은시간
        if (!IsDeBuff(Item.ID, Item.Level) && Item.Reserved>=0)
        {
            StartItem();
            m_Info.eType = DIT_TEXT;
            m_Info.nOffSetY = 6;
            m_Info.bLineBreak = true;
            m_Info.t_bDrawOneLine = true;
            m_Info.t_color.R = 163;
            m_Info.t_color.G = 163;
            m_Info.t_color.B = 163;
            m_Info.t_color.A = 255;
            m_Info.t_ID = 1199;
            EndItem();
            
            StartItem();
            m_Info.eType = DIT_TEXT;
            m_Info.nOffSetY = 6;
            m_Info.t_bDrawOneLine = true;
            m_Info.t_color.R = 163;
            m_Info.t_color.G = 163;
            m_Info.t_color.B = 163;
            m_Info.t_color.A = 255;
            m_Info.t_strText = " : ";
            EndItem();
            
            StartItem();
            m_Info.eType = DIT_TEXT;
            m_Info.nOffSetY = 6;
            m_Info.t_bDrawOneLine = true;
            m_Info.t_color.R = 176;
            m_Info.t_color.G = 155;
            m_Info.t_color.B = 121;
            m_Info.t_color.A = 255;
            m_Info.t_strText = MakeBuffTimeStr(Item.Reserved);
            ParamAdd(m_Info.Condition, "Type", "RemainTime");
            EndItem();
        }
        
        //설명
        if (Len(Item.Description)>0)
        {
            StartItem();
            m_Info.eType = DIT_TEXT;
            m_Info.nOffSetY = 6;
            m_Info.bLineBreak = true;
            m_Info.t_color.R = 178;
            m_Info.t_color.G = 190;
            m_Info.t_color.B = 207;
            m_Info.t_color.A = 255;
            m_Info.t_strText = Item.Description;
            EndItem();   
        }       
    }
    else
    {
        return;
    }
        
    ReturnTooltipInfo(m_Tooltip);
}

/////////////////////////////////////////////////////////////////////////////////
// NORMALITEM
function ReturnTooltip_NTT_NORMALITEM(string param, ETooltipSourceType eSourceType)
{
    local ItemInfo Item;
    
    if (eSourceType == NTST_ITEM)
    {
        ParseString( param, "Name", Item.Name);
        ParseString( param, "Description", Item.Description);
        ParseString( param, "AdditionalName", Item.AdditionalName);
        ParseInt( param, "CrystalType", Item.CrystalType);
        
        // Цвет Название предметов
        AddTooltipItemName(Item.Name, Item, 1);
        
        //Grade Mark
        AddTooltipItemGrade(Item);
        
        //설명
        if (Len(Item.Description)>0)
        {
            m_Tooltip.MinimumWidth = TOOLTIP_MINIMUM_WIDTH;
            
            StartItem();
            m_Info.eType = DIT_TEXT;
            m_Info.nOffSetY = 6;
            m_Info.bLineBreak = true;
            m_Info.t_color.R = 178;
            m_Info.t_color.G = 190;
            m_Info.t_color.B = 207;
            m_Info.t_color.A = 255;
            m_Info.t_strText = Item.Description;
            EndItem();   
        }       
    }
    else
    {
        return;
    }
        
    ReturnTooltipInfo(m_Tooltip);
}

/////////////////////////////////////////////////////////////////////////////////
// RECIPE
function ReturnTooltip_NTT_RECIPE(string param, ETooltipSourceType eSourceType, bool bShowPrice)
{
    local ItemInfo Item;
    
    local string strAdena;
    local string strAdenaComma;
    local color     AdenaColor;
    
    local int ItemNameClass;


    if (eSourceType == NTST_ITEM)
    {
        ParseItemID(param, Item.ID);
        ParseString( param, "Name", Item.Name);
        ParseString( param, "Description", Item.Description);
        ParseString( param, "AdditionalName", Item.AdditionalName);
        ParseInt( param, "CrystalType", Item.CrystalType);
        ParseInt( param, "Weight", Item.Weight);
        ParseINT64( param, "Price", Item.Price);
        
        ItemNameClass = class'UIDATA_ITEM'.static.GetItemNameClass(Item.ID);
        
        // Цвет Название предметов
        // AddTooltipItemName(Item.Name, Item, 1);
        AddTooltipItemName(Item.Name, Item, ItemNameClass);
        
        //GetChatWindowHandle( "ChatWnd.NormalChat" ).AddStringToChatWindow("RECIPE:" $ ItemNameClass, GetChatColorByType(0) );
        
        //Grade Mark
        AddTooltipItemGrade(Item);
        
        //D Качество : 1/5     Дешовый
        addTooltipItemQuality(Item);
        
        //가격
        if (bShowPrice)
        {
            strAdena = Int64ToString(Item.Price);
            strAdenaComma = MakeCostString(strAdena);
            AdenaColor = GetNumericColor(strAdenaComma);
            
            //가격 : xxx,xxx,xxx
            AddTooltipItemOption(641, strAdenaComma $ " ", true, true, false);
            SetTooltipItemColor(AdenaColor.R, AdenaColor.G, AdenaColor.B, 0);
            
            //"아데나"
            StartItem();
            m_Info.eType = DIT_TEXT;
            m_Info.nOffSetY = 6;
            m_Info.t_bDrawOneLine = true;
            m_Info.t_color = AdenaColor;
            m_Info.t_ID= 469;
            EndItem();
            
            //읽어주기 스트링
            AddTooltipItemOption(0, "(" $ ConvertNumToText(strAdena) $ ")", false, true, false);
            SetTooltipItemColor(AdenaColor.R, AdenaColor.G, AdenaColor.B, 0);
        }
        
        //Weight
        AddTooltipItemOption(52, String(Item.Weight), true, true, false);
        
        //설명
        if (Len(Item.Description)>0)
        {
            m_Tooltip.MinimumWidth = TOOLTIP_MINIMUM_WIDTH;
            
            StartItem();
            m_Info.eType = DIT_TEXT;
            m_Info.nOffSetY = 6;
            m_Info.bLineBreak = true;
            m_Info.t_color.R = 178;
            m_Info.t_color.G = 190;
            m_Info.t_color.B = 207;
            m_Info.t_color.A = 255;
            m_Info.t_strText = Item.Description;
            EndItem();   
        }       
    }
    else
    {
        return;
    }
        
    ReturnTooltipInfo(m_Tooltip);
}

/////////////////////////////////////////////////////////////////////////////////
// SHORTCUT
function ReturnTooltip_NTT_SHORTCUT(string param, ETooltipSourceType eSourceType)
{
    local ItemInfo Item;
    
    local EItemParamType eItemParamType;
    local EShortCutItemType eShortCutType;
    local string ItemName;
    local ShortcutCommandItem commandItem;
    local int shortcutID;
    local string strShort;

    local ShortcutAssignWnd Script;


    Script = ShortcutAssignWnd( GetScript( "OptionWnd.ShortcutTab" ) );

    strShort = "<" $ GetSystemString(1523) $ ": ";
    
    if (eSourceType == NTST_ITEM)
    {   
        if( BoolSelect )
        {
            ParseInt( param, "ItemSubType", Item.ItemSubType);
            ParseString( param, "Name", Item.Name);
            ParseInt( param, "RefineryOp1", Item.RefineryOp1);
            ParseInt( param, "RefineryOp2", Item.RefineryOp2);
            eShortCutType = EShortCutItemType(Item.ItemSubType);
            //아이템 이름 취득
            ItemName = class'UIDATA_ITEM'.static.GetRefineryItemName( Item.Name, Item.RefineryOp1, Item.RefineryOp2 );
            switch (eShortCutType)
            {
            case SCIT_ITEM:
                ReturnTooltip_NTT_ITEM(param, "inventory", eSourceType);
                break;
            case SCIT_SKILL:           
                ReturnTooltip_NTT_SKILL(param, eSourceType);
                break;
            case SCIT_ACTION:
            case SCIT_MACRO:
                if (eSourceType == NTST_ITEM)
                {
                    ParseString( param, "Name", Item.Name);
                    ParseString( param, "Description", Item.Description);
                    
                    m_Tooltip.MinimumWidth = TOOLTIP_MINIMUM_WIDTH;

                    //액션 이름
                    StartItem();
                    m_Info.eType = DIT_TEXT;
                    m_Info.t_bDrawOneLine = true;
                    m_Info.t_strText = Item.Name;
                    EndItem();
                    
                    //액션 설명
                    if (Len(Item.Description)>0)
                    {                       
                        StartItem();
                        m_Info.eType = DIT_TEXT;
                        m_Info.nOffSetY = 6;
                        m_Info.t_bDrawOneLine = false;
                        m_Info.bLineBreak = true;
                        m_Info.t_color.R = 178;
                        m_Info.t_color.G = 190;
                        m_Info.t_color.B = 207;
                        m_Info.t_color.A = 255;
                        m_Info.t_strText = Item.Description;
                        EndItem();
                    }       
                }
                else
                {
                    return;
                }
                    
                ReturnTooltipInfo(m_Tooltip);
                break;
            case SCIT_RECIPE:
            case SCIT_BOOKMARK:
                //아이템 이름
                m_Tooltip.MinimumWidth = TOOLTIP_MINIMUM_WIDTH;
                StartItem();
                m_Info.eType = DIT_TEXT;
                //m_Info.bLineBreak = true;
                m_Info.t_bDrawOneLine = true;
                m_Info.t_strText = ItemName;
                EndItem();
                break;
            default:
                break;
            }
            ParseINT(param, "ShortcutID", shortcutID);
            if( GetOptionBool( "Game", "EnterChatting" ) )
            {
                class'ShortcutAPI'.static.GetAssignedKeyFromCommand("TempStateShortcut", "UseShortcutItem Num=" $ shortcutID, commandItem);
            }
            else
            {
                class'ShortcutAPI'.static.GetAssignedKeyFromCommand("GamingStateShortcut", "UseShortcutItem Num=" $ shortcutID, commandItem);
            }
            
            
            //단축키 설명...
            if( commandItem.subkey1 != "" )
            {
                strShort = strShort $ Script.GetUserReadableKeyName( commandItem.subkey1 ) $ "+";
            }
            if( commandItem.subkey2 != "" )
            {
                strShort = strShort $ Script.GetUserReadableKeyName( commandItem.subkey2 ) $ "+";
            }
            if( commandItem.Key != "" )
            {
                strShort = strShort $ Script.GetUserReadableKeyName( commandItem.Key ) $ ">";
            }

            if( commandItem.subkey1 == "" && commandItem.subkey2 == "" && commandItem.Key == "" )
            {
                strShort = strShort $ GetSystemString(27) $">";
            }
            
            //줄추가~
            AddTooltipItemBlank(6);       

            StartItem();
            m_Info.eType = DIT_SPLITLINE;
            m_Info.u_nTextureWidth = TOOLTIP_MINIMUM_WIDTH;           
            m_Info.u_nTextureHeight = 1;
            m_Info.u_strTexture ="L2ui_ch3.tooltip_line";
            EndItem();

            if( ItemName != "" )
            {
                AddTooltipItemBlank(5);
                
                StartItem();
                m_Info.eType = DIT_TEXT;
                m_Info.t_strText = strShort;
                EndItem();
                
                AddTooltipItemBlank(4);
                
                ReturnTooltipInfo(m_Tooltip);               
            }
            return;
        }
        else
        {
            ParseItemID( param, Item.ID );
            ParseString( param, "Name", Item.Name);
            ParseString( param, "AdditionalName", Item.AdditionalName);
            ParseInt( param, "Level", Item.Level);
            ParseInt( param, "Reserved", Item.Reserved);
            ParseInt( param, "Enchanted", Item.Enchanted);
            ParseInt( param, "ItemType", Item.ItemType);
            ParseInt( param, "ItemSubType", Item.ItemSubType);
            ParseInt( param, "CrystalType", Item.CrystalType);
            ParseInt( param, "ConsumeType", Item.ConsumeType);
            ParseInt( param, "RefineryOp1", Item.RefineryOp1);
            ParseInt( param, "RefineryOp2", Item.RefineryOp2);
            ParseINT64( param, "ItemNum", Item.ItemNum);
            ParseInt( param, "MpConsume", Item.MpConsume);
            //branch
            ParseInt ( param, "IsBRPremium", Item.IsBRPremium);
            //end of branch

            eShortCutType = EShortCutItemType(Item.ItemSubType);
            eItemParamType = EItemParamType(Item.ItemType);

            //아이템 이름 취득
            ItemName = class'UIDATA_ITEM'.static.GetRefineryItemName( Item.Name, Item.RefineryOp1, Item.RefineryOp2 );

            switch (eShortCutType)
            {
            case SCIT_ITEM:
                //branch
                AddPrimeItemSymbol(Item);
                //end of branch
                //인첸트 ex) "+10"
                AddTooltipItemEnchant(Item);

                //아이템 이름
                AddTooltipItemName(ItemName, Item, 1);

                //Grade Mark
                AddTooltipItemGrade(Item);

                //아이템 갯수
                AddTooltipItemCount(Item);
                break;
            case SCIT_SKILL:           
                //아이템 이름
                StartItem();
                m_Info.eType = DIT_TEXT;
                m_Info.t_bDrawOneLine = true;
                m_Info.t_strText = ItemName;
                EndItem();

                if (Len(Item.AdditionalName)>0)
                {
                    StartItem();
                    m_Info.eType = DIT_TEXT;
                    m_Info.nOffSetX = 5;
                    m_Info.t_bDrawOneLine = true;
                    m_Info.t_color.R = 255;
                    m_Info.t_color.G = 217;
                    m_Info.t_color.B = 105;
                    m_Info.t_color.A = 255;
                    m_Info.t_strText = Item.AdditionalName;
                    EndItem();

                    Item.Level = class'UIDATA_SKILL'.static.GetEnchantSkillLevel( Item.ID, Item.Level );
                }

                //ex) " Lv "
                StartItem();
                m_Info.eType = DIT_TEXT;
                m_Info.t_bDrawOneLine = true;
                m_Info.t_strText = " ";
                EndItem();

                StartItem();
                m_Info.eType = DIT_TEXT;
                m_Info.t_bDrawOneLine = true;
                m_Info.t_color.R = 163;
                m_Info.t_color.G = 163;
                m_Info.t_color.B = 163;
                m_Info.t_color.A = 255;
                m_Info.t_ID = 88;
                EndItem();

                //스킬 레빌
                StartItem();
                m_Info.eType = DIT_TEXT;
                m_Info.t_bDrawOneLine = true;
                m_Info.t_color.R = 176;
                m_Info.t_color.G = 155;
                m_Info.t_color.B = 121;
                m_Info.t_color.A = 255;
                m_Info.t_strText = " " $ Item.Level;
                EndItem();

                //MP소모량
                StartItem();
                m_Info.eType = DIT_TEXT;
                m_Info.t_bDrawOneLine = true;
                m_Info.t_strText = " (";
                EndItem();

                StartItem();
                m_Info.eType = DIT_TEXT;
                m_Info.t_bDrawOneLine = true;
                m_Info.t_ID = 91;
                EndItem();

                StartItem();
                m_Info.eType = DIT_TEXT;
                m_Info.t_bDrawOneLine = true;
                m_Info.t_strText = ":" $ Item.MpConsume $ ")";
                EndItem();
                break;

            case SCIT_ACTION:
            case SCIT_MACRO:
            case SCIT_RECIPE:
            case SCIT_BOOKMARK:
                //아이템 이름
                StartItem();
                m_Info.eType = DIT_TEXT;
                m_Info.t_bDrawOneLine = true;
                m_Info.t_strText = ItemName;
                EndItem();
                break;
            }
        }
    }
    else
    {
        return;
    }
        
    ReturnTooltipInfo(m_Tooltip);
}

/////////////////////////////////////////////////////////////////////////////////
// RECIPE_MANUFACTURE
function ReturnTooltip_NTT_RECIPE_MANUFACTURE(string param, ETooltipSourceType eSourceType)
{
    local ItemInfo Item;
    local int ItemNameClass;

    if (eSourceType == NTST_ITEM)
    {
        ParseItemID(param, Item.ID);
        ParseString( param, "Name", Item.Name);
        ParseString( param, "Description", Item.Description);
        ParseString( param, "AdditionalName", Item.AdditionalName);
        ParseINT64( param, "Reserved64", Item.Reserved64);
        ParseInt( param, "CrystalType", Item.CrystalType);
        ParseINT64( param, "ItemNum", Item.ItemNum);

        m_Tooltip.MinimumWidth = TOOLTIP_MINIMUM_WIDTH;
        
        ItemNameClass = class'UIDATA_ITEM'.static.GetItemNameClass(Item.ID);
        
        //GetChatWindowHandle( "ChatWnd.NormalChat" ).AddStringToChatWindow("MANUFACTURE:" $ ItemNameClass, GetChatColorByType(0) );
        //GetChatWindowHandle( "ChatWnd.NormalChat" ).AddStringToChatWindow("MANUFACTURE:" $ param, GetChatColorByType(0) );
        
        // Цвет Название предметов
        // AddTooltipItemName(Item.Name, Item, 1);
        AddTooltipItemName(Item.Name, Item, ItemNameClass);
        
        //Grade Mark
        AddTooltipItemGrade(Item);
        
        //D Качество : 1/5     Дешовый
        addTooltipItemQuality(Item);
        
        //ex) "필요수 : 2"
        AddTooltipItemOption(736, Int64ToString(Item.Reserved64), true, true, false);
        
        //ex) "보유수 : 0"
        AddTooltipItemOption(737, Int64ToString(Item.ItemNum), true, true, false);
        
        //설명
        if (Len(Item.Description)>0)
        {
            StartItem();
            m_Info.eType = DIT_TEXT;
            m_Info.nOffSetY = 6;
            m_Info.bLineBreak = true;
            m_Info.t_color.R = 178;
            m_Info.t_color.G = 190;
            m_Info.t_color.B = 207;
            m_Info.t_color.A = 255;
            m_Info.t_strText = Item.Description;
            EndItem();   
        }
    }
    else
    {
        return;
    }
        
    ReturnTooltipInfo(m_Tooltip);
}

/////////////////////////////////////////////////////////////////////////////////
// PLEDGEINFO
function ReturnTooltip_NTT_CLANINFO(string param, ETooltipSourceType eSourceType)
{
    local LVDataRecord record;
    
    if (eSourceType == NTST_LIST)
    {
        ParamToRecord( param, record );
        
        //ex) "직업 : 엘븐메이지"
        AddTooltipItemOption(391, GetClassType(int(record.LVDataList[2].szData)), true, true, true);
    }
    else
    {
        return;
    }
        
    ReturnTooltipInfo(m_Tooltip);
}

//선준 수정(2010.03.30) 완료
function ReturnTooltip_NTT_POSTINFO(string param, ETooltipSourceType eSourceType)
{
    local LVDataRecord record;
    
    if (eSourceType == NTST_LIST)
    {
        ParamToRecord( param, record );

        //ex) "직업 : 엘븐메이지"
        AddTooltipItemOption(391, GetClassType(int(record.LVDataList[1].szData)), true, true, true);
    }
    else
    {
        return;
    }
        
    ReturnTooltipInfo(m_Tooltip);
}


//선준 수정(2010.02.22 ~ 03.08) 완료
/////////////////////////////////////////////////////////////////////////////////
// ROOMLIST
function ReturnTooltip_NTT_ROOMLIST(string param, ETooltipSourceType eSourceType)
{
    local int i;
    local LVDataRecord record;
    local int len;
    
    m_Tooltip.MinimumWidth = TOOLTIP_MINIMUM_WIDTH + 40;

    if (eSourceType == NTST_LIST)
    {
        ParamToRecord( param, record );
        
        len = int( record.LVDataList[6].szData );

        for( i = 0 ; i < len ; i++ )
        {
            StartItem();
            m_Info.eType = DIT_TEXTURE;
            m_Info.u_nTextureWidth = 11;
            m_Info.u_nTextureHeight = 11;
            m_Info.u_strTexture = GetClassIconName2( record.LVDataList[7 + i].nReserved1 );
            EndItem();

            StartItem();
            m_Info.eType = DIT_TEXT;
            m_Info.t_bDrawOneLine = false;
            m_Info.t_color.R = 163;
            m_Info.t_color.G = 163;
            m_Info.t_color.B = 163;
            m_Info.t_color.A = 255;
            m_Info.t_strText = " " $ record.LVDataList[7 + i].szData;
            EndItem();
            if( i != len - 1 )
            {
                AddTooltipItemBlank(2);
            }
        }

        //ex) "직업 : 엘븐메이지"
        //AddTooltipItemOption(391, GetClassType(int(record.LVDataList[2].szData)), true, true, true);
    }
    else
    {
        return;
    }

    ReturnTooltipInfo(m_Tooltip);
}

/////////////////////////////////////////////////////////////////////////////////
// USERLIST
function ReturnTooltip_NTT_USERLIST(string param, ETooltipSourceType eSourceType)
{
    local LVDataRecord record;
    
    m_Tooltip.MinimumWidth = TOOLTIP_MINIMUM_WIDTH + 80;

    if (eSourceType == NTST_LIST)
    {
        ParamToRecord( param, record );
        
        //ex) "직업 : 엘븐메이지"
        AddTooltipItemOption(391, GetClassType(int(record.LVDataList[1].szData)), true, true, true);
        
        AddTooltipItemBlank(0);
        //ex)귀속 지역 :
        StartItem();
        m_Info.eType = DIT_TEXT;
        m_Info.t_color.R = 163;
        m_Info.t_color.G = 163;
        m_Info.t_color.B = 163;
        m_Info.t_color.A = 255;
        m_Info.t_strText = GetSystemString( 2276 ) $ " : ";
        EndItem();
        
        //설명
        StartItem();
        m_Info.eType = DIT_TEXT;
        m_Info.t_color.R = 176;
        m_Info.t_color.G = 155;
        m_Info.t_color.B = 121;
        m_Info.t_color.A = 255;
        if( record.LVDataList[5].szData == "" )
        {           
            m_Info.t_strText = GetSystemString( 27 );
        }
        else
        {           
            m_Info.t_strText = record.LVDataList[5].szData;
        }
        EndItem();
        
        
    }
    else
    {
        return;
    }
    
    
    ReturnTooltipInfo(m_Tooltip);
}


/////////////////////////////////////////////////////////////////////////////////
// PARTYMATCH
function ReturnTooltip_NTT_PARTYMATCH(string param, ETooltipSourceType eSourceType)
{
    local LVDataRecord record;
    
    m_Tooltip.MinimumWidth = TOOLTIP_MINIMUM_WIDTH + 80;

    if (eSourceType == NTST_LIST)
    {
        ParamToRecord( param, record );
        
        //ex) "직업 : 엘븐메이지"
        AddTooltipItemOption(391, GetClassType(int(record.LVDataList[1].szData)), true, true, true);
        
        //선준 수정(2010.02.22 ~ 03.08) 완료
        //ex)현재 위치 : 글루디오
        AddTooltipItemOption(471, GetZoneNameWithZoneID(int(record.LVDataList[3].szReserved)), true, true, true);
        
        /*
        AddTooltipItemBlank(0);
        //귀속지역
        StartItem();
        m_Info.eType = DIT_TEXT;
        m_Info.t_bDrawOneLine = false;
        m_Info.t_color.R = 163;
        m_Info.t_color.G = 163;
        m_Info.t_color.B = 163;
        m_Info.t_color.A = 255;
        m_Info.t_strText = GetSystemString( 2276 ) @ ":";
        EndItem();       
        
        //설명
        
        StartItem();
        m_Info.eType = DIT_TEXT;       
        m_Info.t_color.R = 176;
        m_Info.t_color.G = 155;
        m_Info.t_color.B = 121;
        m_Info.t_color.A = 255;
        if( record.LVDataList[4].szData == "" )
        {
            //m_Info.bLineBreak = true;
            m_Info.t_strText = "" @ GetSystemString( 27 );
        }
        else
        {
            m_Info.bLineBreak = true;
            m_Info.t_strText = record.LVDataList[4].szData;
        }
        EndItem();
        */

        
        AddTooltipItemBlank(0);
        //ex)귀속 지역 :
        StartItem();
        m_Info.eType = DIT_TEXT;
        m_Info.t_color.R = 163;
        m_Info.t_color.G = 163;
        m_Info.t_color.B = 163;
        m_Info.t_color.A = 255;
        m_Info.t_strText = GetSystemString( 2276 ) $ " : ";
        //m_Info.t_strText = "귀속 지역 : ";
        EndItem();
        
        //설명
        StartItem();
        m_Info.eType = DIT_TEXT;
        m_Info.t_color.R = 176;
        m_Info.t_color.G = 155;
        m_Info.t_color.B = 121;
        m_Info.t_color.A = 255;
        if( record.LVDataList[4].szReserved == "" )
        {           
            m_Info.t_strText = GetSystemString( 27 );
        }
        else
        {           
            m_Info.t_strText = record.LVDataList[4].szReserved;
        }
        EndItem();
        
        
    }
    else
    {
        return;
    }
    
    
    ReturnTooltipInfo(m_Tooltip);
}

//선준 추가 UNION 예전 직업만 나오는 경우.
/////////////////////////////////////////////////////////////////////////////////
// UINONLIST
function ReturnTooltip_NTT_UNIONLIST(string param, ETooltipSourceType eSourceType)
{
    local LVDataRecord record;
    
    if (eSourceType == NTST_LIST)
    {
        ParamToRecord( param, record );
        
        //ex) "직업 : 엘븐메이지"
        AddTooltipItemOption(391, GetClassType(int(record.LVDataList[1].szData)), true, true, true);
    }
    else
    {
        return;
    }
        
    ReturnTooltipInfo(m_Tooltip);
}

/////////////////////////////////////////////////////////////////////////////////
// QUESTLIST
function ReturnTooltip_NTT_QUESTLIST(string param, ETooltipSourceType eSourceType)
{
    local LVDataRecord record;
    
    local int nTmp;
    
    if (eSourceType == NTST_LIST)
    {
        ParamToRecord( param, record );
        
        //퀘스트 이름
        AddTooltipItemOption(1200, record.LVDataList[0].szData, true, true, true);
        
        //반복성
        switch(record.LVDataList[3].nReserved1)
        {
        case 0:
        case 2:
            nTmp = 861;
            break;
        case 1:
        case 3:
            nTmp = 862;
            break;
        }
        AddTooltipItemOption2(1202, nTmp, true, true, false);
    }
    else
    {
        return;
    }
        
    ReturnTooltipInfo(m_Tooltip);
}

/////////////////////////////////////////////////////////////////////////////////
// RAIDLIST
function ReturnTooltip_NTT_RAIDLIST(string param, ETooltipSourceType eSourceType)
{
    local LVDataRecord record;
    
    if (eSourceType == NTST_LIST)
    {
        ParamToRecord( param, record );
        
        if (Len(record.szReserved)<1)
            return;
        
        m_Tooltip.MinimumWidth = TOOLTIP_MINIMUM_WIDTH;
        
        //레이드 설명
        StartItem();
        m_Info.eType = DIT_TEXT;
        m_Info.t_bDrawOneLine = false;
        m_Info.t_color.R = 178;
        m_Info.t_color.G = 190;
        m_Info.t_color.B = 207;
        m_Info.t_color.A = 255;
        m_Info.t_strText = record.szReserved;
        EndItem();
    }
    else
    {
        return;
    }
        
    ReturnTooltipInfo(m_Tooltip);
}

/////////////////////////////////////////////////////////////////////////////////
// QUESTINFO
function ReturnTooltip_NTT_QUESTINFO(string param, ETooltipSourceType eSourceType)
{
    local LVDataRecord record;
    
    local int nTmp;
    local int Width1;
    local int Width2;
    local int Height;
        
    if (eSourceType == NTST_LIST)
    {
        ParamToRecord( param, record );
        
        //퀘스트 이름
        AddTooltipItemOption(1200, record.LVDataList[0].szData, true, true, true);
        
        //수행조건
        AddTooltipItemOption(1201, record.LVDataList[1].szData, true, true, false);
        
        //Width결정!
        GetTextSizeDefault(GetSystemString(1200) $ " : " $ record.LVDataList[0].szData, Width1, Height);
        GetTextSizeDefault(GetSystemString(1201) $ " : " $ record.LVDataList[1].szData, Width2, Height);
        if (Width2>Width1)
            Width1 = Width2;
        if (TOOLTIP_MINIMUM_WIDTH>Width1)
            Width1 = TOOLTIP_MINIMUM_WIDTH;
        m_Tooltip.MinimumWidth = Width1 + 30;
        
        //추천레벨
        AddTooltipItemOption(922, record.LVDataList[2].szData, true, true, false);
        
        //반복성
        switch(record.LVDataList[3].nReserved1)
        {
        case 0:
        case 2:
            nTmp = 861;
            break;
        case 1:
        case 3:
            nTmp = 862;
            break;
        }
        AddTooltipItemOption2(1202, nTmp, true, true, false);
        
        //퀘스트설명
        StartItem();
        m_Info.eType = DIT_TEXT;
        m_Info.nOffSetY = 6;
        m_Info.t_bDrawOneLine = false;
        m_Info.bLineBreak = true;
        m_Info.t_color.R = 178;
        m_Info.t_color.G = 190;
        m_Info.t_color.B = 207;
        m_Info.t_color.A = 255;
        m_Info.t_strText = record.szReserved;
        EndItem();
    }
    else
    {
        return;
    }
        
    ReturnTooltipInfo(m_Tooltip);
}

/////////////////////////////////////////////////////////////////////////////////
// MANOR
function ReturnTooltip_NTT_MANOR(string param, string TooltipType, ETooltipSourceType eSourceType)
{
    local LVDataRecord record;
    
    local int idx1;
    local int idx2;
    local int idx3;
    
    if (eSourceType == NTST_LIST)
    {
        ParamToRecord( param, record );
        
        if (TooltipType == "ManorSeedInfo")
        {
            idx1 = 4;
            idx2 = 5;
            idx3 = 6;
        }
        else if (TooltipType == "ManorCropInfo")
        {
            idx1 = 5;
            idx2 = 6;
            idx3 = 7;
        }
        else if (TooltipType == "ManorSeedSetting")
        {
            idx1 = 7;
            idx2 = 8;
            idx3 = 9;
        }
        else if (TooltipType == "ManorCropSetting")
        {
            idx1 = 9;
            idx2 = 10;
            idx3 = 11;
        }
        else if (TooltipType == "ManorDefaultInfo")
        {
            idx1 = 1;
            idx2 = 4;
            idx3 = 5;
        }
        else if (TooltipType == "ManorCropSell")
        {
            idx1 = 7;
            idx2 = 8;
            idx3 = 9;
        }
        
        // 씨앗 or 작물 이름
        AddTooltipItemOption(0, record.LVDataList[0].szData, false, true, true);
        
        // 레벨
        AddTooltipItemOption(537, record.LVDataList[idx1].szData, true, true, false);

        // 보상 타입1
        AddTooltipItemOption(1134, record.LVDataList[idx2].szData, true, true, false);
        
        // 보상 타입2
        AddTooltipItemOption(1135, record.LVDataList[idx3].szData, true, true, false);
    }
    else
    {
        return;
    }
        
    ReturnTooltipInfo(m_Tooltip);
}

// [퀘스트 아이템 툴팁 추가]
function ReturnTooltip_NTT_QUESTREWARDS(string param, ETooltipSourceType eSourceType)
{
    // [퀘스트 아이템 툴팁 추가] 이 부분에 퀘스트 아이템 툴팁에 걸맞는 코드가 들어가면 될 것 같습니다.
    // 2009.10.14
    // ReturnTooltip_NTT_ITEM(param, "Inventoty", eSourceType);
    ReturnTooltip_NTT_ITEM(param, "QuestReward", eSourceType);
}
            
//"XXX : YYYY" 형태의 TooltipItem을 편하게 추가해 준다.
function AddTooltipItemOption(int TitleID, string Content, bool bTitle, bool bContent, bool IamFirst)
{
    if (bTitle)
    {
        StartItem();
        m_Info.eType = DIT_TEXT;
        if (!IamFirst)
            m_Info.nOffSetY = 6;
        m_Info.bLineBreak = true;
        m_Info.t_bDrawOneLine = true;
        m_Info.t_color.R = 163;
        m_Info.t_color.G = 163;
        m_Info.t_color.B = 163;
        m_Info.t_color.A = 255;
        m_Info.t_ID = TitleID;
        EndItem();
    }
    
    if (Content != "0")
    {
        if (bContent)
        {
            if (bTitle)
            {
                StartItem();
                m_Info.eType = DIT_TEXT;
                if (!IamFirst)
                    m_Info.nOffSetY = 6;
                m_Info.t_bDrawOneLine = true;
                m_Info.t_color.R = 163;
                m_Info.t_color.G = 163;
                m_Info.t_color.B = 163;
                m_Info.t_color.A = 255;
                m_Info.t_strText = " : ";
                EndItem();
            }
            
            StartItem();
            m_Info.eType = DIT_TEXT;
            if (!IamFirst)
                m_Info.nOffSetY = 6;
            if (!bTitle)
                m_Info.bLineBreak = true;
            m_Info.t_bDrawOneLine = true;
            m_Info.t_color.R = 176;
            m_Info.t_color.G = 155;
            m_Info.t_color.B = 121;
            m_Info.t_color.A = 255;
            m_Info.t_strText = Content;
            EndItem();
        }
    }
}

// Уровень Использования
function AddTooltipItemUseLevel(ItemInfo Item)
{
    local int myLevel;
    local int minLevel;
    
    local int ColorR;
    local int ColorG;
    local int ColorB;
    local int ColorA;
    
    // 5099    u,Мин. Уровень\0
    StartItem();
    m_Info.eType = DIT_TEXT;
    m_Info.nOffSetY = 6;
    m_Info.bLineBreak = true;
    m_Info.t_bDrawOneLine = true;
    m_Info.t_color.R = 163;
    m_Info.t_color.G = 163;
    m_Info.t_color.B = 163;
    m_Info.t_color.A = 255;
    m_Info.t_ID = 5099;
    EndItem();

    StartItem();
    m_Info.eType = DIT_TEXT;
    m_Info.nOffSetY = 6;
    m_Info.t_bDrawOneLine = true;
    m_Info.t_color.R = 163;
    m_Info.t_color.G = 163;
    m_Info.t_color.B = 163;
    m_Info.t_color.A = 255;
    m_Info.t_strText = " : ";
    EndItem();

    myLevel = GetMyUserLevel();
    minLevel = getItemMinLevel(Item);
    
    StartItem();
    m_Info.eType = DIT_TEXT;
    m_Info.nOffSetY = 6;
    m_Info.t_bDrawOneLine = true;
    
    isUseLevelColor(myLevel, minLevel, ColorR, ColorG, ColorB, ColorA);
    
    m_Info.t_color.R = ColorR;
    m_Info.t_color.G = ColorG;
    m_Info.t_color.B = ColorB;
    m_Info.t_color.A = ColorA;
    
    m_Info.t_strText = String(minLevel);
    EndItem();

}

// уровень персонажа
function int GetMyUserLevel()
{
    local UserInfo PlayerInfo;
    
    local int Level;
    
    if( GetPlayerInfo( PlayerInfo ) )
    {
        Level  = PlayerInfo.nLevel;
    }
    else
    {
        Level = 0;
    }
    
    return Level;
}

// Минимальный уровень использование предмета
function int getItemMinLevel(ItemInfo Item)
{
    local int value;
    
    value = 1;
    
    switch (Item.CrystalType)
    {
        case 5: // S
            value = 120;
            break;
        case 4: // A
            value = 120;
            break;
        case 3: // B
            value = 120;
            break;
        case 2: // C
            value = 120;
        break;
            case 1: // D
            value = getItemMinLevelD(Item);
            break;
    }

    return value;
}

// мин лвл для д
function int getItemMinLevelD(ItemInfo Item)
{
    local int value;
    
    value = 1;
    
    switch (class'UIDATA_ITEM'.static.GetItemNameClass(Item.ID))
    {
        case 0: // 0    Дешовый        Тёмно бел    898989    137,137,137
            value = 1;
        break;
        case 1: // 1    Обычный        Белый        FFFFFF    255,255,255
            value = 20;
        break;
        case 2: // 2    Эпический    Зеленый        00FF00    000,255,000
            value = 40;
        break;
        case 3: // 3    Легендарный    Жёлтый    FFFF00    255,255,000
            value = 60;
        break;
        case 4: // 4    Мифический    Красный        FF0000    255,000,000
            value = 70;
        break;
    }
    
    return value;
}

// зеленым возможно использование иначе красным нет
function isUseLevelColor(int myLevel, int minLevel, out int R, out int G, out int B, out int A)
{
    if( myLevel >= minLevel )
    {
        // Зеленый        00FF00    000,255,000
        R = 000;
        G = 255;
        B = 000;
        A = 255;
    }
    else
    {
        // Красный        FF0000    255,000,000
        R = 255;
        G = 000;
        B = 000;
        A = 255;
    }
}



//"XXX : YYYY" 형태의 TooltipItem을 편하게 추가해 준다.
//SYSSTRING : SYSSTRING
function AddTooltipItemOption2(int TitleID, int ContentID, bool bTitle, bool bContent, bool IamFirst)
{
    if (bTitle)
    {
        StartItem();
        m_Info.eType = DIT_TEXT;
        if (!IamFirst)
            m_Info.nOffSetY = 6;
        m_Info.bLineBreak = true;
        m_Info.t_bDrawOneLine = true;
        m_Info.t_color.R = 163;
        m_Info.t_color.G = 163;
        m_Info.t_color.B = 163;
        m_Info.t_color.A = 255;
        m_Info.t_ID = TitleID;
        EndItem();
    }
    
    if (bContent)
    {   
        if (bTitle)
        {
            StartItem();
            m_Info.eType = DIT_TEXT;
            if (!IamFirst)
                m_Info.nOffSetY = 6;
            m_Info.t_bDrawOneLine = true;
            m_Info.t_color.R = 163;
            m_Info.t_color.G = 163;
            m_Info.t_color.B = 163;
            m_Info.t_color.A = 255;
            m_Info.t_strText = " : ";
            EndItem();
        }       
        
        StartItem();
        m_Info.eType = DIT_TEXT;
        if (!IamFirst)
            m_Info.nOffSetY = 6;
        if (!bTitle)
            m_Info.bLineBreak = true;
        m_Info.t_bDrawOneLine = true;
        m_Info.t_color.R = 176;
        m_Info.t_color.G = 155;
        m_Info.t_color.B = 121;
        m_Info.t_color.A = 255;
        m_Info.t_ID = ContentID;
        EndItem();
    }
}

//아이템의 색상을 다시 설정해준다.
function SetTooltipItemColor(int R, int G, int B, int Offset)
{
    local int idx;
    idx = m_Tooltip.DrawList.Length-1-Offset;
    m_Tooltip.DrawList[idx].t_color.R = R;
    m_Tooltip.DrawList[idx].t_color.G = G;
    m_Tooltip.DrawList[idx].t_color.B = B;
    m_Tooltip.DrawList[idx].t_color.A = 255;
}

//D TooltipItem Добавить пустое место.
function AddTooltipItemBlank(int Height)
{
    StartItem();
    m_Info.eType = DIT_BLANK;
    m_Info.b_nHeight = Height;
    EndItem();
}

//인첸트
function AddTooltipItemEnchant(ItemInfo Item)
{
    local EItemParamType eItemParamType;
    
    eItemParamType = EItemParamType(Item.ItemType);
    if (Item.Enchanted>0 && IsEnchantableItem(eItemParamType))
    {
        StartItem();
        m_Info.eType = DIT_TEXT;
        m_Info.t_bDrawOneLine = true;
        m_Info.t_color.R = 176;
        m_Info.t_color.G = 155;
        m_Info.t_color.B = 121;
        m_Info.t_color.A = 255;
        m_Info.t_strText = "+" $ Item.Enchanted $ " ";
        EndItem();
    }   
}

//D Цвет Название предметов (качество) + AdditionalName
function AddTooltipItemName(string Name, ItemInfo Item, int AddTooltipItemName)
{
    StartItem();
    m_Info.eType = DIT_TEXT;
    m_Info.t_bDrawOneLine = true;
    switch (AddTooltipItemName)
    {
        case 0: // 0    Дешовый        Тёмно бел    898989    137,137,137
        m_Info.t_color.R = 137;
        m_Info.t_color.G = 137;
        m_Info.t_color.B = 137;
        m_Info.t_color.A = 255;
        break;
        case 1: // 1    Обычный        Белый        FFFFFF    255,255,255
        m_Info.t_color.R = 255;
        m_Info.t_color.G = 255;
        m_Info.t_color.B = 255;
        m_Info.t_color.A = 255;
        break;
        case 2: // 2    Эпический    Зеленый        00FF00    000,255,000
        m_Info.t_color.R = 000;
        m_Info.t_color.G = 255;
        m_Info.t_color.B = 000;
        m_Info.t_color.A = 255;
        break;
        case 3: // 3    Легендарный    Жёлтый    FFFF00    255,255,000
        m_Info.t_color.R = 255;
        m_Info.t_color.G = 255;
        m_Info.t_color.B = 000;
        m_Info.t_color.A = 255;
        break;
        case 4: // 4    Мифический    Красный        FF0000    255,000,000
        m_Info.t_color.R = 255;
        m_Info.t_color.G = 000;
        m_Info.t_color.B = 000;
        m_Info.t_color.A = 255;
        break;
    }
    m_Info.t_strText = Name;
    EndItem();

    //Additional Name
    if (Len(Item.AdditionalName)>0)
    {
        StartItem();
        m_Info.eType = DIT_TEXT;
        m_Info.t_bDrawOneLine = true;
        m_Info.t_color.R = 255;
        m_Info.t_color.G = 217;
        m_Info.t_color.B = 105;
        m_Info.t_color.A = 255;
        m_Info.t_strText = " " $ Item.AdditionalName;
        EndItem();
    }
}


function GetQualityColor(ItemInfo Item, out int R, out int G, out int B, out int A)
{
    switch (class'UIDATA_ITEM'.static.GetItemNameClass(Item.ID))
    {
        case 0: // 0    Дешовый        Тёмно бел    898989    137,137,137
            R = 137;
            G = 137;
            B = 137;
            A = 255;
        break;
        case 1: // 1    Обычный        Белый        FFFFFF    255,255,255
            R = 255;
            G = 255;
            B = 255;
            A = 255;
        break;
        case 2: // 2    Эпический    Зеленый        00FF00    000,255,000
            R = 000;
            G = 255;
            B = 000;
            A = 255;
        break;
        case 3: // 3    Легендарный    Жёлтый    FFFF00    255,255,000
            R = 255;
            G = 255;
            B = 000;
            A = 255;
        break;
        case 4: // 4    Мифический    Красный        FF0000    255,000,000
            R = 255;
            G = 000;
            B = 000;
            A = 255;
        break;
        default:
            R = 137;
            G = 137;
            B = 137;
            A = 255;
        break;
    }
}

//D Качество : 1/5     Дешовый
function addTooltipItemQuality(ItemInfo Item)
{
    local string Content;
    
    local int ColorR;
    local int ColorG;
    local int ColorB;
    local int ColorA;
    
    //D 5084 Качество
    StartItem();
    m_Info.eType = DIT_TEXT;
    m_Info.nOffSetY = 6;
    m_Info.bLineBreak = true;
    m_Info.t_bDrawOneLine = true;
    m_Info.t_color.R = 163;
    m_Info.t_color.G = 163;
    m_Info.t_color.B = 163;
    m_Info.t_color.A = 255;
    m_Info.t_ID = 5084;
    EndItem();

    StartItem();
    m_Info.eType = DIT_TEXT;
    m_Info.nOffSetY = 6;
    m_Info.t_bDrawOneLine = true;
    m_Info.t_color.R = 163;
    m_Info.t_color.G = 163;
    m_Info.t_color.B = 163;
    m_Info.t_color.A = 255;
    m_Info.t_strText = " : ";
    EndItem();
    
    //D 1/5     Дешовый
    Content = getInfoQualityType(Item) $ "/5 " ;
    
    StartItem();
    m_Info.eType = DIT_TEXT;
    m_Info.nOffSetY = 6;
    m_Info.t_bDrawOneLine = true;
    m_Info.t_color.R = 176;
    m_Info.t_color.G = 155;
    m_Info.t_color.B = 121;
    m_Info.t_color.A = 255;
    m_Info.t_strText = Content;
    EndItem();
    
    //D
    StartItem();
    m_Info.eType = DIT_TEXT;
    m_Info.nOffSetY = 6;
    //m_Info.bLineBreak = true;
    m_Info.t_bDrawOneLine = true;
//    m_Info.t_color.R = 163;
//    m_Info.t_color.G = 163;
//    m_Info.t_color.B = 163;
//    m_Info.t_color.A = 255;
    
    GetQualityColor(Item, ColorR, ColorG, ColorB, ColorA);
    
    m_Info.t_color.R = ColorR;
    m_Info.t_color.G = ColorG;
    m_Info.t_color.B = ColorB;
    m_Info.t_color.A = ColorA;
    
    m_Info.t_ID = getSysStringQualityType(Item);
    EndItem();

}

function int getSysStringQualityType(ItemInfo Item)
{
    local int SysString;
    
    switch (class'UIDATA_ITEM'.static.GetItemNameClass(Item.ID))
    {
        //D 5079 Дешовый
        case 0:
            SysString =  5079;
        break;
        //D 5080 Обычный
        case 1:
            SysString =  5080;
        break;
        //D 5081 Эпический
        case 2:
            SysString =  5081;
        break;
        //D 5082 Легендарный
        case 3:
            SysString =  5082;
        break;
        //D 5083 Мифический
        case 4:
            SysString =  5083;
        break;
        default:
            SysString =  5079;
        break;
    }
    
    return SysString;
}

function string getInfoQualityType(ItemInfo Item)
{
    local string SysString;
    
    switch (class'UIDATA_ITEM'.static.GetItemNameClass(Item.ID))
    {
        //D 5079 Дешовый
        case 0:
            SysString =  "1";
        break;
        //D 5080 Обычный
        case 1:
            SysString =  "2";
        break;
        //D 5081 Эпический
        case 2:
            SysString =  "3";
        break;
        //D 5082 Легендарный
        case 3:
            SysString =  "4";
        break;
        //D 5083 Мифический
        case 4:
            SysString =  "5";
        break;
        default:
            SysString =  "1";
        break;
    }
    
    return SysString;
}

// 95    u,Физ. Защ.\0
function AddNewPhysicalDefense(int CrystalType, int Enchanted, int PhysicalDefense)
{
    //AddNewPhysicalDefense(Item.CrystalType, Item.Enchanted, Item.PhysicalDefense);
    //AddTooltipItemOption(95, String(GetPhysicalDefense(Item.CrystalType, Item.Enchanted, Item.PhysicalDefense)), true, true, false);   
    local string Content;
    local int overenchant;
    local int enchant;
    
    StartItem();
    m_Info.eType = DIT_TEXT;
    m_Info.nOffSetY = 6;
    m_Info.bLineBreak = true;
    m_Info.t_bDrawOneLine = true;
    m_Info.t_color.R = 163;
    m_Info.t_color.G = 163;
    m_Info.t_color.B = 163;
    m_Info.t_color.A = 255;
    m_Info.t_ID = 95; // 95    u,Физ. Защ.\0
    EndItem();
    
    StartItem();
    m_Info.eType = DIT_TEXT;
    m_Info.nOffSetY = 6;
    m_Info.t_bDrawOneLine = true;
    m_Info.t_color.R = 163;
    m_Info.t_color.G = 163;
    m_Info.t_color.B = 163;
    m_Info.t_color.A = 255;
    m_Info.t_strText = " : ";
    EndItem();

    if(Enchanted > 0)
    {
        enchant = Enchanted;
        overenchant = 0;
        if (Enchanted > 3)
        {
            overenchant = Enchanted - 3;
            enchant = 3;
        }
        Content = string(PhysicalDefense + enchant + (3 * overenchant)) $ " (" $ string(PhysicalDefense) $ " +" $ string(enchant + (3 * overenchant)) $ ")";
    }
    else
    {
        Content = string(PhysicalDefense);
    }

    StartItem();
    m_Info.eType = DIT_TEXT;
    m_Info.nOffSetY = 6;
    m_Info.t_bDrawOneLine = true;
    m_Info.t_color.R = 176;
    m_Info.t_color.G = 155;
    m_Info.t_color.B = 121;
    m_Info.t_color.A = 255;
    m_Info.t_strText = Content;
    EndItem();
}

// 99    u,Маг. Защ.\0
function AddNewMagicalDefense(int CrystalType, int Enchanted, int MagicalDefense)
{
    //AddTooltipItemOption(99, String(GetMagicalDefense(Item.CrystalType, Item.Enchanted, Item.MagicalDefense)), true, true, false);
    
    local string Content;
    local int overenchant;
    local int enchant;
    
    StartItem();
    m_Info.eType = DIT_TEXT;
    m_Info.nOffSetY = 6;
    m_Info.bLineBreak = true;
    m_Info.t_bDrawOneLine = true;
    m_Info.t_color.R = 163;
    m_Info.t_color.G = 163;
    m_Info.t_color.B = 163;
    m_Info.t_color.A = 255;
    m_Info.t_ID = 99; // 99    u,Маг. Защ.\0
    EndItem();
    
    StartItem();
    m_Info.eType = DIT_TEXT;
    m_Info.nOffSetY = 6;
    m_Info.t_bDrawOneLine = true;
    m_Info.t_color.R = 163;
    m_Info.t_color.G = 163;
    m_Info.t_color.B = 163;
    m_Info.t_color.A = 255;
    m_Info.t_strText = " : ";
    EndItem();

    if(Enchanted > 0)
    {
        enchant = Enchanted;
        overenchant = 0;
        if (Enchanted > 3)
        {
            overenchant = Enchanted - 3;
            enchant = 3;
        }
        Content = string(MagicalDefense + enchant + (3 * overenchant)) $ " (" $ string(MagicalDefense) $ " +" $ string(enchant + (3 * overenchant)) $ ")";
    }
    else
    {
        Content = string(MagicalDefense);
    }

    StartItem();
    m_Info.eType = DIT_TEXT;
    m_Info.nOffSetY = 6;
    m_Info.t_bDrawOneLine = true;
    m_Info.t_color.R = 176;
    m_Info.t_color.G = 155;
    m_Info.t_color.B = 121;
    m_Info.t_color.A = 255;
    m_Info.t_strText = Content;
    EndItem();
}

// 94    u,Физ. Атк.\0
function AddNewPhysicalDamage( int WeaponType, int SlotBitType, int CrystalType, int Enchanted, int PhysicalDamage )
{
    local string Content;
    
    StartItem();
    m_Info.eType = DIT_TEXT;
    m_Info.nOffSetY = 6;
    m_Info.bLineBreak = true;
    m_Info.t_bDrawOneLine = true;
    m_Info.t_color.R = 163;
    m_Info.t_color.G = 163;
    m_Info.t_color.B = 163;
    m_Info.t_color.A = 255;
    m_Info.t_ID = 94; // 94    u,Физ. Атк.\0
    EndItem();
    
    StartItem();
    m_Info.eType = DIT_TEXT;
    m_Info.nOffSetY = 6;
    m_Info.t_bDrawOneLine = true;
    m_Info.t_color.R = 163;
    m_Info.t_color.G = 163;
    m_Info.t_color.B = 163;
    m_Info.t_color.A = 255;
    m_Info.t_strText = " : ";
    EndItem();

    if(Enchanted > 0)
    {
        Content = string(PhysicalDamage + getScrollEnchantBonus( CrystalType,  Enchanted)) $ " (" $ string(PhysicalDamage) $ " +" $ string(getScrollEnchantBonus( CrystalType,  Enchanted)) $ ")";
    }
    else
    {
        Content = string(PhysicalDamage);
    }

    StartItem();
    m_Info.eType = DIT_TEXT;
    m_Info.nOffSetY = 6;
    m_Info.t_bDrawOneLine = true;
    m_Info.t_color.R = 176;
    m_Info.t_color.G = 155;
    m_Info.t_color.B = 121;
    m_Info.t_color.A = 255;
    m_Info.t_strText = Content;
    EndItem();
}

// 98    u,Маг. Атк.\0
function AddNewMagicalDamage( int WeaponType, int SlotBitType, int CrystalType, int Enchanted, int MagicalDamage )
{
    local string Content;
    
    StartItem();
    m_Info.eType = DIT_TEXT;
    m_Info.nOffSetY = 6;
    m_Info.bLineBreak = true;
    m_Info.t_bDrawOneLine = true;
    m_Info.t_color.R = 163;
    m_Info.t_color.G = 163;
    m_Info.t_color.B = 163;
    m_Info.t_color.A = 255;
    m_Info.t_ID = 98; // 98    u,Маг. Атк.\0
    EndItem();
    
    StartItem();
    m_Info.eType = DIT_TEXT;
    m_Info.nOffSetY = 6;
    m_Info.t_bDrawOneLine = true;
    m_Info.t_color.R = 163;
    m_Info.t_color.G = 163;
    m_Info.t_color.B = 163;
    m_Info.t_color.A = 255;
    m_Info.t_strText = " : ";
    EndItem();

    if(Enchanted > 0)
    {
        Content = string(MagicalDamage + getScrollEnchantBonus( CrystalType,  Enchanted)) $ " (" $ string(MagicalDamage) $ " +" $ string(getScrollEnchantBonus( CrystalType,  Enchanted)) $ ")";
    }
    else
    {
        Content = string(MagicalDamage);
    }

    StartItem();
    m_Info.eType = DIT_TEXT;
    m_Info.nOffSetY = 6;
    m_Info.t_bDrawOneLine = true;
    m_Info.t_color.R = 176;
    m_Info.t_color.G = 155;
    m_Info.t_color.B = 121;
    m_Info.t_color.A = 255;
    m_Info.t_strText = Content;
    EndItem();
}

function int getScrollEnchantBonus(int CrystalType, int Enchanted)
{
    local int overenchant;
    
    overenchant = 0;
    
    if (Enchanted > 3)
    {
        overenchant = Enchanted - 3;
        Enchanted = 3;
    }
    
    return (getWeaponCrystalEnchantP(CrystalType) * Enchanted) + ((getWeaponCrystalEnchantP(CrystalType) * 2) * overenchant);
}

    function int getWeaponCrystalEnchantP(int CrystalType)
    {
        local int enchant;
        
        switch (CrystalType)
        {
            case 5: // S
                enchant = 10;
                break;
            case 4: // A
                enchant = 8;
                break;
            case 3: // B
                enchant = 6;
                break;
            case 2: // C
                enchant = 4;
                break;
            case 0: // NONE
            case 1: // D
                enchant = 2;
                break;
            default:
                enchant = 0;
                break;
        }
        
        return enchant;
    }
    
//Grade Mark
function AddTooltipItemGrade(ItemInfo Item)
{
    local string TextureName;
    
    TextureName = GetItemGradeTextureName(Item.CrystalType);
    //debug ("TextureName" @ TextureName);
    //debug (TextureName @  Item.CrystalType @ GetItemGradeTextureName(Item.CrystalType));
    if (Len(TextureName)>0)
    {
        StartItem();
        m_Info.eType = DIT_TEXTURE;
        m_Info.nOffSetX = 2;
        m_Info.nOffSetY = 0;
        
        //S80 그레이드일 경우에 한해 아이콘 텍스쳐 크기를 2배로 늘린다.
        //debug ("텍스쳐 이름"@ Item.CrystalType );
        if (Item.CrystalType == 6 || Item.CrystalType == 7)
        {
            m_Info.u_nTextureWidth = 32;
            m_Info.u_nTextureHeight = 16;
            
            m_Info.u_nTextureUWidth = 32;
            m_Info.u_nTextureUHeight = 16;
            
            //debug (TextureName @  Item.CrystalType @ GetItemGradeTextureName(Item.CrystalType));
        }
        //기타 그레이드에 대해 아이콘 텍스쳐 크기를 세팅한다.
        else
        {
            m_Info.u_nTextureWidth = 16;
            m_Info.u_nTextureHeight = 16;
            
            m_Info.u_nTextureUWidth = 16;
            m_Info.u_nTextureUHeight = 16;
        }
        m_Info.u_strTexture = TextureName;
        EndItem();
    }
}

//Stackable Count
function AddTooltipItemCount(ItemInfo Item)
{
    if (IsStackableItem(Item.ConsumeType))
    {
        StartItem();
        m_Info.eType = DIT_TEXT;
        m_Info.t_bDrawOneLine = true;
        m_Info.t_strText = " (" $ MakeCostString(Int64ToString(Item.ItemNum)) $ ")";
        EndItem();
    }   
}

//제련 색상
function GetRefineryColor(int Quality, out int R, out int G, out int B)
{
    switch (Quality)
    {
    case 1:
        R = 187;
        G = 181;
        B = 138;
    break;
    case 2:
        R = 132;
        G = 174;
        B = 216;
    break;
    case 3:
        R = 193;
        G = 112;
        B = 202;
    break;
    case 4:
        R = 225;
        G = 109;
        B = 109;
    break;
    default:
        R = 187;
        G = 181;
        B = 138;
    break;
    }
}

//속성 게이지 그려주기
function AddTooltipItemAttributeGage(ItemInfo Item)
{
    local int i;
    //local int highAttrValue[6];
    local Array<string> textureName, tooltipStr;
    
    for(i = 0; i < 6; i++)
    {
        textureName[i] = "";
        tooltipStr[i] = "";
    }
    
    NowAttrLv =0;
    NowMaxValue =0;
    NowValue =0;

    
    // 공격 아이템 속성
    if (Item.AttackAttributeValue  > 0)
    {
        
        SetAttackAttribute(Item.AttackAttributeValue,ATTRIBUTE_FIRE);
        SetAttackAttribute(Item.AttackAttributeValue,ATTRIBUTE_WATER);
        SetAttackAttribute(Item.AttackAttributeValue,ATTRIBUTE_WIND);
        SetAttackAttribute(Item.AttackAttributeValue,ATTRIBUTE_EARTH);
        SetAttackAttribute(Item.AttackAttributeValue,ATTRIBUTE_HOLY);
        SetAttackAttribute(Item.AttackAttributeValue,ATTRIBUTE_UNHOLY); //레벨과 현제값등을 구한다.
        
        switch(Item.AttackAttributeType)
        {
            case ATTRIBUTE_FIRE:
                textureName[ATTRIBUTE_FIRE] = "L2UI_CT1.Gauges.Gauge_DF_Attribute_FIRE";
                tooltipStr[ATTRIBUTE_FIRE] =GetSystemString(1622) $ " Lv " $ String(AttackAttLevel[ATTRIBUTE_FIRE]) $ " ("$ GetSystemString(1622) $ " " $ GetSystemString(55) $ " " $ String(Item.AttackAttributeValue) $")";
                break;
            case ATTRIBUTE_WATER:
                textureName[ATTRIBUTE_WATER] = "L2UI_CT1.Gauges.Gauge_DF_Attribute_WATER";
                tooltipStr[ATTRIBUTE_WATER] =GetSystemString(1623) $ " Lv " $ String(AttackAttLevel[ATTRIBUTE_WATER]) $ " ("$ GetSystemString(1623) $ " " $ GetSystemString(55) $ " " $String(Item.AttackAttributeValue) $ ")";
                break;
            case ATTRIBUTE_WIND:
                textureName[ATTRIBUTE_WIND] = "L2UI_CT1.Gauges.Gauge_DF_Attribute_WIND";
                tooltipStr[ATTRIBUTE_WIND] =GetSystemString(1624) $ " Lv " $ String(AttackAttLevel[ATTRIBUTE_WIND]) $ " ("$ GetSystemString(1624) $ " " $ GetSystemString(55) $ " " $String(Item.AttackAttributeValue) $ ")";
                break;
            case ATTRIBUTE_EARTH:
                textureName[ATTRIBUTE_EARTH] = "L2UI_CT1.Gauges.Gauge_DF_Attribute_EARTH";
                tooltipStr[ATTRIBUTE_EARTH] =GetSystemString(1625) $ " Lv " $ String(AttackAttLevel[ATTRIBUTE_EARTH]) $ " ("$ GetSystemString(1625) $ " " $ GetSystemString(55) $ " " $ String(Item.AttackAttributeValue) $")";
                break;
            case ATTRIBUTE_HOLY:
                textureName[ATTRIBUTE_HOLY] = "L2UI_CT1.Gauges.Gauge_DF_Attribute_DIVINE";
                tooltipStr[ATTRIBUTE_HOLY] =GetSystemString(1626) $ " Lv " $ String(AttackAttLevel[ATTRIBUTE_HOLY]) $ " ("$ GetSystemString(1626) $ " " $ GetSystemString(55) $ " " $String(Item.AttackAttributeValue) $ ")";
                break;
            case ATTRIBUTE_UNHOLY:
                textureName[ATTRIBUTE_UNHOLY] = "L2UI_CT1.Gauges.Gauge_DF_Attribute_DARK";
                tooltipStr[ATTRIBUTE_UNHOLY] =GetSystemString(1627) $ " Lv " $ String(AttackAttLevel[ATTRIBUTE_UNHOLY]) $ " ("$ GetSystemString(1627) $ " " $ GetSystemString(55) $ " " $String(Item.AttackAttributeValue) $ ")";
                break;
        }
    }
    else    // 방어 아이템 속성
    {   
        SetDefAttribute(Item.DefenseAttributeValueFire,ATTRIBUTE_FIRE);
        SetDefAttribute(Item.DefenseAttributeValueWater,ATTRIBUTE_WATER);
        SetDefAttribute(Item.DefenseAttributeValueWind,ATTRIBUTE_WIND);
        SetDefAttribute(Item.DefenseAttributeValueEarth,ATTRIBUTE_EARTH);
        SetDefAttribute(Item.DefenseAttributeValueHoly,ATTRIBUTE_HOLY);
        SetDefAttribute(Item.DefenseAttributeValueUnholy,ATTRIBUTE_UNHOLY); //레벨과 현제값등을 구한다.

        if(Item.DefenseAttributeValueFire != 0) //파이어 속성 툴팁 그리기
        {
            textureName[ATTRIBUTE_FIRE] = "L2UI_CT1.Gauges.Gauge_DF_Attribute_FIRE";
            tooltipStr[ATTRIBUTE_FIRE] =GetSystemString(1623) $ " Lv " $ String(DefAttLevel[ATTRIBUTE_FIRE]) $ " ("$ GetSystemString(1622) $ " " $ GetSystemString(54) $ " " $ String(Item.DefenseAttributeValueFire) $")";
        }
        if(Item.DefenseAttributeValueWater != 0) //물 속성 툴팁 그리기
        {
            textureName[ATTRIBUTE_WATER] = "L2UI_CT1.Gauges.Gauge_DF_Attribute_WATER";
            tooltipStr[ATTRIBUTE_WATER] =GetSystemString(1622) $ " Lv " $ String(DefAttLevel[ATTRIBUTE_WATER]) $ " ("$ GetSystemString(1623) $ " " $ GetSystemString(54) $ " " $String(Item.DefenseAttributeValueWater) $ ")";
        }
        if(Item.DefenseAttributeValueWind != 0) //바람 속성 툴팁 그리기
        {
            textureName[ATTRIBUTE_WIND] = "L2UI_CT1.Gauges.Gauge_DF_Attribute_WIND";
            tooltipStr[ATTRIBUTE_WIND] =GetSystemString(1625) $ " Lv " $ String(DefAttLevel[ATTRIBUTE_WIND]) $ " ("$ GetSystemString(1624) $ " " $ GetSystemString(54) $ " " $String(Item.DefenseAttributeValueWind) $")";
        }
        if(Item.DefenseAttributeValueEarth != 0) //땅 속성 툴팁 그리기
        {
            textureName[ATTRIBUTE_EARTH] = "L2UI_CT1.Gauges.Gauge_DF_Attribute_EARTH";
            tooltipStr[ATTRIBUTE_EARTH] =GetSystemString(1624) $ " Lv " $ String(DefAttLevel[ATTRIBUTE_EARTH]) $ " ("$ GetSystemString(1625) $ " " $ GetSystemString(54) $ " " $String(Item.DefenseAttributeValueEarth) $ ")";
        }
        if(Item.DefenseAttributeValueHoly != 0) //신성 속성 툴팁 그리기
        {
            textureName[ATTRIBUTE_HOLY] = "L2UI_CT1.Gauges.Gauge_DF_Attribute_DIVINE";
            tooltipStr[ATTRIBUTE_HOLY] =GetSystemString(1627) $ " Lv " $ String(DefAttLevel[ATTRIBUTE_HOLY]) $ " ("$ GetSystemString(1626) $ " " $ GetSystemString(54) $ " " $ String(Item.DefenseAttributeValueHoly) $")";
        }
        if(Item.DefenseAttributeValueUnholy != 0) //암흑 속성 툴팁 그리기
        {
            textureName[ATTRIBUTE_UNHOLY] = "L2UI_CT1.Gauges.Gauge_DF_Attribute_DARK";
            tooltipStr[ATTRIBUTE_UNHOLY] =GetSystemString(1626) $ " Lv " $ String(DefAttLevel[ATTRIBUTE_UNHOLY]) $ " ("$ GetSystemString(1627) $ " " $ GetSystemString(54) $ " " $String(Item.DefenseAttributeValueUnholy) $ ")";
        }
        // 방어 아이템 속성
        

    }

    if (Item.AttackAttributeValue  > 0)//공격속성일경우
    {
        for(i = 0; i < 6; i++)
        {
            if(tooltipStr[i] == "") continue;           
            StartItem();
            m_Info.eType = DIT_TEXT;
            m_Info.nOffSetY = 10;
            m_Info.bLineBreak = true;
            m_Info.t_bDrawOneLine = true;
            m_Info.t_strText = tooltipStr[i];
            EndItem();
            
            //텍스쳐 두장을 겹쳐 그려야 한다.
            StartItem();
            m_Info.eType = DIT_TEXTURE;
            m_Info.bLineBreak = true;
            m_Info.t_bDrawOneLine = true;
            m_Info.nOffSetX = 0;
            m_Info.nOffSetY = 2;
            m_Info.u_nTextureWidth = 140;
            m_Info.u_nTextureHeight = 7;
            m_Info.u_strTexture = textureName[i] $ "_BG";
            EndItem();
            
            StartItem();
            m_Info.eType = DIT_TEXTURE;
            m_Info.bLineBreak = true;
            m_Info.t_bDrawOneLine = true;
            m_Info.nOffSetX = 0;
            m_Info.nOffSetY = -7;
            m_Info.u_nTextureWidth = AttackAttCurrValue[i] * 140 / AttackAttMaxValue[i] ;
            if( m_Info.u_nTextureWidth > 140) m_Info.u_nTextureWidth = 140;    //넘어가면 걍 140이라는.. ㅋ
            m_Info.u_nTextureHeight = 7;
            m_Info.u_strTexture = textureName[i];
            EndItem();
        }
    
    }
    else{ //방어 속성일 경우
        for(i = 0; i < 6; i++)
        {
            if(tooltipStr[i] == "") continue;           
            StartItem();
            m_Info.eType = DIT_TEXT;
            m_Info.nOffSetY = 10;
            m_Info.bLineBreak = true;
            m_Info.t_bDrawOneLine = true;
            m_Info.t_strText = tooltipStr[i];
            EndItem();
            
            //텍스쳐 두장을 겹쳐 그려야 한다.
            StartItem();
            m_Info.eType = DIT_TEXTURE;
            m_Info.bLineBreak = true;
            m_Info.t_bDrawOneLine = true;
            m_Info.nOffSetX = 0;
            m_Info.nOffSetY = 2;
            m_Info.u_nTextureWidth = 140;
            m_Info.u_nTextureHeight = 7;
            m_Info.u_strTexture = textureName[i] $ "_BG";
            EndItem();
            
            StartItem();
            m_Info.eType = DIT_TEXTURE;
            m_Info.bLineBreak = true;
            m_Info.t_bDrawOneLine = true;
            m_Info.nOffSetX = 0;
            m_Info.nOffSetY = -7;
            
            m_Info.u_nTextureWidth = DefAttCurrValue[i] * 140 / DefAttMaxValue[i] ;
            if( m_Info.u_nTextureWidth > 140) m_Info.u_nTextureWidth = 140;    //넘어가면 걍 140이라는.. ㅋ
            m_Info.u_nTextureHeight = 7;
            m_Info.u_strTexture = textureName[i];
            EndItem();
        }
    }
    
}

// function StartItem()
// {
//     local DrawItemInfo infoClear;
//     m_Info = infoClear;
// }
//
// function EndItem()
// {
//     m_Tooltip.DrawList.Length = m_Tooltip.DrawList.Length + 1;
//     m_Tooltip.DrawList[m_Tooltip.DrawList.Length-1] = m_Info;
// }

//퀘스트 아이템의 퀘스트 이름 표시
function AddTooltipItemQuestList(ItemInfo Item)
{
    local int i;
    
    //<관련 퀘스트>
    if(Item.RelatedQuestID[0] != 0)
    {
        StartItem();
        m_Info.eType = DIT_TEXT;
        m_Info.nOffSetY = 10;
        m_Info.bLineBreak = true;
        m_Info.t_bDrawOneLine = true;
        m_Info.t_strText = GetSystemString(1721);
        EndItem();
    }
    
    for(i = 0 ; i<MAX_RELATED_QUEST ; i++)
    {       
        if(Item.RelatedQuestID[i] != 0)
        {
            StartItem();
            m_Info.eType = DIT_TEXT;
            m_Info.nOffSetY = 6;
            m_Info.t_color.R = 163;
            m_Info.t_color.G = 163;
            m_Info.t_color.B = 163;
            m_Info.t_color.A = 255;
            m_Info.bLineBreak = true;
            m_Info.t_bDrawOneLine = true;
            m_Info.t_strText = class'UIDATA_QUEST'.static.GetQuestName(Item.RelatedQuestID[i]);;
            EndItem();
        }
    }
}


// 속성의 레벨값을 전역변수에 저장    //자료가 많아서 전역변수에 집어넣는다.

function SetAttackAttribute(int Attvalue, int type)
{
    if( AttValue >= 375)    // 9렙    375 ~ 450
    {
        AttackAttLevel[type] = 9;
        AttackAttMaxValue[type] = 75;
        AttackAttCurrValue[type] = AttValue - 375;
    }
    else if( AttValue >= 325)    // 8렙    325 ~ 375
    {
        AttackAttLevel[type] = 8;
        AttackAttMaxValue[type] = 50;
        AttackAttCurrValue[type] = AttValue - 325;
    }
    else if( AttValue >= 300)    // 7렙    300 ~ 325
    {
        AttackAttLevel[type] = 7;
        AttackAttMaxValue[type] = 25;
        AttackAttCurrValue[type] = AttValue - 300;
    }
    else if( AttValue >= 225)    // 6렙    225 ~ 300
    {
        AttackAttLevel[type] = 6;
        AttackAttMaxValue[type] = 75;
        AttackAttCurrValue[type] = AttValue - 225;
    }
    else if( AttValue >= 175)    // 5렙    175 ~ 225
    {
        AttackAttLevel[type] = 5;
        AttackAttMaxValue[type] = 50;
        AttackAttCurrValue[type] = AttValue - 175;
    }
    else if( AttValue >= 150)    // 4렙    150 ~ 175
    {
        AttackAttLevel[type] = 4;
        AttackAttMaxValue[type] = 25;
        AttackAttCurrValue[type] = AttValue - 150;
    }
    else if( AttValue >= 75)    // 3렙    75 ~ 150
    {
        AttackAttLevel[type] = 3;
        AttackAttMaxValue[type] = 75;
        AttackAttCurrValue[type] = AttValue - 75;
    }
    else if( AttValue >= 25)    // 2렙    25~ 75
    {
        AttackAttLevel[type] = 2;
        AttackAttMaxValue[type] = 50;
        AttackAttCurrValue[type] = AttValue - 25;
    }
    else    // else 0~ 25
    {
        AttackAttLevel[type] = 1;
        AttackAttMaxValue[type] = 25;
        AttackAttCurrValue[type] = AttValue;
    }   
}
// 속성의 레벨값을 전역변수에 저장    //자료가 많아서 전역변수에 집어넣는다.


function SetDefAttribute(int Defvalue, int type)
{
    if( DefValue >= 150)    // 9렙        150~180
    {
        DefAttLevel[type] = 9;
        DefAttMaxValue[type] = 30;
        DefAttCurrValue[type] = DefValue - 150;
    }
    else if( DefValue >= 132)    // 8렙    132 ~ 150
    {
        DefAttLevel[type] = 8;
        DefAttMaxValue[type] = 18;
        DefAttCurrValue[type] = DefValue - 132;
    }
    else if( DefValue >= 120)    // 7렙    120 ~ 132
    {
        DefAttLevel[type] = 7;
        DefAttMaxValue[type] = 12;
        DefAttCurrValue[type] = DefValue - 120;
    }
    else if( DefValue >= 90)    // 6렙    90 ~ 120
    {
        DefAttLevel[type] = 6;
        DefAttMaxValue[type] = 30;
        DefAttCurrValue[type] = DefValue - 90;
    }
    else if( DefValue >= 72)    // 5렙    72 ~ 90
    {
        DefAttLevel[type] = 5;
        DefAttMaxValue[type] = 18;
        DefAttCurrValue[type] = DefValue - 72;
    }
    else if( DefValue >= 60)    // 4렙    60 ~ 72
    {
        DefAttLevel[type] = 4;
        DefAttMaxValue[type] = 12;
        DefAttCurrValue[type] = DefValue - 60;
    }
    else if( DefValue >= 30)    // 3렙    30 ~ 60
    {
        DefAttLevel[type] = 3;
        DefAttMaxValue[type] = 30;
        DefAttCurrValue[type] = DefValue - 30;
    }
    else if( DefValue >= 12)    // 2렙    // 12 ~ 30
    {
        DefAttLevel[type] = 2;
        DefAttMaxValue[type] = 18;
        DefAttCurrValue[type] = DefValue - 12;
    }
    else    // else                // 0~ 12
    {
        DefAttLevel[type] = 1;
        DefAttMaxValue[type] = 12;
        DefAttCurrValue[type] = DefValue;
    }   
}

//branch
function AddPrimeItemSymbol(ItemInfo Item)
{
    local string TextureName;

    if (Item.IsBRPremium != 2)
        return;

    TextureName = GetPrimeItemSymbolName();
    if (Len(TextureName)>0)
    {
        StartItem();
        m_Info.eType = DIT_TEXTURE;
        m_Info.nOffSetX = 2;
        m_Info.nOffSetY = 0;
        
        m_Info.u_nTextureWidth = 16;
        m_Info.u_nTextureHeight = 16;
            
        m_Info.u_nTextureUWidth = 16;
        m_Info.u_nTextureUHeight = 16;

        m_Info.u_strTexture = TextureName;
        EndItem();
    }
}
//end of branch
defaultproperties
{
}
 
Последнее редактирование:
если кто знает как ковырять NWindow.dll - буду благодарен, ибо идой с нахрапу не смог , а хех редактором пока не смог распознать нужные места.
Качаешь компилятор интерфейса ХФ из интернета, там же есть исходники.

Идёшь в tooltip.uc, находишь там что-то вроде NTT_ITEM..., в нём нечто вроде этого -
C#:
//Physical Damage
AddTooltipItemOption(94, String(GetPhysicalDamage(Item.WeaponType, Item.SlotBitType, Item.CrystalType, Item.Enchanted, Item.PhysicalDamage)), true, true, false);
          
//Masical Damage
AddTooltipItemOption(98, String(GetMagicalDamage(Item.WeaponType, Item.SlotBitType, Item.CrystalType, Item.Enchanted, Item.MagicalDamage)), true, true, false);

GetPhysicalDamage, GetMagicalDamage - как раз и есть вещи с концами в nwindow. Но раз у нас есть uc скрипты, значит мы можем костылить? Можем.

Додумываешься, как переделать это, что бы оно показывало что тебе надо. Получаешь рабочий вариант.
 
поискал по сети, нашёл для компиляции интерфейса Компилятор LUSE (Interface.u) и под видео для нескольких хроник, также отдельно скачал исходники из этой темы, на всякий случай пусть будут.

пока что попробую реализовать прирост характеристик при точке формулами арифметических прогрессий в FuncEnchant.java, интерфейс ковырять начну после, так как навыков нет, то на это придётся выделить много времени, которого пока что у меня нет в таком количестве, поэтому прошу пока не закрывать тему, думаю в течении нескольких месяцев всё доковыряю.
 
поискал по сети, нашёл для компиляции интерфейса Компилятор LUSE (Interface.u) и под видео для нескольких хроник, также отдельно скачал исходники из этой темы, на всякий случай пусть будут.

пока что попробую реализовать прирост характеристик при точке формулами арифметических прогрессий в FuncEnchant.java, интерфейс ковырять начну после, так как навыков нет, то на это придётся выделить много времени, которого пока что у меня нет в таком количестве, поэтому прошу пока не закрывать тему, думаю в течении нескольких месяцев всё доковыряю.
Вам ничего не мешает в клиенте, в ToolTip для типа предметов написать такую же функцию прогрессии, которая будет переопределять стандартные клиентские цифры на нужные вам
 
Вам ничего не мешает в клиенте, в ToolTip для типа предметов написать такую же функцию прогрессии, которая будет переопределять стандартные клиентские цифры на нужные вам
так и думал делать, но после серверной части.

сначала сделаю серверную часть, ведь без отображения визуальной части (тултипа в клиенте) у меня будет работать механика в части дамага так, как задано на стороне сервера, а отображение уже буду прикручивать после настойки формулы на стороне сервера, ведь изменение формулы усиления очень сильно повлияет на пдеф мдеф патк матк что надо будет практически настраивать и смотреть как эти изменения повлияют на игровую механику, в FuncEnchant.java прописаны для разного грейда, разного типа предметов разные значения хотя формула одна для всех, и как раз её я буду менять, хочу существенно увеличить добавление параметров на каждый шаг точки и на каждый грейд, и это можно делать без редактирования стороны клиента.

Тем более, что с джавой не знаком, поэтому пока методом тыка буду настраивать с чтением доков, а это всё время. Но меня ничего не подгоняет, сервер на локалке для себя, как ностальжи по нулевым.
 
Возможно будет проще легче и правильнее, если сможете сделать обработку пакетов скриптом интерфейса, который примет от сервера список параметров для заточки, например ключ "категория предмета * 1000000 + (грейд * 10000 + (тип предмета * 100) + уровень заточки)" и значение "N поинтов", а дальше уже сам ToolTip будет брать значение бонуса по параметрам исследуемого предмета у того скрипта. Получится что у игрока будет всегда актуальные цифры. Дублирование данных зло.
 
@KID,
Возможно будет проще легче и правильнее, если сможете сделать обработку пакетов скриптом интерфейса, который примет от сервера список параметров для заточки

я ещё плохо понимаю место, позицию скриптов интерфейса, о которых речь, но мне проще тогда отказаться от редактирования интерфейса клиента, чем реализовывать обработку пакетов скриптом интерфейса. На серверной стороне FuncEnchant.java задаёт алгоритм точки, который в клиенте вшит в nwindow.dll и Interface.u (со слов пользователей форума в сообщениях выше в этой теме), поэтому место скриптов интерфейса я сейчас не могу представить и к чему сопоставить термин "ToolTip", но редактируя FuncEnchant.java я получаю новый алгоритм точки предметов и там я могу реализовать задумку, и она будет полностью рабочей, только проблема в отображении характеристик при наведении курсора на предмет, но вся игровая механика будет брать значения из FuncEnchant.class
 
я ещё плохо понимаю место, позицию скриптов интерфейса, о которых речь, но мне проще тогда отказаться от редактирования интерфейса клиента, чем реализовывать обработку пакетов скриптом интерфейса. На серверной стороне FuncEnchant.java задаёт алгоритм точки, который в клиенте вшит в nwindow.dll и Interface.u (со слов пользователей форума в сообщениях выше в этой теме), поэтому место скриптов интерфейса я сейчас не могу представить и к чему сопоставить термин "ToolTip", но редактируя FuncEnchant.java я получаю новый алгоритм точки предметов и там я могу реализовать задумку, и она будет полностью рабочей, только проблема в отображении характеристик при наведении курсора на предмет, но вся игровая механика будет брать значения из FuncEnchant.class
отображении характеристик при наведении курсора на предмет - реализуется через
ToolTip
C#:
// 98    u,Маг. Атк.\0
function AddNewMagicalDamage( int WeaponType, int SlotBitType, int CrystalType, int Enchanted, int MagicalDamage )
{
    local string Content;
    
    StartItem();
    m_Info.eType = DIT_TEXT;
    m_Info.nOffSetY = 6;
    m_Info.bLineBreak = true;
    m_Info.t_bDrawOneLine = true;
    m_Info.t_color.R = 163;
    m_Info.t_color.G = 163;
    m_Info.t_color.B = 163;
    m_Info.t_color.A = 255;
    m_Info.t_ID = 98; // 98    u,Маг. Атк.\0
    EndItem();
    
    StartItem();
    m_Info.eType = DIT_TEXT;
    m_Info.nOffSetY = 6;
    m_Info.t_bDrawOneLine = true;
    m_Info.t_color.R = 163;
    m_Info.t_color.G = 163;
    m_Info.t_color.B = 163;
    m_Info.t_color.A = 255;
    m_Info.t_strText = " : ";
    EndItem();

    if(Enchanted > 0)
    {
        Content = string(MagicalDamage + getScrollEnchantBonus( CrystalType,  Enchanted)) $ " (" $ string(MagicalDamage) $ " +" $ string(getScrollEnchantBonus( CrystalType,  Enchanted)) $ ")";
    }
    else
    {
        Content = string(MagicalDamage);
    }

    StartItem();
    m_Info.eType = DIT_TEXT;
    m_Info.nOffSetY = 6;
    m_Info.t_bDrawOneLine = true;
    m_Info.t_color.R = 176;
    m_Info.t_color.G = 155;
    m_Info.t_color.B = 121;
    m_Info.t_color.A = 255;
    m_Info.t_strText = Content;
    EndItem();
}

function int getScrollEnchantBonus(int CrystalType, int Enchanted)
{
    local int overenchant;
    
    overenchant = 0;
    
    if (Enchanted > 3)
    {
        overenchant = Enchanted - 3;
        Enchanted = 3;
    }
    
    return (getWeaponCrystalEnchantP(CrystalType) * Enchanted) + ((getWeaponCrystalEnchantP(CrystalType) * 2) * overenchant);
}

    function int getWeaponCrystalEnchantP(int CrystalType)
    {
        local int enchant;
        
        switch (CrystalType)
        {
            case 5: // S
                enchant = 10;
                break;
            case 4: // A
                enchant = 8;
                break;
            case 3: // B
                enchant = 6;
                break;
            case 2: // C
                enchant = 4;
                break;
            case 0: // NONE
            case 1: // D
                enchant = 2;
                break;
            default:
                enchant = 0;
                break;
        }
        
        return enchant;
    }
 
LifeGame32,
отображении характеристик при наведении курсора на предмет - реализуется через ToolTip
у меня немного другой ToolTip.uc чем приведённый код у вас

я так понял мне нужно будет вписать свой алгоритм заточки в следующие места:
C#:
AddTooltipItemOption(95, String(GetPhysicalDefense(Item.CrystalType, Item.Enchanted, Item.PhysicalDefense)), true, true, false);
AddTooltipItemOption(99, String(GetMagicalDefense(Item.CrystalType, Item.Enchanted, Item.MagicalDefense)), true, true, false);
AddTooltipItemOption(94, String(GetPhysicalDamage(Item.WeaponType, Item.SlotBitType, Item.CrystalType, Item.Enchanted, Item.PhysicalDamage)), true, true, false);
AddTooltipItemOption(98, String(GetMagicalDamage(Item.WeaponType, Item.SlotBitType, Item.CrystalType, Item.Enchanted, Item.MagicalDamage)), true, true, false);
и скомпилить Interface.u
 
LifeGame32,

у меня немного другой ToolTip.uc чем приведённый код у вас

я так понял мне нужно будет вписать свой алгоритм заточки в следующие места:
C#:
AddTooltipItemOption(95, String(GetPhysicalDefense(Item.CrystalType, Item.Enchanted, Item.PhysicalDefense)), true, true, false);
AddTooltipItemOption(99, String(GetMagicalDefense(Item.CrystalType, Item.Enchanted, Item.MagicalDefense)), true, true, false);
AddTooltipItemOption(94, String(GetPhysicalDamage(Item.WeaponType, Item.SlotBitType, Item.CrystalType, Item.Enchanted, Item.PhysicalDamage)), true, true, false);
AddTooltipItemOption(98, String(GetMagicalDamage(Item.WeaponType, Item.SlotBitType, Item.CrystalType, Item.Enchanted, Item.MagicalDamage)), true, true, false);
и скомпилить Interface.u
да вам нужно написать новые методы расчета atk def . по вашим формулам для соответствия с сервером.
 
Назад
Сверху Снизу