Jump to content

hoseen450

Inactive Member
  • Posts

    25
  • Joined

  • Last visited

  • Feedback

    0%

Posts posted by hoseen450

  1. 	case USE_COSTUME_TRANSFORM:
    						{
    							LPITEM item2;
    							if (!IsValidItemPosition(DestCell) || !(item2 = GetItem(DestCell)))
    								return false;
    
    							if (item2->IsEquipped())
    							{
    								BuffOnAttr_RemoveBuffsFromItem(item2);
    							}
    
    							if (item2->IsExchanging() || item2->IsEquipped())
    								return false;
    							
    							if (item2->GetType() != ITEM_COSTUME)
    							{
    								ChatPacket(CHAT_TYPE_INFO, LC_TEXT("bu_nesneyi_bu_esyada_kullanamazsin"));
    								return false;
    							}
    
    							if (item2->GetAttributeCount() == 0)
    							{
    								ChatPacket(CHAT_TYPE_INFO, LC_TEXT("kostumda_hic_efsun_yok"));
    								return false;
    							}
    
    							if ( item2->GetSubType() != 0 || item2->GetSubType() != 1 )
    							{
    								ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ITEM_ISNT_COSTUME"));
    								return false;
    							}
    
    							if (item2->IsBind())
    							{
    								ChatPacket(CHAT_TYPE_INFO, LC_TEXT("kostum_kilitli"));
    								return false;
    							}

     

    5GBNBj.png

    https://metin2.download/picture/ct7O4N6g0B2LU8wk2c799b24W7Lz7Dfh/.gif

    GIF2GIF2GIF2GIF2

  2. 22 hours ago, Den said:

    Paste your uitooltip.py here.

    import dbg
    import player
    import item
    import grp
    import wndMgr
    import skill
    import shop
    import exchange
    import grpText
    import safebox
    import localeInfo
    import app
    import background
    import nonplayer
    import chr
    
    import ui
    import mouseModule
    import constInfo
    if app.ENABLE_SASH_SYSTEM:
    	import sash
    if app.ENABLE_CHANGELOOK_SYSTEM:
    	import changelook
    	
    WARP_SCROLLS = [22011, 22000, 22010]
    EXTRA_SLOT = [0,1,2,4,6,9,12,16]
    DESC_DEFAULT_MAX_COLS = 26 
    DESC_WESTERN_MAX_COLS = 35
    DESC_WESTERN_MAX_WIDTH = 220
    
    def chop(n):
    	return round(n - 0.5, 1)
    
    def pointop(n):
    	t = int(n)
    	if t / 10 < 1:
    		return "0."+n
    	else:		
    		return n[0:len(n)-1]+"."+n[len(n)-1:]
    
    def SplitDescription(desc, limit):
    	total_tokens = desc.split()
    	line_tokens = []
    	line_len = 0
    	lines = []
    	for token in total_tokens:
    		if "|" in token:
    			sep_pos = token.find("|")
    			line_tokens.append(token[:sep_pos])
    
    			lines.append(" ".join(line_tokens))
    			line_len = len(token) - (sep_pos + 1)
    			line_tokens = [token[sep_pos+1:]]
    		else:
    			line_len += len(token)
    			if len(line_tokens) + line_len > limit:
    				lines.append(" ".join(line_tokens))
    				line_len = len(token)
    				line_tokens = [token]
    			else:
    				line_tokens.append(token)
    	
    	if line_tokens:
    		lines.append(" ".join(line_tokens))
    
    	return lines
    
    ###################################################################################################
    ## ToolTip
    ##
    ##   NOTE : ??? Item? Skill? ???? ?? ?????
    ##          ??? ??? ??? ?? ??
    ##
    class ToolTip(ui.ThinBoard):
    
    	TOOL_TIP_WIDTH = 190
    	TOOL_TIP_HEIGHT = 10
    
    	TEXT_LINE_HEIGHT = 17
    
    	TITLE_COLOR = grp.GenerateColor(0.9490, 0.9058, 0.7568, 1.0)
    	SPECIAL_TITLE_COLOR = grp.GenerateColor(1.0, 0.7843, 0.0, 1.0)
    	NORMAL_COLOR = grp.GenerateColor(0.7607, 0.7607, 0.7607, 1.0)
    	FONT_COLOR = grp.GenerateColor(0.7607, 0.7607, 0.7607, 1.0)
    	PRICE_COLOR = 0xffFFB96D
    
    	HIGH_PRICE_COLOR = SPECIAL_TITLE_COLOR
    	MIDDLE_PRICE_COLOR = grp.GenerateColor(0.85, 0.85, 0.85, 1.0)
    	LOW_PRICE_COLOR = grp.GenerateColor(0.7, 0.7, 0.7, 1.0)
    
    	ENABLE_COLOR = grp.GenerateColor(0.7607, 0.7607, 0.7607, 1.0)
    	DISABLE_COLOR = grp.GenerateColor(0.9, 0.4745, 0.4627, 1.0)
    
    	NEGATIVE_COLOR = grp.GenerateColor(0.9, 0.4745, 0.4627, 1.0)
    	POSITIVE_COLOR = grp.GenerateColor(0.5411, 0.7254, 0.5568, 1.0)
    	SPECIAL_POSITIVE_COLOR = grp.GenerateColor(0.6911, 0.8754, 0.7068, 1.0)
    	SPECIAL_POSITIVE_COLOR2 = grp.GenerateColor(0.8824, 0.9804, 0.8824, 1.0)
    	
    	PRICE_INFO_COLOR = grp.GenerateColor(1.0, 0.88, 0.0, 1.0)
    	GEM_PRICE_COLOR = grp.GenerateColor(0.13, 0.77, 1.0, 1.0)
    
    	ITEM_BUFF_LEVEL_COLOR = 0xffffd300
    	ITEM_BUFF_TYPE_COLOR = 0xfffc9c3a
    	ITEM_BUFF_RATE_COLOR = 0xff40e0d0
    	ITEM_BUFF_DURATION_COLOR = 0xffadff00
    	ITEM_BUFF_USAGE_COLOR = 0xffffffff
    
    	SHOP_ITEM_COLOR = 0xfffff64e
    
    	CONDITION_COLOR = 0xffBEB47D
    	UNDER_LOOK_COLOR = 0xfffff64e
    	BEFORE_LOOK_COLOR = 0xff9A9CDB
    	CAN_LEVEL_UP_COLOR = 0xff8EC292
    	CANNOT_LEVEL_UP_COLOR = DISABLE_COLOR
    	NEED_SKILL_POINT_COLOR = 0xff9A9CDB
    
    	def __init__(self, width = TOOL_TIP_WIDTH, isPickable=FALSE):
    		ui.ThinBoard.__init__(self, "TOP_MOST")
    
    		if isPickable:
    			pass
    		else:
    			self.AddFlag("not_pick")
    
    		self.AddFlag("float")
    
    		self.followFlag = TRUE
    		self.toolTipWidth = width
    
    		self.xPos = -1
    		self.yPos = -1
    
    		self.defFontName = localeInfo.UI_DEF_FONT
    		self.ClearToolTip()
    
    	def __del__(self):
    		ui.ThinBoard.__del__(self)
    
    	def ClearToolTip(self):
    		self.toolTipHeight = 12
    		self.childrenList = []
    
    	def SetFollow(self, flag):
    		self.followFlag = flag
    
    	def SetDefaultFontName(self, fontName):
    		self.defFontName = fontName
    
    	def AppendSpace(self, size):
    		self.toolTipHeight += size
    		self.ResizeToolTip()
    
    	def AppendHorizontalLine(self):
    
    		for i in xrange(2):
    			horizontalLine = ui.Line()
    			horizontalLine.SetParent(self)
    			horizontalLine.SetPosition(0, self.toolTipHeight + 3 + i)
    			horizontalLine.SetWindowHorizontalAlignCenter()
    			horizontalLine.SetSize(150, 0)
    			horizontalLine.Show()
    
    			if 0 == i:
    				horizontalLine.SetColor(0xff555555)
    			else:
    				horizontalLine.SetColor(0xff000000)
    
    			self.childrenList.append(horizontalLine)
    
    		self.toolTipHeight += 11
    		self.ResizeToolTip()
    
    	def AlignHorizonalCenter(self):
    		for child in self.childrenList:
    			(x, y)=child.GetLocalPosition()
    			child.SetPosition(self.toolTipWidth/2, y)
    
    		self.ResizeToolTip()
    
    	def AutoAppendTextLine(self, text, color = FONT_COLOR, centerAlign = True):
    		textLine = ui.TextLine()
    		textLine.SetParent(self)
    		textLine.SetFontName(self.defFontName)
    		textLine.SetPackedFontColor(color)
    		textLine.SetText(text)
    		textLine.SetOutline()
    		textLine.SetFeather(False)
    		textLine.Show()
    
    		if centerAlign:
    			textLine.SetPosition(self.toolTipWidth/2, self.toolTipHeight)
    			textLine.SetHorizontalAlignCenter()
    
    		else:
    			textLine.SetPosition(10, self.toolTipHeight)
    
    		self.childrenList.append(textLine)
    
    		(textWidth, textHeight)=textLine.GetTextSize()
    
    		textWidth += 40
    		textHeight += 5
    
    		if self.toolTipWidth < textWidth:
    			self.toolTipWidth = textWidth
    
    		self.toolTipHeight += textHeight
    
    		return textLine
    
    	def SetThinBoardSize(self, width, height = 12) :
    		self.toolTipWidth = width 
    		self.toolTipHeight = height
    
    	def AutoAppendNewTextLine(self, text, color = FONT_COLOR, centerAlign = True):
    		textLine = ui.TextLine()
    		textLine.SetParent(self)
    		textLine.SetFontName(self.defFontName)
    		textLine.SetPackedFontColor(color)
    		textLine.SetText(text)
    		textLine.SetOutline()
    		textLine.SetFeather(FALSE)
    		textLine.Show()
    		if localeInfo.IsARABIC():
    			textLine.SetHorizontalAlignRight()
    		
    		textLine.SetPosition(15, self.toolTipHeight)
    		
    		self.childrenList.append(textLine)
    		(textWidth, textHeight) = textLine.GetTextSize()
    		textWidth += 30
    		textHeight += 10
    		if self.toolTipWidth < textWidth:
    			self.toolTipWidth = textWidth
    		
    		self.toolTipHeight += textHeight
    		self.ResizeToolTipText(textWidth, self.toolTipHeight)
    		return textLine
    
    	def AppendTextLine(self, text, color = FONT_COLOR, centerAlign = True):
    		textLine = ui.TextLine()
    		textLine.SetParent(self)
    		textLine.SetFontName(self.defFontName)
    		textLine.SetPackedFontColor(color)
    		textLine.SetText(text)
    		textLine.SetOutline()
    		textLine.SetFeather(False)
    		textLine.Show()
    
    		if centerAlign:
    			textLine.SetPosition(self.toolTipWidth/2, self.toolTipHeight)
    			textLine.SetHorizontalAlignCenter()
    
    		else:
    			textLine.SetPosition(10, self.toolTipHeight)
    
    		self.childrenList.append(textLine)
    
    		self.toolTipHeight += self.TEXT_LINE_HEIGHT
    		self.ResizeToolTip()
    
    		return textLine
    
    	def AppendDescription(self, desc, limit, color = FONT_COLOR):
    		if localeInfo.IsEUROPE():
    			self.__AppendDescription_WesternLanguage(desc, color)
    		else:
    			self.__AppendDescription_EasternLanguage(desc, limit, color)
    
    	def __AppendDescription_EasternLanguage(self, description, characterLimitation, color=FONT_COLOR):
    		length = len(description)
    		if 0 == length:
    			return
    
    		lineCount = grpText.GetSplitingTextLineCount(description, characterLimitation)
    		for i in xrange(lineCount):
    			if 0 == i:
    				self.AppendSpace(5)
    			self.AppendTextLine(grpText.GetSplitingTextLine(description, characterLimitation, i), color)
    
    	def __AppendDescription_WesternLanguage(self, desc, color=FONT_COLOR):
    		lines = SplitDescription(desc, DESC_WESTERN_MAX_COLS)
    		if not lines:
    			return
    
    		self.AppendSpace(5)
    		for line in lines:
    			self.AppendTextLine(line, color)
    
    
    	def ResizeToolTip(self):
    		self.SetSize(self.toolTipWidth, self.TOOL_TIP_HEIGHT + self.toolTipHeight)
    
    	def ResizeToolTipText(self, x, y):
    		self.SetSize(x, y)
    
    	def SetTitle(self, name):
    		self.AppendTextLine(name, self.TITLE_COLOR)
    
    	def GetLimitTextLineColor(self, curValue, limitValue):
    		if curValue < limitValue:
    			return self.DISABLE_COLOR
    
    		return self.ENABLE_COLOR
    
    	def GetChangeTextLineColor(self, value, isSpecial=FALSE):
    		if value > 0:
    			if isSpecial:
    				return self.SPECIAL_POSITIVE_COLOR
    			else:
    				return self.POSITIVE_COLOR
    
    		if 0 == value:
    			return self.NORMAL_COLOR
    
    		return self.NEGATIVE_COLOR
    
    	def SetToolTipPosition(self, x = -1, y = -1):
    		self.xPos = x
    		self.yPos = y
    
    	def ShowToolTip(self):
    		self.SetTop()
    		self.Show()
    
    		self.OnUpdate()
    
    	def HideToolTip(self):
    		self.Hide()
    
    	def OnUpdate(self):
    
    		if not self.followFlag:
    			return
    
    		x = 0
    		y = 0
    		width = self.GetWidth()
    		height = self.toolTipHeight
    
    		if -1 == self.xPos and -1 == self.yPos:
    
    			(mouseX, mouseY) = wndMgr.GetMousePosition()
    
    			if mouseY < wndMgr.GetScreenHeight() - 300:
    				y = mouseY + 40
    			else:
    				y = mouseY - height - 30
    
    			x = mouseX - width/2				
    
    		else:
    
    			x = self.xPos - width/2
    			y = self.yPos - height
    
    		x = max(x, 0)
    		y = max(y, 0)
    		x = min(x + width/2, wndMgr.GetScreenWidth() - width/2) - width/2
    		y = min(y + self.GetHeight(), wndMgr.GetScreenHeight()) - self.GetHeight()
    
    		parentWindow = self.GetParentProxy()
    		if parentWindow:
    			(gx, gy) = parentWindow.GetGlobalPosition()
    			x -= gx
    			y -= gy
    
    		self.SetPosition(x, y)
    
    class ItemToolTip(ToolTip):
    
    	if app.ENABLE_SEND_TARGET_INFO:
    		isStone = False
    		isBook = False
    		isBook2 = False
    
    	CHARACTER_NAMES = ( 
    		localeInfo.TOOLTIP_WARRIOR,
    		localeInfo.TOOLTIP_ASSASSIN,
    		localeInfo.TOOLTIP_SURA,
    		localeInfo.TOOLTIP_SHAMAN,
    		localeInfo.TOOLTIP_WOLFMAN	
    	)		
    
    	CHARACTER_COUNT = len(CHARACTER_NAMES)
    	WEAR_NAMES = ( 
    		localeInfo.TOOLTIP_ARMOR, 
    		localeInfo.TOOLTIP_HELMET, 
    		localeInfo.TOOLTIP_SHOES, 
    		localeInfo.TOOLTIP_WRISTLET, 
    		localeInfo.TOOLTIP_WEAPON, 
    		localeInfo.TOOLTIP_NECK,
    		localeInfo.TOOLTIP_EAR,
    		localeInfo.TOOLTIP_UNIQUE,
    		localeInfo.TOOLTIP_SHIELD,
    		localeInfo.TOOLTIP_ARROW,
    	)
    	WEAR_COUNT = len(WEAR_NAMES)
    
    	AFFECT_DICT = {
    		item.APPLY_MAX_HP : localeInfo.TOOLTIP_MAX_HP,
    		item.APPLY_MAX_SP : localeInfo.TOOLTIP_MAX_SP,
    		item.APPLY_CON : localeInfo.TOOLTIP_CON,
    		item.APPLY_INT : localeInfo.TOOLTIP_INT,
    		item.APPLY_STR : localeInfo.TOOLTIP_STR,
    		item.APPLY_DEX : localeInfo.TOOLTIP_DEX,
    		item.APPLY_ATT_SPEED : localeInfo.TOOLTIP_ATT_SPEED,
    		item.APPLY_MOV_SPEED : localeInfo.TOOLTIP_MOV_SPEED,
    		item.APPLY_CAST_SPEED : localeInfo.TOOLTIP_CAST_SPEED,
    		item.APPLY_HP_REGEN : localeInfo.TOOLTIP_HP_REGEN,
    		item.APPLY_SP_REGEN : localeInfo.TOOLTIP_SP_REGEN,
    		item.APPLY_POISON_PCT : localeInfo.TOOLTIP_APPLY_POISON_PCT,
    		item.APPLY_STUN_PCT : localeInfo.TOOLTIP_APPLY_STUN_PCT,
    		item.APPLY_SLOW_PCT : localeInfo.TOOLTIP_APPLY_SLOW_PCT,
    		item.APPLY_CRITICAL_PCT : localeInfo.TOOLTIP_APPLY_CRITICAL_PCT,
    		item.APPLY_PENETRATE_PCT : localeInfo.TOOLTIP_APPLY_PENETRATE_PCT,
    
    		item.APPLY_ATTBONUS_WARRIOR : localeInfo.TOOLTIP_APPLY_ATTBONUS_WARRIOR,
    		item.APPLY_ATTBONUS_ASSASSIN : localeInfo.TOOLTIP_APPLY_ATTBONUS_ASSASSIN,
    		item.APPLY_ATTBONUS_SURA : localeInfo.TOOLTIP_APPLY_ATTBONUS_SURA,
    		item.APPLY_ATTBONUS_SHAMAN : localeInfo.TOOLTIP_APPLY_ATTBONUS_SHAMAN,
    		item.APPLY_ATTBONUS_MONSTER : localeInfo.TOOLTIP_APPLY_ATTBONUS_MONSTER,
    
    		item.APPLY_ATTBONUS_HUMAN : localeInfo.TOOLTIP_APPLY_ATTBONUS_HUMAN,
    		item.APPLY_ATTBONUS_ANIMAL : localeInfo.TOOLTIP_APPLY_ATTBONUS_ANIMAL,
    		item.APPLY_ATTBONUS_ORC : localeInfo.TOOLTIP_APPLY_ATTBONUS_ORC,
    		item.APPLY_ATTBONUS_MILGYO : localeInfo.TOOLTIP_APPLY_ATTBONUS_MILGYO,
    		item.APPLY_ATTBONUS_UNDEAD : localeInfo.TOOLTIP_APPLY_ATTBONUS_UNDEAD,
    		item.APPLY_ATTBONUS_DEVIL : localeInfo.TOOLTIP_APPLY_ATTBONUS_DEVIL,
    		item.APPLY_STEAL_HP : localeInfo.TOOLTIP_APPLY_STEAL_HP,
    		item.APPLY_STEAL_SP : localeInfo.TOOLTIP_APPLY_STEAL_SP,
    		item.APPLY_MANA_BURN_PCT : localeInfo.TOOLTIP_APPLY_MANA_BURN_PCT,
    		item.APPLY_DAMAGE_SP_RECOVER : localeInfo.TOOLTIP_APPLY_DAMAGE_SP_RECOVER,
    		item.APPLY_BLOCK : localeInfo.TOOLTIP_APPLY_BLOCK,
    		item.APPLY_DODGE : localeInfo.TOOLTIP_APPLY_DODGE,
    		item.APPLY_RESIST_SWORD : localeInfo.TOOLTIP_APPLY_RESIST_SWORD,
    		item.APPLY_RESIST_TWOHAND : localeInfo.TOOLTIP_APPLY_RESIST_TWOHAND,
    		item.APPLY_RESIST_DAGGER : localeInfo.TOOLTIP_APPLY_RESIST_DAGGER,
    		item.APPLY_RESIST_BELL : localeInfo.TOOLTIP_APPLY_RESIST_BELL,
    		item.APPLY_RESIST_FAN : localeInfo.TOOLTIP_APPLY_RESIST_FAN,
    		item.APPLY_RESIST_BOW : localeInfo.TOOLTIP_RESIST_BOW,
    		item.APPLY_RESIST_FIRE : localeInfo.TOOLTIP_RESIST_FIRE,
    		item.APPLY_RESIST_ELEC : localeInfo.TOOLTIP_RESIST_ELEC,
    		item.APPLY_RESIST_MAGIC : localeInfo.TOOLTIP_RESIST_MAGIC,
    		item.APPLY_RESIST_WIND : localeInfo.TOOLTIP_APPLY_RESIST_WIND,
    		item.APPLY_REFLECT_MELEE : localeInfo.TOOLTIP_APPLY_REFLECT_MELEE,
    		item.APPLY_REFLECT_CURSE : localeInfo.TOOLTIP_APPLY_REFLECT_CURSE,
    		item.APPLY_POISON_REDUCE : localeInfo.TOOLTIP_APPLY_POISON_REDUCE,
    		item.APPLY_KILL_SP_RECOVER : localeInfo.TOOLTIP_APPLY_KILL_SP_RECOVER,
    		item.APPLY_EXP_DOUBLE_BONUS : localeInfo.TOOLTIP_APPLY_EXP_DOUBLE_BONUS,
    		item.APPLY_GOLD_DOUBLE_BONUS : localeInfo.TOOLTIP_APPLY_GOLD_DOUBLE_BONUS,
    		item.APPLY_ITEM_DROP_BONUS : localeInfo.TOOLTIP_APPLY_ITEM_DROP_BONUS,
    		item.APPLY_POTION_BONUS : localeInfo.TOOLTIP_APPLY_POTION_BONUS,
    		item.APPLY_KILL_HP_RECOVER : localeInfo.TOOLTIP_APPLY_KILL_HP_RECOVER,
    		item.APPLY_IMMUNE_STUN : localeInfo.TOOLTIP_APPLY_IMMUNE_STUN,
    		item.APPLY_IMMUNE_SLOW : localeInfo.TOOLTIP_APPLY_IMMUNE_SLOW,
    		item.APPLY_IMMUNE_FALL : localeInfo.TOOLTIP_APPLY_IMMUNE_FALL,
    		item.APPLY_BOW_DISTANCE : localeInfo.TOOLTIP_BOW_DISTANCE,
    		item.APPLY_DEF_GRADE_BONUS : localeInfo.TOOLTIP_DEF_GRADE,
    		item.APPLY_ATT_GRADE_BONUS : localeInfo.TOOLTIP_ATT_GRADE,
    		item.APPLY_MAGIC_ATT_GRADE : localeInfo.TOOLTIP_MAGIC_ATT_GRADE,
    		item.APPLY_MAGIC_DEF_GRADE : localeInfo.TOOLTIP_MAGIC_DEF_GRADE,
    		item.APPLY_MAX_STAMINA : localeInfo.TOOLTIP_MAX_STAMINA,
    		item.APPLY_MALL_ATTBONUS : localeInfo.TOOLTIP_MALL_ATTBONUS,
    		item.APPLY_MALL_DEFBONUS : localeInfo.TOOLTIP_MALL_DEFBONUS,
    		item.APPLY_MALL_EXPBONUS : localeInfo.TOOLTIP_MALL_EXPBONUS,
    		item.APPLY_MALL_ITEMBONUS : localeInfo.TOOLTIP_MALL_ITEMBONUS,
    		item.APPLY_MALL_GOLDBONUS : localeInfo.TOOLTIP_MALL_GOLDBONUS,
    		item.APPLY_SKILL_DAMAGE_BONUS : localeInfo.TOOLTIP_SKILL_DAMAGE_BONUS,
    		item.APPLY_NORMAL_HIT_DAMAGE_BONUS : localeInfo.TOOLTIP_NORMAL_HIT_DAMAGE_BONUS,
    		item.APPLY_SKILL_DEFEND_BONUS : localeInfo.TOOLTIP_SKILL_DEFEND_BONUS,
    		item.APPLY_NORMAL_HIT_DEFEND_BONUS : localeInfo.TOOLTIP_NORMAL_HIT_DEFEND_BONUS,
    		item.APPLY_PC_BANG_EXP_BONUS : localeInfo.TOOLTIP_MALL_EXPBONUS_P_STATIC,
    		item.APPLY_PC_BANG_DROP_BONUS : localeInfo.TOOLTIP_MALL_ITEMBONUS_P_STATIC,
    		item.APPLY_RESIST_WARRIOR : localeInfo.TOOLTIP_APPLY_RESIST_WARRIOR,
    		item.APPLY_RESIST_ASSASSIN : localeInfo.TOOLTIP_APPLY_RESIST_ASSASSIN,
    		item.APPLY_RESIST_SURA : localeInfo.TOOLTIP_APPLY_RESIST_SURA,
    		item.APPLY_RESIST_SHAMAN : localeInfo.TOOLTIP_APPLY_RESIST_SHAMAN,
    		item.APPLY_MAX_HP_PCT : localeInfo.TOOLTIP_APPLY_MAX_HP_PCT,
    		item.APPLY_MAX_SP_PCT : localeInfo.TOOLTIP_APPLY_MAX_SP_PCT,
    		item.APPLY_ENERGY : localeInfo.TOOLTIP_ENERGY,
    		item.APPLY_COSTUME_ATTR_BONUS : localeInfo.TOOLTIP_COSTUME_ATTR_BONUS,
    
    		item.APPLY_MAGIC_ATTBONUS_PER : localeInfo.TOOLTIP_MAGIC_ATTBONUS_PER,
    		item.APPLY_MELEE_MAGIC_ATTBONUS_PER : localeInfo.TOOLTIP_MELEE_MAGIC_ATTBONUS_PER,
    		item.APPLY_RESIST_ICE : localeInfo.TOOLTIP_RESIST_ICE,
    		item.APPLY_RESIST_EARTH : localeInfo.TOOLTIP_RESIST_EARTH,
    		item.APPLY_RESIST_DARK : localeInfo.TOOLTIP_RESIST_DARK,
    		item.APPLY_ANTI_CRITICAL_PCT : localeInfo.TOOLTIP_ANTI_CRITICAL_PCT,
    		item.APPLY_ANTI_PENETRATE_PCT : localeInfo.TOOLTIP_ANTI_PENETRATE_PCT,
    		item.APPLY_BLEEDING_PCT : localeInfo.TOOLTIP_APPLY_BLEEDING_PCT,
    		item.APPLY_BLEEDING_REDUCE : localeInfo.TOOLTIP_APPLY_BLEEDING_REDUCE,
    		item.APPLY_ATTBONUS_WOLFMAN : localeInfo.TOOLTIP_APPLY_ATTBONUS_WOLFMAN,
    		item.APPLY_RESIST_WOLFMAN : localeInfo.TOOLTIP_APPLY_RESIST_WOLFMAN,
    		item.APPLY_RESIST_CLAW : localeInfo.TOOLTIP_APPLY_RESIST_CLAW,
    	}
    
    	if app.ENABLE_ANTI_RESIST_MAGIC_BONUS_SYSTEM:
    		AFFECT_DICT.update({
    			item.APPLY_ANTI_RESIST_MAGIC : localeInfo.APPLY_ANTI_RESIST_MAGIC,
    		})
    
    	ATTRIBUTE_NEED_WIDTH = {
    		23 : 230,
    		24 : 230,
    		25 : 230,
    		26 : 220,
    		27 : 210,
    
    		35 : 210,
    		36 : 210,
    		37 : 210,
    		38 : 210,
    		39 : 210,
    		40 : 210,
    		41 : 210,
    
    		42 : 220,
    		43 : 230,
    		45 : 230,
    	}
    
    	ANTI_FLAG_DICT = {
    		0 : item.ITEM_ANTIFLAG_WARRIOR,
    		1 : item.ITEM_ANTIFLAG_ASSASSIN,
    		2 : item.ITEM_ANTIFLAG_SURA,
    		3 : item.ITEM_ANTIFLAG_SHAMAN,
    		4 : item.ITEM_ANTIFLAG_WOLFMAN,
    	}
    
    	FONT_COLOR = grp.GenerateColor(0.7607, 0.7607, 0.7607, 1.0)
    
    	def __init__(self, *args, **kwargs):
    		ToolTip.__init__(self, *args, **kwargs)
    		self.itemVnum = 0
    		self.isShopItem = FALSE
    		self.isOfflineShopItem = FALSE
    
    		# ??? ??? ??? ? ?? ???? ??? ? ?? ?????? ??? Disable Color? ?? (?? ??? ???? ??? ?? ? ??? ???)
    		self.bCannotUseItemForceSetDisableColor = TRUE 
    
    	def __del__(self):
    		ToolTip.__del__(self)
    
    	def SetCannotUseItemForceSetDisableColor(self, enable):
    		self.bCannotUseItemForceSetDisableColor = enable
    
    	def CanEquip(self):
    		if not item.IsEquipmentVID(self.itemVnum):
    			return TRUE
    
    		race = player.GetRace()
    		job = chr.RaceToJob(race)
    		if not self.ANTI_FLAG_DICT.has_key(job):
    			return FALSE
    
    		if item.IsAntiFlag(self.ANTI_FLAG_DICT[job]):
    			return FALSE
    
    		sex = chr.RaceToSex(race)
    		
    		MALE = 1
    		FEMALE = 0
    
    		if item.IsAntiFlag(item.ITEM_ANTIFLAG_MALE) and sex == MALE:
    			return FALSE
    
    		if item.IsAntiFlag(item.ITEM_ANTIFLAG_FEMALE) and sex == FEMALE:
    			return FALSE
    
    		for i in xrange(item.LIMIT_MAX_NUM):
    			(limitType, limitValue) = item.GetLimit(i)
    
    			if item.LIMIT_LEVEL == limitType:
    				if player.GetStatus(player.LEVEL) < limitValue:
    					return FALSE
    			"""
    			elif item.LIMIT_STR == limitType:
    				if player.GetStatus(player.ST) < limitValue:
    					return FALSE
    			elif item.LIMIT_DEX == limitType:
    				if player.GetStatus(player.DX) < limitValue:
    					return FALSE
    			elif item.LIMIT_INT == limitType:
    				if player.GetStatus(player.IQ) < limitValue:
    					return FALSE
    			elif item.LIMIT_CON == limitType:
    				if player.GetStatus(player.HT) < limitValue:
    					return FALSE
    			"""
    
    		return TRUE
    
    	def AppendTextLine(self, text, color = FONT_COLOR, centerAlign = TRUE):
    		if not self.CanEquip() and self.bCannotUseItemForceSetDisableColor:
    			color = self.DISABLE_COLOR
    
    		return ToolTip.AppendTextLine(self, text, color, centerAlign)
    
    	def ClearToolTip(self):
    		self.isShopItem = FALSE
    		self.isOfflineShopItem = FALSE
    		self.toolTipWidth = self.TOOL_TIP_WIDTH
    		ToolTip.ClearToolTip(self)
    
    	def SetInventoryItem(self, slotIndex, window_type = player.INVENTORY):
    		itemVnum = player.GetItemIndex(window_type, slotIndex)
    		if 0 == itemVnum:
    			return
    
    		self.ClearToolTip()
    		if shop.IsOpen():
    			if not shop.IsPrivateShop() or not shop.IsOfflineShop():
    				item.SelectItem(itemVnum)
    				self.AppendSellingPrice(player.GetISellItemPrice(window_type, slotIndex)*5)
    
    		metinSlot = [player.GetItemMetinSocket(window_type, slotIndex, i) for i in xrange(player.METIN_SOCKET_MAX_NUM)]
    		attrSlot = [player.GetItemAttribute(window_type, slotIndex, i) for i in xrange(player.ATTRIBUTE_SLOT_MAX_NUM)]
    
    		if app.ENABLE_CHANGELOOK_SYSTEM:
    			self.AddItemData(itemVnum, metinSlot, attrSlot, 0, player.INVENTORY, slotIndex)
    		else:
    			self.AddItemData(itemVnum, metinSlot, attrSlot)
    			# self.AddItemData(itemVnum, metinSlot, attrSlot, 0, player.INVENTORY, slotIndex)
    		# else:
    			# self.AddItemData(itemVnum, metinSlot, attrSlot)
    		self.__AppendSealInformation(player.INVENTORY, slotIndex)
    		
    	def SetOfflineShopBuilderItem(self, invenType, invenPos, offlineShopIndex):
    		itemVnum = player.GetItemIndex(invenType, invenPos)
    		if (itemVnum == 0):
    			return
    
    		self.ClearToolTip()
    		item.SelectItem(itemVnum)
    		#self.AppendSellingPrice(shop.GetOfflineShopItemPrice2(invenType, invenPos))
    
    		metinSlot = []
    		for i in xrange(player.METIN_SOCKET_MAX_NUM):
    			metinSlot.append(player.GetItemMetinSocket(invenPos, i))
    		attrSlot = []
    		for i in xrange(player.ATTRIBUTE_SLOT_MAX_NUM):
    			attrSlot.append(player.GetItemAttribute(invenPos, i))
    		
    		if app.ENABLE_CHANGELOOK_SYSTEM:
    			self.AddItemData(itemVnum, metinSlot, attrSlot, 0, invenType, invenPos)
    		else:
    			self.AddItemData(itemVnum, metinSlot, attrSlot, 0)
    
    		price = shop.GetOfflineShopItemPrice2(invenType, invenPos)
    
    		if app.ENABLE_CHEQUE_SYSTEM:
    			price_cheque = shop.GetOfflineShopItemPriceCheque2(invenType, invenPos)
    			price_yang = shop.GetOfflineShopItemPrice2(invenType, invenPos)
    			self.AppendSpace(5)
    			self.AppendTextLine(localeInfo.CHEQUE_SYSTEM_SELL_PRICE, grp.GenerateColor(255./255, 246./255, 78./255, 1.0))
    			if price_cheque > 0:
    				self.AppendSpace(5)
    				self.AppendTextLine(localeInfo.NumberToWonString(price_cheque), grp.GenerateColor(0./255, 215./255, 255./255, 1.0))
    			if price_yang > 0:
    				self.AppendSpace(5)
    				self.AppendTextLine(localeInfo.NumberToGoldString(price), self.GetPriceColor(price))
    		else:
    			self.AppendTextLine(localeInfo.NumberToGoldString(price), self.GetPriceColor(price))
    		
    	def SetOfflineShopItem(self, slotIndex, addprice = 0, waltype = 0):
    		itemVnum = shop.GetOfflineShopItemID(slotIndex)
    		if (itemVnum == 0):
    			return
    			
    		price = shop.GetOfflineShopItemPrice(slotIndex)
    		if app.ENABLE_CHEQUE_SYSTEM:
    			price_cheque = shop.GetOfflineShopItemPriceCheque(slotIndex)
    			price_yang = shop.GetOfflineShopItemPrice(slotIndex)
    		self.ClearToolTip()
    		self.isOfflineShopItem = TRUE
    		
    		metinSlot = []
    		for i in xrange(player.METIN_SOCKET_MAX_NUM):
    			metinSlot.append(shop.GetOfflineShopItemMetinSocket(slotIndex, i))
    		attrSlot = []
    		for i in xrange(player.ATTRIBUTE_SLOT_MAX_NUM):
    			attrSlot.append(shop.GetOfflineShopItemAttribute(slotIndex, i))
    			
    		if app.ENABLE_CHANGELOOK_SYSTEM:
    			transmutation = shop.GetOfflineShopItemTransmutation(slotIndex)
    			if not transmutation:
    				self.AddItemData(itemVnum, metinSlot, attrSlot)
    			else:
    				self.AddItemData(itemVnum, metinSlot, attrSlot, 0, player.INVENTORY, -1, transmutation)
    		else:
    			self.AddItemData(itemVnum, metinSlot, attrSlot)
    		if waltype == 0:
    			if app.ENABLE_CHEQUE_SYSTEM:
    				if shop.IsOfflineShop():
    					self.AppendSpace(5)
    					self.AppendTextLine(localeInfo.CHEQUE_SYSTEM_SELL_PRICE, grp.GenerateColor(255./255, 246./255, 78./255, 1.0))
    					if price_cheque > 0:
    						self.AppendSpace(5)
    						self.AppendTextLine(localeInfo.NumberToWonString(price_cheque), grp.GenerateColor(0./255, 215./255, 255./255, 1.0))
    					if price_yang > 0:
    						self.AppendSpace(5)
    						self.AppendTextLine(localeInfo.NumberToGoldString(price), self.GetPriceColor(price))
    				else:
    					self.AppendSpace(5)
    					self.AppendTextLine(localeInfo.CHEQUE_SYSTEM_SELL_PRICE, grp.GenerateColor(255./255, 246./255, 78./255, 1.0))
    					if price_cheque > 0:
    						self.AppendSpace(5)
    						self.AppendTextLine(localeInfo.NumberToWonString(price_cheque), grp.GenerateColor(0./255, 215./255, 255./255, 1.0))
    					if price_yang > 0:
    						self.AppendSpace(5)
    						self.AppendTextLine(localeInfo.NumberToGoldString(price), self.GetPriceColor(price))
    			else:
    				self.AppendPrice(price)
    		else:
    			self.AppendSpace(5)
    			self.AppendTextLine(localeInfo.TOOLTIP_BUYPRICE % (localeInfo.NumberToMoneyString(addprice)[:-5]), self.SPECIAL_TITLE_COLOR)
    
    	def SetInventoryItemAttrTransfer(self, slotIndex_1, slotIndex_2, window_type = player.INVENTORY):
    		itemVnum = player.GetItemIndex(window_type, slotIndex_1)
    		itemVnum_2 = player.GetItemIndex(window_type, slotIndex_2)
    		if itemVnum == 0 or itemVnum_2 == 0:
    			return
    		
    		self.ClearToolTip()
    		if shop.IsOpen():
    			if not shop.IsPrivateShop() or not shop.IsOfflineShop():
    				item.SelectItem(itemVnum)
    				self.AppendSellingPrice(player.GetISellItemPrice(window_type, slotIndex_2))
    		
    		metinSlot = [player.GetItemMetinSocket(window_type, slotIndex_2, i) for i in xrange(player.METIN_SOCKET_MAX_NUM)]
    		attrSlot = [player.GetItemAttribute(window_type, slotIndex_2, i) for i in xrange(player.ATTRIBUTE_SLOT_MAX_NUM)]
    		self.AddItemDataAttrTransfer(itemVnum, itemVnum_2, metinSlot, attrSlot, 0, 0, window_type, slotIndex_2)
    
    	def AddItemDataAttrTransfer(self, itemVnum, itemVnum_2, metinSlot, attrSlot = 0, flags = 0, unbindTime = 0, window_type = player.INVENTORY, slotIndex = -1):
    		self.itemVnum = itemVnum
    		item.SelectItem(itemVnum)
    		itemType = item.GetItemType()
    		itemSubType = item.GetItemSubType()
    		itemDesc = item.GetItemDescription()
    		itemSummary = item.GetItemSummary()
    		
    		self.__AdjustMaxWidth(attrSlot, itemDesc)
    		self.__SetItemTitle(itemVnum, metinSlot, attrSlot)
    		self.AppendDescription(itemDesc, 26)
    		self.AppendDescription(itemSummary, 26, self.CONDITION_COLOR)
    		self.__AppendLimitInformation()
    		self.__AppendAffectInformation()
    		
    		item.SelectItem(itemVnum_2)
    		self.__AppendAttributeInformation(attrSlot)
    		
    		item.SelectItem(itemVnum)
    		self.AppendWearableInformation()
    		bHasRealtimeFlag = 0
    		for i in xrange(item.LIMIT_MAX_NUM):
    			(limitType, limitValue) = item.GetLimit(i)
    			if item.LIMIT_REAL_TIME == limitType:
    				bHasRealtimeFlag = 1
    		
    		if 1 == bHasRealtimeFlag:
    			self.AppendMallItemLastTime(metinSlot[0])
    		
    		self.ShowToolTip()
    
    	def SetShopItem(self, slotIndex, addprice = 0, waltype = 0):
    		import localeInfo
    		itemVnum = shop.GetItemID(slotIndex)
    		if 0 == itemVnum:
    			return
    
    		price = shop.GetItemPrice(slotIndex)
    		if app.ENABLE_CHEQUE_SYSTEM:
    			price_cheque = shop.GetItemPriceCheque(slotIndex)
    			price_yang = shop.GetItemPrice(slotIndex)
    		self.ClearToolTip()
    		self.isShopItem = True
    		item.SelectItem(itemVnum)
    		metinSlot = []
    		for i in xrange(player.METIN_SOCKET_MAX_NUM):
    			metinSlot.append(shop.GetItemMetinSocket(slotIndex, i))
    		attrSlot = []
    		for i in xrange(player.ATTRIBUTE_SLOT_MAX_NUM):
    			attrSlot.append(shop.GetItemAttribute(slotIndex, i)) 
    		if app.ENABLE_CHANGELOOK_SYSTEM:
    			transmutation = shop.GetItemTransmutation(slotIndex)
    			if not transmutation:
    				self.AddItemData(itemVnum, metinSlot, attrSlot)
    			else:
    				self.AddItemData(itemVnum, metinSlot, attrSlot, 0, player.INVENTORY, -1, transmutation)
    		else:
    			self.AddItemData(itemVnum, metinSlot, attrSlot)
    		if waltype == 0:
    			if app.ENABLE_CHEQUE_SYSTEM and app.ENABLE_SHOP_SISTEM:
    				if shop.IsPrivateShop():
    					self.AppendSpace(5)
    					self.AppendTextLine(localeInfo.CHEQUE_SYSTEM_SELL_PRICE, grp.GenerateColor(255./255, 246./255, 78./255, 1.0))
    					if price_cheque > 0:
    						self.AppendSpace(5)
    						self.AppendTextLine(localeInfo.NumberToWonString(price_cheque), grp.GenerateColor(0./255, 215./255, 255./255, 1.0))
    					if price_yang > 0:
    						self.AppendSpace(5)
    						self.AppendTextLine(localeInfo.NumberToGoldString(price), self.GetPriceColor(price))
    				else:
    					if item.IsAntiFlag(item.ANTIFLAG_SHOP_SECONDARY):
    						self.miktar(price)
    					elif item.IsAntiFlag(item.ANTIFLAG_SHOP_TRIPLE):
    						self.miktar2(price)
    					else:
    						self.AppendPrice(price)
    		else:
    			self.AppendSpace(5)
    			self.AppendTextLine(localeInfo.TOOLTIP_BUYPRICE % (localeInfo.NumberToMoneyString(addprice)[:-5]), self.SPECIAL_TITLE_COLOR)
    
    	def SetShopItemBySecondaryCoin(self, slotIndex):
    		itemVnum = shop.GetItemID(slotIndex)
    		if 0 == itemVnum:
    			return
    
    		price = shop.GetItemPrice(slotIndex)
    		self.ClearToolTip()
    		self.isShopItem = TRUE
    
    		metinSlot = []
    		for i in xrange(player.METIN_SOCKET_MAX_NUM):
    			metinSlot.append(shop.GetItemMetinSocket(slotIndex, i))
    		attrSlot = []
    		for i in xrange(player.ATTRIBUTE_SLOT_MAX_NUM):
    			attrSlot.append(shop.GetItemAttribute(slotIndex, i))
    
    		if app.ENABLE_CHANGELOOK_SYSTEM:
    			transmutation = shop.GetItemTransmutation(slotIndex)
    			if not transmutation:
    				self.AddItemData(itemVnum, metinSlot, attrSlot)
    			else:
    				self.AddItemData(itemVnum, metinSlot, attrSlot, 0, player.INVENTORY, -1, transmutation)
    		else:
    			self.AddItemData(itemVnum, metinSlot, attrSlot)
    		self.AppendPriceBySecondaryCoin(price)
    
    	def SetExchangeOwnerItem(self, slotIndex):
    		itemVnum = exchange.GetItemVnumFromSelf(slotIndex)
    		if 0 == itemVnum:
    			return
    
    		self.ClearToolTip()
    
    		metinSlot = []
    		for i in xrange(player.METIN_SOCKET_MAX_NUM):
    			metinSlot.append(exchange.GetItemMetinSocketFromSelf(slotIndex, i))
    		attrSlot = []
    		for i in xrange(player.ATTRIBUTE_SLOT_MAX_NUM):
    			attrSlot.append(exchange.GetItemAttributeFromSelf(slotIndex, i))
    		if app.ENABLE_CHANGELOOK_SYSTEM:
    			transmutation = exchange.GetItemTransmutation(slotIndex, True)
    			if not transmutation:
    				self.AddItemData(itemVnum, metinSlot, attrSlot)
    			else:
    				self.AddItemData(itemVnum, metinSlot, attrSlot, 0, player.INVENTORY, -1, transmutation)
    		else:
    			self.AddItemData(itemVnum, metinSlot, attrSlot)
    
    	def SetExchangeTargetItem(self, slotIndex):
    		itemVnum = exchange.GetItemVnumFromTarget(slotIndex)
    		if 0 == itemVnum:
    			return
    
    		self.ClearToolTip()
    
    		metinSlot = []
    		for i in xrange(player.METIN_SOCKET_MAX_NUM):
    			metinSlot.append(exchange.GetItemMetinSocketFromTarget(slotIndex, i))
    		attrSlot = []
    		for i in xrange(player.ATTRIBUTE_SLOT_MAX_NUM):
    			attrSlot.append(exchange.GetItemAttributeFromTarget(slotIndex, i))
    		if app.ENABLE_CHANGELOOK_SYSTEM:
    			transmutation = exchange.GetItemTransmutation(slotIndex, False)
    			if not transmutation:
    				self.AddItemData(itemVnum, metinSlot, attrSlot)
    			else:
    				self.AddItemData(itemVnum, metinSlot, attrSlot, 0, player.INVENTORY, -1, transmutation)
    		else:
    			self.AddItemData(itemVnum, metinSlot, attrSlot)
    
    	def SetPrivateShopBuilderItem(self, invenType, invenPos, privateShopSlotIndex):
    		itemVnum = player.GetItemIndex(invenType, invenPos)
    		if 0 == itemVnum:
    			return
    
    		item.SelectItem(itemVnum)
    		self.ClearToolTip()
    
    		metinSlot = []
    		for i in xrange(player.METIN_SOCKET_MAX_NUM):
    			metinSlot.append(player.GetItemMetinSocket(invenPos, i))
    		attrSlot = []
    		for i in xrange(player.ATTRIBUTE_SLOT_MAX_NUM):
    			attrSlot.append(player.GetItemAttribute(invenPos, i))
    
    		if app.ENABLE_CHANGELOOK_SYSTEM:
    			self.AddItemData(itemVnum, metinSlot, attrSlot, 0, invenType, invenPos)
    		else:
    			self.AddItemData(itemVnum, metinSlot, attrSlot, 0)
    
    		price = shop.GetPrivateShopItemPrice(invenType, invenPos)
    
    		if app.ENABLE_CHEQUE_SYSTEM:
    			price_cheque = shop.GetPrivateShopItemPriceCheque(invenType, invenPos)
    			price_yang = shop.GetPrivateShopItemPrice(invenType, invenPos)
    			self.AppendSpace(5)
    			self.AppendTextLine(localeInfo.CHEQUE_SYSTEM_SELL_PRICE, grp.GenerateColor(255./255, 246./255, 78./255, 1.0))
    			if price_cheque > 0:
    				self.AppendSpace(5)
    				self.AppendTextLine(localeInfo.NumberToWonString(price_cheque), grp.GenerateColor(0./255, 215./255, 255./255, 1.0))
    			if price_yang > 0:
    				self.AppendSpace(5)
    				self.AppendTextLine(localeInfo.NumberToGoldString(price), self.GetPriceColor(price))
    		else:
    			self.AppendTextLine(localeInfo.NumberToGoldString(price), self.GetPriceColor(price))
    
    	def SetSafeBoxItem(self, slotIndex):
    		itemVnum = safebox.GetItemID(slotIndex)
    		if 0 == itemVnum:
    			return
    
    		self.ClearToolTip()
    		metinSlot = []
    		for i in xrange(player.METIN_SOCKET_MAX_NUM):
    			metinSlot.append(safebox.GetItemMetinSocket(slotIndex, i))
    		attrSlot = []
    		for i in xrange(player.ATTRIBUTE_SLOT_MAX_NUM):
    			attrSlot.append(safebox.GetItemAttribute(slotIndex, i))
    		
    		if app.ENABLE_CHANGELOOK_SYSTEM:
    			self.AddItemData(itemVnum, metinSlot, attrSlot, safebox.GetItemFlags(slotIndex), player.SAFEBOX, slotIndex)
    		else:
    			self.AddItemData(itemVnum, metinSlot, attrSlot, safebox.GetItemFlags(slotIndex))
    		self.__AppendSealInformation(player.SAFEBOX, slotIndex)
    
    	def SetMallItem(self, slotIndex):
    		itemVnum = safebox.GetMallItemID(slotIndex)
    		if 0 == itemVnum:
    			return
    
    		self.ClearToolTip()
    		metinSlot = []
    		for i in xrange(player.METIN_SOCKET_MAX_NUM):
    			metinSlot.append(safebox.GetMallItemMetinSocket(slotIndex, i))
    		attrSlot = []
    		for i in xrange(player.ATTRIBUTE_SLOT_MAX_NUM):
    			attrSlot.append(safebox.GetMallItemAttribute(slotIndex, i))
    
    		if app.ENABLE_CHANGELOOK_SYSTEM:
    			self.AddItemData(itemVnum, metinSlot, attrSlot, 0, player.MALL, slotIndex)
    		else:
    			self.AddItemData(itemVnum, metinSlot, attrSlot)
    		self.__AppendSealInformation(player.MALL, slotIndex)
    
    	def SetItemToolTip(self, itemVnum):
    		self.ClearToolTip()
    		metinSlot = []
    		for i in xrange(player.METIN_SOCKET_MAX_NUM):
    			metinSlot.append(0)
    		attrSlot = []
    		for i in xrange(player.ATTRIBUTE_SLOT_MAX_NUM):
    			attrSlot.append((0, 0))
    
    		self.AddItemData(itemVnum, metinSlot, attrSlot)
    
    	if app.ENABLE_SEND_TARGET_INFO:
    		def SetItemToolTipStone(self, itemVnum):
    			self.itemVnum = itemVnum
    			item.SelectItem(itemVnum)
    			itemType = item.GetItemType()
    
    			itemDesc = item.GetItemDescription()
    			itemSummary = item.GetItemSummary()
    			attrSlot = 0
    			self.__AdjustMaxWidth(attrSlot, itemDesc)
    			itemName = item.GetItemName()
    			realName = itemName[:itemName.find("+")]
    			self.SetTitle(realName + " +0 - +4")
    
    			## Description ###
    			self.AppendDescription(itemDesc, -26)
    			self.AppendDescription(itemSummary, -26, self.CONDITION_COLOR)
    
    			if item.ITEM_TYPE_METIN == itemType:
    				self.AppendMetinInformation()
    				self.AppendMetinWearInformation()
    
    			for i in xrange(item.LIMIT_MAX_NUM):
    				(limitType, limitValue) = item.GetLimit(i)
    
    				if item.LIMIT_REAL_TIME_START_FIRST_USE == limitType:
    					self.AppendRealTimeStartFirstUseLastTime(item, metinSlot, i)
    
    				elif item.LIMIT_TIMER_BASED_ON_WEAR == limitType:
    					self.AppendTimerBasedOnWearLastTime(metinSlot)
    
    			self.ShowToolTip()
    
    	def __AppendAttackSpeedInfo(self, item):
    		atkSpd = item.GetValue(0)
    
    		if atkSpd < 80:
    			stSpd = localeInfo.TOOLTIP_ITEM_VERY_FAST
    		elif atkSpd <= 95:
    			stSpd = localeInfo.TOOLTIP_ITEM_FAST
    		elif atkSpd <= 105:
    			stSpd = localeInfo.TOOLTIP_ITEM_NORMAL
    		elif atkSpd <= 120:
    			stSpd = localeInfo.TOOLTIP_ITEM_SLOW
    		else:
    			stSpd = localeInfo.TOOLTIP_ITEM_VERY_SLOW
    
    		self.AppendTextLine(localeInfo.TOOLTIP_ITEM_ATT_SPEED % stSpd, self.NORMAL_COLOR)
    
    	def __AppendAttackGradeInfo(self):
    		atkGrade = item.GetValue(1)
    		self.AppendTextLine(localeInfo.TOOLTIP_ITEM_ATT_GRADE % atkGrade, self.GetChangeTextLineColor(atkGrade))
    
    	if app.ENABLE_SASH_SYSTEM:
    		def CalcSashValue(self, value, abs):
    			if not value:
    				return 0
    			
    			valueCalc = int((round(value * abs) / 100) - .5) + int(int((round(value * abs) / 100) - .5) > 0)
    			if valueCalc <= 0 and value > 0:
    				value = 1
    			else:
    				value = valueCalc
    			
    			return value
    
    	def __AppendAttackPowerInfo(self, itemAbsChance = 0):
    		minPower = item.GetValue(3)
    		maxPower = item.GetValue(4)
    		addPower = item.GetValue(5)
    		
    		if app.ENABLE_SASH_SYSTEM:
    			if itemAbsChance:
    				minPower = self.CalcSashValue(minPower, itemAbsChance)
    				maxPower = self.CalcSashValue(maxPower, itemAbsChance)
    				addPower = self.CalcSashValue(addPower, itemAbsChance)
    		
    		if maxPower > minPower:
    			self.AppendTextLine(localeInfo.TOOLTIP_ITEM_ATT_POWER % (minPower + addPower, maxPower + addPower), self.POSITIVE_COLOR)
    		else:
    			self.AppendTextLine(localeInfo.TOOLTIP_ITEM_ATT_POWER_ONE_ARG % (minPower + addPower), self.POSITIVE_COLOR)
    
    	def __AppendMagicAttackInfo(self, itemAbsChance = 0):
    		minMagicAttackPower = item.GetValue(1)
    		maxMagicAttackPower = item.GetValue(2)
    		addPower = item.GetValue(5)
    		
    		if app.ENABLE_SASH_SYSTEM:
    			if itemAbsChance:
    				minMagicAttackPower = self.CalcSashValue(minMagicAttackPower, itemAbsChance)
    				maxMagicAttackPower = self.CalcSashValue(maxMagicAttackPower, itemAbsChance)
    				addPower = self.CalcSashValue(addPower, itemAbsChance)
    		
    		if minMagicAttackPower > 0 or maxMagicAttackPower > 0:
    			if maxMagicAttackPower > minMagicAttackPower:
    				self.AppendTextLine(localeInfo.TOOLTIP_ITEM_MAGIC_ATT_POWER % (minMagicAttackPower + addPower, maxMagicAttackPower + addPower), self.POSITIVE_COLOR)
    			else:
    				self.AppendTextLine(localeInfo.TOOLTIP_ITEM_MAGIC_ATT_POWER_ONE_ARG % (minMagicAttackPower + addPower), self.POSITIVE_COLOR)
    
    	def __AppendMagicDefenceInfo(self, itemAbsChance = 0):
    		magicDefencePower = item.GetValue(0)
    		
    		if app.ENABLE_SASH_SYSTEM:
    			if itemAbsChance:
    				magicDefencePower = self.CalcSashValue(magicDefencePower, itemAbsChance)
    		
    		if magicDefencePower > 0:
    			self.AppendTextLine(localeInfo.TOOLTIP_ITEM_MAGIC_DEF_POWER % magicDefencePower, self.GetChangeTextLineColor(magicDefencePower))
    
    	def __AppendAttributeInformation(self, attrSlot, itemAbsChance = 0):
    		if 0 != attrSlot:
    			for i in xrange(player.ATTRIBUTE_SLOT_MAX_NUM):
    				type = attrSlot[i][0]
    				value = attrSlot[i][1]
    				if 0 == value:
    					continue
    				
    				affectString = self.__GetAffectString(type, value)
    				if app.ENABLE_SASH_SYSTEM:
    					if item.GetItemType() == item.ITEM_TYPE_COSTUME and item.GetItemSubType() == item.COSTUME_TYPE_SASH and itemAbsChance:
    						value = self.CalcSashValue(value, itemAbsChance)
    						affectString = self.__GetAffectString(type, value)
    				
    				if affectString:
    					affectColor = self.__GetAttributeColor(i, value)
    					self.AppendTextLine(affectString, affectColor)
    
    	def __GetAttributeColor(self, index, value):
    		if value > 0:
    			if index >= 5:
    				return self.SPECIAL_POSITIVE_COLOR2
    			else:
    				return self.SPECIAL_POSITIVE_COLOR
    		elif value == 0:
    			return self.NORMAL_COLOR
    		else:
    			return self.NEGATIVE_COLOR
    
    	def __IsPolymorphItem(self, itemVnum):
    		if itemVnum >= 70103 and itemVnum <= 70106:
    			return 1
    		return 0
    
    	def __SetPolymorphItemTitle(self, monsterVnum):
    		if localeInfo.IsVIETNAM():
    			itemName =item.GetItemName()
    			itemName+=" "
    			itemName+=nonplayer.GetMonsterName(monsterVnum)
    		else:
    			itemName =nonplayer.GetMonsterName(monsterVnum)
    			itemName+=" "
    			itemName+=item.GetItemName()
    		self.SetTitle(itemName)
    
    	def __SetNormalItemTitle(self):
    		if app.ENABLE_SEND_TARGET_INFO:
    			if self.isStone:
    				itemName = item.GetItemName()
    				realName = itemName[:itemName.find("+")]
    				self.SetTitle(realName + " +0 - +4")
    			else:
    				self.SetTitle(item.GetItemName())
    		else:
    			self.SetTitle(item.GetItemName())
    
    	def __SetSpecialItemTitle(self):
    		self.AppendTextLine(item.GetItemName(), self.SPECIAL_TITLE_COLOR)
    
    	def __SetItemTitle(self, itemVnum, metinSlot, attrSlot):
    		if localeInfo.IsCANADA():
    			if 72726 == itemVnum or 72730 == itemVnum:
    				self.AppendTextLine(item.GetItemName(), grp.GenerateColor(1.0, 0.7843, 0.0, 1.0))
    				return
    			
    		if self.__IsPolymorphItem(itemVnum):
    			self.__SetPolymorphItemTitle(metinSlot[0])
    		else:
    			if self.__IsAttr(attrSlot):
    				self.__SetSpecialItemTitle()
    				return
    
    			self.__SetNormalItemTitle()
    
    	def __IsAttr(self, attrSlot):
    		if not attrSlot:
    			return FALSE
    
    		for i in xrange(player.ATTRIBUTE_SLOT_MAX_NUM):
    			type = attrSlot[i][0]
    			if 0 != type:
    				return TRUE
    
    		return FALSE
    	
    	def AddRefineItemData(self, itemVnum, metinSlot, attrSlot = 0):
    		for i in xrange(player.METIN_SOCKET_MAX_NUM):
    			metinSlotData=metinSlot[i]
    			if self.GetMetinItemIndex(metinSlotData) == constInfo.ERROR_METIN_STONE:
    				metinSlot[i]=player.METIN_SOCKET_TYPE_SILVER
    
    		self.AddItemData(itemVnum, metinSlot, attrSlot)
    
    	def AddItemData_Offline(self, itemVnum, itemDesc, itemSummary, metinSlot, attrSlot):
    		self.__AdjustMaxWidth(attrSlot, itemDesc)
    		self.__SetItemTitle(itemVnum, metinSlot, attrSlot)
    		
    		if self.__IsHair(itemVnum):	
    			self.__AppendHairIcon(itemVnum)
    
    		### Description ###
    		self.AppendDescription(itemDesc, 26)
    		self.AppendDescription(itemSummary, 26, self.CONDITION_COLOR)
    
    	def check_sigillo(self, item_vnum):
    		for x in range(55701,55707):
    			if x == item_vnum:
    				return TRUE
    		if item_vnum == 55801:
    			return TRUE
    		return FALSE
    
    	def AddItemData(self, itemVnum, metinSlot, attrSlot = 0, flags = 0, window_type = player.INVENTORY, slotIndex = -1, transmutation = -1):
    		self.itemVnum = itemVnum
    		item.SelectItem(itemVnum)
    		itemType = item.GetItemType()
    		itemSubType = item.GetItemSubType()
    
    		if 50026 == itemVnum:
    			if 0 != metinSlot:
    				name = item.GetItemName()
    				if metinSlot[0] > 0:
    					name += " "
    					name += localeInfo.NumberToMoneyString(metinSlot[0])
    				self.SetTitle(name)
    
    				self.ShowToolTip()
    			return
    
    		### Skill Book ###
    		if app.ENABLE_SEND_TARGET_INFO:
    			if 50300 == itemVnum and not self.isBook:
    				if 0 != metinSlot and not self.isBook:
    					self.__SetSkillBookToolTip(metinSlot[0], localeInfo.TOOLTIP_SKILLBOOK_NAME, 1)
    					self.ShowToolTip()
    				elif self.isBook:
    					self.SetTitle(item.GetItemName())
    					self.AppendDescription(item.GetItemDescription(), 26)
    					self.AppendDescription(item.GetItemSummary(), 26, self.CONDITION_COLOR)
    					self.ShowToolTip()					
    				return
    			elif 70037 == itemVnum :
    				if 0 != metinSlot and not self.isBook2:
    					self.__SetSkillBookToolTip(metinSlot[0], localeInfo.TOOLTIP_SKILL_FORGET_BOOK_NAME, 0)
    					self.AppendDescription(item.GetItemDescription(), 26)
    					self.AppendDescription(item.GetItemSummary(), 26, self.CONDITION_COLOR)
    					self.ShowToolTip()
    				elif self.isBook2:
    					self.SetTitle(item.GetItemName())
    					self.AppendDescription(item.GetItemDescription(), 26)
    					self.AppendDescription(item.GetItemSummary(), 26, self.CONDITION_COLOR)
    					self.ShowToolTip()					
    				return
    			elif 70055 == itemVnum:
    				if 0 != metinSlot:
    					self.__SetSkillBookToolTip(metinSlot[0], localeInfo.TOOLTIP_SKILL_FORGET_BOOK_NAME, 0)
    					self.AppendDescription(item.GetItemDescription(), 26)
    					self.AppendDescription(item.GetItemSummary(), 26, self.CONDITION_COLOR)
    					self.ShowToolTip()
    				return
    		else:
    			if 50300 == itemVnum:
    				if 0 != metinSlot:
    					self.__SetSkillBookToolTip(metinSlot[0], localeInfo.TOOLTIP_SKILLBOOK_NAME, 1)
    					self.ShowToolTip()
    				return
    			elif 70037 == itemVnum:
    				if 0 != metinSlot:
    					self.__SetSkillBookToolTip(metinSlot[0], localeInfo.TOOLTIP_SKILL_FORGET_BOOK_NAME, 0)
    					self.AppendDescription(item.GetItemDescription(), 26)
    					self.AppendDescription(item.GetItemSummary(), 26, self.CONDITION_COLOR)
    					self.ShowToolTip()
    				return
    			elif 70055 == itemVnum:
    				if 0 != metinSlot:
    					self.__SetSkillBookToolTip(metinSlot[0], localeInfo.TOOLTIP_SKILL_FORGET_BOOK_NAME, 0)
    					self.AppendDescription(item.GetItemDescription(), 26)
    					self.AppendDescription(item.GetItemSummary(), 26, self.CONDITION_COLOR)
    					self.ShowToolTip()
    				return
    		###########################################################################################
    
    
    		itemDesc = item.GetItemDescription()
    		itemSummary = item.GetItemSummary()
    
    		isCostumeItem = 0
    		isCostumeHair = 0
    		isCostumeBody = 0
    		isCostumeMount = 0
    		if app.ENABLE_SASH_SYSTEM:
    			isCostumeSash = 0
    		if app.ENABLE_COSTUME_WEAPON_SYSTEM:
    			isCostumeWeapon = 0
    			
    		if app.ENABLE_COSTUME_SYSTEM:
    			if item.ITEM_TYPE_COSTUME == itemType:
    				isCostumeItem = 1
    				isCostumeHair = item.COSTUME_TYPE_HAIR == itemSubType
    				isCostumeBody = item.COSTUME_TYPE_BODY == itemSubType
    				isCostumeMount = item.COSTUME_SLOT_MOUNT == itemSubType
    			if app.ENABLE_SASH_SYSTEM:
    				isCostumeSash = itemSubType == item.COSTUME_TYPE_SASH
    			if app.ENABLE_COSTUME_WEAPON_SYSTEM:
    				isCostumeWeapon = item.COSTUME_TYPE_WEAPON == itemSubType
    
    				#dbg.TraceError("IS_COSTUME_ITEM! body(%d) hair(%d)" % (isCostumeBody, isCostumeHair))
    
    		self.__AdjustMaxWidth(attrSlot, itemDesc)
    		self.__SetItemTitle(itemVnum, metinSlot, attrSlot)
    		
    		### Hair Preview Image ###
    		if self.__IsHair(itemVnum):	
    			self.__AppendHairIcon(itemVnum)
    
    		### Description ###
    		self.AppendDescription(itemDesc, 26)
    		self.AppendDescription(itemSummary, 26, self.CONDITION_COLOR)
    
    		if self.check_sigillo(itemVnum) or itemVnum == 55002:
    			if attrSlot[0][1] != 0:
    				self.AppendSpace(2)
    				blackyas = (int(attrSlot[5][1])/60)/24
    				petevobl = (int(attrSlot[6][1]))
    				self.AppendTextLine("|cffffffffمستوى: "+str(metinSlot[1]) + " (" + str(blackyas) + localeInfo.DAY + ")", self.NORMAL_COLOR)
    				if (str(petevobl)) == "0":
    					self.AppendTextLine(localeInfo.PET_TEXTT_7, grp.GenerateColor(0, 78, 0, 1))
    				elif (str(petevobl)) == "1":
    					self.AppendTextLine(localeInfo.PET_SYSTEM_EVO2, grp.GenerateColor(0, 78, 0, 1))
    				elif (str(petevobl)) == "2":
    					self.AppendTextLine(localeInfo.PET_SYSTEM_EVO3, grp.GenerateColor(0, 78, 0, 1))
    				elif (str(petevobl)) == "3":
    					self.AppendTextLine(localeInfo.PET_SYSTEM_EVO4, grp.GenerateColor(0, 78, 0, 1))
    				self.AppendSpace(2)
    				self.AppendTextLine("حياة: +"+pointop(str(attrSlot[0][1]))+"%", self.SPECIAL_POSITIVE_COLOR)
    				self.AppendTextLine("دفاع: +"+pointop(str(attrSlot[1][1]))+"%", self.SPECIAL_POSITIVE_COLOR)
    				self.AppendTextLine("اسلوب: +"+pointop(str(attrSlot[2][1]))+"%", self.SPECIAL_POSITIVE_COLOR)
    				self.AppendSpace(5)
    				if itemVnum != 55002:
    					days = (int(attrSlot[3][1])/60)/24
    					hours = (int(attrSlot[3][1]) - (days*60*24)) / 60
    					mins = int(attrSlot[3][1]) - (days*60*24) - (hours*60)
    					self.AppendTextLine(localeInfo.PET_TEXTT_1 % (days, hours, mins), self.SPECIAL_POSITIVE_COLOR)
    
    		#if 55701 == itemVnum:
    				# self.AppendSpace(5)
    				# self.AppendTextLine(localeInfo.TOOLTIP_UNLIMITED_ITEM, grp.GenerateColor(1.0, 0.7843, 0.0, 1.0))
    
    		# if 55702 == itemVnum:
    				# self.AppendSpace(5)
    				# self.AppendTextLine(localeInfo.TOOLTIP_UNLIMITED_ITEM1, grp.GenerateColor(1.0, 0.7843, 0.0, 1.0))
    
    		# if 55703 == itemVnum:
    				# self.AppendSpace(5)
    				# self.AppendTextLine(localeInfo.TOOLTIP_UNLIMITED_ITEM2, grp.GenerateColor(1.0, 0.7843, 0.0, 1.0))
    
    		# if 55704 == itemVnum:
    				# self.AppendSpace(5)
    				# self.AppendTextLine(localeInfo.TOOLTIP_UNLIMITED_ITEM3, grp.GenerateColor(1.0, 0.7843, 0.0, 1.0))
    
    		# if 55705 == itemVnum:
    				# self.AppendSpace(5)
    				# self.AppendTextLine(localeInfo.TOOLTIP_UNLIMITED_ITEM4, grp.GenerateColor(1.0, 0.7843, 0.0, 1.0))
    				
    		# if 55706 == itemVnum:
    				# self.AppendSpace(5)
    				# self.AppendTextLine(localeInfo.TOOLTIP_UNLIMITED_ITEM5, grp.GenerateColor(1.0, 0.7843, 0.0, 1.0))
    
    		### Weapon ###
    		if item.ITEM_TYPE_WEAPON == itemType:
    
    			self.__AppendLimitInformation()
    			
    			self.AppendSpace(5)
    			
    			if item.WEAPON_FAN == itemSubType:
    				self.__AppendMagicAttackInfo()
    				self.__AppendAttackPowerInfo()
    			else:
    				self.__AppendAttackPowerInfo()
    				self.__AppendMagicAttackInfo()
    			
    			self.__AppendAffectInformation()
    			self.__AppendAttributeInformation(attrSlot)
    			if app.ENABLE_CHANGELOOK_SYSTEM:
    				self.AppendTransmutation(window_type, slotIndex, transmutation)
    
    			self.AppendWearableInformation()
    			bHasRealtimeFlag = 0
    			for i in xrange(item.LIMIT_MAX_NUM):
    				(limitType, limitValue) = item.GetLimit(i)
    				if item.LIMIT_REAL_TIME == limitType:
    					bHasRealtimeFlag = 1
    					
    			if bHasRealtimeFlag == 1:
    				self.AppendMallItemLastTime(metinSlot[0])
    			else:
    				self.__AppendMetinSlotInfo(metinSlot)
    
    		### Armor ###
    		elif item.ITEM_TYPE_ARMOR == itemType:
    			self.__AppendLimitInformation()
    
    			## ???
    			defGrade = item.GetValue(1)
    			defBonus = item.GetValue(5)*2 ## ??? ?? ?? ?? ??? ??
    			if defGrade > 0:
    				self.AppendSpace(5)
    				self.AppendTextLine(localeInfo.TOOLTIP_ITEM_DEF_GRADE % (defGrade+defBonus), self.GetChangeTextLineColor(defGrade))
    
    			self.__AppendMagicDefenceInfo()
    			self.__AppendAffectInformation()
    			self.__AppendAttributeInformation(attrSlot)
    			if app.ENABLE_CHANGELOOK_SYSTEM:
    				self.AppendTransmutation(window_type, slotIndex, transmutation)
    
    			self.AppendWearableInformation()
    
    			if itemSubType in (item.ARMOR_WRIST, item.ARMOR_NECK, item.ARMOR_EAR):				
    				self.__AppendAccessoryMetinSlotInfo(metinSlot, constInfo.GET_ACCESSORY_MATERIAL_VNUM(itemVnum, itemSubType))
    			else:
    				self.__AppendMetinSlotInfo(metinSlot)
    
    		### Ring Slot Item (Not UNIQUE) ###
    		elif item.ITEM_TYPE_RING == itemType:
    			self.__AppendLimitInformation()
    			self.__AppendAffectInformation()
    			self.__AppendAttributeInformation(attrSlot)
    
    			#?? ?? ??? ???? ?? ?? ??
    			#self.__AppendAccessoryMetinSlotInfo(metinSlot, 99001)
    			bHasRealtimeFlag = 0
    			for i in xrange(item.LIMIT_MAX_NUM):
    				(limitType, limitValue) = item.GetLimit(i)
    				if item.LIMIT_REAL_TIME == limitType:
    					bHasRealtimeFlag = 1
    			
    			if bHasRealtimeFlag == 1:
    				self.AppendMallItemLastTime(metinSlot[0])			
    
    		### Belt Item ###
    		elif item.ITEM_TYPE_BELT == itemType:
    			self.__AppendLimitInformation()
    			self.__AppendAffectInformation()
    			self.__AppendAttributeInformation(attrSlot)
    			self.AppendTextLine("Kullanilabilir Slot : %s " % EXTRA_SLOT[item.GetValue(0)], self.SPECIAL_POSITIVE_COLOR)
    
    			self.__AppendAccessoryMetinSlotInfo(metinSlot, constInfo.GET_BELT_MATERIAL_VNUM(itemVnum))
    
    		## ??? ??? ##
    		elif 0 != isCostumeItem:
    			self.__AppendLimitInformation()
    			
    			if app.ENABLE_SASH_SYSTEM:
    				if isCostumeSash:
    					## ABSORPTION RATE
    					absChance = int(metinSlot[sash.ABSORPTION_SOCKET])
    					self.AppendTextLine(localeInfo.SASH_ABSORB_CHANCE % (absChance), self.CONDITION_COLOR)
    					## END ABSOPRTION RATE
    					
    					itemAbsorbedVnum = int(metinSlot[sash.ABSORBED_SOCKET])
    					if itemAbsorbedVnum:
    						## ATTACK / DEFENCE
    						item.SelectItem(itemAbsorbedVnum)
    						if item.GetItemType() == item.ITEM_TYPE_WEAPON:
    							if item.GetItemSubType() == item.WEAPON_FAN:
    								self.__AppendMagicAttackInfo(metinSlot[sash.ABSORPTION_SOCKET])
    								item.SelectItem(itemAbsorbedVnum)
    								self.__AppendAttackPowerInfo(metinSlot[sash.ABSORPTION_SOCKET])
    							else:
    								self.__AppendAttackPowerInfo(metinSlot[sash.ABSORPTION_SOCKET])
    								item.SelectItem(itemAbsorbedVnum)
    								self.__AppendMagicAttackInfo(metinSlot[sash.ABSORPTION_SOCKET])
    						elif item.GetItemType() == item.ITEM_TYPE_ARMOR:
    							defGrade = item.GetValue(1)
    							defBonus = item.GetValue(5) * 2
    							defGrade = self.CalcSashValue(defGrade, metinSlot[sash.ABSORPTION_SOCKET])
    							defBonus = self.CalcSashValue(defBonus, metinSlot[sash.ABSORPTION_SOCKET])
    							
    							if defGrade > 0:
    								self.AppendSpace(5)
    								self.AppendTextLine(localeInfo.TOOLTIP_ITEM_DEF_GRADE % (defGrade + defBonus), self.GetChangeTextLineColor(defGrade))
    							
    							item.SelectItem(itemAbsorbedVnum)
    							self.__AppendMagicDefenceInfo(metinSlot[sash.ABSORPTION_SOCKET])
    						## END ATTACK / DEFENCE
    						
    						## EFFECT
    						item.SelectItem(itemAbsorbedVnum)
    						for i in xrange(item.ITEM_APPLY_MAX_NUM):
    							(affectType, affectValue) = item.GetAffect(i)
    							affectValue = self.CalcSashValue(affectValue, metinSlot[sash.ABSORPTION_SOCKET])
    							affectString = self.__GetAffectString(affectType, affectValue)
    							if affectString and affectValue > 0:
    								self.AppendTextLine(affectString, self.GetChangeTextLineColor(affectValue))
    							
    							item.SelectItem(itemAbsorbedVnum)
    						# END EFFECT
    						
    						item.SelectItem(itemVnum)
    						## ATTR
    						self.__AppendAttributeInformation(attrSlot, metinSlot[sash.ABSORPTION_SOCKET])
    						# END ATTR
    					else:
    						# ATTR
    						self.__AppendAttributeInformation(attrSlot)
    						# END ATTR
    				else:
    					self.__AppendAffectInformation()
    					self.__AppendAttributeInformation(attrSlot)
    			else:
    				self.__AppendAffectInformation()
    				self.__AppendAttributeInformation(attrSlot)
    			if app.ENABLE_CHANGELOOK_SYSTEM:
    				self.AppendTransmutation(window_type, slotIndex, transmutation)
    			self.AppendWearableInformation()
    			bHasRealtimeFlag = 0
    			for i in xrange(item.LIMIT_MAX_NUM):
    				(limitType, limitValue) = item.GetLimit(i)
    				if item.LIMIT_REAL_TIME == limitType:
    					bHasRealtimeFlag = 1
    			
    			if bHasRealtimeFlag == 1:
    				self.AppendMallItemLastTime(metinSlot[0])
    				
    		## Rod ##
    		elif item.ITEM_TYPE_ROD == itemType:
    
    			if 0 != metinSlot:
    				curLevel = item.GetValue(0) / 10
    				curEXP = metinSlot[0]
    				maxEXP = item.GetValue(2)
    				self.__AppendLimitInformation()
    				self.__AppendRodInformation(curLevel, curEXP, maxEXP)
    
    		## Pick ##
    		elif item.ITEM_TYPE_PICK == itemType:
    
    			if 0 != metinSlot:
    				curLevel = item.GetValue(0) / 10
    				curEXP = metinSlot[0]
    				maxEXP = item.GetValue(2)
    				self.__AppendLimitInformation()
    				self.__AppendPickInformation(curLevel, curEXP, maxEXP)
    
    		## Lottery ##
    		elif item.ITEM_TYPE_LOTTERY == itemType:
    			if 0 != metinSlot:
    
    				ticketNumber = int(metinSlot[0])
    				stepNumber = int(metinSlot[1])
    
    				self.AppendSpace(5)
    				self.AppendTextLine(localeInfo.TOOLTIP_LOTTERY_STEP_NUMBER % (stepNumber), self.NORMAL_COLOR)
    				self.AppendTextLine(localeInfo.TOOLTIP_LOTTO_NUMBER % (ticketNumber), self.NORMAL_COLOR);
    
    		### Metin ###
    		elif item.ITEM_TYPE_METIN == itemType:
    			self.AppendMetinInformation()
    			self.AppendMetinWearInformation()
    
    		### Fish ###
    		elif item.ITEM_TYPE_FISH == itemType:
    			if 0 != metinSlot:
    				self.__AppendFishInfo(metinSlot[0])
    		
    		## item.ITEM_TYPE_BLEND
    		elif item.ITEM_TYPE_BLEND == itemType:
    			self.__AppendLimitInformation()
    
    			if metinSlot:
    				affectType = metinSlot[0]
    				affectValue = metinSlot[1]
    				time = metinSlot[2]
    				self.AppendSpace(5)
    				affectText = self.__GetAffectString(affectType, affectValue)
    
    				self.AppendTextLine(affectText, self.NORMAL_COLOR)
    
    				if time >= 0:
    					minute = (time / 60)
    					second = (time % 60)
    					timeString = localeInfo.TOOLTIP_POTION_TIME
    
    					if minute >= 0:
    						timeString += str(minute) + localeInfo.TOOLTIP_POTION_MIN
    					if second >= 0:
    						timeString += " " + str(second) + localeInfo.TOOLTIP_POTION_SEC
    
    					self.AppendTextLine(timeString)
    				else:
    					self.AppendTextLine(localeInfo.BLEND_POTION_NO_TIME)
    			else:
    				self.AppendTextLine("BLEND_POTION_NO_INFO")
    
    		elif item.ITEM_TYPE_UNIQUE == itemType:
    			if 0 != metinSlot:
    				bHasRealtimeFlag = 0
    				
    				for i in xrange(item.LIMIT_MAX_NUM):
    					(limitType, limitValue) = item.GetLimit(i)
    
    					if item.LIMIT_REAL_TIME == limitType:
    						bHasRealtimeFlag = 1
    				
    				if 1 == bHasRealtimeFlag:
    					self.AppendMallItemLastTime(metinSlot[0])		
    				else:
    					time = metinSlot[player.METIN_SOCKET_MAX_NUM-1]
    
    					if 1 == item.GetValue(2): ## ??? ?? Flag / ?? ??? ??
    						self.AppendMallItemLastTime(time)
    					else:
    						self.AppendUniqueItemLastTime(time)
    
    		### Use ###
    		elif item.ITEM_TYPE_USE == itemType:
    			self.__AppendLimitInformation()
    
    			if item.USE_POTION == itemSubType or item.USE_POTION_NODELAY == itemSubType:
    				self.__AppendPotionInformation()
    
    			elif item.USE_ABILITY_UP == itemSubType:
    				self.__AppendAbilityPotionInformation()
    
    
    			## ?? ???
    			if 27989 == itemVnum or 76006 == itemVnum:
    				if 0 != metinSlot:
    					useCount = int(metinSlot[0])
    
    					self.AppendSpace(5)
    					self.AppendTextLine(localeInfo.TOOLTIP_REST_USABLE_COUNT % (200 - useCount), self.NORMAL_COLOR)
    
    			## ??? ???
    			elif 50004 == itemVnum:
    				if 0 != metinSlot:
    					useCount = int(metinSlot[0])
    
    					self.AppendSpace(5)
    					self.AppendTextLine(localeInfo.TOOLTIP_REST_USABLE_COUNT % (10 - useCount), self.NORMAL_COLOR)
    
    			## ????
    			elif constInfo.IS_AUTO_POTION(itemVnum):
    				if 0 != metinSlot:
    					## 0: ???, 1: ???, 2: ??
    					isActivated = int(metinSlot[0])
    					usedAmount = float(metinSlot[1])
    					totalAmount = float(metinSlot[2])
    					
    					if 0 == totalAmount:
    						totalAmount = 1
    					
    					self.AppendSpace(5)
    
    					if 0 != isActivated:
    						self.AppendTextLine("(%s)" % (localeInfo.TOOLTIP_AUTO_POTION_USING), self.SPECIAL_POSITIVE_COLOR)
    						self.AppendSpace(5)
    						
    					self.AppendTextLine(localeInfo.TOOLTIP_AUTO_POTION_REST % (100.0 - ((usedAmount / totalAmount) * 100.0)), self.POSITIVE_COLOR)
    								
    			## ?? ???
    			elif itemVnum in WARP_SCROLLS:
    				if 0 != metinSlot:
    					xPos = int(metinSlot[0])
    					yPos = int(metinSlot[1])
    
    					if xPos != 0 and yPos != 0:
    						(mapName, xBase, yBase) = background.GlobalPositionToMapInfo(xPos, yPos)
    						
    						localeMapName=localeInfo.MINIMAP_ZONE_NAME_DICT.get(mapName, "")
    
    						self.AppendSpace(5)
    
    						if localeMapName!="":						
    							self.AppendTextLine(localeInfo.TOOLTIP_MEMORIZED_POSITION % (localeMapName, int(xPos-xBase)/100, int(yPos-yBase)/100), self.NORMAL_COLOR)
    						else:
    							self.AppendTextLine(localeInfo.TOOLTIP_MEMORIZED_POSITION_ERROR % (int(xPos)/100, int(yPos)/100), self.NORMAL_COLOR)
    							dbg.TraceError("NOT_EXIST_IN_MINIMAP_ZONE_NAME_DICT: %s" % mapName)
    
    			if 79000 == itemVnum:
    				if 0 != metinSlot:
    					useCount = int(metinSlot[0])
    
    					self.AppendSpace(5)
    					self.AppendTextLine("مستوى البوف: M" , self.ITEM_BUFF_LEVEL_COLOR)
    					self.AppendTextLine("نوع البوف: بركة" , self.ITEM_BUFF_TYPE_COLOR)			
    					self.AppendTextLine("معدل البوف: %24" , self.ITEM_BUFF_RATE_COLOR)			
    					self.AppendTextLine("مدة البوف: 164" , self.ITEM_BUFF_DURATION_COLOR)	
    					self.AppendTextLine("البوف متبقى: %s "  %(80 - useCount), self.ITEM_BUFF_USAGE_COLOR)					
    	
    					
    			if 79001 == itemVnum:
    				if 0 != metinSlot:
    					useCount = int(metinSlot[0])
    
    					self.AppendSpace(5)
    					self.AppendTextLine("مستوى البوف: G" , self.ITEM_BUFF_LEVEL_COLOR)
    					self.AppendTextLine("نوع البوف: بركة" , self.ITEM_BUFF_TYPE_COLOR)			
    					self.AppendTextLine("معدل البوف: %29" , self.ITEM_BUFF_RATE_COLOR)			
    					self.AppendTextLine("مدة البوف:: 224" , self.ITEM_BUFF_DURATION_COLOR)	
    					self.AppendTextLine("البوف متبقى: %s "  %(60 - useCount), self.ITEM_BUFF_USAGE_COLOR)					
    					
    			if 79002 == itemVnum:
    				if 0 != metinSlot:
    					useCount = int(metinSlot[0])
    
    					self.AppendSpace(5)
    					self.AppendTextLine("مستوى البوف: P" , self.ITEM_BUFF_LEVEL_COLOR)
    					self.AppendTextLine("نوع البوف: بركة" , self.ITEM_BUFF_TYPE_COLOR)			
    					self.AppendTextLine("معدل البوف: %35" , self.ITEM_BUFF_RATE_COLOR)			
    					self.AppendTextLine("مدة البوف: 310" , self.ITEM_BUFF_DURATION_COLOR)	
    					self.AppendTextLine("البوف متبقى: %s "  %(50 - useCount), self.ITEM_BUFF_USAGE_COLOR)					
    	
    			if 79003 == itemVnum:
    				if 0 != metinSlot:
    					useCount = int(metinSlot[0])
    
    					self.AppendSpace(5)
    					self.AppendTextLine("مستوى البوف: M" , self.ITEM_BUFF_LEVEL_COLOR)
    					self.AppendTextLine("نوع البوف: حرجة" , self.ITEM_BUFF_TYPE_COLOR)			
    					self.AppendTextLine("معدل البوف: %24" , self.ITEM_BUFF_RATE_COLOR)			
    					self.AppendTextLine("مدة البوف: 110" , self.ITEM_BUFF_DURATION_COLOR)	
    					self.AppendTextLine("البوف متبقى: %s "  %(80 - useCount), self.ITEM_BUFF_USAGE_COLOR)					
    	
    					
    			if 79004 == itemVnum:
    				if 0 != metinSlot:
    					useCount = int(metinSlot[0])
    
    					self.AppendSpace(5)
    					self.AppendTextLine("مستوى البوف: G" , self.ITEM_BUFF_LEVEL_COLOR)
    					self.AppendTextLine("نوع البوف: حرجة" , self.ITEM_BUFF_TYPE_COLOR)			
    					self.AppendTextLine("معدل البوف: %29" , self.ITEM_BUFF_RATE_COLOR)			
    					self.AppendTextLine("مدة البوف: 142" , self.ITEM_BUFF_DURATION_COLOR)	
    					self.AppendTextLine("البوف متبقى: %s "  %(60 - useCount), self.ITEM_BUFF_USAGE_COLOR)					
    					
    			if 79005 == itemVnum:
    				if 0 != metinSlot:
    					useCount = int(metinSlot[0])
    
    					self.AppendSpace(5)
    					self.AppendTextLine("مستوى البوف: P" , self.ITEM_BUFF_LEVEL_COLOR)
    					self.AppendTextLine("نوع البوف: حرجة" , self.ITEM_BUFF_TYPE_COLOR)			
    					self.AppendTextLine("معدل البوف: %35" , self.ITEM_BUFF_RATE_COLOR)			
    					self.AppendTextLine("مدة البوف: 185" , self.ITEM_BUFF_DURATION_COLOR)	
    					self.AppendTextLine("البوف متبقى: %s "  %(50 - useCount), self.ITEM_BUFF_USAGE_COLOR)					
    
    			if 79006 == itemVnum:
    				if 0 != metinSlot:
    					useCount = int(metinSlot[0])
    
    					self.AppendSpace(5)
    					self.AppendTextLine("مستوى البوف: M" , self.ITEM_BUFF_LEVEL_COLOR)
    					self.AppendTextLine("نوع البوف: انعكاس" , self.ITEM_BUFF_TYPE_COLOR)			
    					self.AppendTextLine("معدل البوف %21" , self.ITEM_BUFF_RATE_COLOR)			
    					self.AppendTextLine("مدة البوف: 160" , self.ITEM_BUFF_DURATION_COLOR)	
    					self.AppendTextLine("البوف متبقى: %s "  %(80 - useCount), self.ITEM_BUFF_USAGE_COLOR)					
    	
    					
    			if 79007 == itemVnum:
    				if 0 != metinSlot:
    					useCount = int(metinSlot[0])
    
    					self.AppendSpace(5)
    					self.AppendTextLine("البوف متبقى: G" , self.ITEM_BUFF_LEVEL_COLOR)
    					self.AppendTextLine("نوع البوف: انعكاس" , self.ITEM_BUFF_TYPE_COLOR)			
    					self.AppendTextLine("معدل البوف: %31" , self.ITEM_BUFF_RATE_COLOR)			
    					self.AppendTextLine("مدة البوف: 224" , self.ITEM_BUFF_DURATION_COLOR)	
    					self.AppendTextLine("البوف متبقى: %s "  %(60 - useCount), self.ITEM_BUFF_USAGE_COLOR)					
    					
    			if 79008 == itemVnum:
    				if 0 != metinSlot:
    					useCount = int(metinSlot[0])
    
    					self.AppendSpace(5)
    					self.AppendTextLine("البوف متبقى: P" , self.ITEM_BUFF_LEVEL_COLOR)
    					self.AppendTextLine("نوع البوف: انعكاس" , self.ITEM_BUFF_TYPE_COLOR)			
    					self.AppendTextLine("معدل البوف: %45" , self.ITEM_BUFF_RATE_COLOR)			
    					self.AppendTextLine("مدة البوف: 310" , self.ITEM_BUFF_DURATION_COLOR)	
    					self.AppendTextLine("البوف متبقى: %s "  %(50 - useCount), self.ITEM_BUFF_USAGE_COLOR)
    
    			#####
    			if item.USE_SPECIAL == itemSubType:
    				bHasRealtimeFlag = 0
    				for i in xrange(item.LIMIT_MAX_NUM):
    					(limitType, limitValue) = item.GetLimit(i)
    
    					if item.LIMIT_REAL_TIME == limitType:
    						bHasRealtimeFlag = 1
    		
    				## ??? ?? ??? ???. ex) ?? ?? : 6? 6?? 58? 
    				if 1 == bHasRealtimeFlag:
    					self.AppendMallItemLastTime(metinSlot[0])
    				else:
    					# ... ??... ???? ?? ?? ?? ??? ???...
    					# ? ??? ??? ??? ??? ?? ??...
    					if 0 != metinSlot:
    						time = metinSlot[player.METIN_SOCKET_MAX_NUM-1]
    
    						## ??? ?? Flag
    						if 1 == item.GetValue(2):
    							self.AppendMallItemLastTime(time)
    			
    			elif item.USE_TIME_CHARGE_PER == itemSubType:
    				bHasRealtimeFlag = 0
    				for i in xrange(item.LIMIT_MAX_NUM):
    					(limitType, limitValue) = item.GetLimit(i)
    
    					if item.LIMIT_REAL_TIME == limitType:
    						bHasRealtimeFlag = 1
    				if metinSlot[2]:
    					self.AppendTextLine(localeInfo.TOOLTIP_TIME_CHARGER_PER(metinSlot[2]))
    				else:
    					self.AppendTextLine(localeInfo.TOOLTIP_TIME_CHARGER_PER(item.GetValue(0)))
     		
    				## ??? ?? ??? ???. ex) ?? ?? : 6? 6?? 58? 
    				if 1 == bHasRealtimeFlag:
    					self.AppendMallItemLastTime(metinSlot[0])
    
    			elif item.USE_TIME_CHARGE_FIX == itemSubType:
    				bHasRealtimeFlag = 0
    				for i in xrange(item.LIMIT_MAX_NUM):
    					(limitType, limitValue) = item.GetLimit(i)
    
    					if item.LIMIT_REAL_TIME == limitType:
    						bHasRealtimeFlag = 1
    				if metinSlot[2]:
    					self.AppendTextLine(localeInfo.TOOLTIP_TIME_CHARGER_FIX(metinSlot[2]))
    				else:
    					self.AppendTextLine(localeInfo.TOOLTIP_TIME_CHARGER_FIX(item.GetValue(0)))
    		
    				## ??? ?? ??? ???. ex) ?? ?? : 6? 6?? 58? 
    				if 1 == bHasRealtimeFlag:
    					self.AppendMallItemLastTime(metinSlot[0])
    
    		elif item.ITEM_TYPE_QUEST == itemType:
    			for i in xrange(item.LIMIT_MAX_NUM):
    				(limitType, limitValue) = item.GetLimit(i)
    
    				if item.LIMIT_REAL_TIME == limitType:
    					self.AppendMallItemLastTime(metinSlot[0])
    		elif item.ITEM_TYPE_DS == itemType:
    			self.AppendTextLine(self.__DragonSoulInfoString(itemVnum))
    			self.__AppendAttributeInformation(attrSlot)
    		else:
    			self.__AppendLimitInformation()
    
    		for i in xrange(item.LIMIT_MAX_NUM):
    			(limitType, limitValue) = item.GetLimit(i)
    			#dbg.TraceError("LimitType : %d, limitValue : %d" % (limitType, limitValue))
    			
    			if item.LIMIT_REAL_TIME_START_FIRST_USE == limitType:
    				self.AppendRealTimeStartFirstUseLastTime(item, metinSlot, i)
    				#dbg.TraceError("2) REAL_TIME_START_FIRST_USE flag On ")
    				
    			elif item.LIMIT_TIMER_BASED_ON_WEAR == limitType:
    				self.AppendTimerBasedOnWearLastTime(metinSlot)
    				#dbg.TraceError("1) REAL_TIME flag On ")
    
    
    				
    		self.ShowToolTip()
    
    	def __DragonSoulInfoString (self, dwVnum):
    		step = (dwVnum / 100) % 10
    		refine = (dwVnum / 10) % 10
    		if 0 == step:
    			return localeInfo.DRAGON_SOUL_STEP_LEVEL1 + " " + localeInfo.DRAGON_SOUL_STRENGTH(refine)
    		elif 1 == step:
    			return localeInfo.DRAGON_SOUL_STEP_LEVEL2 + " " + localeInfo.DRAGON_SOUL_STRENGTH(refine)
    		elif 2 == step:
    			return localeInfo.DRAGON_SOUL_STEP_LEVEL3 + " " + localeInfo.DRAGON_SOUL_STRENGTH(refine)
    		elif 3 == step:
    			return localeInfo.DRAGON_SOUL_STEP_LEVEL4 + " " + localeInfo.DRAGON_SOUL_STRENGTH(refine)
    		elif 4 == step:
    			return localeInfo.DRAGON_SOUL_STEP_LEVEL5 + " " + localeInfo.DRAGON_SOUL_STRENGTH(refine)
    		else:
    			return ""
    
    
    	## ?????
    	def __IsHair(self, itemVnum):
    		return (self.__IsOldHair(itemVnum) or 
    			self.__IsNewHair(itemVnum) or
    			self.__IsNewHair2(itemVnum) or
    			self.__IsNewHair3(itemVnum) or
    			self.__IsCostumeHair(itemVnum)
    			)
    
    	def __IsOldHair(self, itemVnum):
    		return itemVnum > 73000 and itemVnum < 74000	
    
    	def __IsNewHair(self, itemVnum):
    		return itemVnum > 74000 and itemVnum < 75000	
    
    	def __IsNewHair2(self, itemVnum):
    		return itemVnum > 75000 and itemVnum < 76000	
    
    	def __IsNewHair3(self, itemVnum):
    		return ((74012 < itemVnum and itemVnum < 74022) or
    			(74262 < itemVnum and itemVnum < 74272) or
    			(74512 < itemVnum and itemVnum < 74522) or
    			(74762 < itemVnum and itemVnum < 74772) or
    			(45000 < itemVnum and itemVnum < 47000))
    
    	def __IsCostumeHair(self, itemVnum):
    		return app.ENABLE_COSTUME_SYSTEM and self.__IsNewHair3(itemVnum - 100000)
    		
    	def __AppendHairIcon(self, itemVnum):
    		itemImage = ui.ImageBox()
    		itemImage.SetParent(self)
    		itemImage.Show()			
    
    		if self.__IsOldHair(itemVnum):
    			itemImage.LoadImage("d:/ymir work/item/quest/"+str(itemVnum)+".tga")
    		elif self.__IsNewHair3(itemVnum):
    			itemImage.LoadImage("icon/hair/%d.sub" % (itemVnum))
    		elif self.__IsNewHair(itemVnum): # ?? ?? ??? ????? ????. ??? ???? 1000?? ??? ???.
    			itemImage.LoadImage("d:/ymir work/item/quest/"+str(itemVnum-1000)+".tga")
    		elif self.__IsNewHair2(itemVnum):
    			itemImage.LoadImage("icon/hair/%d.sub" % (itemVnum))
    		elif self.__IsCostumeHair(itemVnum):
    			itemImage.LoadImage("icon/hair/%d.sub" % (itemVnum - 100000))
    
    		itemImage.SetPosition(itemImage.GetWidth()/2, self.toolTipHeight)
    		self.toolTipHeight += itemImage.GetHeight()
    		#self.toolTipWidth += itemImage.GetWidth()/2
    		self.childrenList.append(itemImage)
    		self.ResizeToolTip()
    
    	## ???? ? Description ? ?? ?? ???? ????
    	def __AdjustMaxWidth(self, attrSlot, desc):
    		newToolTipWidth = self.toolTipWidth
    		newToolTipWidth = max(self.__AdjustAttrMaxWidth(attrSlot), newToolTipWidth)
    		newToolTipWidth = max(self.__AdjustDescMaxWidth(desc), newToolTipWidth)
    		if newToolTipWidth > self.toolTipWidth:
    			self.toolTipWidth = newToolTipWidth
    			self.ResizeToolTip()
    
    	def __AdjustAttrMaxWidth(self, attrSlot):
    		if 0 == attrSlot:
    			return self.toolTipWidth
    
    		maxWidth = self.toolTipWidth
    		for i in xrange(player.ATTRIBUTE_SLOT_MAX_NUM):
    			type = attrSlot[i][0]
    			value = attrSlot[i][1]
    			if self.ATTRIBUTE_NEED_WIDTH.has_key(type):
    				if value > 0:
    					maxWidth = max(self.ATTRIBUTE_NEED_WIDTH[type], maxWidth)
    
    					# ATTR_CHANGE_TOOLTIP_WIDTH
    					#self.toolTipWidth = max(self.ATTRIBUTE_NEED_WIDTH[type], self.toolTipWidth)
    					#self.ResizeToolTip()
    					# END_OF_ATTR_CHANGE_TOOLTIP_WIDTH
    
    		return maxWidth
    
    	def __AdjustDescMaxWidth(self, desc):
    		if len(desc) < DESC_DEFAULT_MAX_COLS:
    			return self.toolTipWidth
    	
    		return DESC_WESTERN_MAX_WIDTH
    
    	def __SetSkillBookToolTip(self, skillIndex, bookName, skillGrade):
    		skillName = skill.GetSkillName(skillIndex)
    
    		if not skillName:
    			return
    
    		if localeInfo.IsVIETNAM():
    			itemName = bookName + " " + skillName
    		else:
    			itemName = skillName + " " + bookName
    		self.SetTitle(itemName)
    
    	def __AppendPickInformation(self, curLevel, curEXP, maxEXP):
    		self.AppendSpace(5)
    		self.AppendTextLine(localeInfo.TOOLTIP_PICK_LEVEL % (curLevel), self.NORMAL_COLOR)
    		self.AppendTextLine(localeInfo.TOOLTIP_PICK_EXP % (curEXP, maxEXP), self.NORMAL_COLOR)
    
    		if curEXP == maxEXP:
    			self.AppendSpace(5)
    			self.AppendTextLine(localeInfo.TOOLTIP_PICK_UPGRADE1, self.NORMAL_COLOR)
    			self.AppendTextLine(localeInfo.TOOLTIP_PICK_UPGRADE2, self.NORMAL_COLOR)
    			self.AppendTextLine(localeInfo.TOOLTIP_PICK_UPGRADE3, self.NORMAL_COLOR)
    
    
    	def __AppendRodInformation(self, curLevel, curEXP, maxEXP):
    		self.AppendSpace(5)
    		self.AppendTextLine(localeInfo.TOOLTIP_FISHINGROD_LEVEL % (curLevel), self.NORMAL_COLOR)
    		self.AppendTextLine(localeInfo.TOOLTIP_FISHINGROD_EXP % (curEXP, maxEXP), self.NORMAL_COLOR)
    
    		if curEXP == maxEXP:
    			self.AppendSpace(5)
    			self.AppendTextLine(localeInfo.TOOLTIP_FISHINGROD_UPGRADE1, self.NORMAL_COLOR)
    			self.AppendTextLine(localeInfo.TOOLTIP_FISHINGROD_UPGRADE2, self.NORMAL_COLOR)
    			self.AppendTextLine(localeInfo.TOOLTIP_FISHINGROD_UPGRADE3, self.NORMAL_COLOR)
    
    	def __AppendLimitInformation(self):
    
    		appendSpace = FALSE
    
    		for i in xrange(item.LIMIT_MAX_NUM):
    
    			(limitType, limitValue) = item.GetLimit(i)
    
    			if limitValue > 0:
    				if FALSE == appendSpace:
    					self.AppendSpace(5)
    					appendSpace = TRUE
    
    			else:
    				continue
    
    			if item.LIMIT_LEVEL == limitType:
    				color = self.GetLimitTextLineColor(player.GetStatus(player.LEVEL), limitValue)
    				self.AppendTextLine(localeInfo.TOOLTIP_ITEM_LIMIT_LEVEL % (limitValue), color)
    			"""
    			elif item.LIMIT_STR == limitType:
    				color = self.GetLimitTextLineColor(player.GetStatus(player.ST), limitValue)
    				self.AppendTextLine(localeInfo.TOOLTIP_ITEM_LIMIT_STR % (limitValue), color)
    			elif item.LIMIT_DEX == limitType:
    				color = self.GetLimitTextLineColor(player.GetStatus(player.DX), limitValue)
    				self.AppendTextLine(localeInfo.TOOLTIP_ITEM_LIMIT_DEX % (limitValue), color)
    			elif item.LIMIT_INT == limitType:
    				color = self.GetLimitTextLineColor(player.GetStatus(player.IQ), limitValue)
    				self.AppendTextLine(localeInfo.TOOLTIP_ITEM_LIMIT_INT % (limitValue), color)
    			elif item.LIMIT_CON == limitType:
    				color = self.GetLimitTextLineColor(player.GetStatus(player.HT), limitValue)
    				self.AppendTextLine(localeInfo.TOOLTIP_ITEM_LIMIT_CON % (limitValue), color)
    			"""
    
    
    
    
    
    
    
    
    	def __AppendSealInformation(self, window_type, slotIndex):
    		if window_type == player.SAFEBOX:
    			if safebox.GetItemBind(slotIndex) <= 1:
    				itemSoulTime = safebox.GetItemBind(slotIndex)
    			else:
    				itemSoulTime = max(0, safebox.GetItemBind(slotIndex) - app.GetGlobalTimeStamp())
    		elif window_type == player.MALL:
    			if safebox.GetMallItemBind(slotIndex) <= 1:
    				itemSoulTime = safebox.GetMallItemBind(slotIndex)
    			else:
    				itemSoulTime = max(0, safebox.GetMallItemBind(slotIndex) - app.GetGlobalTimeStamp())
    		elif window_type == player.INVENTORY:
    			if player.GetItemBind(slotIndex) <= 1:
    				itemSoulTime = player.GetItemBind(slotIndex)
    			else:
    				itemSoulTime = max(0, player.GetItemBind(slotIndex) - app.GetGlobalTimeStamp())
    		else:
    			return
    			
    		if itemSoulTime == 0:
    			return
    		elif itemSoulTime == 1:
    			self.AppendSpace(5)
    			self.AppendTextLine(localeInfo.TOOLTIP_SEALED, self.NEGATIVE_COLOR)
    		elif itemSoulTime > 1:
    			self.AppendSpace(5)
    			hrs = itemSoulTime / 3600
    			itemSoulTime -= 3600 * hrs
    			mins = itemSoulTime / 60
    			itemSoulTime -= 60 * mins
    			self.AppendTextLine(localeInfo.TOOLTIP_UNSEAL_LEFT_TIME % (hrs, mins), self.NEGATIVE_COLOR)
    
    	def __GetAffectString(self, affectType, affectValue):
    		if 0 == affectType:
    			return None
    
    		if 0 == affectValue:
    			return None
    
    		try:
    			return self.AFFECT_DICT[affectType](affectValue)
    		except TypeError:
    			return "UNKNOWN_VALUE[%s] %s" % (affectType, affectValue)
    		except KeyError:
    			return "UNKNOWN_TYPE[%s] %s" % (affectType, affectValue)
    
    	def __AppendAffectInformation(self):
    		for i in xrange(item.ITEM_APPLY_MAX_NUM):
    
    			(affectType, affectValue) = item.GetAffect(i)
    
    			affectString = self.__GetAffectString(affectType, affectValue)
    			if affectString:
    				self.AppendTextLine(affectString, self.GetChangeTextLineColor(affectValue))
    
    	def AppendWearableInformation(self):
    		self.AppendSpace(5)
    		self.AppendTextLine(localeInfo.TOOLTIP_ITEM_WEARABLE_JOB, self.NORMAL_COLOR)
    		flagList = (
    						not item.IsAntiFlag(item.ITEM_ANTIFLAG_WARRIOR),
    						not item.IsAntiFlag(item.ITEM_ANTIFLAG_ASSASSIN),
    						not item.IsAntiFlag(item.ITEM_ANTIFLAG_SURA),
    						not item.IsAntiFlag(item.ITEM_ANTIFLAG_SHAMAN),
    						not item.IsAntiFlag(item.ITEM_ANTIFLAG_WOLFMAN)
    				)
    		
    		characterNames = ""
    		for i in xrange(self.CHARACTER_COUNT):
    			name = self.CHARACTER_NAMES[i]
    			flag = flagList[i]
    			if flag:
    				characterNames += " "
    				characterNames += name
    		
    		textLine = self.AppendTextLine(characterNames, self.NORMAL_COLOR, TRUE)
    		textLine.SetFeather()
    		if item.IsAntiFlag(item.ITEM_ANTIFLAG_MALE):
    			textLine = self.AppendTextLine(localeInfo.FOR_FEMALE, self.NORMAL_COLOR, TRUE)
    			textLine.SetFeather()
    		
    		if item.IsAntiFlag(item.ITEM_ANTIFLAG_FEMALE):
    			textLine = self.AppendTextLine(localeInfo.FOR_MALE, self.NORMAL_COLOR, TRUE)
    			textLine.SetFeather()
    
    	def __AppendPotionInformation(self):
    		self.AppendSpace(5)
    
    		healHP = item.GetValue(0)
    		healSP = item.GetValue(1)
    		healStatus = item.GetValue(2)
    		healPercentageHP = item.GetValue(3)
    		healPercentageSP = item.GetValue(4)
    
    		if healHP > 0:
    			self.AppendTextLine(localeInfo.TOOLTIP_POTION_PLUS_HP_POINT % healHP, self.GetChangeTextLineColor(healHP))
    		if healSP > 0:
    			self.AppendTextLine(localeInfo.TOOLTIP_POTION_PLUS_SP_POINT % healSP, self.GetChangeTextLineColor(healSP))
    		if healStatus != 0:
    			self.AppendTextLine(localeInfo.TOOLTIP_POTION_CURE)
    		if healPercentageHP > 0:
    			self.AppendTextLine(localeInfo.TOOLTIP_POTION_PLUS_HP_PERCENT % healPercentageHP, self.GetChangeTextLineColor(healPercentageHP))
    		if healPercentageSP > 0:
    			self.AppendTextLine(localeInfo.TOOLTIP_POTION_PLUS_SP_PERCENT % healPercentageSP, self.GetChangeTextLineColor(healPercentageSP))
    
    	def __AppendAbilityPotionInformation(self):
    
    		self.AppendSpace(5)
    
    		abilityType = item.GetValue(0)
    		time = item.GetValue(1)
    		point = item.GetValue(2)
    
    		if abilityType == item.APPLY_ATT_SPEED:
    			self.AppendTextLine(localeInfo.TOOLTIP_POTION_PLUS_ATTACK_SPEED % point, self.GetChangeTextLineColor(point))
    		elif abilityType == item.APPLY_MOV_SPEED:
    			self.AppendTextLine(localeInfo.TOOLTIP_POTION_PLUS_MOVING_SPEED % point, self.GetChangeTextLineColor(point))
    
    		if time > 0:
    			minute = (time / 60)
    			second = (time % 60)
    			timeString = localeInfo.TOOLTIP_POTION_TIME
    
    			if minute > 0:
    				timeString += str(minute) + localeInfo.TOOLTIP_POTION_MIN
    			if second > 0:
    				timeString += " " + str(second) + localeInfo.TOOLTIP_POTION_SEC
    
    			self.AppendTextLine(timeString)
    
    	def GetPriceColor(self, price):
    		if price>=constInfo.HIGH_PRICE:
    			return self.HIGH_PRICE_COLOR
    		if price>=constInfo.MIDDLE_PRICE:
    			return self.MIDDLE_PRICE_COLOR
    		else:
    			return self.LOW_PRICE_COLOR
    
    	def AppendPrice(self, price):
    		self.AppendSpace(5)
    		self.AppendTextLine(localeInfo.TOOLTIP_BUYPRICE1 , self.SHOP_ITEM_COLOR)
    		self.AppendTextLine(localeInfo.TOOLTIP_BUYPRICE % (localeInfo.NumberToMoneyString(price)), self.GetPriceColor(price))
    		
    	if app.ENABLE_SHOP_SISTEM:
    		def miktar(self, price):
    			self.AppendSpace(5)
    			self.AppendTextLine(localeInfo.TOOLTIP_BUYPRICE1 , self.SHOP_ITEM_COLOR)
    			self.AppendTextLine(localeInfo.TOOLTIP_BUYPRICE_NEW  % (localeInfo.NumberToMoneyString2(price)), self.GetPriceColor(price))
    
    		def miktar2(self, price):
    			self.AppendSpace(5)
    			self.AppendTextLine(localeInfo.TOOLTIP_BUYPRICE1 , self.SHOP_ITEM_COLOR)
    			self.AppendTextLine(localeInfo.TOOLTIP_BUYPRICE_NEW_2  % (localeInfo.NumberToMoneyString2(price)), self.GetPriceColor(price))
    		
    	def AppendPriceBySecondaryCoin(self, price):
    		self.AppendSpace(5)
    		self.AppendTextLine(localeInfo.TOOLTIP_BUYPRICE1 , self.SHOP_ITEM_COLOR)
    		self.AppendTextLine(localeInfo.TOOLTIP_BUYPRICE  % (localeInfo.NumberToSecondaryCoinString(price)), self.GetPriceColor(price))
    
    	def AppendSellingPrice(self, price):
    		if item.IsAntiFlag(item.ITEM_ANTIFLAG_SELL):
    			self.AppendTextLine(localeInfo.TOOLTIP_ANTI_SELL, self.DISABLE_COLOR)
    			self.AppendSpace(5)
    		else:
    			self.AppendTextLine(localeInfo.TOOLTIP_BUYPRICE1 , self.SHOP_ITEM_COLOR)
    			self.AppendTextLine(localeInfo.TOOLTIP_SELLPRICE % (localeInfo.NumberToMoneyString(price)), self.GetPriceColor(price))
    			self.AppendSpace(5)
    
    	def AppendMetinInformation(self):
    		affectType, affectValue = item.GetAffect(0)
    		#affectType = item.GetValue(0)
    		#affectValue = item.GetValue(1)
    
    		affectString = self.__GetAffectString(affectType, affectValue)
    
    		if affectString:
    			self.AppendSpace(5)
    			self.AppendTextLine(affectString, self.GetChangeTextLineColor(affectValue))
    
    	def AppendMetinWearInformation(self):
    
    		self.AppendSpace(5)
    		self.AppendTextLine(localeInfo.TOOLTIP_SOCKET_REFINABLE_ITEM, self.NORMAL_COLOR)
    
    		flagList = (item.IsWearableFlag(item.WEARABLE_BODY),
    					item.IsWearableFlag(item.WEARABLE_HEAD),
    					item.IsWearableFlag(item.WEARABLE_FOOTS),
    					item.IsWearableFlag(item.WEARABLE_WRIST),
    					item.IsWearableFlag(item.WEARABLE_WEAPON),
    					item.IsWearableFlag(item.WEARABLE_NECK),
    					item.IsWearableFlag(item.WEARABLE_EAR),
    					item.IsWearableFlag(item.WEARABLE_UNIQUE),
    					item.IsWearableFlag(item.WEARABLE_SHIELD),
    					item.IsWearableFlag(item.WEARABLE_ARROW))
    
    		wearNames = ""
    		for i in xrange(self.WEAR_COUNT):
    
    			name = self.WEAR_NAMES[i]
    			flag = flagList[i]
    
    			if flag:
    				wearNames += "  "
    				wearNames += name
    
    		textLine = ui.TextLine()
    		textLine.SetParent(self)
    		textLine.SetFontName(self.defFontName)
    		textLine.SetPosition(self.toolTipWidth/2, self.toolTipHeight)
    		textLine.SetHorizontalAlignCenter()
    		textLine.SetPackedFontColor(self.NORMAL_COLOR)
    		textLine.SetText(wearNames)
    		textLine.Show()
    		self.childrenList.append(textLine)
    
    		self.toolTipHeight += self.TEXT_LINE_HEIGHT
    		self.ResizeToolTip()
    
    	def GetMetinSocketType(self, number):
    		if player.METIN_SOCKET_TYPE_NONE == number:
    			return player.METIN_SOCKET_TYPE_NONE
    		elif player.METIN_SOCKET_TYPE_SILVER == number:
    			return player.METIN_SOCKET_TYPE_SILVER
    		elif player.METIN_SOCKET_TYPE_GOLD == number:
    			return player.METIN_SOCKET_TYPE_GOLD
    		else:
    			item.SelectItem(number)
    			if item.METIN_NORMAL == item.GetItemSubType():
    				return player.METIN_SOCKET_TYPE_SILVER
    			elif item.METIN_GOLD == item.GetItemSubType():
    				return player.METIN_SOCKET_TYPE_GOLD
    			elif "USE_PUT_INTO_ACCESSORY_SOCKET" == item.GetUseType(number):
    				return player.METIN_SOCKET_TYPE_SILVER
    			elif "USE_PUT_INTO_RING_SOCKET" == item.GetUseType(number):
    				return player.METIN_SOCKET_TYPE_SILVER
    			elif "USE_PUT_INTO_BELT_SOCKET" == item.GetUseType(number):
    				return player.METIN_SOCKET_TYPE_SILVER
    
    		return player.METIN_SOCKET_TYPE_NONE
    
    	def GetMetinItemIndex(self, number):
    		if player.METIN_SOCKET_TYPE_SILVER == number:
    			return 0
    		if player.METIN_SOCKET_TYPE_GOLD == number:
    			return 0
    
    		return number
    
    	def __AppendAccessoryMetinSlotInfo(self, metinSlot, mtrlVnum):		
    		ACCESSORY_SOCKET_MAX_SIZE = 3		
    
    		cur=min(metinSlot[0], ACCESSORY_SOCKET_MAX_SIZE)
    		end=min(metinSlot[1], ACCESSORY_SOCKET_MAX_SIZE)
    
    		affectType1, affectValue1 = item.GetAffect(0)
    		affectList1=[0, max(1, affectValue1*10/100), max(2, affectValue1*20/100), max(3, affectValue1*40/100)]
    
    		affectType2, affectValue2 = item.GetAffect(1)
    		affectList2=[0, max(1, affectValue2*10/100), max(2, affectValue2*20/100), max(3, affectValue2*40/100)]
    
    		mtrlPos=0
    		mtrlList=[mtrlVnum]*cur+[player.METIN_SOCKET_TYPE_SILVER]*(end-cur)
    		for mtrl in mtrlList:
    			affectString1 = self.__GetAffectString(affectType1, affectList1[mtrlPos+1]-affectList1[mtrlPos])			
    			affectString2 = self.__GetAffectString(affectType2, affectList2[mtrlPos+1]-affectList2[mtrlPos])
    
    			leftTime = 0
    			if cur == mtrlPos+1:
    				leftTime=metinSlot[2]
    
    			self.__AppendMetinSlotInfo_AppendMetinSocketData(mtrlPos, mtrl, affectString1, affectString2, leftTime)
    			mtrlPos+=1
    
    	def __AppendMetinSlotInfo(self, metinSlot):
    		if self.__AppendMetinSlotInfo_IsEmptySlotList(metinSlot):
    			return
    
    		for i in xrange(player.METIN_SOCKET_MAX_NUM):
    			self.__AppendMetinSlotInfo_AppendMetinSocketData(i, metinSlot[i])
    
    	def __AppendMetinSlotInfo_IsEmptySlotList(self, metinSlot):
    		if 0 == metinSlot:
    			return 1
    
    		for i in xrange(player.METIN_SOCKET_MAX_NUM):
    			metinSlotData=metinSlot[i]
    			if 0 != self.GetMetinSocketType(metinSlotData):
    				if 0 != self.GetMetinItemIndex(metinSlotData):
    					return 0
    
    		return 1
    
    	def __AppendMetinSlotInfo_AppendMetinSocketData(self, index, metinSlotData, custumAffectString="", custumAffectString2="", leftTime=0):
    
    		slotType = self.GetMetinSocketType(metinSlotData)
    		itemIndex = self.GetMetinItemIndex(metinSlotData)
    
    		if 0 == slotType:
    			return
    
    		self.AppendSpace(5)
    
    		slotImage = ui.ImageBox()
    		slotImage.SetParent(self)
    		slotImage.Show()
    
    		## Name
    		nameTextLine = ui.TextLine()
    		nameTextLine.SetParent(self)
    		nameTextLine.SetFontName(self.defFontName)
    		nameTextLine.SetPackedFontColor(self.NORMAL_COLOR)
    		nameTextLine.SetOutline()
    		nameTextLine.SetFeather()
    		nameTextLine.Show()			
    
    		self.childrenList.append(nameTextLine)
    
    		if player.METIN_SOCKET_TYPE_SILVER == slotType:
    			slotImage.LoadImage("d:/ymir work/ui/game/windows/metin_slot_silver.sub")
    		elif player.METIN_SOCKET_TYPE_GOLD == slotType:
    			slotImage.LoadImage("d:/ymir work/ui/game/windows/metin_slot_gold.sub")
    
    		self.childrenList.append(slotImage)
    		
    		if localeInfo.IsARABIC():
    			slotImage.SetPosition(self.toolTipWidth - slotImage.GetWidth() - 9, self.toolTipHeight-1)
    			nameTextLine.SetPosition(self.toolTipWidth - 50, self.toolTipHeight + 2)
    		else:
    			slotImage.SetPosition(9, self.toolTipHeight-1)
    			nameTextLine.SetPosition(50, self.toolTipHeight + 2)
    
    		metinImage = ui.ImageBox()
    		metinImage.SetParent(self)
    		metinImage.Show()
    		self.childrenList.append(metinImage)
    
    		if itemIndex:
    
    			item.SelectItem(itemIndex)
    
    			## Image
    			try:
    				metinImage.LoadImage(item.GetIconImageFileName())
    			except:
    				dbg.TraceError("ItemToolTip.__AppendMetinSocketData() - Failed to find image file %d:%s" % 
    					(itemIndex, item.GetIconImageFileName())
    				)
    
    			nameTextLine.SetText(item.GetItemName())
    			
    			## Affect		
    			affectTextLine = ui.TextLine()
    			affectTextLine.SetParent(self)
    			affectTextLine.SetFontName(self.defFontName)
    			affectTextLine.SetPackedFontColor(self.POSITIVE_COLOR)
    			affectTextLine.SetOutline()
    			affectTextLine.SetFeather()
    			affectTextLine.Show()			
    				
    			if localeInfo.IsARABIC():
    				metinImage.SetPosition(self.toolTipWidth - metinImage.GetWidth() - 10, self.toolTipHeight)
    				affectTextLine.SetPosition(self.toolTipWidth - 50, self.toolTipHeight + 16 + 2)
    			else:
    				metinImage.SetPosition(10, self.toolTipHeight)
    				affectTextLine.SetPosition(50, self.toolTipHeight + 16 + 2)
    							
    			if custumAffectString:
    				affectTextLine.SetText(custumAffectString)
    			elif itemIndex!=constInfo.ERROR_METIN_STONE:
    				affectType, affectValue = item.GetAffect(0)
    				affectString = self.__GetAffectString(affectType, affectValue)
    				if affectString:
    					affectTextLine.SetText(affectString)
    			else:
    				affectTextLine.SetText(localeInfo.TOOLTIP_APPLY_NOAFFECT)
    			
    			self.childrenList.append(affectTextLine)			
    
    			if custumAffectString2:
    				affectTextLine = ui.TextLine()
    				affectTextLine.SetParent(self)
    				affectTextLine.SetFontName(self.defFontName)
    				affectTextLine.SetPackedFontColor(self.POSITIVE_COLOR)
    				affectTextLine.SetPosition(50, self.toolTipHeight + 16 + 2 + 16 + 2)
    				affectTextLine.SetOutline()
    				affectTextLine.SetFeather()
    				affectTextLine.Show()
    				affectTextLine.SetText(custumAffectString2)
    				self.childrenList.append(affectTextLine)
    				self.toolTipHeight += 16 + 2
    
    			if 0 != leftTime:
    				timeText = (localeInfo.LEFT_TIME + " : " + localeInfo.SecondToDHM(leftTime))
    
    				timeTextLine = ui.TextLine()
    				timeTextLine.SetParent(self)
    				timeTextLine.SetFontName(self.defFontName)
    				timeTextLine.SetPackedFontColor(self.POSITIVE_COLOR)
    				timeTextLine.SetPosition(50, self.toolTipHeight + 16 + 2 + 16 + 2)
    				timeTextLine.SetOutline()
    				timeTextLine.SetFeather()
    				timeTextLine.Show()
    				timeTextLine.SetText(timeText)
    				self.childrenList.append(timeTextLine)
    				self.toolTipHeight += 16 + 2
    
    		else:
    			nameTextLine.SetText(localeInfo.TOOLTIP_SOCKET_EMPTY)
    
    		self.toolTipHeight += 35
    		self.ResizeToolTip()
    
    	def __AppendFishInfo(self, size):
    		if size > 0:
    			self.AppendSpace(5)
    			self.AppendTextLine(localeInfo.TOOLTIP_FISH_LEN % (float(size) / 100.0), self.NORMAL_COLOR)
    
    	def AppendUniqueItemLastTime(self, restMin):
    		restSecond = restMin*60
    		self.AppendSpace(5)
    		self.AppendTextLine(localeInfo.LEFT_TIME + " : " + localeInfo.SecondToDHM(restSecond), self.NORMAL_COLOR)
    
    	def AppendMallItemLastTime(self, endTime):
    		leftSec = max(0, endTime - app.GetGlobalTimeStamp())
    		self.AppendSpace(5)
    		self.AppendTextLine(localeInfo.LEFT_TIME + " : " + localeInfo.SecondToDHM(leftSec), self.NORMAL_COLOR)
    		
    	def AppendTimerBasedOnWearLastTime(self, metinSlot):
    		if 0 == metinSlot[0]:
    			self.AppendSpace(5)
    			self.AppendTextLine(localeInfo.CANNOT_USE, self.DISABLE_COLOR)
    		else:
    			endTime = app.GetGlobalTimeStamp() + metinSlot[0]
    			self.AppendMallItemLastTime(endTime)		
    	
    	def AppendRealTimeStartFirstUseLastTime(self, item, metinSlot, limitIndex):		
    		useCount = metinSlot[1]
    		endTime = metinSlot[0]
    		
    		# ? ???? ????? Socket0? ?? ??(2012? 3? 1? 13? 01? ??..) ? ????.
    		# ???? ???? Socket0? ??????(???? 600 ?? ?. ???)? ???? ? ??, 0??? Limit Value? ?? ??????? ????.
    		if 0 == useCount:
    			if 0 == endTime:
    				(limitType, limitValue) = item.GetLimit(limitIndex)
    				endTime = limitValue
    
    			endTime += app.GetGlobalTimeStamp()
    	
    		self.AppendMallItemLastTime(endTime)
    
    	if app.ENABLE_SASH_SYSTEM:
    		def SetSashResultItem(self, slotIndex, window_type = player.INVENTORY):
    			(itemVnum, MinAbs, MaxAbs) = sash.GetResultItem()
    			if not itemVnum:
    				return
    			
    			self.ClearToolTip()
    			
    			metinSlot = [player.GetItemMetinSocket(window_type, slotIndex, i) for i in xrange(player.METIN_SOCKET_MAX_NUM)]
    			attrSlot = [player.GetItemAttribute(window_type, slotIndex, i) for i in xrange(player.ATTRIBUTE_SLOT_MAX_NUM)]
    			
    			item.SelectItem(itemVnum)
    			itemType = item.GetItemType()
    			itemSubType = item.GetItemSubType()
    			if itemType != item.ITEM_TYPE_COSTUME and itemSubType != item.COSTUME_TYPE_SASH:
    				return
    			
    			absChance = MaxAbs
    			itemDesc = item.GetItemDescription()
    			self.__AdjustMaxWidth(attrSlot, itemDesc)
    			self.__SetItemTitle(itemVnum, metinSlot, attrSlot)
    			self.AppendDescription(itemDesc, 26)
    			self.AppendDescription(item.GetItemSummary(), 26, self.CONDITION_COLOR)
    			self.__AppendLimitInformation()
    			
    			## ABSORPTION RATE
    			if MinAbs == MaxAbs:
    				self.AppendTextLine(localeInfo.SASH_ABSORB_CHANCE % (MinAbs), self.CONDITION_COLOR)
    			else:
    				self.AppendTextLine(localeInfo.SASH_ABSORB_CHANCE2 % (MinAbs, MaxAbs), self.CONDITION_COLOR)
    			## END ABSOPRTION RATE
    			
    			itemAbsorbedVnum = int(metinSlot[sash.ABSORBED_SOCKET])
    			if itemAbsorbedVnum:
    				## ATTACK / DEFENCE
    				item.SelectItem(itemAbsorbedVnum)
    				if item.GetItemType() == item.ITEM_TYPE_WEAPON:
    					if item.GetItemSubType() == item.WEAPON_FAN:
    						self.__AppendMagicAttackInfo(absChance)
    						item.SelectItem(itemAbsorbedVnum)
    						self.__AppendAttackPowerInfo(absChance)
    					else:
    						self.__AppendAttackPowerInfo(absChance)
    						item.SelectItem(itemAbsorbedVnum)
    						self.__AppendMagicAttackInfo(absChance)
    				elif item.GetItemType() == item.ITEM_TYPE_ARMOR:
    					defGrade = item.GetValue(1)
    					defBonus = item.GetValue(5) * 2
    					defGrade = self.CalcSashValue(defGrade, absChance)
    					defBonus = self.CalcSashValue(defBonus, absChance)
    					
    					if defGrade > 0:
    						self.AppendSpace(5)
    						self.AppendTextLine(localeInfo.TOOLTIP_ITEM_DEF_GRADE % (defGrade + defBonus), self.GetChangeTextLineColor(defGrade))
    					
    					item.SelectItem(itemAbsorbedVnum)
    					self.__AppendMagicDefenceInfo(absChance)
    				## END ATTACK / DEFENCE
    				
    				## EFFECT
    				item.SelectItem(itemAbsorbedVnum)
    				for i in xrange(item.ITEM_APPLY_MAX_NUM):
    					(affectType, affectValue) = item.GetAffect(i)
    					affectValue = self.CalcSashValue(affectValue, absChance)
    					affectString = self.__GetAffectString(affectType, affectValue)
    					if affectString and affectValue > 0:
    						self.AppendTextLine(affectString, self.GetChangeTextLineColor(affectValue))
    					
    					item.SelectItem(itemAbsorbedVnum)
    				# END EFFECT
    				
    			item.SelectItem(itemVnum)
    			## ATTR
    			self.__AppendAttributeInformation(attrSlot, MaxAbs)
    			# END ATTR
    			
    			self.AppendWearableInformation()
    			self.ShowToolTip()
    
    		def SetSashResultAbsItem(self, slotIndex1, slotIndex2, window_type = player.INVENTORY):
    			itemVnumSash = player.GetItemIndex(window_type, slotIndex1)
    			itemVnumTarget = player.GetItemIndex(window_type, slotIndex2)
    			if not itemVnumSash or not itemVnumTarget:
    				return
    			
    			self.ClearToolTip()
    			
    			item.SelectItem(itemVnumSash)
    			itemType = item.GetItemType()
    			itemSubType = item.GetItemSubType()
    			if itemType != item.ITEM_TYPE_COSTUME and itemSubType != item.COSTUME_TYPE_SASH:
    				return
    			
    			metinSlot = [player.GetItemMetinSocket(window_type, slotIndex1, i) for i in xrange(player.METIN_SOCKET_MAX_NUM)]
    			attrSlot = [player.GetItemAttribute(window_type, slotIndex2, i) for i in xrange(player.ATTRIBUTE_SLOT_MAX_NUM)]
    			
    			itemDesc = item.GetItemDescription()
    			self.__AdjustMaxWidth(attrSlot, itemDesc)
    			self.__SetItemTitle(itemVnumSash, metinSlot, attrSlot)
    			self.AppendDescription(itemDesc, 26)
    			self.AppendDescription(item.GetItemSummary(), 26, self.CONDITION_COLOR)
    			item.SelectItem(itemVnumSash)
    			self.__AppendLimitInformation()
    			
    			## ABSORPTION RATE
    			self.AppendTextLine(localeInfo.SASH_ABSORB_CHANCE % (metinSlot[sash.ABSORPTION_SOCKET]), self.CONDITION_COLOR)
    			## END ABSOPRTION RATE
    			
    			## ATTACK / DEFENCE
    			itemAbsorbedVnum = itemVnumTarget
    			item.SelectItem(itemAbsorbedVnum)
    			if item.GetItemType() == item.ITEM_TYPE_WEAPON:
    				if item.GetItemSubType() == item.WEAPON_FAN:
    					self.__AppendMagicAttackInfo(metinSlot[sash.ABSORPTION_SOCKET])
    					item.SelectItem(itemAbsorbedVnum)
    					self.__AppendAttackPowerInfo(metinSlot[sash.ABSORPTION_SOCKET])
    				else:
    					self.__AppendAttackPowerInfo(metinSlot[sash.ABSORPTION_SOCKET])
    					item.SelectItem(itemAbsorbedVnum)
    					self.__AppendMagicAttackInfo(metinSlot[sash.ABSORPTION_SOCKET])
    			elif item.GetItemType() == item.ITEM_TYPE_ARMOR:
    				defGrade = item.GetValue(1)
    				defBonus = item.GetValue(5) * 2
    				defGrade = self.CalcSashValue(defGrade, metinSlot[sash.ABSORPTION_SOCKET])
    				defBonus = self.CalcSashValue(defBonus, metinSlot[sash.ABSORPTION_SOCKET])
    				
    				if defGrade > 0:
    					self.AppendSpace(5)
    					self.AppendTextLine(localeInfo.TOOLTIP_ITEM_DEF_GRADE % (defGrade + defBonus), self.GetChangeTextLineColor(defGrade))
    				
    				item.SelectItem(itemAbsorbedVnum)
    				self.__AppendMagicDefenceInfo(metinSlot[sash.ABSORPTION_SOCKET])
    			## END ATTACK / DEFENCE
    			
    			## EFFECT
    			item.SelectItem(itemAbsorbedVnum)
    			for i in xrange(item.ITEM_APPLY_MAX_NUM):
    				(affectType, affectValue) = item.GetAffect(i)
    				affectValue = self.CalcSashValue(affectValue, metinSlot[sash.ABSORPTION_SOCKET])
    				affectString = self.__GetAffectString(affectType, affectValue)
    				if affectString and affectValue > 0:
    					self.AppendTextLine(affectString, self.GetChangeTextLineColor(affectValue))
    				
    				item.SelectItem(itemAbsorbedVnum)
    			## END EFFECT
    			
    			## ATTR
    			item.SelectItem(itemAbsorbedVnum)
    			for i in xrange(player.ATTRIBUTE_SLOT_MAX_NUM):
    				type = attrSlot[i][0]
    				value = attrSlot[i][1]
    				if not value:
    					continue
    				
    				value = self.CalcSashValue(value, metinSlot[sash.ABSORPTION_SOCKET])
    				affectString = self.__GetAffectString(type, value)
    				if affectString and value > 0:
    					affectColor = self.__GetAttributeColor(i, value)
    					self.AppendTextLine(affectString, affectColor)
    				
    				item.SelectItem(itemAbsorbedVnum)
    			## END ATTR
    			
    			## WEARABLE
    			item.SelectItem(itemVnumSash)
    			self.AppendSpace(5)
    			self.AppendTextLine(localeInfo.TOOLTIP_ITEM_WEARABLE_JOB, self.NORMAL_COLOR)
    			
    			item.SelectItem(itemVnumSash)
    			flagList = (
    						not item.IsAntiFlag(item.ITEM_ANTIFLAG_WARRIOR),
    						not item.IsAntiFlag(item.ITEM_ANTIFLAG_ASSASSIN),
    						not item.IsAntiFlag(item.ITEM_ANTIFLAG_SURA),
    						not item.IsAntiFlag(item.ITEM_ANTIFLAG_SHAMAN)
    			)
    			
    			flagList += (not item.IsAntiFlag(item.ITEM_ANTIFLAG_WOLFMAN),)
    			
    			characterNames = ""
    			for i in xrange(self.CHARACTER_COUNT):
    				name = self.CHARACTER_NAMES[i]
    				flag = flagList[i]
    				if flag:
    					characterNames += " "
    					characterNames += name
    			
    			textLine = self.AppendTextLine(characterNames, self.NORMAL_COLOR, True)
    			textLine.SetFeather()
    			
    			item.SelectItem(itemVnumSash)
    			if item.IsAntiFlag(item.ITEM_ANTIFLAG_MALE):
    				textLine = self.AppendTextLine(localeInfo.FOR_FEMALE, self.NORMAL_COLOR, True)
    				textLine.SetFeather()
    			
    			if item.IsAntiFlag(item.ITEM_ANTIFLAG_FEMALE):
    				textLine = self.AppendTextLine(localeInfo.FOR_MALE, self.NORMAL_COLOR, True)
    				textLine.SetFeather()
    			## END WEARABLE
    			
    			self.ShowToolTip()
    
    	if app.ENABLE_CHANGELOOK_SYSTEM:
    		def AppendTransmutation(self, window_type, slotIndex, transmutation):
    			itemVnum = 0
    			if transmutation == -1:
    				if window_type == player.INVENTORY:
    					itemVnum = player.GetItemTransmutation(window_type, slotIndex)
    				elif window_type == player.SAFEBOX:
    					itemVnum = safebox.GetItemTransmutation(slotIndex)
    				elif window_type == player.MALL:
    					itemVnum = safebox.GetMallItemTransmutation(slotIndex)
    					#itemVnum = safebox.GetItemMallTransmutation(slotIndex)
    			else:
    				itemVnum = transmutation
    			
    			if not itemVnum:
    				return
    			
    			item.SelectItem(itemVnum)
    			itemName = item.GetItemName()
    			if not itemName or itemName == "":
    				return
    			
    			self.AppendSpace(5)
    			title = "[ " + localeInfo.CHANGE_LOOK_TITLE + " ]"
    			self.AppendTextLine(title, self.BEFORE_LOOK_COLOR)
    			textLine = self.AppendTextLine(itemName, self.UNDER_LOOK_COLOR, True)
    			textLine.SetFeather()
    
    class HyperlinkItemToolTip(ItemToolTip):
    	def __init__(self):
    		ItemToolTip.__init__(self, isPickable=TRUE)
    
    	def SetHyperlinkItem(self, tokens):
    		minTokenCount = 3 + player.METIN_SOCKET_MAX_NUM
    		if app.ENABLE_CHANGELOOK_SYSTEM:
    			minTokenCount += 1
    		maxTokenCount = minTokenCount + 2 * player.ATTRIBUTE_SLOT_MAX_NUM
    		if tokens and len(tokens) >= minTokenCount and len(tokens) <= maxTokenCount:
    			head, vnum, flag = tokens[:3]
    			itemVnum = int(vnum, 16)
    			metinSlot = [int(metin, 16) for metin in tokens[3:6]]
    
    			rests = tokens[6:]
    			transmutation = 0
    			if app.ENABLE_CHANGELOOK_SYSTEM:
    				rests = tokens[7:]
    				cnv = [int(cnv, 16) for cnv in tokens[6:7]]
    				transmutation = int(cnv[0])
    			if rests:
    				attrSlot = []
    
    				rests.reverse()
    				while rests:
    					key = int(rests.pop(), 16)
    					if rests:
    						val = int(rests.pop())
    						attrSlot.append((key, val))
    
    				attrSlot += [(0, 0)] * (player.ATTRIBUTE_SLOT_MAX_NUM - len(attrSlot))
    			else:
    				attrSlot = [(0, 0)] * player.ATTRIBUTE_SLOT_MAX_NUM
    
    			self.ClearToolTip()
    			if app.ENABLE_CHANGELOOK_SYSTEM:
    				if not transmutation:
    					self.AddItemData(itemVnum, metinSlot, attrSlot)
    				else:
    					self.AddItemData(itemVnum, metinSlot, attrSlot, 0, player.INVENTORY, -1, transmutation)
    			else:
    				self.AddItemData(itemVnum, metinSlot, attrSlot)
    
    			ItemToolTip.OnUpdate(self)
    
    	def OnUpdate(self):
    		pass
    
    	def OnMouseLeftButtonDown(self):
    		self.Hide()
    
    class SkillToolTip(ToolTip):
    
    	POINT_NAME_DICT = {
    		player.LEVEL : localeInfo.SKILL_TOOLTIP_LEVEL,
    		player.IQ : localeInfo.SKILL_TOOLTIP_INT,
    	}
    
    	SKILL_TOOL_TIP_WIDTH = 200
    	PARTY_SKILL_TOOL_TIP_WIDTH = 340
    
    	PARTY_SKILL_EXPERIENCE_AFFECT_LIST = (	( 2, 2,  10,),
    											( 8, 3,  20,),
    											(14, 4,  30,),
    											(22, 5,  45,),
    											(28, 6,  60,),
    											(34, 7,  80,),
    											(38, 8, 100,), )
    
    	PARTY_SKILL_PLUS_GRADE_AFFECT_LIST = (	( 4, 2, 1, 0,),
    											(10, 3, 2, 0,),
    											(16, 4, 2, 1,),
    											(24, 5, 2, 2,), )
    
    	PARTY_SKILL_ATTACKER_AFFECT_LIST = (	( 36, 3, ),
    											( 26, 1, ),
    											( 32, 2, ), )
    
    	SKILL_GRADE_NAME = {	player.SKILL_GRADE_MASTER : localeInfo.SKILL_GRADE_NAME_MASTER,
    							player.SKILL_GRADE_GRAND_MASTER : localeInfo.SKILL_GRADE_NAME_GRAND_MASTER,
    							player.SKILL_GRADE_PERFECT_MASTER : localeInfo.SKILL_GRADE_NAME_PERFECT_MASTER, }
    
    	AFFECT_NAME_DICT =	{
    							"HP" : localeInfo.TOOLTIP_SKILL_AFFECT_ATT_POWER,
    							"ATT_GRADE" : localeInfo.TOOLTIP_SKILL_AFFECT_ATT_GRADE,
    							"DEF_GRADE" : localeInfo.TOOLTIP_SKILL_AFFECT_DEF_GRADE,
    							"ATT_SPEED" : localeInfo.TOOLTIP_SKILL_AFFECT_ATT_SPEED,
    							"MOV_SPEED" : localeInfo.TOOLTIP_SKILL_AFFECT_MOV_SPEED,
    							"DODGE" : localeInfo.TOOLTIP_SKILL_AFFECT_DODGE,
    							"RESIST_NORMAL" : localeInfo.TOOLTIP_SKILL_AFFECT_RESIST_NORMAL,
    							"REFLECT_MELEE" : localeInfo.TOOLTIP_SKILL_AFFECT_REFLECT_MELEE,
    						}
    	AFFECT_APPEND_TEXT_DICT =	{
    									"DODGE" : "%",
    									"RESIST_NORMAL" : "%",
    									"REFLECT_MELEE" : "%",
    								}
    
    	def __init__(self):
    		ToolTip.__init__(self, self.SKILL_TOOL_TIP_WIDTH)
    	def __del__(self):
    		ToolTip.__del__(self)
    
    	def SetSkill(self, skillIndex, skillLevel = -1):
    
    		if 0 == skillIndex:
    			return
    
    		if skill.SKILL_TYPE_GUILD == skill.GetSkillType(skillIndex):
    
    			if self.SKILL_TOOL_TIP_WIDTH != self.toolTipWidth:
    				self.toolTipWidth = self.SKILL_TOOL_TIP_WIDTH
    				self.ResizeToolTip()
    
    			self.AppendDefaultData(skillIndex)
    			self.AppendSkillConditionData(skillIndex)
    			self.AppendGuildSkillData(skillIndex, skillLevel)
    
    		else:
    
    			if self.SKILL_TOOL_TIP_WIDTH != self.toolTipWidth:
    				self.toolTipWidth = self.SKILL_TOOL_TIP_WIDTH
    				self.ResizeToolTip()
    
    			slotIndex = player.GetSkillSlotIndex(skillIndex)
    			skillGrade = player.GetSkillGrade(slotIndex)
    			skillLevel = player.GetSkillLevel(slotIndex)
    			skillCurrentPercentage = player.GetSkillCurrentEfficientPercentage(slotIndex)
    			skillNextPercentage = player.GetSkillNextEfficientPercentage(slotIndex)
    
    			self.AppendDefaultData(skillIndex)
    			self.AppendSkillConditionData(skillIndex)
    			self.AppendSkillDataNew(slotIndex, skillIndex, skillGrade, skillLevel, skillCurrentPercentage, skillNextPercentage)
    			self.AppendSkillRequirement(skillIndex, skillLevel)
    
    		self.ShowToolTip()
    
    	def SetSkillNew(self, slotIndex, skillIndex, skillGrade, skillLevel):
    
    		if 0 == skillIndex:
    			return
    
    		if player.SKILL_INDEX_TONGSOL == skillIndex:
    
    			slotIndex = player.GetSkillSlotIndex(skillIndex)
    			skillLevel = player.GetSkillLevel(slotIndex)
    
    			self.AppendDefaultData(skillIndex)
    			self.AppendPartySkillData(skillGrade, skillLevel)
    
    		elif player.SKILL_INDEX_RIDING == skillIndex:
    
    			slotIndex = player.GetSkillSlotIndex(skillIndex)
    			self.AppendSupportSkillDefaultData(skillIndex, skillGrade, skillLevel, 30)
    
    		elif player.SKILL_INDEX_SUMMON == skillIndex:
    
    			maxLevel = 10
    
    			self.ClearToolTip()
    			self.__SetSkillTitle(skillIndex, skillGrade)
    
    			## Description
    			description = skill.GetSkillDescription(skillIndex)
    			self.AppendDescription(description, 25)
    
    			if skillLevel == 10:
    				self.AppendSpace(5)
    				self.AppendTextLine(localeInfo.TOOLTIP_SKILL_LEVEL_MASTER % (skillLevel), self.NORMAL_COLOR)
    				self.AppendTextLine(localeInfo.SKILL_SUMMON_DESCRIPTION % (skillLevel*10), self.NORMAL_COLOR)
    
    			else:
    				self.AppendSpace(5)
    				self.AppendTextLine(localeInfo.TOOLTIP_SKILL_LEVEL % (skillLevel), self.NORMAL_COLOR)
    				self.__AppendSummonDescription(skillLevel, self.NORMAL_COLOR)
    
    				self.AppendSpace(5)
    				self.AppendTextLine(localeInfo.TOOLTIP_SKILL_LEVEL % (skillLevel+1), self.NEGATIVE_COLOR)
    				self.__AppendSummonDescription(skillLevel+1, self.NEGATIVE_COLOR)
    
    		elif skill.SKILL_TYPE_GUILD == skill.GetSkillType(skillIndex):
    
    			if self.SKILL_TOOL_TIP_WIDTH != self.toolTipWidth:
    				self.toolTipWidth = self.SKILL_TOOL_TIP_WIDTH
    				self.ResizeToolTip()
    
    			self.AppendDefaultData(skillIndex)
    			self.AppendSkillConditionData(skillIndex)
    			self.AppendGuildSkillData(skillIndex, skillLevel)
    
    		else:
    
    			if self.SKILL_TOOL_TIP_WIDTH != self.toolTipWidth:
    				self.toolTipWidth = self.SKILL_TOOL_TIP_WIDTH
    				self.ResizeToolTip()
    
    			slotIndex = player.GetSkillSlotIndex(skillIndex)
    
    			skillCurrentPercentage = player.GetSkillCurrentEfficientPercentage(slotIndex)
    			skillNextPercentage = player.GetSkillNextEfficientPercentage(slotIndex)
    
    			self.AppendDefaultData(skillIndex, skillGrade)
    			self.AppendSkillConditionData(skillIndex)
    			self.AppendSkillDataNew(slotIndex, skillIndex, skillGrade, skillLevel, skillCurrentPercentage, skillNextPercentage)
    			self.AppendSkillRequirement(skillIndex, skillLevel)
    
    		self.ShowToolTip()
    
    	def __SetSkillTitle(self, skillIndex, skillGrade):
    		self.SetTitle(skill.GetSkillName(skillIndex, skillGrade))
    		self.__AppendSkillGradeName(skillIndex, skillGrade)
    
    	def __AppendSkillGradeName(self, skillIndex, skillGrade):		
    		if self.SKILL_GRADE_NAME.has_key(skillGrade):
    			self.AppendSpace(5)
    			self.AppendTextLine(self.SKILL_GRADE_NAME[skillGrade] % (skill.GetSkillName(skillIndex, 0)), self.CAN_LEVEL_UP_COLOR)
    
    	def SetSkillOnlyName(self, slotIndex, skillIndex, skillGrade):
    		if 0 == skillIndex:
    			return
    
    		slotIndex = player.GetSkillSlotIndex(skillIndex)
    
    		self.toolTipWidth = self.SKILL_TOOL_TIP_WIDTH
    		self.ResizeToolTip()
    
    		self.ClearToolTip()
    		self.__SetSkillTitle(skillIndex, skillGrade)		
    		self.AppendDefaultData(skillIndex, skillGrade)
    		self.AppendSkillConditionData(skillIndex)		
    		self.ShowToolTip()
    
    	def AppendDefaultData(self, skillIndex, skillGrade = 0):
    		self.ClearToolTip()
    		self.__SetSkillTitle(skillIndex, skillGrade)
    
    		## Level Limit
    		levelLimit = skill.GetSkillLevelLimit(skillIndex)
    		if levelLimit > 0:
    
    			color = self.NORMAL_COLOR
    			if player.GetStatus(player.LEVEL) < levelLimit:
    				color = self.NEGATIVE_COLOR
    
    			self.AppendSpace(5)
    			self.AppendTextLine(localeInfo.TOOLTIP_ITEM_LIMIT_LEVEL % (levelLimit), color)
    
    		## Description
    		description = skill.GetSkillDescription(skillIndex)
    		self.AppendDescription(description, 25)
    
    	def AppendSupportSkillDefaultData(self, skillIndex, skillGrade, skillLevel, maxLevel):
    		self.ClearToolTip()
    		self.__SetSkillTitle(skillIndex, skillGrade)
    
    		## Description
    		description = skill.GetSkillDescription(skillIndex)
    		self.AppendDescription(description, 25)
    
    		if 1 == skillGrade:
    			skillLevel += 19
    		elif 2 == skillGrade:
    			skillLevel += 29
    		elif 3 == skillGrade:
    			skillLevel = 40
    
    		self.AppendSpace(5)
    		self.AppendTextLine(localeInfo.TOOLTIP_SKILL_LEVEL_WITH_MAX % (skillLevel, maxLevel), self.NORMAL_COLOR)
    
    	def AppendSkillConditionData(self, skillIndex):
    		conditionDataCount = skill.GetSkillConditionDescriptionCount(skillIndex)
    		if conditionDataCount > 0:
    			self.AppendSpace(5)
    			for i in xrange(conditionDataCount):
    				self.AppendTextLine(skill.GetSkillConditionDescription(skillIndex, i), self.CONDITION_COLOR)
    
    	def AppendGuildSkillData(self, skillIndex, skillLevel):
    		skillMaxLevel = 7
    		skillCurrentPercentage = float(skillLevel) / float(skillMaxLevel)
    		skillNextPercentage = float(skillLevel+1) / float(skillMaxLevel)
    		## Current Level
    		if skillLevel > 0:
    			if self.HasSkillLevelDescription(skillIndex, skillLevel):
    				self.AppendSpace(5)
    				if skillLevel == skillMaxLevel:
    					self.AppendTextLine(localeInfo.TOOLTIP_SKILL_LEVEL_MASTER % (skillLevel), self.NORMAL_COLOR)
    				else:
    					self.AppendTextLine(localeInfo.TOOLTIP_SKILL_LEVEL % (skillLevel), self.NORMAL_COLOR)
    
    				#####
    
    				for i in xrange(skill.GetSkillAffectDescriptionCount(skillIndex)):
    					self.AppendTextLine(skill.GetSkillAffectDescription(skillIndex, i, skillCurrentPercentage), self.ENABLE_COLOR)
    
    				## Cooltime
    				coolTime = skill.GetSkillCoolTime(skillIndex, skillCurrentPercentage)
    				if coolTime > 0:
    					self.AppendTextLine(localeInfo.TOOLTIP_SKILL_COOL_TIME + str(coolTime), self.ENABLE_COLOR)
    
    				## SP
    				needGSP = skill.GetSkillNeedSP(skillIndex, skillCurrentPercentage)
    				if needGSP > 0:
    					self.AppendTextLine(localeInfo.TOOLTIP_NEED_GSP % (needGSP), self.ENABLE_COLOR)
    
    		## Next Level
    		if skillLevel < skillMaxLevel:
    			if self.HasSkillLevelDescription(skillIndex, skillLevel+1):
    				self.AppendSpace(5)
    				self.AppendTextLine(localeInfo.TOOLTIP_NEXT_SKILL_LEVEL_1 % (skillLevel+1, skillMaxLevel), self.DISABLE_COLOR)
    
    				#####
    
    				for i in xrange(skill.GetSkillAffectDescriptionCount(skillIndex)):
    					self.AppendTextLine(skill.GetSkillAffectDescription(skillIndex, i, skillNextPercentage), self.DISABLE_COLOR)
    
    				## Cooltime
    				coolTime = skill.GetSkillCoolTime(skillIndex, skillNextPercentage)
    				if coolTime > 0:
    					self.AppendTextLine(localeInfo.TOOLTIP_SKILL_COOL_TIME + str(coolTime), self.DISABLE_COLOR)
    
    				## SP
    				needGSP = skill.GetSkillNeedSP(skillIndex, skillNextPercentage)
    				if needGSP > 0:
    					self.AppendTextLine(localeInfo.TOOLTIP_NEED_GSP % (needGSP), self.DISABLE_COLOR)
    
    	def AppendSkillDataNew(self, slotIndex, skillIndex, skillGrade, skillLevel, skillCurrentPercentage, skillNextPercentage):
    
    		self.skillMaxLevelStartDict = { 0 : 17, 1 : 7, 2 : 10, }
    		self.skillMaxLevelEndDict = { 0 : 20, 1 : 10, 2 : 10, }
    
    		skillLevelUpPoint = 1
    		realSkillGrade = player.GetSkillGrade(slotIndex)
    		skillMaxLevelStart = self.skillMaxLevelStartDict.get(realSkillGrade, 15)
    		skillMaxLevelEnd = self.skillMaxLevelEndDict.get(realSkillGrade, 20)
    
    		## Current Level
    		if skillLevel > 0:
    			if self.HasSkillLevelDescription(skillIndex, skillLevel):
    				self.AppendSpace(5)
    				if skillGrade == skill.SKILL_GRADE_COUNT:
    					pass
    				elif skillLevel == skillMaxLevelEnd:
    					self.AppendTextLine(localeInfo.TOOLTIP_SKILL_LEVEL_MASTER % (skillLevel), self.NORMAL_COLOR)
    				else:
    					self.AppendTextLine(localeInfo.TOOLTIP_SKILL_LEVEL % (skillLevel), self.NORMAL_COLOR)
    				self.AppendSkillLevelDescriptionNew(skillIndex, skillCurrentPercentage, self.ENABLE_COLOR)
    
    		## Next Level
    		if skillGrade != skill.SKILL_GRADE_COUNT:
    			if skillLevel < skillMaxLevelEnd:
    				if self.HasSkillLevelDescription(skillIndex, skillLevel+skillLevelUpPoint):
    					self.AppendSpace(5)
    					## HP??, ???? ????? ??
    					if skillIndex == 141 or skillIndex == 142:
    						self.AppendTextLine(localeInfo.TOOLTIP_NEXT_SKILL_LEVEL_3 % (skillLevel+1), self.DISABLE_COLOR)
    					else:
    						self.AppendTextLine(localeInfo.TOOLTIP_NEXT_SKILL_LEVEL_1 % (skillLevel+1, skillMaxLevelEnd), self.DISABLE_COLOR)
    					self.AppendSkillLevelDescriptionNew(skillIndex, skillNextPercentage, self.DISABLE_COLOR)
    
    	def AppendSkillLevelDescriptionNew(self, skillIndex, skillPercentage, color):
    
    		affectDataCount = skill.GetNewAffectDataCount(skillIndex)
    		if affectDataCount > 0:
    			for i in xrange(affectDataCount):
    				type, minValue, maxValue = skill.GetNewAffectData(skillIndex, i, skillPercentage)
    
    				if not self.AFFECT_NAME_DICT.has_key(type):
    					continue
    
    				minValue = int(minValue)
    				maxValue = int(maxValue)
    				affectText = self.AFFECT_NAME_DICT[type]
    
    				if "HP" == type:
    					if minValue < 0 and maxValue < 0:
    						minValue *= -1
    						maxValue *= -1
    
    					else:
    						affectText = localeInfo.TOOLTIP_SKILL_AFFECT_HEAL
    
    				affectText += str(minValue)
    				if minValue != maxValue:
    					affectText += " - " + str(maxValue)
    				affectText += self.AFFECT_APPEND_TEXT_DICT.get(type, "")
    
    				#import debugInfo
    				#if debugInfo.IsDebugMode():
    				#	affectText = "!!" + affectText
    
    				self.AppendTextLine(affectText, color)
    			
    		else:
    			for i in xrange(skill.GetSkillAffectDescriptionCount(skillIndex)):
    				self.AppendTextLine(skill.GetSkillAffectDescription(skillIndex, i, skillPercentage), color)
    		
    
    		## Duration
    		duration = skill.GetDuration(skillIndex, skillPercentage)
    		if duration > 0:
    			self.AppendTextLine(localeInfo.TOOLTIP_SKILL_DURATION % (duration), color)
    
    		## Cooltime
    		coolTime = skill.GetSkillCoolTime(skillIndex, skillPercentage)
    		if coolTime > 0:
    			self.AppendTextLine(localeInfo.TOOLTIP_SKILL_COOL_TIME + str(coolTime), color)
    
    		## SP
    		needSP = skill.GetSkillNeedSP(skillIndex, skillPercentage)
    		if needSP != 0:
    			continuationSP = skill.GetSkillContinuationSP(skillIndex, skillPercentage)
    
    			if skill.IsUseHPSkill(skillIndex):
    				self.AppendNeedHP(needSP, continuationSP, color)
    			else:
    				self.AppendNeedSP(needSP, continuationSP, color)
    
    	def AppendSkillRequirement(self, skillIndex, skillLevel):
    
    		skillMaxLevel = skill.GetSkillMaxLevel(skillIndex)
    
    		if skillLevel >= skillMaxLevel:
    			return
    
    		isAppendHorizontalLine = FALSE
    
    		## Requirement
    		if skill.IsSkillRequirement(skillIndex):
    
    			if not isAppendHorizontalLine:
    				isAppendHorizontalLine = TRUE
    				self.AppendHorizontalLine()
    
    			requireSkillName, requireSkillLevel = skill.GetSkillRequirementData(skillIndex)
    
    			color = self.CANNOT_LEVEL_UP_COLOR
    			if skill.CheckRequirementSueccess(skillIndex):
    				color = self.CAN_LEVEL_UP_COLOR
    			self.AppendTextLine(localeInfo.TOOLTIP_REQUIREMENT_SKILL_LEVEL % (requireSkillName, requireSkillLevel), color)
    
    		## Require Stat
    		requireStatCount = skill.GetSkillRequireStatCount(skillIndex)
    		if requireStatCount > 0:
    
    			for i in xrange(requireStatCount):
    				type, level = skill.GetSkillRequireStatData(skillIndex, i)
    				if self.POINT_NAME_DICT.has_key(type):
    
    					if not isAppendHorizontalLine:
    						isAppendHorizontalLine = TRUE
    						self.AppendHorizontalLine()
    
    					name = self.POINT_NAME_DICT[type]
    					color = self.CANNOT_LEVEL_UP_COLOR
    					if player.GetStatus(type) >= level:
    						color = self.CAN_LEVEL_UP_COLOR
    					self.AppendTextLine(localeInfo.TOOLTIP_REQUIREMENT_STAT_LEVEL % (name, level), color)
    
    	def HasSkillLevelDescription(self, skillIndex, skillLevel):
    		if skill.GetSkillAffectDescriptionCount(skillIndex) > 0:
    			return TRUE
    		if skill.GetSkillCoolTime(skillIndex, skillLevel) > 0:
    			return TRUE
    		if skill.GetSkillNeedSP(skillIndex, skillLevel) > 0:
    			return TRUE
    
    		return FALSE
    
    	def AppendMasterAffectDescription(self, index, desc, color):
    		self.AppendTextLine(desc, color)
    
    	def AppendNextAffectDescription(self, index, desc):
    		self.AppendTextLine(desc, self.DISABLE_COLOR)
    
    	def AppendNeedHP(self, needSP, continuationSP, color):
    
    		self.AppendTextLine(localeInfo.TOOLTIP_NEED_HP % (needSP), color)
    
    		if continuationSP > 0:
    			self.AppendTextLine(localeInfo.TOOLTIP_NEED_HP_PER_SEC % (continuationSP), color)
    
    	def AppendNeedSP(self, needSP, continuationSP, color):
    
    		if -1 == needSP:
    			self.AppendTextLine(localeInfo.TOOLTIP_NEED_ALL_SP, color)
    
    		else:
    			self.AppendTextLine(localeInfo.TOOLTIP_NEED_SP % (needSP), color)
    
    		if continuationSP > 0:
    			self.AppendTextLine(localeInfo.TOOLTIP_NEED_SP_PER_SEC % (continuationSP), color)
    
    	def AppendPartySkillData(self, skillGrade, skillLevel):
    
    		if 1 == skillGrade:
    			skillLevel += 19
    		elif 2 == skillGrade:
    			skillLevel += 29
    		elif 3 == skillGrade:
    			skillLevel =  40
    
    		if skillLevel <= 0:
    			return
    
    		skillIndex = player.SKILL_INDEX_TONGSOL
    		slotIndex = player.GetSkillSlotIndex(skillIndex)
    		skillPower = player.GetSkillCurrentEfficientPercentage(slotIndex)
    		if localeInfo.IsBRAZIL():
    			k = skillPower
    		else:
    			k = player.GetSkillLevel(skillIndex) / 100.0
    		self.AppendSpace(5)
    		self.AutoAppendTextLine(localeInfo.TOOLTIP_PARTY_SKILL_LEVEL % skillLevel, self.NORMAL_COLOR)
    
    		if skillLevel>=10:
    			self.AutoAppendTextLine(localeInfo.PARTY_SKILL_ATTACKER % chop( 10 + 60 * k ))
    
    		if skillLevel>=20:
    			self.AutoAppendTextLine(localeInfo.PARTY_SKILL_BERSERKER 	% chop(1 + 5 * k))
    			self.AutoAppendTextLine(localeInfo.PARTY_SKILL_TANKER 	% chop(50 + 1450 * k))
    
    		if skillLevel>=25:
    			self.AutoAppendTextLine(localeInfo.PARTY_SKILL_BUFFER % chop(5 + 45 * k ))
    
    		if skillLevel>=35:
    			self.AutoAppendTextLine(localeInfo.PARTY_SKILL_SKILL_MASTER % chop(25 + 600 * k ))
    
    		if skillLevel>=40:
    			self.AutoAppendTextLine(localeInfo.PARTY_SKILL_DEFENDER % chop( 5 + 30 * k ))
    
    		self.AlignHorizonalCenter()
    
    	def __AppendSummonDescription(self, skillLevel, color):
    		if skillLevel > 1:
    			self.AppendTextLine(localeInfo.SKILL_SUMMON_DESCRIPTION % (skillLevel * 10), color)
    		elif 1 == skillLevel:
    			self.AppendTextLine(localeInfo.SKILL_SUMMON_DESCRIPTION % (15), color)
    		elif 0 == skillLevel:
    			self.AppendTextLine(localeInfo.SKILL_SUMMON_DESCRIPTION % (10), color)
    
    
    if __name__ == "__main__":	
    	import app
    	import wndMgr
    	import systemSetting
    	import mouseModule
    	import grp
    	import ui
    	
    	#wndMgr.SetOutlineFlag(TRUE)
    
    	app.SetMouseHandler(mouseModule.mouseController)
    	app.SetHairColorEnable(TRUE)
    	wndMgr.SetMouseHandler(mouseModule.mouseController)
    	wndMgr.SetScreenSize(systemSetting.GetWidth(), systemSetting.GetHeight())
    	app.Create("METIN2 CLOSED BETA", systemSetting.GetWidth(), systemSetting.GetHeight(), 1)
    	mouseModule.mouseController.Create()
    
    	toolTip = ItemToolTip()
    	toolTip.ClearToolTip()
    	#toolTip.AppendTextLine("Test")
    	desc = "Item descriptions:|increase of width of display to 35 digits per row AND installation of function that the displayed words are not broken up in two parts, but instead if one word is too long to be displayed in this row, this word will start in the next row."
    	summ = ""
    
    	toolTip.AddItemData_Offline(10, desc, summ, 0, 0) 
    	toolTip.Show()
    	
    	app.Loop()

     

  3. Hai i have problem in syserr [system-gaya]

    1209 13:51:53006 :: TypeError
    1209 13:51:53006 :: :
    1209 13:51:53006 :: 'int' object has no attribute '__getitem__'
    1209 13:51:53007 ::
    
    1209 13:51:56562 :: Traceback (most recent call last):
    
    1209 13:51:56562 ::   File "ui.py", line 1889, in OnOverInItem
    
    1209 13:51:56563 ::   File "ui.py", line 88, in __call__
    
    1209 13:51:56564 ::   File "ui.py", line 79, in __call__
    
    1209 13:51:56564 ::   File "uisystemgems.py", line 284, in OverInItem
    
    1209 13:51:56565 ::   File "uiToolTip.py", line 1435, in AddItemData
    
    1209 13:51:56565 :: TypeError
    1209 13:51:56565 :: :
    1209 13:51:56565 :: 'int' object has no attribute '__getitem__'
    1209 13:51:56566 :: 

    Help pleasss

×
×
  • Create New...

Important Information

Terms of Use / Privacy Policy / Guidelines / We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.