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

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х и выше, а другой вариант, который описывается какой-нибудь арифметической прогрессией
 
Посмотреть вложение 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;
    }
}
 
или же имелось ввиду, что дамаг будет выдаваться учитывая изменения в FuncEnchant.java но при наведении курсора на предмет P.Atck в описании будет из dll (точно dll или может всё таки какая-то датка, ведь их можно редактировать)
Он имел ввиду визуально в тултипе будет все как и было ранее, это вшито на уровне клиента 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 скрипты, значит мы можем костылить? Можем.

Додумываешься, как переделать это, что бы оно показывало что тебе надо. Получаешь рабочий вариант.
 
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 . по вашим формулам для соответствия с сервером.
 
каких пойнтов?
уровень заточки ты имеешь в виду?

если в сборке явно не расписаны в каком-то хмл свойства всех свитков заточки (сколько прибавляют, шансы и т.д.), то значит все тупо захардкодено в ядре и тебе лезть в 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;
    }
}


но в джаве не силён, возможно кто подскажет куда дальше копать
 
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 или может всё таки какая-то датка, ведь их можно редактировать)
 
jois, - в описании предмета ничего не поменялось, но в статусе персонажа пересчитало согласно изменениям в FuncEnchant.java

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

если кто знает как ковырять NWindow.dll - буду благодарен, ибо идой с нахрапу не смог , а хех редактором пока не смог распознать нужные места.
 
поискал по сети, нашёл для компиляции интерфейса Компилятор 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
 
Назад
Сверху Снизу