Jump to content

Marcos17

Member
  • Posts

    64
  • Joined

  • Last visited

  • Feedback

    0%

Posts posted by Marcos17

  1. 19 hours ago, Ikarus_ said:

    What may not be cleaned is not necessarily AtlasWindow but its child named "board" . Let's see if you dump it what's coming out.

    	def Destroy(self):
    		import dbg
    		references = vars(self.board)
    		dbg.TraceError("STARTING AtlasWindow.board DUMP")
    		for name, value in references.items():
    			dbg.TraceError("AtlasWindow.board.{} = {}", name, value)
    			
    		dbg.TraceError("STARTING AtlasWindow.board.titleBar DUMP")
    		for name, value in vars(self.board.titleBar).items():
    			dbg.TraceError("AtlasWindow.board.titleBar.{} = {}", name, value)
    		
    		miniMap.UnregisterAtlasWindow()
    		self.ClearDictionary()
    		self.AtlasMainWindow = None
    		self.tooltipAtlasClose = 0
    		self.tooltipInfo = None
    		self.infoGuildMark = None
    		self.board = None

    The test is obv identical to the previous one.

    My guess is that the close event of the "BoardWithTitleBar" isn't moved to None

    Spoiler

    0320 15:56:38838 :: AtlasWindow.board.{} = {}
    0320 15:56:38838 :: AtlasWindow.board.{} = {}
    0320 15:56:38838 :: AtlasWindow.board.{} = {}
    0320 15:56:38838 :: AtlasWindow.board.{} = {}
    0320 15:56:38838 :: AtlasWindow.board.{} = {}
    0320 15:56:38838 :: AtlasWindow.board.{} = {}
    0320 15:56:38838 :: AtlasWindow.board.{} = {}
    0320 15:56:38838 :: AtlasWindow.board.{} = {}
    0320 15:56:38838 :: AtlasWindow.board.{} = {}
    0320 15:56:38838 :: AtlasWindow.board.{} = {}
    0320 15:56:38838 :: AtlasWindow.board.{} = {}
    0320 15:56:38838 :: AtlasWindow.board.{} = {}
    0320 15:56:38838 :: AtlasWindow.board.{} = {}
    0320 15:56:38838 :: AtlasWindow.board.{} = {}
    0320 15:56:38838 :: AtlasWindow.board.{} = {}
    0320 15:56:38838 :: AtlasWindow.board.{} = {}
    0320 15:56:38838 :: AtlasWindow.board.{} = {}
    0320 15:56:38838 :: AtlasWindow.board.{} = {}
    0320 15:56:38838 :: AtlasWindow.board.{} = {}
    0320 15:56:38838 :: AtlasWindow.board.{} = {}
    0320 15:56:38838 :: AtlasWindow.board.{} = {}
    0320 15:56:38838 :: AtlasWindow.board.{} = {}
    0320 15:56:38838 :: AtlasWindow.board.{} = {}
    0320 15:56:38838 :: AtlasWindow.board.{} = {}
    0320 15:56:38838 :: AtlasWindow.board.{} = {}
    0320 15:56:38838 :: STARTING AtlasWindow.board.titleBar DUMP
    0320 15:56:38838 :: AtlasWindow.board.titleBar.{} = {}
    0320 15:56:38838 :: AtlasWindow.board.titleBar.{} = {}
    0320 15:56:38838 :: AtlasWindow.board.titleBar.{} = {}
    0320 15:56:38838 :: AtlasWindow.board.titleBar.{} = {}
    0320 15:56:38838 :: AtlasWindow.board.titleBar.{} = {}
    0320 15:56:38838 :: AtlasWindow.board.titleBar.{} = {}
    0320 15:56:38838 :: AtlasWindow.board.titleBar.{} = {}
    0320 15:56:38838 :: AtlasWindow.board.titleBar.{} = {}
    0320 15:56:38838 :: AtlasWindow.board.titleBar.{} = {}
    0320 15:56:38838 :: AtlasWindow.board.titleBar.{} = {}
    0320 15:56:38838 :: AtlasWindow.board.titleBar.{} = {}
    0320 15:56:38838 :: AtlasWindow.board.titleBar.{} = {}
    0320 15:56:38838 :: AtlasWindow.board.titleBar.{} = {}
    0320 15:56:38838 :: AtlasWindow.board.titleBar.{} = {}
    0320 15:56:38838 :: AtlasWindow.board.titleBar.{} = {}
    0320 15:56:38838 :: AtlasWindow.board.titleBar.{} = {}
    0320 15:56:38838 :: AtlasWindow.board.titleBar.{} = {}
    0320 15:56:38838 :: AtlasWindow.board.titleBar.{} = {}
    0320 15:56:38838 :: AtlasWindow.board.titleBar.{} = {}
    0320 15:56:38838 :: AtlasWindow.board.titleBar.{} = {}
    0320 15:56:38838 :: AtlasWindow.board.titleBar.{} = {}
    0320 15:56:38838 :: AtlasWindow.board.titleBar.{} = {}
    0320 15:56:38838 :: AtlasWindow.board.titleBar.{} = {}
    0320 15:56:38838 :: AtlasWindow.board.titleBar.{} = {}

     

  2. 2 hours ago, Ikarus_ said:

    There's a easy&fast way to check if i m correct.
    Replace your def Destroy with mine posting here:
     

    	def Destroy(self):
    		miniMap.UnregisterAtlasWindow()
    		self.ClearDictionary()
    		self.AtlasMainWindow = None
    		self.tooltipAtlasClose = 0
    		self.tooltipInfo = None
    		self.infoGuildMark = None
    		self.board = None
    		
    		import dbg
    		references = vars(self)
    		dbg.TraceError("STARTING WITH DUMPING AtlasWindow")
    		for name, value in references.items():
    			dgb.TraceError("AtlasWindowReference {}={}".format(name, value))

    You need to login into game and warp your character, You will find dumping inside your syserr.txt

    Let's  hypothesize the possible scenarios:
    1. The syserr looks empty : Your Destroy function is never called: You must call it
    2. The syserr contains strings but all of them has value "None" or numbers/empty lists etc: My guess was wrong, the problem is something else.
    3. The syserr contains strings and at least one of them is a reference to an object which makes your AtlasWindow not cleaned enough.
    if you need help understanding what scenario you got you can post your syserr here

    my syserr:

    0318 18:02:31278 :: STARTING WITH DUMPING AtlasWindow
    0318 18:02:31278 :: AtlasWindowReference mouseLeftButtonUpEvent=None
    0318 18:02:31278 :: AtlasWindowReference mouseLeftButtonDownArgs=None
    0318 18:02:31278 :: AtlasWindowReference hWnd=690919656
    0318 18:02:31278 :: AtlasWindowReference tooltipInfo=None
    0318 18:02:31278 :: AtlasWindowReference AtlasMainWindow=None
    0318 18:02:31278 :: AtlasWindowReference baseX=0
    0318 18:02:31278 :: AtlasWindowReference baseY=0
    0318 18:02:31278 :: AtlasWindowReference moveWindowEvent=None
    0318 18:02:31278 :: AtlasWindowReference overInArgs=None
    0318 18:02:31278 :: AtlasWindowReference renderArgs=None
    0318 18:02:31278 :: AtlasWindowReference mouseLeftButtonDoubleClickEvent=None
    0318 18:02:31278 :: AtlasWindowReference mapName=
    0318 18:02:31278 :: AtlasWindowReference mouseRightButtonDownArgs=None
    0318 18:02:31278 :: AtlasWindowReference board=None
    0318 18:02:31278 :: AtlasWindowReference infoGuildMark=None
    0318 18:02:31278 :: AtlasWindowReference onMouseLeftButtonUpEvent=None
    0318 18:02:31278 :: AtlasWindowReference overInEvent=None
    0318 18:02:31278 :: AtlasWindowReference mouseLeftButtonDownEvent=None
    0318 18:02:31278 :: AtlasWindowReference ElementDictionary={}
    0318 18:02:31278 :: AtlasWindowReference parentWindow=0
    0318 18:02:31278 :: AtlasWindowReference mouseLeftButtonUpArgs=None
    0318 18:02:31278 :: AtlasWindowReference mouseRightButtonDownEvent=None
    0318 18:02:31278 :: AtlasWindowReference overOutEvent=None
    0318 18:02:31278 :: AtlasWindowReference renderEvent=None
    0318 18:02:31278 :: AtlasWindowReference overOutArgs=None
    0318 18:02:31278 :: AtlasWindowReference clickEvent=None
    0318 18:02:31278 :: AtlasWindowReference tooltipAtlasClose=0
    0318 18:02:31278 :: AtlasWindowReference Children=[]

  3. On 16/03/2022 at 11:43, Ikarus_ said:

    Memory leak.

    All references instantiated in the class must be set to None before deleting the object.
    Check your class AtlasWindow inside uiminimap.py and search for def Destroy, inside this function you have to move to None all the reference.

     

    I looked at the class you referred to and everything seems to be correct, but the error persists =/

    Spoiler
    class AtlasWindow(ui.ScriptWindow):
    
    	class AtlasRenderer(ui.Window):
    		def __init__(self):
    			ui.Window.__init__(self)
    			self.AddFlag("not_pick")
    
    		def OnUpdate(self):
    			miniMap.UpdateAtlas()
    
    		def OnRender(self):
    			(x, y) = self.GetGlobalPosition()
    			fx = float(x)
    			fy = float(y)
    			miniMap.RenderAtlas(fx, fy)
    
    		def HideAtlas(self):
    			miniMap.HideAtlas()
    
    		def ShowAtlas(self):
    			miniMap.ShowAtlas()
    
    	def __init__(self):
    		self.tooltipInfo = MapTextToolTip()
    		self.tooltipInfo.Hide()
    		self.infoGuildMark = ui.MarkBox()
    		self.infoGuildMark.Hide()
    		self.AtlasMainWindow = None
    		self.mapName = ""
    		self.board = 0
    
    		ui.ScriptWindow.__init__(self)
    
    	def __del__(self):
    		ui.ScriptWindow.__del__(self)
    
    	def SetMapName(self, mapName):
    		if 949==app.GetDefaultCodePage():
    			try:
    				self.board.SetTitleName(localeInfo.MINIMAP_ZONE_NAME_DICT[mapName])
    			except:
    				pass
    
    	def LoadWindow(self):
    		try:
    			pyScrLoader = ui.PythonScriptLoader()
    			pyScrLoader.LoadScriptFile(self, "UIScript/AtlasWindow.py")
    		except:
    			import exception
    			exception.Abort("AtlasWindow.LoadWindow.LoadScript")
    
    		try:
    			self.board = self.GetChild("board")
    
    		except:
    			import exception
    			exception.Abort("AtlasWindow.LoadWindow.BindObject")
    
    		self.AtlasMainWindow = self.AtlasRenderer()
    		self.board.SetCloseEvent(self.Hide)
    		self.AtlasMainWindow.SetParent(self.board)
    		self.AtlasMainWindow.SetPosition(7, 30)
    		self.tooltipInfo.SetParent(self.board)
    		self.infoGuildMark.SetParent(self.board)
    		self.SetPosition(wndMgr.GetScreenWidth() - 136 - 256 - 10, 0)
    		self.Hide()
    
    		miniMap.RegisterAtlasWindow(self)
    
    	def Destroy(self):
    		miniMap.UnregisterAtlasWindow()
    		self.ClearDictionary()
    		self.AtlasMainWindow = None
    		self.tooltipAtlasClose = 0
    		self.tooltipInfo = None
    		self.infoGuildMark = None
    		self.board = None
    
    	def OnUpdate(self):
    
    		if not self.tooltipInfo:
    			return
    
    		if not self.infoGuildMark:
    			return
    
    		self.infoGuildMark.Hide()
    		self.tooltipInfo.Hide()
    
    		if FALSE == self.board.IsIn():
    			return
    
    		(mouseX, mouseY) = wndMgr.GetMousePosition()
    		(bFind, sName, iPosX, iPosY, dwTextColor, dwGuildID) = miniMap.GetAtlasInfo(mouseX, mouseY)
    
    		if FALSE == bFind:
    			return
    
    		if "empty_guild_area" == sName:
    			sName = localeInfo.GUILD_EMPTY_AREA
    
    		if localeInfo.IsARABIC() and sName[-1].isalnum():
    			self.tooltipInfo.SetText("(%s)%d, %d" % (sName, iPosX, iPosY))
    		else:
    			self.tooltipInfo.SetText("%s(%d, %d)" % (sName, iPosX, iPosY))
    
    		(x, y) = self.GetGlobalPosition()
    		self.tooltipInfo.SetTooltipPosition(mouseX - x, mouseY - y)
    		self.tooltipInfo.SetTextColor(dwTextColor)
    		self.tooltipInfo.Show()
    		self.tooltipInfo.SetTop()
    
    		if 0 != dwGuildID:
    			textWidth, textHeight = self.tooltipInfo.GetTextSize()
    			self.infoGuildMark.SetIndex(dwGuildID)
    			self.infoGuildMark.SetPosition(mouseX - x - textWidth - 18 - 5, mouseY - y)
    			self.infoGuildMark.Show()
    
    	def Hide(self):
    		if self.AtlasMainWindow:
    			self.AtlasMainWindow.HideAtlas()
    			self.AtlasMainWindow.Hide()
    		ui.ScriptWindow.Hide(self)
    
    	def Show(self):
    		if self.AtlasMainWindow:
    			(bGet, iSizeX, iSizeY) = miniMap.GetAtlasSize()
    			if bGet:
    				self.SetSize(iSizeX + 15, iSizeY + 38)
    
    				if localeInfo.IsARABIC():
    					self.board.SetPosition(iSizeX+15, 0)
    
    				self.board.SetSize(iSizeX + 15, iSizeY + 38)
    				#self.AtlasMainWindow.SetSize(iSizeX, iSizeY)
    				self.AtlasMainWindow.ShowAtlas()
    				self.AtlasMainWindow.Show()
    		ui.ScriptWindow.Show(self)
    
    	def SetCenterPositionAdjust(self, x, y):
    		self.SetPosition((wndMgr.GetScreenWidth() - self.GetWidth()) / 2 + x, (wndMgr.GetScreenHeight() - self.GetHeight()) / 2 + y)
    
    	def OnPressEscapeKey(self):
    		self.Hide()
    		return TRUE

     

     

  4. On 4/6/2020 at 12:02 PM, duwen123 said:

    Olá! Em primeiro lugar, desculpe pelo meu mau inglês?

    Eu tenho um problema com meu switchbot, bônus de 6/7 para ser mais específico. Os bônus de 1 a 5 são bons, todos funcionam bem com o Switchbot.

    Quando eu seleciono um bônus de 6/7 no switchbot, ele funciona. Ele muda até que o bônus esteja no item. MAS quando eu seleciono 2 bônus, ele muda infinitamente. Tipo, não para quando atinge esses bônus.

    Eu fiquei lá por 3 minutos seguidos e supervisionei, e chegou a 2 bônus por 3 vezes no mínimo. te dou um exemplo:

    Eu seleciono esses dois bônus 6/7: Max HP e INT. E quando eu pressiono Start, ele muda os bônus, mas quando chega a esses 2 bônus, ele não para. Vai mais longe.

    Este é o meu switchbot.py:

    https://pastebin.com/9McSevrz 

    Hope this helps

    Spoiler
    import shop
    import player
    import item
    import ui
    import game
    import net
    import locale
    import chat
    import grp
    import wndMgr
    import mouseModule
    
    from uitooltip import ItemToolTip
    # Project by Mijago
    # Bot Update by Metin2
    
    WEAR_NAMES = ItemToolTip.WEAR_NAMES
    AFFECT_DICT = ItemToolTip.AFFECT_DICT
    
    #Bonus
    BONI_AVAIL = [1,2,3,4,5,6,7,9,10,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,41,43,44,45,48,53,59,60,61,62,63,71,72,78,79,80,81] 
    
    #Bonus Jola
    BONI_RARE_AVAIL = [3,4,5,6,59,60,61,62,63,78,79,80,81,53] 
    
    #ID dos itens Especiais
    SWITCH_VNUM = 71084
    SWITCH_RARE_VNUM = 71052
    
    #Delay Minimo e maximo
    MIN_SWITCH_DELAY = 35
    MAX_SWITCH_DELAY_APPEND = 120
    
    #Maximo de Itens a ser rodados
    MAX_NUM = 8
    
    proposals = {
    	1: { # 1 = Weapon
    		"PVP (Corp)":[
    			[9,10],
    			[15,10],
    			[17,10],
    			[16,10],
    			[5,8],
    			[3,8],
    		],
    		"PVP (Mental)":[
    			[9,10],
    			[15,10],
    			[17,10],
    			[6,8],
    			[5,10],
    			[16,10],
    		],
    		"PVM": [
    			[5,10],
    			[19,20],
    		],
    	},
    	2: [ # Armor
    		[ #BODY,
    		],
    		[ #HEAD,
    		],
    		[ #SHIELD,
    		],
    		[ #WRIST,
    		],
    		[ #FOOTS,
    		],
    		[ #NECK,
    		],
    		[ #EAR,
    		],
    	],
    }
    
    # Farben :)
    # COLOR_BG = grp.GenerateColor(0.0, 0.0, 0.0, 0.5)
    # COLOR_INACTIVE = grp.GenerateColor(0.0, 0.0, 1.0, 0.2)
    # COLOR_ACTIVE   = grp.GenerateColor(0.1, 0.6, 1.0, 0.2)
    # COLOR_FINISHED = grp.GenerateColor(0.0, 0.8, 1.0, 0.3)
    
    # COLOR_INACTIVE_RARE = grp.GenerateColor(0.0, 0.2, 1.0, 0.2)
    # COLOR_ACTIVE_RARE   = grp.GenerateColor(0.2, 0.7, 1.0, 0.2)
    
    # COLOR_HIGHLIGHT_RARE = grp.GenerateColor(0.2, 0.2, 1.0, 0.05)
    
    # COLOR_PIN_HINT = grp.GenerateColor(0.0, 0.5, 1.0, 0.3)
    
    # COLOR_CHECKBOX_NOT_SELECTED = grp.GenerateColor(0.0, 0.3, 1.0, 0.1)
    # COLOR_CHECKBOX_SELECTED = grp.GenerateColor(0.0, 0.3, 1.0, 0.3)
    
    # Standardfarben:
    COLOR_BG = grp.GenerateColor(0.0, 0.0, 0.0, 0.5)
    COLOR_INACTIVE = grp.GenerateColor(1.0, 0.0, 0.0, 0.2)
    COLOR_ACTIVE   = grp.GenerateColor(1.0, 0.6, 0.1, 0.2)
    COLOR_FINISHED = grp.GenerateColor(0.0, 1.0, 0.0, 0.2)
    
    COLOR_INACTIVE_RARE = grp.GenerateColor(1.0, 0.2, 0.0, 0.2)
    COLOR_ACTIVE_RARE   = grp.GenerateColor(1.0, 0.7, 0.2, 0.2)
    
    COLOR_HIGHLIGHT_RARE = grp.GenerateColor(1.0, 0.2, 0.2, 0.05)
    
    COLOR_PIN_HINT = grp.GenerateColor(0.0, 0.5, 1.0, 0.3)
    
    
    COLOR_CHECKBOX_NOT_SELECTED = grp.GenerateColor(1.0, 0.3, 0.0, 0.1)
    COLOR_CHECKBOX_SELECTED = grp.GenerateColor(0.3, 1.0, 1.0, 0.3)
    
    
    DISTANCE_BOTTOM = 36
    
    class Bar(ui.Bar):
    	def __init__(self,layer = "UI"):
    		ui.Bar.__init__(self,layer)
    	def SetColor(self,color):
    		wndMgr.SetColor(self.hWnd, color)
    		self.color = color
    
    
    class BonusSelector(ui.Bar):
    	def Activate(self):
    		self.sub_parent.resetSwitch()
    		self.Status_new.SetColor(COLOR_ACTIVE)
    		self.sub_parent.StatusBar.SetColor(COLOR_ACTIVE)
    		self.sub_parent.StatusText.SetText("Ativo")
    		self.Starter.SetText("Switch ("+str(self.index+1)+") parado.")
    		self.sub_parent.boni_active = 1
    		#if self.parentWindow.parentWindow.gameWindow != None:
    		#	self.sub_parent.blockBar.swib_normal.SetColor(COLOR_ACTIVE)
    		#pass
    	def Deactivate(self):
    		self.sub_parent.resetSwitch()
    		self.Status_new.SetColor(COLOR_INACTIVE)
    		self.sub_parent.StatusBar.SetColor(COLOR_INACTIVE)
    		self.sub_parent.StatusText.SetText("Inativo")
    		self.Starter.SetText("Switch ("+str(self.index+1)+") iniciado.")
    		self.sub_parent.boni_active = 0
    		#if self.sub_parent.parentWindow.parentWindow.gameWindow != None:
    		#	self.sub_parent.blockBar.swib_normal.SetColor(COLOR_INACTIVE)
    		#pass
    	
    	def Activate_rare(self):
    		self.sub_parent.resetSwitch_rare()
    		self.sub_parent.StatusBar_rare.SetColor(COLOR_ACTIVE_RARE)
    		self.sub_parent.StatusText_rare.SetText("6/7 Ativo")
    		self.Starter_rare_boni.SetText("6/7 parado")
    		self.sub_parent.boni_rare_active = 1
    		#if self.parentWindow.parentWindow.gameWindow != None:
    		#	self.sub_parent.blockBar.swib_rare.SetColor(COLOR_ACTIVE_RARE)
    		#pass
    	def Deactivate_rare(self):
    		self.sub_parent.resetSwitch_rare()
    		# self.Status_new.SetColor(COLOR_INACTIVE)
    		self.sub_parent.StatusBar_rare.SetColor(COLOR_INACTIVE_RARE)
    		self.sub_parent.StatusText_rare.SetText("6/7 Inativo")
    		self.Starter_rare_boni.SetText("6/7 iniciar")
    		self.Starter_rare_boni.SetUp()
    		self.sub_parent.boni_rare_active = 0
    		#if self.sub_parent.parentWindow.parentWindow.gameWindow != None:
    		#	self.sub_parent.blockBar.swib_rare.SetColor(COLOR_INACTIVE_RARE)
    		#pass
    		
    	def Finish(self):
    		self.Status_new.SetColor(COLOR_FINISHED)
    		self.sub_parent.StatusBar.SetColor(COLOR_FINISHED)
    		self.sub_parent.StatusText.SetText("Pronto")
    		self.Starter.SetText("Switch ("+str(self.index+1)+") continuar")
    		self.sub_parent.boni_active = 0
    		if self.sub_parent.parentWindow.parentWindow.gameWindow != None:
    			self.sub_parent.blockBar.swib_normal.SetColor(COLOR_FINISHED)
    		pass
    		
    	def Finish_rare(self):
    		# self.Status_new.SetColor(COLOR_FINISHED)
    		self.sub_parent.StatusBar_rare.SetColor(COLOR_FINISHED)
    		self.sub_parent.StatusText_rare.SetText("6/7 Pronto")
    		self.Starter_rare_boni.SetText("6/7 continuar")
    		self.sub_parent.boni_rare_active = 0
    		if self.sub_parent.parentWindow.parentWindow.gameWindow != None:
    			self.sub_parent.blockBar.swib_rare.SetColor(COLOR_FINISHED)
    		pass
    	def Block(self):
    		self.BlockBar.Show()
    		self.BlockBar.sub.Show()
    		self.Starter.Hide()
    		pass
    	def Unblock(self):
    		self.BlockBar.sub.Hide()
    		self.BlockBar.Hide()
    		self.Starter.Show()
    		pass
    		
    		
    	def enable_rare_boni(self):
    		for i in range(0,4):
    			self.boni[6][i].Show()
    			self.boni[7][i].Show()
    		self.Starter.SetPosition(0,140+45)
    		self.bg_rare_boni.Show()
    		self.bg_rare_boni_but.Show()
    		self.Starter_rare_boni.Show()
    		self.sub_parent.StatusBar_rare.Show()
    		
    		if self.sub_parent.parentWindow.parentWindow.gameWindow != None:
    			self.sub_parent.blockBar.Enable_rare(1)
    		
    	def disable_rare_boni(self):
    		for i in range(0,4):
    			self.boni[6][i].Hide()
    			self.boni[7][i].Hide()
    		self.Starter.SetPosition(0,140)
    		self.bg_rare_boni.Hide()
    		self.bg_rare_boni_but.Hide()
    		self.Starter_rare_boni.Hide()
    		self.sub_parent.StatusBar_rare.Hide()
    		self.Deactivate_rare()
    		if self.sub_parent.parentWindow.parentWindow.gameWindow != None:
    			self.sub_parent.blockBar.Enable_rare(0)
    		
    	def __init__(self,sub_parent):
    		ui.Bar.__init__(self, "UI")
    		self.sub_parent = sub_parent
    		self.index = sub_parent.index
    		self.SetColor(COLOR_BG)
    		self.SetSize(500,315+10)
    		self.boni = {}
    		self.Status_new = ui.Bar()
    		self.Status_new.SetParent(self)
    		self.Status_new.SetColor(COLOR_INACTIVE)
    		self.Status_new.SetSize(500,5)
    		self.Status_new.Show()
    		
    		
    		self.bg_rare_boni = ui.Bar()
    		self.bg_rare_boni.SetColor(COLOR_HIGHLIGHT_RARE)
    		self.bg_rare_boni.SetParent(self)
    		self.bg_rare_boni.SetPosition(0,132)
    		self.bg_rare_boni.SetSize(500,51)
    		self.bg_rare_boni.Hide()
    		
    		self.bg_rare_boni_but = ui.Bar()
    		self.bg_rare_boni_but.SetColor(COLOR_HIGHLIGHT_RARE)
    		self.bg_rare_boni_but.SetParent(self)
    		self.bg_rare_boni_but.SetPosition(400,133+50)
    		self.bg_rare_boni_but.SetSize(100,25)
    		self.bg_rare_boni_but.Hide()
    		
    		self.EnableRareBoni = CheckBox("6/7 Ativar")
    		self.EnableRareBoni.SetParent(self)
    		self.EnableRareBoni.SetPosition(10,270)
    		self.EnableRareBoni.eventUp   = self.disable_rare_boni
    		self.EnableRareBoni.eventDown = self.enable_rare_boni
    		self.EnableRareBoni.Show()
    		
    		self.Starter = ui.ToggleButton()
    		self.Starter.SetWindowHorizontalAlignCenter()
    		self.Starter.SetParent(self)
    		self.Starter.SetUpVisual("d:/ymir work/ui/public/XLarge_Button_01.sub")
    		self.Starter.SetOverVisual("d:/ymir work/ui/public/XLarge_button_02.sub")
    		self.Starter.SetDownVisual("d:/ymir work/ui/public/XLarge_button_03.sub")
    		self.Starter.SetPosition(0,140)
    		self.Starter.SetText("Bot iniciado")
    		self.Starter.SetToggleDownEvent(self.Activate)
    		self.Starter.SetToggleUpEvent(self.Deactivate)
    		self.Starter.Show()
    		
    		self.Starter_rare_boni = ui.ToggleButton()
    		self.Starter_rare_boni.SetWindowHorizontalAlignCenter()
    		self.Starter_rare_boni.SetParent(self)
    		self.Starter_rare_boni.SetUpVisual("d:/ymir work/ui/public/Large_Button_01.sub")
    		self.Starter_rare_boni.SetOverVisual("d:/ymir work/ui/public/Large_button_02.sub")
    		self.Starter_rare_boni.SetDownVisual("d:/ymir work/ui/public/Large_button_03.sub")
    		self.Starter_rare_boni.SetPosition(200,140+45)
    		self.Starter_rare_boni.SetText("6/7 iniciar")
    		self.Starter_rare_boni.SetToggleDownEvent(self.Activate_rare)
    		self.Starter_rare_boni.SetToggleUpEvent(self.Deactivate_rare)
    		self.Starter_rare_boni.Hide()
    		
    		for i in range(7,5,-1):
    			vas = i
    			self.boni[vas] = {}
    			self.boni[vas][0] = ui.TextLine()
    			self.boni[vas][0].SetParent(self)
    			self.boni[vas][0].SetText("Bonus "+str(vas))
    			self.boni[vas][0].SetPosition(15,10+25*(vas-1))
    			self.boni[vas][0].Hide()
    			self.boni[vas][1] = DropDown(self,"- Vazio -")
    			self.boni[vas][1].SetPosition(70,10+25*(vas-1))
    			for x in AFFECT_DICT:
    				if x in BONI_RARE_AVAIL:
    					self.boni[vas][1].AppendItem(str(AFFECT_DICT[x](0)),x)
    			self.boni[vas][1].SetSize(330,20)
    			self.boni[vas][1].Hide()
    			self.boni[vas][2] = ui.Bar("UI")
    			self.boni[vas][2].SetParent(self)
    			self.boni[vas][2].SetPosition(410,10+25*(vas-1))
    			self.boni[vas][2].SetColor(0xC0000000)
    			self.boni[vas][2].SetSize(80,20)
    			self.boni[vas][2].Hide()
    			self.boni[vas][3] = Edit2("0",14)
    			self.boni[vas][3].SetParent(self.boni[vas][2])
    			self.boni[vas][3].SetNumberMode()
    			self.boni[vas][3].SetSize(80,20)
    			self.boni[vas][3].SetPosition(4,3)
    			self.boni[vas][3].Hide()
    		
    		for i in range(0,5):
    			vas = 5-i
    			self.boni[vas] = {}
    			self.boni[vas][0] = ui.TextLine()
    			self.boni[vas][0].SetParent(self)
    			self.boni[vas][0].SetText("Bonus "+str(vas))
    			self.boni[vas][0].SetPosition(15,10+25*(vas-1))
    			self.boni[vas][0].Show()
    			self.boni[vas][1] = DropDown(self,"- Vazio -")
    			self.boni[vas][1].SetPosition(70,10+25*(vas-1))
    			for x in AFFECT_DICT:
    				if x in BONI_AVAIL:
    					self.boni[vas][1].AppendItem(str(AFFECT_DICT[x](0)),x)
    			self.boni[vas][1].SetSize(330,20)
    			self.boni[vas][1].Show()
    			self.boni[vas][2] = ui.Bar("UI")
    			self.boni[vas][2].SetParent(self)
    			self.boni[vas][2].SetPosition(410,10+25*(vas-1))
    			self.boni[vas][2].SetColor(0xC0000000)
    			self.boni[vas][2].SetSize(80,20)
    			self.boni[vas][2].Show()
    			self.boni[vas][3] = Edit2("0",14)
    			self.boni[vas][3].SetParent(self.boni[vas][2])
    			self.boni[vas][3].SetNumberMode()
    			self.boni[vas][3].SetSize(80,20)
    			self.boni[vas][3].SetPosition(4,3)
    			self.boni[vas][3].Show()
    		
    		self.but_propose = DropDown(self,'Adds Feitos',0)
    		self.but_propose.SetParent(self)
    		self.but_propose.SetPosition(380,295)
    		self.but_propose.OnChange=self.change_boni
    		self.but_propose.Show()
    			
    		self.BlockBar = ui.Bar()
    		self.BlockBar.SetParent(self)
    		self.BlockBar.SetColor(COLOR_INACTIVE)
    		self.BlockBar.SetPosition(0,5)
    		self.BlockBar.SetSize(500,170-5+35+2)
    		self.BlockBar.Hide()
    		
    		self.BlockBar.sub = ui.Bar()
    		self.BlockBar.sub.SetParent(self)
    		self.BlockBar.sub.SetColor(COLOR_INACTIVE)
    		self.BlockBar.sub.SetPosition(500-122,5+170-5+35+2)
    		self.BlockBar.sub.SetSize(122,30)
    		self.BlockBar.sub.Hide()
    		
    		self.BlockText = ui.TextLine()
    		self.BlockText.SetParent(self.BlockBar)
    		self.BlockText.SetWindowHorizontalAlignCenter()
    		self.BlockText.SetHorizontalAlignCenter()
    		self.BlockText.SetPosition(0,140)
    		self.BlockText.SetText("Este item não pode ser rodado.")
    		self.BlockText.Show()
    		
    		
    		self.prepare_propose()
    		
    	def change_boni(self):
    		use = self.but_propose.DropList.GetSelectedItem().value
    		bon = 1
    		item.SelectItem(self.sub_parent.vnum)
    		for x in use:
    			# TODO: Check if bonus exists on item!!
    			ok = 1
    			for i in xrange(item.ITEM_APPLY_MAX_NUM):
    				(affectType, affectValue) = item.GetAffect(i)
    				if affectType == x[0]:
    					ok = 0
    			if ok == 0:
    				continue
    			y = self.boni[bon][1]
    			y.SelectByAffectId(x[0])
    			self.boni[bon][1].act.SetText(y.DropList.GetSelectedItem().textBox.GetText()) 
    			self.boni[bon][3].SetText(str(x[1]))
    			bon+=1
    
    		for x in range(bon,6):
    			y = self.boni[x][1].DropList
    			y.SelectIndex(0)
    			self.boni[x][1].act.SetText(y.GetSelectedItem().textBox.GetText()) 
    			self.boni[x][3].SetText("0")
    			
    		
    	def prepare_propose(self):
    		self.but_propose.DropList.RemoveAllItems()
    		self.but_propose.maxh = 95
    		self.but_propose.c = 0
    		self.but_propose.AppendItem("Nenhum",[])
    		
    		item.SelectItem(self.sub_parent.vnum)
    		type = item.GetItemType()
    		
    		use = proposals[type]
    		if type == 2:
    			use = use[item.GetItemSubType()]
    		
    		for prop in use:
    			self.but_propose.AppendItem(prop,use[prop])
    			
    		
    			
    		
    class ItemTabBar(ui.Window):
    	
    	class BlockBar(ui.Window):
    		size_res = 32
    		multi = 1
    		def SetSize(self,i=1):
    			self.multi = i
    			ui.Window.SetSize(self,self.size_res,self.size_res*i)
    			if self.rare_enabled == 1:
    				self.swib_normal.SetSize(self.size_res,self.size_res*i/3*2)
    				pos1 = int(1.0*self.size_res*i/3.0*2.0)
    				self.swib_normal.SetSize(self.size_res,pos1)
    				self.swib_rare.SetSize(self.size_res,self.size_res*i-pos1)
    				self.swib_rare.SetPosition(0,pos1)
    				self.swib_rare.Show()
    			else:
    				self.swib_normal.SetSize(self.size_res,self.size_res*i)
    				self.swib_rare.Hide()
    			
    		def Enable_rare(self,o = 1):
    			self.rare_enabled = o
    			self.SetSize(self.multi)
    			
    		def __init__(self):
    			ui.Window.__init__(self)
    			self.rare_enabled = 0
    			self.swib_normal = ui.Bar()
    			self.swib_normal.SetParent(self)
    			self.swib_normal.SetSize(self.size_res,self.size_res*self.multi)
    			self.swib_normal.SetColor(COLOR_INACTIVE)
    			self.swib_normal.SetPosition(0,0)
    			self.swib_normal.Show()
    			
    			self.swib_rare = ui.Bar()
    			self.swib_rare.SetParent(self)
    			self.swib_rare.SetSize(self.size_res,self.size_res)
    			self.swib_rare.SetColor(COLOR_INACTIVE_RARE)
    			self.swib_rare.SetPosition(0,0)
    			self.swib_rare.Hide()
    			self.SetSize(1)
    			
    	
    	class ItemTab(ui.Bar):
    		
    		height_selected   = 36*3+8
    		height_unselected = 36*3+5
    		
    		def Destroy(self):
    			self.parentWindow.parentWindow.enable_rebuy.SetParent(self.parentWindow.parentWindow)
    			self.parentWindow.parentWindow.but_speed.SetParent(self.parentWindow.parentWindow)
    			self.parentWindow.parentWindow.help_show_rare.SetParent(self.parentWindow.parentWindow)
    			self.parentWindow.parentWindow.help_rebuy.SetParent(self.parentWindow.parentWindow)
    			# self.parentWindow.parentWindow.help_stop_all.SetParent(self.parentWindow.parentWindow)
    			self.parentWindow.parentWindow.help_duration.SetParent(self.parentWindow.parentWindow)
    			# self.parentWindow.parentWindow.but_deactivate_all.SetParent(self.parentWindow.parentWindow)
    			# self.parentWindow.parentWindow.but_deactivate_all.Hide()
    			self.parentWindow.parentWindow.enable_rebuy.Hide()
    			self.parentWindow.parentWindow.but_speed.Hide()
    			
    			self.bonusSelector.Hide()
    			self.bonusSelector.__del__()
    			self.Hide()
    			self.__del__()
    		
    		def DeleteMe(self):
    			self.parentWindow.DeleteTab(self.tabnum)
    		
    		def __init__(self,parent,tabnum,index = 0,vnum = 0): ## Init ItemTab
    			ui.Bar.__init__(self)
    			self.SetColor(COLOR_BG)
    			self.SetSize(self.width,self.height_unselected)
    			self.index = index
    			self.tabnum = tabnum
    			self.vnum = vnum
    			self.count = 0
    			self.count_rare = 0
    			self.parentWindow = parent
    			self.SetParent(parent)
    
    			
    			
    			#if self.parentWindow.parentWindow.gameWindow != None:
    			#	self.blockBar = ItemTabBar.BlockBar()
    			#	self.blockBar.SetParent(self.parentWindow.parentWindow.gameWindow.interface.wndInventory.wndItem)
    			#	ipi = self.parentWindow.parentWindow.gameWindow.interface.wndInventory.inventoryPageIndex
    			#	self.blockBar.Show()
    			#	ip2 = self.index - ipi*45
    			#	self.blockBar.SetPosition(((ip2-int(ip2/5)*5)*self.blockBar.size_res),int(ip2/5)*self.blockBar.size_res)
    			
    			self.ItemIcon = ui.ImageBox()
    			self.ItemIcon.SetParent(self)
    			self.ItemIcon.AddFlag("not_pick")
    			self.ItemIcon.SetWindowHorizontalAlignCenter()
    			self.ItemIcon.SetWindowVerticalAlignCenter()
    			self.ItemIcon.Show()
    			
    			self.SlotName = ui.TextLine()
    			self.SlotName.SetParent(self)
    			self.SlotName.SetWindowHorizontalAlignCenter()
    			self.SlotName.SetHorizontalAlignCenter()
    			self.SlotName.SetPosition(0,5)
    			self.SlotName.SetText("Slot %d" % (self.index+1))
    			self.SlotName.AddFlag("not_pick")
    			self.SlotName.Show()
    			
    			self.StatusBar = Bar() # Special Bar
    			self.StatusBar.SetParent(self)
    			self.StatusBar.SetWindowVerticalAlignBottom()
    			self.StatusBar.SetSize(self.width,20)
    			self.StatusBar.SetPosition(0,20)
    			self.StatusBar.SetColor(COLOR_INACTIVE)
    			self.StatusBar.AddFlag("not_pick")
    			self.StatusBar.Show()
    			
    			self.StatusText = ui.TextLine()
    			self.StatusText.SetParent(self.StatusBar)
    			# self.StatusText.SetParent(self)
    			self.StatusText.SetWindowHorizontalAlignCenter()
    			self.StatusText.SetWindowVerticalAlignCenter()
    			self.StatusText.SetHorizontalAlignCenter()
    			self.StatusText.SetVerticalAlignCenter()
    			self.StatusText.SetPosition(0,0)
    			self.StatusText.SetText("Inativo")
    			self.StatusText.Show()
    			
    			
    			self.StatusBar_rare = Bar() # Special Bar
    			self.StatusBar_rare.SetParent(self)
    			self.StatusBar_rare.SetWindowVerticalAlignBottom()
    			self.StatusBar_rare.SetSize(self.width,20)
    			self.StatusBar_rare.SetPosition(0,40)
    			self.StatusBar_rare.SetColor(COLOR_INACTIVE_RARE)
    			self.StatusBar_rare.AddFlag("not_pick")
    			self.StatusBar_rare.Hide()
    			
    			self.StatusText_rare = ui.TextLine()
    			self.StatusText_rare.SetParent(self.StatusBar_rare)
    			self.StatusText_rare.SetWindowHorizontalAlignCenter()
    			self.StatusText_rare.SetWindowVerticalAlignCenter()
    			self.StatusText_rare.SetHorizontalAlignCenter()
    			self.StatusText_rare.SetVerticalAlignCenter()
    			self.StatusText_rare.SetPosition(0,0)
    			self.StatusText_rare.SetText("6/7 Inativo")
    			self.StatusText_rare.Show()
    			
    			
    			self.CloseBut = ui.Button()
    			self.CloseBut.SetParent(self)
    			self.CloseBut.SetUpVisual("d:/ymir work/ui/public/close_button_01.sub")
    			self.CloseBut.SetOverVisual("d:/ymir work/ui/public/close_button_02.sub")
    			self.CloseBut.SetDownVisual("d:/ymir work/ui/public/close_button_03.sub")
    			self.CloseBut.SetToolTipText("Fechar Aba", 0, -23)
    			self.CloseBut.SetEvent(self.DeleteMe)
    			self.CloseBut.SetPosition(0,0)
    			self.CloseBut.Show()
    			
    		
    			
    			self.OnMouseLeftButtonDown = lambda: self.Select()
    			
    			self.boni_active = 0
    			self.boni_rare_active = 0
    			
    			self.bonusSelector = BonusSelector(self)
    			self.bonusSelector.SetParentProxy(self.parentWindow.parentWindow)
    			self.bonusSelector.SetPosition(10,35+36*3+4*2)
    			self.bonusSelector.Hide()
    			self.vnum = 0
    			self.SetIndex(index)
    			
    			self.resetSwitch()
    			self.resetSwitch_rare()
    
    		def IsActive(self):
    			return self.boni_active == 1
    		def IsActive_rare(self):
    			return self.boni_rare_active == 1
    			
    		def SetParentProxy(self,parent):
    			ui.Bar.SetParentProxy(self,parent)
    		def Select(self):
    			for a in self.parentWindow.tabList:
    				self.parentWindow.tabList[a].UnSelect()
    				self.parentWindow.tabList[a].bonusSelector.Hide()
    			self.bonusSelector.Show()
    			self.SetSize(self.width,self.height_selected)
    			self.Update()
    			# self.parentWindow.parentWindow.but_deactivate_all.SetParent(self.bonusSelector)
    			# self.parentWindow.parentWindow.but_deactivate_all.SetPosition(415-10,200+10)
    			# self.parentWindow.parentWindow.but_deactivate_all.Show()
    			self.parentWindow.parentWindow.enable_rebuy.SetParent(self.bonusSelector)
    			self.parentWindow.parentWindow.enable_rebuy.SetPosition(10,285+10)
    			self.parentWindow.parentWindow.enable_rebuy.Show()
    			self.parentWindow.parentWindow.but_speed.SetParent(self.bonusSelector)
    			self.parentWindow.parentWindow.but_speed.SetPosition(0,290+10)
    			self.parentWindow.parentWindow.but_speed.Show()
    			
    			self.parentWindow.parentWindow.help_show_rare.SetParent(self.bonusSelector)
    			self.parentWindow.parentWindow.help_rebuy.SetParent(self.bonusSelector)
    			# self.parentWindow.parentWindow.help_stop_all.SetParent(self.bonusSelector)
    			self.parentWindow.parentWindow.help_duration.SetParent(self.bonusSelector)
    			
    			
    		def UnSelect(self):
    			self.SetSize(self.width,self.height_unselected)
    			self.Update()
    			
    		def Update(self):
    			self.StatusBar.SetPosition(0,20)
    			self.SetPosition((self.width+self.dist)*self.tabnum,0)
    			self.SlotName.SetText("Slot %d" % (self.index+1))
    			
    		def resetSwitch(self):
    			self.values = [0,0,0,0,0]
    		def resetSwitch_rare(self):
    			self.values_rare = [0,0]
    		
    		# last_switch = -1
    		rebuyed = 0
    		def nachkauf(self):
    			if self.parentWindow.parentWindow.buyed != 0:
    				return
    			else:
    				self.parentWindow.parentWindow.buyed = 1
    			if self.parentWindow.parentWindow.enable_rebuy.checked == 1:
    				for i in range(0,shop.SHOP_SLOT_COUNT):
    					me = shop.GetItemID(i)
    					if me == SWITCH_VNUM:
    						if shop.GetItemPrice(i) > player.GetMoney():
    							# chat.AppendChat(1,"-- Switchitem gefunden! Aber wir haben kein Geld :(")
    							self.bonusSelector.Deactivate()
    							return
    						else:
    							net.SendShopBuyPacket(i)
    							self.rebuyed = 1
    							# self.Switch()
    							return
    							
    		rebuyed_rare = 0
    		def nachkauf_rare(self):
    			if self.parentWindow.parentWindow.buyed_rare != 0:
    				return
    			else:
    				self.parentWindow.parentWindow.buyed_rare = 1
    			if self.parentWindow.parentWindow.enable_rebuy.checked == 1:
    				for i in range(0,shop.SHOP_SLOT_COUNT):
    					me = shop.GetItemID(i)
    					if me == SWITCH_RARE_VNUM:
    						if shop.GetItemPrice(i) > player.GetMoney():
    							# chat.AppendChat(1,"-- Switchitem gefunden! Aber wir haben kein Geld :(")
    							self.bonusSelector.Deactivate_rare()
    							return
    						else:
    							net.SendShopBuyPacket(i)
    							self.rebuyed_rare = 1
    							# self.Switch()
    							return
    			# self.bonusSelector.Deactivate()
    		
    		def Switch_rare(self):
    			lc = 0
    			for i in range(0,90*2):
    				if player.GetItemIndex(i) == SWITCH_RARE_VNUM:
    					lc+=player.GetItemCount(i)
    					
    			if lc == 0 and self.parentWindow.parentWindow.enable_rebuy.checked == 0:
    				chat.AppendChat(2,"Slot %d: 6/7 Switch bonus quebrados -> nenhum item foi bem sucedido." % (self.index+1))
    				self.bonusSelector.Deactivate_rare()
    				return
    			
    			if lc < 15:
    				self.nachkauf_rare()
    			
    			if lc == 0:
    				self.bonusSelector.Deactivate_rare()
    				chat.AppendChat(2,"Slot %d: 6/7 Switch cancelado -> Não há arumaka disponível." % (self.index+1))
    				return
    			
    			for i in range(0,90*2):
    				if player.GetItemIndex(i) == SWITCH_RARE_VNUM:
    					net.SendItemUseToItemPacket(i,self.index)
    					return
    		
    		def Switch(self):
    			lc = 0
    			for i in range(0,90*2):
    				if player.GetItemIndex(i) == SWITCH_VNUM:
    					lc+=player.GetItemCount(i)
    			
    			if lc == 0 and self.parentWindow.parentWindow.enable_rebuy.checked == 0:
    				self.bonusSelector.Deactivate()
    				return
    			
    			if lc < 15:
    				self.nachkauf()
    				
    			if lc == 0:
    				self.bonusSelector.Deactivate()
    				return
    
    			for i in range(0,90*2):
    				if player.GetItemIndex(i) == SWITCH_VNUM:
    					net.SendItemUseToItemPacket(i,self.index)
    					return
    			# self.nachkauf()
    			
    		def checkSwitch(self):
    			ok = 0
    			for i in range(0,5):
    				if player.GetItemAttribute(self.index, i) != self.values[i]:
    					ok = 1
    			self.prob = self.GetProb()
    			self.StatusText.SetText("Ativo (%d%%)" %self.prob)
    			if ok == 1 or self.prob >= 90:
    				if self.prob >= 90:
    					chat.AppendChat(1,"Slot %d: pronto!" % (self.index+1))
    					self.bonusSelector.Finish()
    					return
    				self.values  = [player.GetItemAttribute(self.index, i) for i in range(0,5)]
    				self.Switch()
    			elif self.rebuyed > 0:
    				self.rebuyed = 0
    				self.Switch()
    			elif ok == 0 and self.count < 5:
    				self.count+=1
    			elif ok == 0 and self.count >= 5:
    				self.count = 0
    				self.Switch()
    			# elif self.last_switch > -1 and player.GetItemCount(self.last_switch) == 0:
    			# chat.AppendChat(2,"%d"%player.GetItemCount(self.last_switch))
    				# self.last_switch = 0
    				# self.Switch()
    			# else:
    				# if self.GetProb() != 100:
    					# self.Switch()
    			pass
    		
    		def checkSwitch_rare(self):
    			ok = 0
    			for i in range(0,2):
    				if player.GetItemAttribute(self.index, i+6) != self.values_rare[i]:
    					ok = 1
    			self.prob_rare = self.GetProb_rare()
    			self.StatusText_rare.SetText("Ativo (%d%%)" %self.prob_rare)
    			if ok == 1 or self.prob_rare >= 90:
    				if self.prob_rare >= 90:
    					self.bonusSelector.Finish_rare()
    					chat.AppendChat(1,"Slot %d: 6/7 pronto!" % (self.index+1))
    					return
    				self.values_rare  = [player.GetItemAttribute(self.index, i) for i in range(5,7)]
    				self.Switch_rare()
    			elif self.rebuyed_rare > 0:
    				self.rebuyed_rare = 0
    				self.Switch_rare()
    			elif ok == 0 and self.count_rare < 5:
    				self.count_rare+=1
    			elif ok == 0 and self.count_rare >= 5:
    				self.count_rare = 0
    				self.Switch_rare()
    				
    			pass
    		def UpdateItem(self):
    			# try:
    			vnum = player.GetItemIndex(self.index)
    			if vnum == 0 and self.vnum != 0:
    				self.resetSwitch()
    				self.resetSwitch_rare()
    				self.vnum = 0
    				self.bonusSelector.Deactivate()
    				self.bonusSelector.Block()
    				self.bonusSelector.prepare_propose()
    				self.ItemIcon.Hide()
    				#if self.parentWindow.parentWindow.gameWindow != None:
    				#	self.blockBar.SetSize(1)
    				#return
    			elif vnum != self.vnum:
    				self.resetSwitch()
    				self.resetSwitch_rare()
    				self.vnum = vnum
    				self.bonusSelector.Deactivate()
    				self.bonusSelector.prepare_propose()
    				item.SelectItem(self.vnum)
    				#if self.parentWindow.parentWindow.gameWindow != None:
    				#	(w,h) = item.GetItemSize()
    				#	self.blockBar.SetSize(h)
    				
    				if item.GetItemType() != 1 and item.GetItemType() != 2:
    					self.bonusSelector.Block()
    				else:
    					self.bonusSelector.Unblock()
    				
    				
    				self.ItemIcon.Show()
    				self.ItemIcon.LoadImage(item.GetIconImageFileName())
    				# self.values = [player.GetItemAttribute(self.index, i) for i in range(0,5)]
    				return
    			if self.IsActive():
    				self.checkSwitch()
    				
    			if self.IsActive_rare():
    				self.checkSwitch_rare()
    				
    			# except:
    				# pass
    			
    		def SetIndex(self,index):
    			self.index = index
    			self.bonusSelector.index = index
    			self.bonusSelector.Starter.SetText("Switch ("+str(index+1)+") iniciado")
    			self.Update()
    			self.UpdateItem()
    			
    		def GetProb_rare(self):
    			values = [player.GetItemAttribute(self.index, i+5) for i in range(0,2)]
    
    			val2 = {}
    			for i in range(0,2):
    				try:
    					affectString = AFFECT_DICT[values[i][0]](values[i][1])
    					val2[values[i][0]] = values[i][1]
    					self.bonusSelector.ibi[i+5].SetText(affectString)
    				except:
    					pass
    			prob = 0
    			max  = 0
    			
    			yp = self.GenList_rare()
    			for x in yp:
    				if yp[x] in val2 and val2[yp[x]] >= int(self.bonusSelector.boni[x+5][3].GetText()) :
    					prob = prob+1
    				max = max+1
    			if max > 0:
    				prozent = 100/max*prob
    			else:
    				prozent = 100
    			return prozent
    			pass
    		def GetProb(self):
    			values = [player.GetItemAttribute(self.index, i) for i in range(0,5)]
    			val2 = {}
    			# for i in xrange(player.ATTRIBUTE_SLOT_MAX_NUM):
    			for i in range(0,5):
    				try:
    					affectString = AFFECT_DICT[values[i][0]](values[i][1])
    					val2[values[i][0]] = values[i][1]
    					self.bonusSelector.ibi[i].SetText(affectString)
    				except:
    					pass
    			prob = 0
    			max  = 0
    			yp = self.GenList()
    			for x in yp:
    				if yp[x] in val2 and val2[yp[x]] >= int(self.bonusSelector.boni[x][3].GetText()):
    					prob = prob+1
    				max = max+1
    			if max > 0:
    				prozent = 100/max*prob
    			else:
    				prozent = 100
    			return prozent
    			
    		def GenList(self):
    			ret = {}
    			for i in range(0,5):
    				if self.bonusSelector.boni[5-i][1].selected.value != 0:
    					ret[5-i] = self.bonusSelector.boni[5-i][1].selected.value
    			return ret
    		def GenList_rare(self):
    			ret = {}
    			for i in range(0,2):
    				if self.bonusSelector.boni[6+i][1].selected.value != 0:
    					ret[i+1] = self.bonusSelector.boni[6+i][1].selected.value
    			return ret
    			
    	def __init__(self,parent):
    		ui.Window.__init__(self)
    		self.SetSize(500,36*3+4*2)
    		self.tabCount = 0
    		self.tabList = {}
    		
    		self.parentWindow = parent
    		self.SetParent(parent)
    		self.plusBar = ui.Bar()
    		self.plusBar.SetParent(self)
    		self.plusBar.SetSize(90,30)
    		self.plusBar.SetWindowVerticalAlignCenter()
    		self.plusBar.SetColor(COLOR_BG)
    		# self.plusBar.OnMouseLeftButtonDown = lambda: self.AddTab_pre()
    		self.plusBar.OnMouseLeftButtonUp = lambda: self.AddTab_pre()
    		self.OnMouseLeftButtonUp = lambda: self.AddTab_pre()
    		self.plusBar.SetPosition(30,0)
    		self.plusBar.Show()
    		
    		self.AddText = ui.TextLine()
    		self.AddText.SetParent(self.plusBar)
    		self.AddText.SetText("Arraste o item aqui")
    		self.AddText.SetWindowVerticalAlignCenter()
    		self.AddText.SetWindowHorizontalAlignCenter()
    		self.AddText.SetVerticalAlignCenter()
    		self.AddText.SetHorizontalAlignCenter()
    		self.AddText.SetPosition(0,0)
    		self.AddText.Show()
    		
    		dist = [
    			[500,  0  ], #1
    			[240, 10  ],
    			[160, 10  ],
    			[117, 10.5],
    			# [ 80, 25  ], #5
    			[ 92, 10  ], #5
    			[ 75, 10  ], #6
    			[ 64,  9  ], #7
    			[ 56,  7.5], #8
    			[ 50,  6.5], #9
    			[ 45,  5.5], #10
    		][MAX_NUM-1]
    		self.ItemTab.width = dist[0]
    		self.ItemTab.dist  = dist[1]
    
    		
    		#For 8
    		# dist  = 9-1.5
    		# width = 56
    		
    		# For 9
    		# dist  = 9-2.5
    		# width = 50
    		
    		# For 10
    		# dist  = 9-3.5
    		# width = 45
    		
    		
    	def DeleteTab(self,id):
    		if self.parentWindow.gameWindow != None:
    			self.tabList[id].blockBar.Hide()
    			self.tabList[id].blockBar.Destroy()
    		self.tabList[id].Destroy()
    		# del self.tabList[id]
    		self.tabCount = self.tabCount -1 
    		if self.tabCount > id and id < 5:
    			for i in xrange(id,self.tabCount):
    				self.tabList[i] = self.tabList[i+1] 
    				self.tabList[i].tabnum = i
    				self.tabList[i].SetPosition((self.tabList[i].width+self.tabList[i].dist)*i,0)
    				
    			del self.tabList[self.tabCount]
    			
    		else:
    			del self.tabList[id]
    			
    		
    		if self.tabCount > 0:
    			self.tabList[0].Select()
    		
    		if (self.ItemTab.width+self.ItemTab.dist)*self.tabCount < 20:
    			self.parentWindow.SetSize(520,387-210)
    			self.parentWindow.but_speed.Hide()
    			self.plusBar.SetPosition(20,0)
    		else:
    			(x,y) = self.tabList[self.tabCount-1].GetLocalPosition()
    			self.plusBar.SetPosition(x+self.ItemTab.width+self.ItemTab.dist,0)
    			# self.plusBar.SetPosition((self.ItemTab.width+self.ItemTab.dist)*self.tabCount-10,0)
    		self.plusBar.Show()
    		
    	def AddTab_pre(self):
    		if mouseModule.mouseController.isAttached():
    			attachedSlotType = mouseModule.mouseController.GetAttachedType()
    			attachedSlotPos = mouseModule.mouseController.GetAttachedSlotNumber()
    			attachedSlotVnum = mouseModule.mouseController.GetAttachedItemIndex()
    			
    			item.SelectItem(attachedSlotVnum)
    			if item.GetItemType() != 1 and item.GetItemType() != 2:
    				mouseModule.mouseController.DeattachObject()
    				chat.AppendChat(2,"Este item não pode ser rodado.")
    				return
    			
    			for a in self.tabList:
    				if self.tabList[a].index == attachedSlotPos:
    					mouseModule.mouseController.DeattachObject()
    					chat.AppendChat(2,"Esse slot já foi inserido!")
    					return
    				
    				
    			if player.SLOT_TYPE_INVENTORY == attachedSlotType:
    				self.AddTab(attachedSlotPos,attachedSlotVnum)
    				chat.AppendChat(2,"Item adicionado!")
    
    			mouseModule.mouseController.DeattachObject()
    		
    	def AddTab(self,id,vnum = 0):
    		if self.tabCount < MAX_NUM:
    			self.tabList[self.tabCount] = self.ItemTab(self,self.tabCount,id,vnum)
    			
    			self.tabList[self.tabCount].Select()
    			self.tabList[self.tabCount].Show()
    			self.tabCount+= 1
    			if (self.ItemTab.width+self.ItemTab.dist)*self.tabCount < 20:
    				self.plusBar.SetPosition(20,0)
    			else:
    				(x,y) = self.tabList[self.tabCount-1].GetLocalPosition()
    				self.plusBar.SetPosition(x+self.ItemTab.width+self.ItemTab.dist,0)
    		
    		if self.tabCount == MAX_NUM:
    			self.plusBar.Hide()
    			
    		self.parentWindow.SetSize(520,487+10)
    		self.parentWindow.but_speed.Show()
    			# return 0
    
    class Bot(ui.BoardWithTitleBar):
    	class PinGroup(ui.Bar):
    		def OnUpdate(self):
    			## Now check position.
    			(x,y) = self.GetGlobalPosition()
    			max_x = wndMgr.GetScreenWidth()-self.GetWidth()
    			max_y = wndMgr.GetScreenHeight()-self.GetHeight()-DISTANCE_BOTTOM
    			if not x == self.pos_x  or not y == self.pos_y:
    				old_dir = self.dir
    				if self.pos_x == 0 and not self.pos_y == 0 and not self.pos_y == max_y and old_dir != 1:
    					self.parse_dir(1)
    				elif self.pos_x == max_x and not self.pos_y == 0 and not self.pos_y == max_y and old_dir != 2:
    					self.parse_dir(2)
    				elif self.pos_y == max_y and not self.pos_x == 0 and not self.pos_x == max_x and old_dir != 4:
    					self.parse_dir(4)
    				elif self.pos_y == 0 and not self.pos_x == 0 and not self.pos_x == max_x and old_dir != 3:
    					self.parse_dir(3)
    					
    				max_x = wndMgr.GetScreenWidth()-self.GetWidth()
    				max_y = wndMgr.GetScreenHeight()-self.GetHeight()-DISTANCE_BOTTOM	
    					
    				
    				if self.pos_x == 0 and not self.pos_y == 0 and not self.pos_y == max_y:
    					x = 0
    				elif self.pos_x == max_x and not self.pos_y == 0 and not self.pos_y == max_y:
    					x = max_x
    				elif self.pos_y == 0 and not self.pos_x == 0 and not self.pos_x == max_x:
    					y = 0
    				elif self.pos_y == max_y and not self.pos_x == 0 and not self.pos_x == max_x:
    					y = max_y
    				if x > 0 and x < max_x and y > 0 and y < max_y:
    					if y < int(max_y/2):
    						y = 0
    					else:
    						y = max_y
    					
    					if x < int(max_x/2):
    						x = 0
    					else:
    						x = max_x
    						
    				
    				x = min(max(0,x),wndMgr.GetScreenWidth()-self.GetWidth())
    				y = min(max(0,y),wndMgr.GetScreenHeight()-self.GetHeight()-DISTANCE_BOTTOM)
    				self.SetPosition(x,y)
    				self.pos_x = x
    				self.pos_y = y
    			# (self.pos_x,self.pos_y) = self.GetGlobalPosition()
    			self.parent.OnUpdate()
    			for c in self.txtlist:
    				c.SetColor(c.item.StatusBar.color)
    				c.txt2.SetText("Status: %s" % c.item.StatusText.GetText())
    				try:
    					c.listWin2.SetColor(c.item.StatusBar_rare.color)
    					c.txt3.SetText("Status: %s" % c.item.StatusText_rare.GetText())
    				except:
    					pass
    				
    		def ShowMainWindow(self):
    			(x,y) = self.parent.GetGlobalPosition()
    			x = min(max(32,x),wndMgr.GetScreenWidth()-self.parent.GetWidth()-32)
    			y = min(max(32,y),wndMgr.GetScreenHeight()-self.parent.GetHeight()-DISTANCE_BOTTOM-32)
    			self.parent.SetPosition(x,y)
    			self.parent.Show()
    			self.__del__()
    		def parse_dir(self,dir):
    			self.dir = dir
    			w,h = 100,50
    			for listWin in self.txtlist:
    				itm = listWin.item
    				listWin.AddFlag("not_pick")
    				if dir >= 3:
    					listWin.SetPosition(w,4)
    					listWin.SetSize(90,h-8)
    					w+=92
    					if itm.bonusSelector.EnableRareBoni.checked == 1:
    						w+=15
    						listWin.SetSize(105,4+12+12)
    						listWin.listWin2.SetSize(105,14)
    						listWin.listWin2.Show()
    						listWin.txt3.Show()
    				else:
    					listWin.SetPosition(0,h)
    					listWin.SetSize(w,4+12+12+2)
    					
    					if itm.bonusSelector.EnableRareBoni.checked == 1:
    						listWin.SetSize(w,4+12+12)
    						listWin.listWin2.SetSize(w,14)
    						listWin.listWin2.Show()
    						listWin.txt3.Show()
    						# itl.append(txt3)
    						h+=12
    						pass
    					h+=4+12+12+4
    			self.SetSize(w,h)
    		
    		def __init__(self,parent,dir = 1):
    			self.parent = parent
    			self.dir = dir
    			ui.Bar.__init__(self)
    			# Direction: 1 = left; 2 = right; 3 = top
    			self.SetColor(COLOR_BG)
    			w,h = 100,50
    			
    			self.AddFlag("float")
    			self.AddFlag("movable")
    
    			
    			
    			self.maximise_but = ui.Button()
    			self.maximise_but.SetParent(self)
    			self.maximise_but.SetPosition(4,4)
    			self.maximise_but.SetUpVisual("d:/ymir work/ui/public/large_button_01.sub")
    			self.maximise_but.SetOverVisual("d:/ymir work/ui/public/large_button_02.sub")
    			self.maximise_but.SetDownVisual("d:/ymir work/ui/public/large_button_03.sub")
    			self.maximise_but.SetText("Ampliar")
    			self.maximise_but.SetEvent(self.ShowMainWindow)
    			self.maximise_but.Show()
    			
    			self.stop_but = ui.Button()
    			self.stop_but.SetParent(self)
    			self.stop_but.SetPosition(4,24)
    			self.stop_but.SetUpVisual("d:/ymir work/ui/public/large_button_01.sub")
    			self.stop_but.SetOverVisual("d:/ymir work/ui/public/large_button_02.sub")
    			self.stop_but.SetDownVisual("d:/ymir work/ui/public/large_button_03.sub")
    			self.stop_but.SetText("Desativar Todos")
    			self.stop_but.SetEvent(self.parent.deactivate_all)
    			self.stop_but.Show()
    			
    			self.txtlist = []
    			for a in self.parent.itemTabBar.tabList:
    				itm = self.parent.itemTabBar.tabList[a]
    				
    				listWin = ui.Bar()
    				listWin.item = itm
    				self.txtlist.append(listWin)
    				listWin.SetColor(itm.StatusBar.color)
    				listWin.SetParent(self)
    				listWin.AddFlag("not_pick")
    				listWin.Show()
    				
    				listWin.txt1 = ui.TextLine()
    				listWin.txt1.SetParent(listWin)
    				listWin.txt1.SetText("Slot %d:" %(itm.index+1))
    				listWin.txt1.Show()
    				listWin.txt1.SetPosition(4,2)
    				
    				listWin.txt2 = ui.TextLine()
    				listWin.txt2.SetParent(listWin)
    				listWin.txt2.SetText("Status: %s" % itm.StatusText.GetText())
    				listWin.txt2.SetPosition(4,2+12)
    				listWin.txt2.Show()
    				
    				listWin.listWin2 = ui.Bar()
    				listWin.listWin2.AddFlag("not_pick")
    				listWin.listWin2.SetColor(itm.StatusBar_rare.color)
    				listWin.listWin2.SetParent(listWin)
    				listWin.listWin2.SetPosition(0,4+12+12)
    				listWin.listWin2.SetSize(w,12+2)
    				listWin.listWin2.Hide()
    				
    				listWin.txt3 = ui.TextLine()
    				listWin.txt3.SetParent(listWin.listWin2)
    				listWin.txt3.SetText("Status: %s" % itm.StatusText_rare.GetText())
    				listWin.txt3.SetPosition(4,0)
    				listWin.txt3.Hide()
    				
    				if dir >= 3:
    					listWin.SetPosition(w,4)
    					listWin.SetSize(90,h-8)
    					w+=92
    					if itm.bonusSelector.EnableRareBoni.checked == 1:
    						w+=15
    						listWin.SetSize(105,4+12+12)
    						listWin.listWin2.SetSize(105,14)
    						listWin.listWin2.Show()
    						listWin.txt3.Show()
    				else:
    					listWin.SetPosition(0,h)
    					listWin.SetSize(w,4+12+12+2)
    					
    					if itm.bonusSelector.EnableRareBoni.checked == 1:
    						listWin.SetSize(w,4+12+12)
    						listWin.listWin2.Show()
    						listWin.txt3.Show()
    						# itl.append(txt3)
    						h+=12
    						pass
    					
    					h+=4+12+12+4
    				# else:
    					
    				# self.txtlist.append(itl)
    			
    			self.SetSize(w,h)
    			(x,y) = self.parent.GetGlobalPosition()
    			
    			x = min(max(0,x),wndMgr.GetScreenWidth()-self.GetWidth())
    			y = min(max(0,y),wndMgr.GetScreenHeight()-self.GetHeight()-DISTANCE_BOTTOM)
    			if dir == 1:
    				# self.SetWindowHorizontalAlignLeft()
    				self.SetPosition(0,y)
    			elif dir == 2:
    				# self.SetWindowHorizontalAlignRight()
    				self.SetPosition(wndMgr.GetScreenWidth()-self.GetWidth(),y)
    			elif dir == 3:
    				# self.SetWindowVerticalAlignTop()
    				self.SetPosition(x,0)
    			else:
    				# self.SetWindowVerticalAlignBottom()
    				self.SetPosition(x,wndMgr.GetScreenHeight()-(DISTANCE_BOTTOM+h))
    				
    			(self.pos_x,self.pos_y) = self.GetGlobalPosition()
    				
    			self.parse_dir(dir)
    			# if dir == 1:
    				# self.SetWindowHorizontalAlignLeft()
    				# self.SetPosition(0,0)
    			# elif dir == 2:
    				# self.SetWindowHorizontalAlignRight()
    				# self.SetPosition(self.GetWidth(),0)
    			# elif dir == 3:
    				# self.SetWindowHorizontalAlignCenter()
    				# self.SetPosition(0,0)
    			# elif dir == 4:
    				# self.SetWindowHorizontalAlignCenter()
    				# self.SetPosition(0,36+h)
    			# else:
    				# return # ERR
    				
    				
    	
    	pinhint = 0
    	def ShowPinHint(self,type):
    		self.pinhint = type
    		if type == 0:
    			self.PinHint.Hide()
    			return
    		# type=2
    		
    		(x,y) = self.GetGlobalPosition()
    		if type == 1:  # Left
    			self.PinHint.SetWindowHorizontalAlignLeft()
    			self.PinHint.SetWindowVerticalAlignCenter()
    			self.PinHint.SetSize(max(min(30,30-x),3),wndMgr.GetScreenHeight())
    			self.PinHint.SetPosition(0,0)
    		elif type == 2: # Right
    			self.PinHint.SetWindowHorizontalAlignRight()
    			self.PinHint.SetWindowVerticalAlignCenter()
    			self.PinHint.SetSize(30,wndMgr.GetScreenHeight())
    			self.PinHint.SetPosition(max(min(30,30-(wndMgr.GetScreenWidth()-(x+self.GetWidth()))),3),0)
    		elif type == 3: # Top
    			self.PinHint.SetWindowHorizontalAlignCenter()
    			self.PinHint.SetWindowVerticalAlignTop()
    			self.PinHint.SetSize(wndMgr.GetScreenWidth(),max(min(30,30-y),3))
    			self.PinHint.SetPosition(0,0)
    		elif type == 4: # Top
    			self.PinHint.SetWindowHorizontalAlignCenter()
    			self.PinHint.SetWindowVerticalAlignBottom()
    			self.PinHint.SetSize(wndMgr.GetScreenWidth(),30)
    			self.PinHint.SetPosition(0,36+max(min(30,30-(wndMgr.GetScreenHeight()-36-(y+self.GetHeight()))),3))
    		self.PinHint.Show()
    		# else:
    			
    	
    	def __init__(self):
    		ui.BoardWithTitleBar.__init__(self)
    		self.gameWindow = None
    		
    		self.SetTitleName("Bot Metin2")
    		self.AddFlag("float")
    		self.AddFlag("movable")
    		self.SetPosition(30,30)
    		# self.SetSize(520,387)
    		# self.SetSize(520,387-210)
    		self.SetSize(520,387-200)
    		
    		self.PinHint = ui.Bar()
    		self.PinHint.SetColor(COLOR_PIN_HINT)
    		self.PinHint.Show()
    		
    		self.OnMouseLeftButtonDown = self.drag_start
    		self.OnMouseLeftButtonUp   = self.drag_end
    		
    		self.titleBar.MinimizeBut = ui.Button()
    		self.titleBar.MinimizeBut.SetParent(self.titleBar)
    		self.titleBar.MinimizeBut.SetUpVisual("d:/ymir work/interface/button/thinboard_minimize_01_normal.tga")
    		self.titleBar.MinimizeBut.SetOverVisual("d:/ymir work/interface/button/thinboard_minimize_02_hover.tga")
    		self.titleBar.MinimizeBut.SetDownVisual("d:/ymir work/interface/button/thinboard_minimize_03_active.tga")
    		self.titleBar.MinimizeBut.SetToolTipText("Minimizar", 0, -23)
    		self.titleBar.MinimizeBut.SetPosition(520 - self.titleBar.btnClose.GetWidth()-3- 32 - 3, 3)
    		self.titleBar.MinimizeBut.SetEvent(lambda: self.PinShow(1))
    		self.titleBar.MinimizeBut.Show()
    		
    		self.titleBar.HelpBut = ui.ToggleButton()
    		self.titleBar.HelpBut.SetParent(self.titleBar)
    		self.titleBar.HelpBut.SetUpVisual("d:/ymir work/ui/public/small_button_01.sub")
    		self.titleBar.HelpBut.SetOverVisual("d:/ymir work/ui/public/small_button_02.sub")
    		self.titleBar.HelpBut.SetDownVisual("d:/ymir work/ui/public/small_button_03.sub")
    		self.titleBar.HelpBut.SetToolTipText("Ajuda", 0, -23)
    		self.titleBar.HelpBut.SetText("Ajuda")
    		self.titleBar.HelpBut.SetPosition(3, 0)
    		self.titleBar.HelpBut.SetToggleDownEvent(lambda: self.ToggleHelp(1))
    		self.titleBar.HelpBut.SetToggleUpEvent(lambda: self.ToggleHelp(0))
    		self.titleBar.HelpBut.Hide()
    		
    		
    		self.but_deactivate_all = ui.Button()
    		# self.but_deactivate_all.SetParent(self)
    		self.but_deactivate_all.SetParent(self.titleBar)
    		# self.but_deactivate_all.SetPosition(415,350)
    		self.but_deactivate_all.SetPosition(3+5+self.titleBar.HelpBut.GetWidth(), 0)
    		self.but_deactivate_all.SetUpVisual("d:/ymir work/ui/public/large_button_01.sub")
    		self.but_deactivate_all.SetOverVisual("d:/ymir work/ui/public/large_button_02.sub")
    		self.but_deactivate_all.SetDownVisual("d:/ymir work/ui/public/large_button_03.sub")
    		self.but_deactivate_all.SetText("Parar Tudo")
    		self.but_deactivate_all.SetEvent(self.deactivate_all)
    		self.but_deactivate_all.Show()
    		
    		self.titleBar.but_deactivate_all = ui.Button()
    		self.titleBar.but_deactivate_all.SetParent(self.titleBar)
    		self.titleBar.but_deactivate_all.SetPosition(3+5+self.titleBar.HelpBut.GetWidth()+5+self.but_deactivate_all.GetWidth(), 0)
    		self.titleBar.but_deactivate_all.SetUpVisual("d:/ymir work/ui/public/small_button_01.sub")
    		self.titleBar.but_deactivate_all.SetOverVisual("d:/ymir work/ui/public/small_button_02.sub")
    		self.titleBar.but_deactivate_all.SetDownVisual("d:/ymir work/ui/public/small_button_03.sub")
    		self.titleBar.but_deactivate_all.SetText("Info")
    		self.titleBar.but_deactivate_all.SetEvent(self.about)
    		self.titleBar.but_deactivate_all.Show()
    		self.titleName.SetPosition(60, 4)
    		
    		self.enable_rebuy = CheckBox("Comprar automaticamente")
    		self.enable_rebuy.Toggle()
    		self.enable_rebuy.Hide()
    		
    		self.but_speed = ui.SliderBar()
    		self.but_speed.SetParent(self)
    		self.but_speed.SetWindowHorizontalAlignCenter()
    		self.but_speed.SetPosition(0,360)
    		self.but_speed.SetSliderPos(0.0)
    		# self.but_speed.SetToolTipText("Switch-Geschwindigkeit", 0, -23)
    		# self.but_speed.Show()
    		self.but_speed.Hide()
    		
    		self.itemTabBar = ItemTabBar(self)
    		self.itemTabBar.SetPosition(10,35)
    		self.itemTabBar.Show()
    		
    		
    		self.buyed = 0
    		self.buyed_rare = 0
    		
    		self.SetCloseEvent(self._Hide)
    		
    		self.Hide = self._Hide
    		
    		
    		### NOW initialize the HELP stuff!
    		
    		self.help_add_item = HelpBar(0.8,'Solte um item aqui para adiciona-lo.')
    		self.help_add_item.SetParent(self)
    		self.help_add_item.SetPosition(60,50)
    		
    		self.help_minimize = HelpBar(0.8,'Arraste para diminuir o bot para a beira',1)
    		self.help_minimize.SetParent(self.titleBar)
    		self.help_minimize.SetWindowHorizontalAlignCenter()
    		self.help_minimize.SetPosition(100,-30)
    		
    		self.help_show_rare = HelpBar(0.85,'Com isso, voce pode alternar a exebição 6/7')
    		self.help_show_rare.SetParent(self)
    		# self.help_show_rare.SetPosition(35,312)
    		
    		self.help_rebuy = HelpBar(0.5,'Se o bot deve comprar mais?')
    		self.help_rebuy.SetParent(self)
    		# self.help_rebuy.SetPosition(25,297)
    		
    		self.help_stop_all = HelpBar(0.8,'Parar todos os processos!',1)
    		self.help_stop_all.SetParent(self.titleBar)
    		self.help_stop_all.SetPosition(3+5+self.titleBar.HelpBut.GetWidth()*1.2,-30)
    		
    		self.help_duration = HelpBar(0.8,'Retardar Bot',1)
    		self.help_duration.SetParent(self)
    		
    		
    	def ToggleHelp(self,val):
    		self.help_on = val
    	
    	def Show(self):
    		ui.BoardWithTitleBar.Show(self)
    		self.BonusSelector_bot_shown = 1
    		
    	def _Hide(self):
    		## ONLY FOR TESTING
    		# for a in range(0,self.itemTabBar.tabCount):
    			# self.itemTabBar.DeleteTab(0)
    		
    		ui.BoardWithTitleBar.Hide(self)
    		self.BonusSelector_bot_shown = 0
    		
    		
    	def deactivate_all(self):
    		for a in self.itemTabBar.tabList:
    			self.itemTabBar.tabList[a].bonusSelector.Starter.SetUp()
    			self.itemTabBar.tabList[a].bonusSelector.Starter.OnToggleUp()
    			self.itemTabBar.tabList[a].bonusSelector.Starter_rare_boni.SetUp()
    			self.itemTabBar.tabList[a].bonusSelector.Starter_rare_boni.OnToggleUp()
    		pass
    		
    	drag = 0
    	def drag_start(self):
    		self.drag = 1
    		
    	def drag_end(self):
    		self.drag = 0
    		if self.pinhint > 0:
    			self.PinShow(self.pinhint)
    			# self.PinGroupBox = self.PinGroup()
    			pass
    		self.ShowPinHint(0)
    		
    	def PinShow(self,dir):
    		self.PinGroupBox = self.PinGroup(self,dir)
    		self.Hide()
    		self.PinGroupBox.Show()
    		
    	def EnableInventoryTweak(self,gameWindow):
    		self.gameWindow=gameWindow
    		self.gameWindow.interface.wndInventory.inventoryTab[0].SetEvent(lambda arg=0: self.__SetInventoryPage(arg))
    		self.gameWindow.interface.wndInventory.inventoryTab[1].SetEvent(lambda arg=1: self.__SetInventoryPage(arg))
    	def __SetInventoryPage(self,arg):
    		self.gameWindow.interface.wndInventory.SetInventoryPage(arg)
    		for a in self.itemTabBar.tabList:
    			itm = self.itemTabBar.tabList[a]
    			if itm.index >= arg*45 and itm.index < (arg+1)*45:
    				itm.blockBar.Show()
    			else:
    				itm.blockBar.Hide()
    	help_on = 0
    	counter = 0
    	AboutWindow = None
    	def OnUpdate(self):
    		if self.AboutWindow:
    			if self.AboutWindow.x_counter > 1:
    				self.AboutWindow.x_counter -=1
    				self.AboutWindow.text6.SetText("Tempo: %0.1f" % (self.AboutWindow.x_counter/45.0))
    			elif self.AboutWindow.x_counter == 1:
    				self.AboutWindow.Hide()
    				# self.AboutWindow.Delete()
    				
    		if self.help_on == 1:
    			(x,y) = self.itemTabBar.plusBar.GetLocalPosition()
    			self.help_add_item.SetPosition(x+20,50)
    			self.help_add_item.Show()
    			self.help_stop_all.Show()
    			
    			self.help_minimize.Show()
    			if self.itemTabBar.tabCount > 0:
    				self.help_show_rare.SetPosition(25,164)
    				self.help_show_rare.Show()
    				self.help_rebuy.SetPosition(15,147)
    				self.help_rebuy.Show()
    				
    				# self.help_duration.SetPosition(300,180)
    				self.help_duration.SetPosition(190-5.5+self.but_speed.GetSliderPos()*int(35.5+self.but_speed.GetWidth()/2),180)
    				self.help_duration.Show()
    				
    			else:
    				self.help_show_rare.Hide()
    				self.help_rebuy.Hide()
    				self.help_duration.Hide()
    			
    		else:
    			self.help_add_item.Hide()
    			self.help_minimize.Hide()
    			self.help_show_rare.Hide()
    			self.help_rebuy.Hide()
    			self.help_stop_all.Hide()
    			self.help_duration.Hide()
    			
    		if self.drag == 1:
    			(x1, y1) = self.GetGlobalPosition()
    			# if x1 < 0:
    				# x1 = 0
    			# elif x1 > wndMgr.GetScreenWidth()-520:
    				# x1 = wndMgr.GetScreenWidth()-520
    			# if y1 < 0:
    				# y1 = 0
    			# elif y1 > wndMgr.GetScreenHeight()-36-self.GetHeight():
    				# y1 = wndMgr.GetScreenHeight()-36-self.GetHeight()
    			x1 = max(min(wndMgr.GetScreenWidth()-520,x1),0)
    			y1 = max(min(wndMgr.GetScreenHeight()-36-self.GetHeight(),y1),0)
    			self.SetPosition(x1,y1)
    			if x1 < 30:
    				self.ShowPinHint(1)
    			elif wndMgr.GetScreenWidth()-x1-520 < 30:
    				self.ShowPinHint(2)
    			elif y1 < 30:
    				self.ShowPinHint(3)
    			elif wndMgr.GetScreenHeight()-y1-self.GetHeight() < 60:
    				self.ShowPinHint(4)
    			else:
    				self.ShowPinHint(0)
    			# self.SetPosition(x1+(x-self.drag_pos[0]),y1)
    			pass
    		
    		if self.gameWindow != None:
    			for a in self.itemTabBar.tabList:
    				itm = self.itemTabBar.tabList[a]
    			
    			
    			
    		self.counter+=1
    		if self.counter >= int(self.but_speed.GetSliderPos()*MAX_SWITCH_DELAY_APPEND+MIN_SWITCH_DELAY):
    			self.buyed = 0
    			self.buyed_rare = 0
    			self.counter = 0
    			for a in self.itemTabBar.tabList:
    				itm = self.itemTabBar.tabList[a]
    				itm.UpdateItem()
    				# if itm.
    				
    
    	def about(self):
    		self.AboutWindow = ui.ThinBoard()
    		self.AboutWindow.SetParent(self)
    		self.AboutWindow.SetSize(250,100)
    		self.AboutWindow.SetWindowHorizontalAlignCenter()
    		self.AboutWindow.SetWindowVerticalAlignCenter()
    		self.AboutWindow.SetPosition(0,0)
    		self.AboutWindow.Show()
    		self.AboutWindow.x_counter = 450
    		
    		self.AboutWindow.text1 = ui.TextLine()
    		self.AboutWindow.text1.SetParent(self.AboutWindow)
    		self.AboutWindow.text1.SetWindowHorizontalAlignCenter()
    		self.AboutWindow.text1.SetHorizontalAlignCenter()
    		self.AboutWindow.text1.SetPosition(0,5)
    		self.AboutWindow.text1.SetText("Bot revision - Mt2")
    		self.AboutWindow.text1.SetPackedFontColor(ui.GenerateColor(58, 141, 221))
    		self.AboutWindow.text1.Show()
    		
    		self.AboutWindow.text2 = ui.TextLine()
    		self.AboutWindow.text2.SetParent(self.AboutWindow)
    		self.AboutWindow.text2.SetPosition(8,18)
    		self.AboutWindow.text2.SetText("Criado por Ryong Mt2")
    		self.AboutWindow.text2.Show()
    		
    		self.AboutWindow.text3 = ui.TextLine()
    		self.AboutWindow.text3.SetParent(self.AboutWindow)
    		self.AboutWindow.text3.SetPosition(8,18+13)
    		self.AboutWindow.text3.SetText("Updated e Revision - Metin2")
    		self.AboutWindow.text3.Show()
    		
    		self.AboutWindow.text4 = ui.TextLine()
    		self.AboutWindow.text4.SetParent(self.AboutWindow)
    		self.AboutWindow.text4.SetPosition(8,18+13*3)
    		self.AboutWindow.text4.SetText("Todos os direitos reservados")
    		self.AboutWindow.text4.Show()
    		
    		self.AboutWindow.text5 = ui.TextLine()
    		self.AboutWindow.text5.SetParent(self.AboutWindow)
    		self.AboutWindow.text5.SetPosition(8,18+13*4)
    		self.AboutWindow.text5.SetText("")
    		self.AboutWindow.text5.Show()
    		
    		self.AboutWindow.text6 = ui.TextLine()
    		self.AboutWindow.text6.SetParent(self.AboutWindow)
    		self.AboutWindow.text6.SetPosition(200,18+13*5)
    		self.AboutWindow.text6.SetText("Tempo: %d" % self.AboutWindow.x_counter)
    		self.AboutWindow.text6.Show()
    		
    		
    		
    class HelpBar(ui.Window):
    	def __init__(self,width,text,centered = 0):
    		ui.Window.__init__(self)
    		self.AddFlag("not_pick")
    		self.AddFlag("attach")
    		
    		img = ui.ExpandedImageBox()
    		
    		img.SetParent(self)
    		img.LoadImage("d:/ymir work/ui/pattern/help_stick.tga")
    		img.SetRenderingRect(0.0, -width, 0.0, 0.0)
    		img.Show()
    		
    		self.img = img
    		
    		txt = ui.TextLine()
    		
    		txt=ui.TextLine()
    		txt.SetParent(self)
    		txt.SetText(text)
    		txt.Show()
    		
    		img.SetPosition(0,18-width*img.GetHeight())
    		txt.SetPosition(0,0)
    		txt.SetWindowHorizontalAlignCenter()
    		if centered != 0:
    			txt.SetHorizontalAlignCenter()
    		# txt.SetPosition(0,0)
    		
    		self.txt = txt
    	
    class DropDown(ui.Window):
    	dropped  = 0
    	dropstat = 0
    	last = 0
    	lastS = 0
    	maxh = 95
    	OnChange = None
    	class Item(ui.ListBoxEx.Item):
    		def __init__(self,parent, text,value=0):
    			ui.ListBoxEx.Item.__init__(self)
    
    			self.textBox=ui.TextLine()
    			self.textBox.SetParent(self)
    			self.textBox.SetText(text)
    			# self.textBox.SetLimitWidth(parent.GetWidth()-132)
    			self.textBox.Show()
    			self.value = value
    		def GetValue(self):
    			return self.value
    		def __del__(self):
    			ui.ListBoxEx.Item.__del__(self)
    			
    	def __init__(self,parent,tt = "",down=1):
    		ui.Window.__init__(self,"TOP_MOST")
    		self.down = down
    		self.SetParentProxy(parent)
    		self.bg = ui.Bar("TOP_MOST")
    		self.bg.SetParent(self)
    		self.bg.SetPosition(0,0)
    		self.bg.SetColor(0xc0000000)
    		self.bg.OnMouseOverIn = self.bgMouseIn
    		self.bg.OnMouseOverOut = self.bgMouseOut
    		self.bg.OnMouseLeftButtonDown = self.ExpandMe
    		self.bg.Show()
    		self.act = ui.TextLine()
    		self.act.SetParent(self.bg)
    		self.act.SetPosition(4,2)
    		self.act.SetText(tt)
    		self.act.Show()
    		self.GetText = self.act.GetText
    		
    		self.Drop = ui.Bar("TOP_MOST")
    		self.Drop.SetParent(self.GetParentProxy())
    		self.Drop.SetPosition(0,21)
    		# self.Drop.SetSize(150,95)
    		self.Drop.SetSize(150,0)
    		# self.Drop.SetColor(0xc00a0a0a)
    		self.Drop.SetColor(0xff0a0a0a)
    		
    		
    		self.ScrollBar = ui.ThinScrollBar()
    		self.ScrollBar.SetParent(self.Drop)
    		self.ScrollBar.SetPosition(132,0)
    		# self.ScrollBar.SetScrollBarSize(95)
    		self.ScrollBar.SetScrollBarSize(0)
    		# self.ScrollBar.Show()
    		
    		self.DropList = ui.ListBoxEx()
    		self.DropList.SetParent(self.Drop)
    		self.DropList.itemHeight = 12
    		self.DropList.itemStep = 13
    		self.DropList.SetPosition(0,0)
    		# self.DropList.SetSize(132,self.maxh)
    		self.DropList.SetSize(132,13) 
    		self.DropList.SetScrollBar(self.ScrollBar)
    		self.DropList.SetSelectEvent(self.SetTitle)
    		self.DropList.SetViewItemCount(0)
    		self.DropList.Show()
    		if tt != "":
    			self.AppendItemAndSelect(tt)
    		self.selected = self.DropList.GetSelectedItem()
    		
    			
    		self.SetSize(120,20)
    	def __del__(self): 
    		ui.Window.__del__(self)
    	c = 1
    	def AppendItem(self,text,value=0):
    		self.c+=1   
    		self.DropList.AppendItem(self.Item(self,text,value))
    		self.maxh = min(95,13*self.c)
    		if self.c > 7:
    			self.ScrollBar.Show()
    			
    		
    	def AppendItemAndSelect(self,text,value=0):
    		self.DropList.AppendItem(self.Item(self,text,value))
    		self.DropList.SelectIndex(len(self.DropList.itemList)-1)
    		
    	def SelectByAffectId(self,id):
    		for x in self.DropList.itemList:
    			if x.value == id:
    				self.DropList.SelectItem(x)
    				break
    				
    	def SetTitle(self,item):
    		self.act.SetText(str(item.textBox.GetText()))
    		self.last = self.DropList.basePos
    		self.lastS = self.ScrollBar.GetPos()
    		self.dropped = 0
    		self.selected = item
    		if self.OnChange:
    			self.OnChange()
    		# self.Drop.Hide()
    		
    	def SetPosition(self,w,h):
    		ui.Window.SetPosition(self,w,h)
    		if self.down == 1:
    			self.Drop.SetPosition(w,h+21)
    		else:
    			self.Drop.SetPosition(w,h-self.Drop.GetHeight())
    		
    	def SetSize(self,w,h):
    		ui.Window.SetSize(self,w,h)
    		self.bg.SetSize(w,h)
    		self.Drop.SetSize(w,0)
    		self.DropList.SetSize(w-18,self.maxh)
    		for x in self.DropList.itemList:
    			x.SetSize(w-18,12)
    		self.ScrollBar.SetPosition(w-18,0)
    		
    		
    	def ExpandMe(self):
    		if self.dropped == 1:
    			# self.Drop.Hide()
    			self.dropped = 0
    		else:
    			# self.Drop.Show()
    			self.dropped = 1
    			
    	def OnUpdate(self):
    		iter = 6
    		if self.Drop.GetHeight() < 50:
    			self.ScrollBar.Hide()
    		else:
    			self.ScrollBar.Show()
    			
    		if self.dropped == 0 and self.dropstat == 1:
    			if self.Drop.GetHeight() <=0:
    				self.dropstat = 0
    				self.Drop.SetSize(self.Drop.GetWidth(),0)
    				self.ScrollBar.SetScrollBarSize(self.Drop.GetHeight())
    				self.Drop.Hide()
    			else:
    				if self.Drop.GetHeight()-iter < 0:
    					self.Drop.SetSize(self.Drop.GetWidth(),0)
    				else:
    					self.Drop.SetSize(self.Drop.GetWidth(),self.Drop.GetHeight()-iter)
    					(w,h) = self.GetLocalPosition()
    					self.SetPosition(w,h)
    						
    					
    				self.ScrollBar.SetScrollBarSize(self.Drop.GetHeight())
    			self.DropList.SetViewItemCount(int(self.Drop.GetHeight()/13))
    			self.DropList.SetBasePos(self.last+1)
    			self.DropList.SetBasePos(self.last)
    		elif self.dropped == 1 and self.dropstat == 0:
    			self.Drop.Show()
    			self.SetTop()
    			if self.Drop.GetHeight() >=self.maxh:
    				self.Drop.SetSize(self.Drop.GetWidth(),self.maxh)
    				self.ScrollBar.SetScrollBarSize(self.maxh)
    				self.dropstat = 1
    				self.DropList.SetViewItemCount(7)
    				self.ScrollBar.SetPos(self.lastS)
    			else:
    				self.ScrollBar.SetScrollBarSize(self.Drop.GetHeight()+iter)
    				self.Drop.SetSize(self.Drop.GetWidth(),self.Drop.GetHeight()+iter)
    				(w,h) = self.GetLocalPosition()
    				self.SetPosition(w,h)
    			self.DropList.SetViewItemCount(int(self.Drop.GetHeight()/13))
    			self.DropList.SetBasePos(self.last+1)
    			self.DropList.SetBasePos(self.last)
    		
    	## BG Hover
    	def bgMouseIn(self):
    		self.bg.SetColor(0xc00a0a0a)
    	def bgMouseOut(self):
    		self.bg.SetColor(0xc0000000)
    		
    
    class Edit2(ui.EditLine):
    	def __init__(self,main = "",ml = 99):
    		ui.EditLine.__init__(self)
    		self.SetText(main)
    		self.main = main
    		self.SetMax(ml)
    		self.SetUserMax(ml)
    	def GetText(self):
    		res = ui.EditLine.GetText(self)
    		if res == "":
    			return "0"
    		else:
    			return res
    			
    	def __del__(self):
    		ui.EditLine.__del__(self)
    	def OnSetFocus(self):
    		ui.EditLine.OnSetFocus(self)
    		if ui.EditLine.GetText(self) == self.main:
    			self.SetText("")
    	def OnKillFocus(self):
    		ui.EditLine.OnKillFocus(self)
    		if ui.EditLine.GetText(self) == "":
    			self.SetText(self.main)
    			
    
    class CheckBox(ui.Window):
    	checked = 0
    	eventUp  =None
    	eventDown=None
    	def __init__(self,cont = ""):
    		ui.Window.__init__(self)
    		self.BG = ui.Bar("UI")
    		self.BG.SetParent(self)
    		self.BG.SetPosition(0,0)
    		self.BG.SetSize(20,20)
    		# self.BG.SetColor(0xc00b0b0b)
    		self.BG.SetColor(COLOR_CHECKBOX_NOT_SELECTED)
    		self.BG.OnMouseLeftButtonUp = self.Toggle
    		self.OnMouseLeftButtonUp = self.Toggle
    		self.BG.Show()
    		self.Title = ui.TextLine()
    		self.Title.SetParent(self)
    		self.Title.SetPosition(25,2)
    		self.Title.SetText(cont)
    		self.Title.Show()
    		self.stat = ui.TextLine()
    		self.stat.SetParent(self.BG)
    		self.stat.SetPosition(0,0)
    		self.stat.SetWindowHorizontalAlignCenter()
    		self.stat.SetWindowVerticalAlignCenter()
    		self.stat.SetHorizontalAlignCenter()
    		self.stat.SetVerticalAlignCenter()
    		self.stat.SetSize(0,0)
    		self.stat.SetText("")
    		self.SetSize(25+self.Title.GetTextSize()[0]+5,20)
    		self.stat.Show()
    	def __del__(self):
    		ui.ToggleButton.__del__(self)
    	def Toggle(self):
    		if self.checked == 1:
    			self.OnToggleUp()
    		else:
    			self.OnToggleDown()
    	def OnToggleUp(self):
    		self.stat.SetText("")
    		# self.BG.SetColor(0xc00b0b0b)
    		self.BG.SetColor(COLOR_CHECKBOX_NOT_SELECTED)
    		self.checked = 0
    		if self.eventUp:
    			self.eventUp()
    	def OnToggleDown(self):
    		# self.BG.SetColor(0xf00b0b0b)
    		self.BG.SetColor(COLOR_CHECKBOX_SELECTED) 
    		self.stat.SetText("X")
    		self.checked = 1
    		if self.eventDown:
    			self.eventDown()
    
    			
    # Zum Testen
    # a = Bot()
    # a.Show()
    
    # oder;
    # Bot().Show()

     

     

    • Love 1
  5. 23 hours ago, Amun said:

    You're getting that error because the size of avail is 0.

    Something like this should suffice:

    Before
    const TItemAttrTable& r = g_map_itemRare[avail[number(0, avail.size() - 1)]];
    
    Add:
    if (!avail.size()) {
    	// add some error here about the size, if you want to know when it happens.
    	return false;
    }

     

    Cheers!

    Don't give the error anymore, but the 7 bonus just fails, it doesn't add at all 

  6. On 2/23/2022 at 3:10 PM, Amun said:

    Dê-nos o código, cara .. O erro é bastante auto-explicativo, mas não sabemos o que você tem lá ..

    item_attribute.cpp 485

    Here is my file item_atribute.cpp

    Thanks for listening

    Spoiler
    #include "stdafx.h"
    #include "constants.h"
    #include "log.h"
    #include "item.h"
    #include "char.h"
    #include "desc.h"
    #include "item_manager.h"
    
    const int MAX_NORM_ATTR_NUM = ITEM_MANAGER::MAX_NORM_ATTR_NUM;
    const int MAX_RARE_ATTR_NUM = ITEM_MANAGER::MAX_RARE_ATTR_NUM;
    
    int CItem::GetAttributeSetIndex()
    {
    	if (GetType() == ITEM_WEAPON)
    	{
    		if (GetSubType() == WEAPON_ARROW)
    			return -1;
    #ifdef WJ_QUIVER_SYSTEM
    		if (GetSubType() == WEAPON_UNLIMITED_ARROW)
    			return -1;
    #endif
    		return ATTRIBUTE_SET_WEAPON;
    	}
    
    	if (GetType() == ITEM_COSTUME && GetSubType() == COSTUME_WEAPON)
    		return ATTRIBUTE_SET_SHIELD;
    	else if (GetType() == ITEM_COSTUME && GetSubType() == COSTUME_BODY)
    		return ATTRIBUTE_SET_BODY;
    
    	if (GetType() == ITEM_ARMOR || GetType() == ITEM_COSTUME)
    	{
    		switch (GetSubType())
    		{
    			case ARMOR_BODY:
    				return ATTRIBUTE_SET_BODY;
    
    			case ARMOR_WRIST:
    				return ATTRIBUTE_SET_WRIST;
    
    			case ARMOR_FOOTS:
    				return ATTRIBUTE_SET_FOOTS;
    
    			case ARMOR_NECK:
    				return ATTRIBUTE_SET_NECK;
    
    			case ARMOR_HEAD:
    				return ATTRIBUTE_SET_HEAD;
    
    			case ARMOR_SHIELD:
    				return ATTRIBUTE_SET_SHIELD;
    
    			case ARMOR_EAR:
    				return ATTRIBUTE_SET_EAR;
    
    #ifdef ENABLE_PENDANT
    			case ARMOR_PENDANT:
    				return ATTRIBUTE_SET_PENDANT;
    #endif
    		}
    	}
    
    	return -1;
    }
    
    bool CItem::HasAttr(BYTE bApply)
    {
    	for (int i = 0; i < ITEM_APPLY_MAX_NUM; ++i)
    		if (m_pProto->aApplies[i].bType == bApply)
    			return true;
    
    	for (int i = 0; i < MAX_NORM_ATTR_NUM; ++i)
    		if (GetAttributeType(i) == bApply)
    			return true;
    
    	return false;
    }
    /*
    bool CItem::HasApply(BYTE bApply)
    {
    	for (int i = 0; i < ITEM_APPLY_MAX_NUM; ++i)
    		if (m_pProto->aApplies[i].bType == bApply)
    			return true;
    		
    	return false;
    }
    
    bool CItem::HasOnlyAttr(BYTE bApply)
    {
    	for (int i = 0; i < MAX_NORM_ATTR_NUM; ++i)
    		if (GetAttributeType(i) == bApply)
    			return true;
    	
    	return false;
    }
    */
    bool CItem::HasRareAttr(BYTE bApply)
    {
    	for (int i = 0; i < MAX_RARE_ATTR_NUM; ++i)
    		if (GetAttributeType(i + 5) == bApply)
    			return true;
    
    	return false;
    }
    /*
    void CItem::AddNewAttr(BYTE index, BYTE bApply, BYTE bLevel)
    {
    	if (HasApply(bApply))
    		return;
    
    	if (bLevel <= 0)
    		return;
    	
    	int iAttributeSet = GetAttributeSetIndex();
    	
    	const TItemAttrTable & r = g_map_itemAttr[bApply];
    	if (!r.bMaxLevelBySet[iAttributeSet])
    		return;
    
    	int i = GetAttributeCount();
    
    	if (i == 3)
    	{
    		RemoveAttributeAt(index);
    		const TItemAttrTable & r = g_map_itemAttr[bApply];
    		long lVal = r.lValues[MIN(4, bLevel - 1)];
    
    		if (lVal)
    			SetAttribute(index, bApply, lVal);		
    	}
    	else
    	{
    		const TItemAttrTable & r = g_map_itemAttr[bApply];
    		long lVal = r.lValues[MIN(4, bLevel - 1)];
    
    		if (lVal)
    			SetAttribute(index, bApply, lVal);
    	}
    }
    */
    void CItem::AddAttribute(BYTE bApply, short sValue)
    {
    	if (HasAttr(bApply))
    		return;
    
    	int i = GetAttributeCount();
    
    	if (i >= MAX_NORM_ATTR_NUM)
    		sys_err("item attribute overflow!");
    	else
    	{
    		if (sValue)
    			SetAttribute(i, bApply, sValue);
    	}
    }
    
    void CItem::AddAttr(BYTE bApply, BYTE bLevel)
    {
    	if (HasAttr(bApply))
    		return;
    
    	if (bLevel <= 0)
    		return;
    
    	int i = GetAttributeCount();
    
    	if (i == MAX_NORM_ATTR_NUM)
    		sys_err("item attribute overflow!");
    	else
    	{
    		const TItemAttrTable & r = g_map_itemAttr[bApply];
    		long lVal = r.lValues[MIN(4, bLevel - 1)];
    
    		if (lVal)
    			SetAttribute(i, bApply, lVal);
    	}
    }
    
    void CItem::PutAttributeWithLevel(BYTE bLevel)
    {
    	int iAttributeSet = GetAttributeSetIndex();
    
    	if (iAttributeSet < 0)
    		return;
    
    	if (bLevel > ITEM_ATTRIBUTE_MAX_LEVEL)
    		return;
    
    	std::vector<int> avail;
    
    	int total = 0;
    
    	// 붙일 수 있는 속성 배열을 구축
    	for (int i = 0; i < MAX_APPLY_NUM; ++i)
    	{
    		const TItemAttrTable & r = g_map_itemAttr[i];
    
    		if (r.bMaxLevelBySet[iAttributeSet] && !HasAttr(i))
    		{
    			avail.push_back(i);
    			total += r.dwProb;
    		}
    	}
    
    	// 구축된 배열로 확률 계산을 통해 붙일 속성 선정
    	unsigned int prob = number(1, total);
    	int attr_idx = APPLY_NONE;
    
    	for (DWORD i = 0; i < avail.size(); ++i)
    	{
    		const TItemAttrTable & r = g_map_itemAttr[avail[i]];
    
    		if (prob <= r.dwProb)
    		{
    			attr_idx = avail[i];
    			break;
    		}
    
    		prob -= r.dwProb;
    	}
    
    	if (!attr_idx)
    	{
    		sys_err("Cannot put item attribute %d %d", iAttributeSet, bLevel);
    		return;
    	}
    
    	const TItemAttrTable & r = g_map_itemAttr[attr_idx];
    
    	// 종류별 속성 레벨 최대값 제한
    	if (bLevel > r.bMaxLevelBySet[iAttributeSet])
    		bLevel = r.bMaxLevelBySet[iAttributeSet];
    
    	AddAttr(attr_idx, bLevel);
    }
    
    void CItem::PutAttribute(const int * aiAttrPercentTable)
    {
    	int iAttrLevelPercent = number(1, 100);
    	int i;
    
    	for (i = 0; i < ITEM_ATTRIBUTE_MAX_LEVEL; ++i)
    	{
    		if (iAttrLevelPercent <= aiAttrPercentTable[i])
    			break;
    
    		iAttrLevelPercent -= aiAttrPercentTable[i];
    	}
    
    	PutAttributeWithLevel(i + 1);
    }
    
    void CItem::ChangeAttribute(const int* aiChangeProb)
    {
    	int iAttributeCount = GetAttributeCount();
    
    	ClearAttribute();
    
    	if (iAttributeCount == 0)
    		return;
    
    	TItemTable const * pProto = GetProto();
    
    	if (pProto && pProto->sAddonType)
    	{
    		ApplyAddon(pProto->sAddonType);
    	}
    
    	static const int tmpChangeProb[ITEM_ATTRIBUTE_MAX_LEVEL] =
    	{
    		0, 10, 40, 35, 15,
    	};
    
    	for (int i = GetAttributeCount(); i < iAttributeCount; ++i)
    	{
    		if (aiChangeProb == NULL)
    		{
    			PutAttribute(tmpChangeProb);
    		}
    		else
    		{
    			PutAttribute(aiChangeProb);
    		}
    	}
    }
    
    void CItem::AddAttribute()
    {
    	static const int aiItemAddAttributePercent[ITEM_ATTRIBUTE_MAX_LEVEL] =
    	{
    		40, 50, 10, 0, 0
    	};
    
    	if (GetAttributeCount() < MAX_NORM_ATTR_NUM)
    #ifdef __ENABLE_COSTUME_ENCHANT_SYSTEM__
    		PutAttribute(GetType() == ITEM_COSTUME ? aiCostumeAttributeLevelPercent : aiItemAddAttributePercent);
    #else
    		PutAttribute(aiItemAddAttributePercent);
    #endif
    }
    
    void CItem::ClearAttribute()
    {
    	for (int i = 0; i < MAX_NORM_ATTR_NUM; ++i)
    	{
    		m_aAttr[i].bType = 0;
    		m_aAttr[i].sValue = 0;
    	}
    }
    
    int CItem::GetAttributeCount()
    {
    	int i;
    
    	for (i = 0; i < MAX_NORM_ATTR_NUM; ++i)
    	{
    		if (GetAttributeType(i) == 0)
    			break;
    	}
    
    	return i;
    }
    
    int CItem::FindAttribute(BYTE bType)
    {
    	for (int i = 0; i < MAX_NORM_ATTR_NUM; ++i)
    	{
    		if (GetAttributeType(i) == bType)
    			return i;
    	}
    
    	return -1;
    }
    
    bool CItem::RemoveAttributeAt(int index)
    {
    	if (GetAttributeCount() <= index)
    		return false;
    
    	for (int i = index; i < MAX_NORM_ATTR_NUM - 1; ++i)
    	{
    		SetAttribute(i, GetAttributeType(i + 1), GetAttributeValue(i + 1));
    	}
    
    	SetAttribute(MAX_NORM_ATTR_NUM - 1, APPLY_NONE, 0);
    	return true;
    }
    
    bool CItem::RemoveAttributeType(BYTE bType)
    {
    	int index = FindAttribute(bType);
    	return index != -1 && RemoveAttributeType(index);
    }
    
    void CItem::SetAttributes(const TPlayerItemAttribute* c_pAttribute)
    {
    	thecore_memcpy(m_aAttr, c_pAttribute, sizeof(m_aAttr));
    	Save();
    }
    
    void CItem::SetAttribute(int i, BYTE bType, short sValue)
    {
    	assert(i < MAX_NORM_ATTR_NUM);
    
    	m_aAttr[i].bType = bType;
    	m_aAttr[i].sValue = sValue;
    	UpdatePacket();
    	Save();
    
    	if (bType)
    	{
    		const char * pszIP = NULL;
    
    		if (GetOwner() && GetOwner()->GetDesc())
    			pszIP = GetOwner()->GetDesc()->GetHostName();
    
    		LogManager::instance().ItemLog(i, bType, sValue, GetID(), "SET_ATTR", "", pszIP ? pszIP : "", GetOriginalVnum());
    	}
    }
    
    void CItem::SetAttribute2(int i, BYTE bType, short sValue)
    {
    	if (i == 15)
    		i = 6;
    	else if (i == 14)
    		i = 5;
    	else
    	{
    		assert(i < MAX_NORM_ATTR_NUM);
    	}
    
    	m_aAttr[i].bType = bType;
    	m_aAttr[i].sValue = sValue;
    	UpdatePacket();
    	Save();
    }
    
    void CItem::SetForceAttribute(int i, BYTE bType, short sValue)
    {
    	assert(i < ITEM_ATTRIBUTE_MAX_NUM);
    
    	m_aAttr[i].bType = bType;
    	m_aAttr[i].sValue = sValue;
    	UpdatePacket();
    	Save();
    
    	if (bType)
    	{
    		const char * pszIP = NULL;
    
    		if (GetOwner() && GetOwner()->GetDesc())
    			pszIP = GetOwner()->GetDesc()->GetHostName();
    
    		LogManager::instance().ItemLog(i, bType, sValue, GetID(), "SET_FORCE_ATTR", "", pszIP ? pszIP : "", GetOriginalVnum());
    	}
    }
    
    
    void CItem::CopyAttributeTo(LPITEM pItem)
    {
    	pItem->SetAttributes(m_aAttr);
    }
    
    int CItem::GetRareAttrCount()
    {
    	int ret = 0;
    
    	if (m_aAttr[5].bType != 0)
    		ret++;
    
    	if (m_aAttr[6].bType != 0)
    		ret++;
    
    	return ret;
    }
    
    bool CItem::ChangeRareAttribute()
    {
    	if (GetRareAttrCount() == 0)
    		return false;
    
    	int cnt = GetRareAttrCount();
    
    	for (int i = 0; i < cnt; ++i)
    	{
    		m_aAttr[i + 5].bType = 0;
    		m_aAttr[i + 5].sValue = 0;
    	}
    
    	if (GetOwner() && GetOwner()->GetDesc())
    		LogManager::instance().ItemLog(GetOwner(), this, "SET_RARE_CHANGE", "");
    	else
    		LogManager::instance().ItemLog(0, 0, 0, GetID(), "SET_RARE_CHANGE", "", "", GetOriginalVnum());
    
    	for (int i = 0; i < cnt; ++i)
    	{
    		AddRareAttribute();
    	}
    
    	return true;
    }
    
    bool CItem::AddRareAttribute()
    {
    	int count = GetRareAttrCount();
    
    	if (count >= 2)
    		return false;
    
    	int pos = count + 5;
    	TPlayerItemAttribute & attr = m_aAttr[pos];
    
    	int nAttrSet = GetAttributeSetIndex();
    	std::vector<int> avail;
    
    	for (int i = 0; i < MAX_APPLY_NUM; ++i)
    	{
    		const TItemAttrTable & r = g_map_itemRare[i];
    
    		if (r.dwApplyIndex != 0 && r.bMaxLevelBySet[nAttrSet] > 0 && HasRareAttr(i) != true)
    		{
    			avail.push_back(i);
    		}
    	}
    
    	const TItemAttrTable& r = g_map_itemRare[avail[number(0, avail.size() - 1)]];
    	int nAttrLevel = 5;
    
    	if (nAttrLevel > r.bMaxLevelBySet[nAttrSet])
    		nAttrLevel = r.bMaxLevelBySet[nAttrSet];
    
    	attr.bType = r.dwApplyIndex;
    	attr.sValue = r.lValues[nAttrLevel - 1];
    
    	UpdatePacket();
    
    	Save();
    
    	const char * pszIP = NULL;
    
    	if (GetOwner() && GetOwner()->GetDesc())
    		pszIP = GetOwner()->GetDesc()->GetHostName();
    
    	LogManager::instance().ItemLog(pos, attr.bType, attr.sValue, GetID(), "SET_RARE", "", pszIP ? pszIP : "", GetOriginalVnum());
    	return true;
    }
    

     

     

  7. Good afternoon...

    I added the system, it adds the 6 bonus correctly, when I add the 7 bonus the following core crash:

     

    SYSERR: Feb 21 18:24:44 :: number_ex: number(): first argument is bigger than second argument 0 -> -1, item_attribute.cpp 485

     

    Would anyone know the reason for this error?

    Thanks in advance for your help and good afternoon to all

  8. Good afternoon...

    I added the system, it adds the 6 bonus correctly, when I add the 8 bonus the following core crash:

    SYSERR: Feb 21 18:24:44 :: number_ex: number(): first argument is bigger than second argument 0 -> -1, item_attribute.cpp 485

    Would anyone know the reason for this error?

    Thanks in advance for your help and good afternoon to all

  9. It's giving me this error when compiling

    cmd_gm.cpp: In function 'void reload_regen(LPCHARACTER, const char*, int, int)':
    cmd_gm.cpp:1284:33: error: 'class SECTREE_MANAGER' has no member named 'BuildMap'
         SECTREE_MANAGER::instance().BuildMap(mapIndex, LocaleService_GetMapPath().c_str());

    Any solutions please?

×
×
  • 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.