antiblock
https://arwen2.global/

purabrisa

Membro
  • Content Count

    107
  • Joined

  • Last visited

  • Days Won

    1

Reputation Activity

  1. Upvote
    purabrisa reacted to friend in [Dif] 1 Segundo Para Desaparecer O Item Do Chão   
    Boas pessoal, hoje já postei uma Dif porque estava à procura dela e reparei que a CG não tinha.
    Então agora estava à procura de uma Dif para o meu server na CG mas também não tem.
    É a Dif para o Item Dropado, desaparecer passado 1/3/5/10 Segundo(s).
    Desaparecer Após 1 Segundo:

    Desaparecer Após 3 Segundos:
    Desaparecer Após 5 Segundos:
    Desaparecer Após 10 Segundos:
    Desaparecer Após 20 Segundos:
    Desaparecer Após 30 Segundos:
    Créditos: We Are The Team Se foi util, não te esqueças do meu http://cyber-gamers.org/public/style_emoticons/default/451960.gif
    Cumpz,
    J0K3RHD
  2. Upvote
    purabrisa got a reaction from Duos in [Resolvido][Duvida] Rates Bugadas   
    adicionar DIFF no gamepara exp 1000%Att.
  3. Upvote
    purabrisa reacted to friend in Serverfiles Flyworld2   
    Verificado : 18/08/2018
    Links : ON
    Link do client : OFF - re-upload sff
     
    Boas pessoal, sou o J0K3RHD e trago aqui umas Serverfiles que achei interessante.
    Informações das Files:
    - Serverfiles de 2011
    - Level Máximo: 170
    - Status Vão Até 125
    - 6ª Habilidade No Ninja e Warrior
    - Server é Muito Estável
    - Novos Mapas
    - Sistema Mascotes
    - Muitas Armas e Armaduras Novas
    Algumas Imagens:



    Uma Random Casa Entre O Vendedor De Armaduras e o Vendedor De Armas

    Uma Interface, Na Minha Opinião Bonita

    Alguns Mapas:



    Dados:
    VirtualBox / Virtual PC:
    - ID: root
    - Password: 12345
    Navicat:
    - ID: root
    - Password: fuckthisshit
    Conta In-Game:
    - ID: troldius3
    - Password: 123456
    Para Ligar o Servidor usem o Comando: cd /usr/metin2/wof2010 && sh start.sh
    Downloads:
    - Serverfiles: https://mega.co.nz/#..._h0fM5YyJUGPUQE ou http://www.4shared.c.../FlyWorld2.html
    - Client: http://www.4shared.c...ld2_Client.html
    MasterEPack Para Editar Os Ficheiros Eix/epk: http://www.mediafire...0fq/MasterEPack
    Créditos: Metin2Zone
    Não se esqueçam do meu http://cyber-gamers.org/public/style_emoticons/default/451960.gif se gostaram :)
    Cumpz,
    J0K3RHD
  4. Upvote
    purabrisa reacted to SINOLOGY in Tradução Versão 1.0.2 - 2013Er Files [Novo 0.2]   
    http://cyber-gamers.org/public/style_emoticons/default/451960.gif http://cyber-gamers.org/public/style_emoticons/default/451960.gifhttp://cyber-gamers.org/public/style_emoticons/default/451960.gif http://cyber-gamers.org/public/style_emoticons/default/451960.gif
    TRADUÇÃO VERSÃO 1.0.2 - 2013er FILES
    Download:

    https://mega.co.nz/#...nFi8Pd1fM_-0vRs

    Scan: https://www.virustot...sis/1370222041/

    Senha:
    puriecyber


    Esta é a Versão 1.0.2 de BOSS.

    Esta tradução está diponível apenas para o fórum PURI e CYBER-GAMERS.


    É recomendado LER os arquivos Ler.txt das traduções.
  5. Upvote
    purabrisa reacted to WildEgo in [Novos Trabalhos]   
    0/20


    Tempo: +/- 25minutos

    0/20

    Tempo: +/- 60minutos
  6. Upvote
    purabrisa reacted to TheSubKIller aka Skinning in [NEW] Icons forum   
    Boas Cyber-Gamers







    Fonte: epvp
  7. Upvote
    purabrisa reacted to quenii in Metin2 File Tool   
    Deixo aqui o tool disponibilizado por (balika01) para extração/compactação
    da pack para os novos binários (Novo método CRC+type2)
    É bem simples de usar vou deixar aqui um exemplo:

    Unpack = Extrair
    root = Arquivo a ser descompactado
    D:Metin2Kenny = Local onde será descompactado (Coloque o seu)
    root.dat = Arquivo que será gerado ao descompactar como se fosse um arquivo (XML)
    (Exemplo extraio o root e depois pra compactar só arrastar o root.dat para o compilador)
    - Se baseie pelas linhas que deixei, feito isso salve isso com qualquer nome, porém na extensão (.DAT)
    - Feito isso, para extrair é só arrasta o arquivo (.DAT) que você fez para o tool
    - Para compactar é só arrastar o outro arquivo (.DAT) que será gerado na extração para o tool.
    - O arquivo (.DAT) que for gerado na extração é basicamente como se fosse um (XML)
    Lembrando que os binários disponibilizados pelo Balika01 sem HS e com novo método de CRC é necessário alterar os types para 1.
    Bom é isso
    Download:

    Scan (Todos são falsos positivo) https://www.virustot...da623/analysis/
    Balika01
    Tim66613
    Pushedx
    Markus FJX
  8. Upvote
    purabrisa reacted to SINVAL o.O in [Release]Official Crafting System   
    Olá Pessoal
    Sistema Oficial Crafting para compartilhar hoje

    Print:

    Download
    VT
    Bem vamos lá:
    Add game.py

    dragon_soul_refine_settings.py

    locale/de/ui

    dragonsoulrefinewindow.py

    locale/de/ui

    dragonsoulwindow.py

    root

    uidragonsoul.py
    .Down()self.deckTab[(page+1)%2].SetUp()self.RefreshEquipSlotWindow()# ¿ëÈ¥¼® È°¼ºÈ* °ü·Ãdef ActivateDragonSoulByExtern(self, deck):self.isActivated = TRUEself.activateButton.Down()self.deckPageIndex = deckself.deckTab[deck].Down()self.deckTab[(deck+1)%2].SetUp()self.RefreshEquipSlotWindow()def DeactivateDragonSoul(self):self.isActivated = FALSEself.activateButton.SetUp()def ActivateButtonClick(self):self.isActivated = self.isActivated ^ TRUEif self.isActivated:if self.__CanActivateDeck():net.SendChatPacket("/dragon_soul activate " + str(self.deckPageIndex))else:self.isActivated = FALSEself.activateButton.SetUp()else:net.SendChatPacket("/dragon_soul deactivate")def __CanActivateDeck(self):canActiveNum = 0for i in xrange(6):slotNumber = self.__InventoryLocalSlotPosToGlobalSlotPos(player.INVENTORY, player.DRAGON_SOUL_EQUIPMENT_SLOT_START + i)itemVnum = player.GetItemIndex(slotNumber)if itemVnum != 0:item.SelectItem(itemVnum)isNoLimit = TRUEfor i in xrange(item.LIMIT_MAX_NUM):(limitType, limitValue) = item.GetLimit(i)# LIMIT_TIMER_BASED_ON_WEAR´Â ¼ÒÄÏ0¿¡ ³²Àº ½Ã°£À» ¹Ú´Â´Ù.# LIMIT_REAL_TIMEÀº ½Ã°£ ´Ù µÇ¸é ¾ÆÀÌÅÛÀÌ »ç¶óÁö¹Ç·Î ÇÒ ÇÊ¿ä°¡ ¾ø´Ù.# LIMIT_REAL_TIME_START_FIRST_USE´Â ¼*¹ö¿¡ Á¦´ë·Î Á¤ÀǵÇÁö ¾Ê¾Æ ÀÏ´Ü ³ÀµĞ´Ù.if item.LIMIT_TIMER_BASED_ON_WEAR == limitType:isNoLimit = FALSEremain_time = player.GetItemMetinSocket(player.INVENTORY, slotNumber, 0)if 0 != remain_time:canActiveNum += 1break# ŸÀ̸Ӱ¡ ¾ø´Ù¸é ActivateÇÒ ¼ö ÀÖ´Â ¿ëÈ¥¼®.if isNoLimit:canActiveNum += 1return canActiveNum &--#62; 0# È°¼ºÈ* °ü·Ã ³¡# ½½·Ô highlight °ü·Ãdef __HighlightSlot_ClearCurrentPage(self):for i in xrange(self.wndItem.GetSlotCount()):slotNumber = self.__InventoryLocalSlotPosToGlobalSlotPos(player.DRAGON_SOUL_INVENTORY, i)if slotNumber in self.listHighlightedSlot:self.wndItem.DeactivateSlot(i)self.listHighlightedSlot.remove(slotNumber)def __HighlightSlot_RefreshCurrentPage(self):for i in xrange(self.wndItem.GetSlotCount()):slotNumber = self.__InventoryLocalSlotPosToGlobalSlotPos(player.DRAGON_SOUL_INVENTORY, i)if slotNumber in self.listHighlightedSlot:self.wndItem.ActivateSlot(i)def HighlightSlot(self, slot):if not slot in self.listHighlightedSlot:self.listHighlightedSlot.append (slot)# ½½·Ô highlight °ü·Ã ³¡def SetDragonSoulRefineWindow(self, wndDragonSoulRefine):if app.ENABLE_DRAGON_SOUL_SYSTEM:from _weakref import proxyself.wndDragonSoulRefine = proxy(wndDragonSoulRefine)## °*È*ÇÒ ¼ö ¾ø´Â °æ¿ì ³¯¸®´Â ¿¹¿Ü#class DragonSoulRefineException(Exception):#passclass DragonSoulRefineWindow(ui.ScriptWindow):REFINE_TYPE_GRADE, REFINE_TYPE_STEP, REFINE_TYPE_STRENGTH = xrange(3)DS_SUB_HEADER_DIC = {REFINE_TYPE_GRADE : player.DS_SUB_HEADER_DO_UPGRADE,REFINE_TYPE_STEP : player.DS_SUB_HEADER_DO_IMPROVEMENT,REFINE_TYPE_STRENGTH : player.DS_SUB_HEADER_DO_REFINE}REFINE_STONE_SLOT, DRAGON_SOUL_SLOT = xrange(2)INVALID_DRAGON_SOUL_INFO = -1def __init__(self):ui.ScriptWindow.__init__(self)self.tooltipItem = Noneself.sellingSlotNumber = -1self.isLoaded = 0self.refineChoiceButtonDict = Noneself.doRefineButton = Noneself.wndMoney = Noneself.SetWindowName("DragonSoulRefineWindow")self.__LoadWindow()def __del__(self):ui.ScriptWindow.__del__(self)def Show(self):self.__LoadWindow()ui.ScriptWindow.Show(self)def __LoadWindow(self):if self.isLoaded == 1:returnself.isLoaded = 1try:pyScrLoader = ui.PythonScriptLoader()pyScrLoader.LoadScriptFile(self, uiScriptLocale.LOCALE_UISCRIPT_PATH + "dragonsoulrefinewindow.py")except:import exceptionexception.Abort("dragonsoulrefinewindow.LoadWindow.LoadObject")try:if locale.IsARABIC():self.board = self.GetChild("DragonSoulRefineWindowBaseImage")self.board.SetScale(-1.0, 1.0)self.board.SetRenderingRect(-1.0, 0.0, 1.0, 0.0)wndRefineSlot = self.GetChild("RefineSlot")wndResultSlot = self.GetChild("ResultSlot")self.GetChild("TitleBar").SetCloseEvent(ui.__mem_func__(self.Close))self.refineChoiceButtonDict = {self.REFINE_TYPE_GRADE : self.GetChild("GradeButton"),self.REFINE_TYPE_STEP: self.GetChild("StepButton"),self.REFINE_TYPE_STRENGTH : self.GetChild("StrengthButton"),}self.doRefineButton = self.GetChild("DoRefineButton")self.wndMoney = self.GetChild("Money_Slot")except:import exceptionexception.Abort("DragonSoulRefineWindow.LoadWindow.BindObject")## Item SlotswndRefineSlot.SetOverInItemEvent(ui.__mem_func__(self.__OverInRefineItem))wndRefineSlot.SetOverOutItemEvent(ui.__mem_func__(self.__OverOutItem))wndRefineSlot.SetSelectEmptySlotEvent(ui.__mem_func__(self.__SelectRefineEmptySlot))wndRefineSlot.SetSelectItemSlotEvent(ui.__mem_func__(self.__SelectRefineItemSlot))wndRefineSlot.SetUseSlotEvent(ui.__mem_func__(self.__SelectRefineItemSlot))wndRefineSlot.SetUnselectItemSlotEvent(ui.__mem_func__(self.__SelectRefineItemSlot))wndResultSlot.SetOverInItemEvent(ui.__mem_func__(self.__OverInResultItem))wndResultSlot.SetOverOutItemEvent(ui.__mem_func__(self.__OverOutItem))self.wndRefineSlot = wndRefineSlotself.wndResultSlot = wndResultSlot## Buttonself.refineChoiceButtonDict[self.REFINE_TYPE_GRADE].SetToggleDownEvent(self.__ToggleDownGradeButton)self.refineChoiceButtonDict[self.REFINE_TYPE_STEP].SetToggleDownEvent(self.__ToggleDownStepButton)self.refineChoiceButtonDict[self.REFINE_TYPE_STRENGTH].SetToggleDownEvent(self.__ToggleDownStrengthButton)self.refineChoiceButtonDict[self.REFINE_TYPE_GRADE].SetToggleUpEvent(lambda : self.__ToggleUpButton(self.REFINE_TYPE_GRADE))self.refineChoiceButtonDict[self.REFINE_TYPE_STEP].SetToggleUpEvent(lambda : self.__ToggleUpButton(self.REFINE_TYPE_STEP))self.refineChoiceButtonDict[self.REFINE_TYPE_STRENGTH].SetToggleUpEvent(lambda : self.__ToggleUpButton(self.REFINE_TYPE_STRENGTH))self.doRefineButton.SetEvent(self.__PressDoRefineButton)## Dialogself.wndPopupDialog = uiCommon.PopupDialog()self.currentRefineType = self.REFINE_TYPE_GRADEself.refineItemInfo = {}self.resultItemInfo = {}self.currentRecipe = {}self.wndMoney.SetText(locale.NumberToMoneyString(0))self.refineChoiceButtonDict[self.REFINE_TYPE_GRADE].Down()self.__Initialize()def Destroy(self):self.ClearDictionary()self.tooltipItem = Noneself.wndItem = 0self.wndEquip = 0self.activateButton = 0self.questionDialog = Noneself.mallButton = Noneself.inventoryTab = []self.deckTab = []self.equipmentTab = []self.tabDict = Noneself.tabButtonDict = Nonedef Close(self):if None != self.tooltipItem:self.tooltipItem.HideToolTip()self.__FlushRefineItemSlot()player.SendDragonSoulRefine(player.DRAGON_SOUL_REFINE_CLOSE)self.Hide()def Show(self):self.currentRefineType = self.REFINE_TYPE_GRADEself.wndMoney.SetText(locale.NumberToMoneyString(0))self.refineChoiceButtonDict[self.REFINE_TYPE_GRADE].Down()self.refineChoiceButtonDict[self.REFINE_TYPE_STEP].SetUp()self.refineChoiceButtonDict[self.REFINE_TYPE_STRENGTH].SetUp()self.Refresh()ui.ScriptWindow.Show(self)def SetItemToolTip(self, tooltipItem):self.tooltipItem = tooltipItem# ¹öÆ° ´*·Á ÀÖ´Â »óŸ¦ Á¦¿ÜÇÑ ¸ğµç °*È*â °ü·Ã º¯¼öµéÀ» ÃʱâÈ*.def __Initialize(self):self.currentRecipe = {}self.refineItemInfo = {}self.resultItemInfo = {}if self.REFINE_TYPE_STRENGTH == self.currentRefineType:self.refineSlotLockStartIndex = 2else:self.refineSlotLockStartIndex = 1for i in xrange(self.refineSlotLockStartIndex):self.wndRefineSlot.HideSlotBaseImage(i)self.wndMoney.SetText(locale.NumberToMoneyString(0))def __FlushRefineItemSlot(self):## Item slot settings# ¿ø·¡ Àκ¥ÀÇ ¾ÆÀÌÅÛ Ä«¿îÆ® ȸº¹for invenType, invenPos, itemCount in self.refineItemInfo.values():remainCount = player.GetItemCount(invenType, invenPos)player.SetItemCount(invenType, invenPos, remainCount + itemCount)self.__Initialize()def __ToggleUpButton(self, idx):#if self.REFINE_TYPE_GRADE == self.currentRefineType:self.refineChoiceButtonDict[idx].Down()def __ToggleDownGradeButton(self):if self.REFINE_TYPE_GRADE == self.currentRefineType:returnself.refineChoiceButtonDict[self.currentRefineType].SetUp()self.currentRefineType = self.REFINE_TYPE_GRADEself.__FlushRefineItemSlot()self.Refresh()def __ToggleDownStepButton(self):if self.REFINE_TYPE_STEP == self.currentRefineType:returnself.refineChoiceButtonDict[self.currentRefineType].SetUp()self.currentRefineType = self.REFINE_TYPE_STEPself.__FlushRefineItemSlot()self.Refresh()def __ToggleDownStrengthButton(self):if self.REFINE_TYPE_STRENGTH == self.currentRefineType:returnself.refineChoiceButtonDict[self.currentRefineType].SetUp()self.currentRefineType = self.REFINE_TYPE_STRENGTHself.__FlushRefineItemSlot()self.Refresh()def __PopUp(self, message):self.wndPopupDialog.SetText(message)self.wndPopupDialog.Open()def __SetItem(self, (invenType, invenPos), dstSlotIndex, itemCount):if dstSlotIndex &--#62;= self.refineSlotLockStartIndex:return FALSEitemVnum = player.GetItemIndex(invenType, invenPos)maxCount = player.GetItemCount(invenType, invenPos)if itemCount &--#62; maxCount:raise Exception, ("Invalid attachedItemCount(%d). (base pos (%d, %d), base itemCount(%d))" % (itemCount, invenType, invenPos, maxCount))#return FALSE# strength °*È*ÀÏ °æ¿ì, 0¹ø¿£ °*È*¼®, 1¹ø¿£ ¿ëÈ¥¼®À» ³õµµ·Ï °*Á¦ÇÔ.if DragonSoulRefineWindow.REFINE_TYPE_STRENGTH == self.currentRefineType:if self.__IsDragonSoul(itemVnum):dstSlotIndex = 1else:dstSlotIndex = 0# ºó ½½·ÔÀ̾î¾ßÇÔ.if dstSlotIndex in self.refineItemInfo:return FALSE# °*È*â¿¡ ¿Ã¸± ¼ö ÀÖ´Â ¾ÆÀÌÅÛÀÎÁö °Ë»ç.if FALSE == self.__CheckCanRefine(itemVnum):return FALSE# ²ø¾î´Ù ³õÀº ¾ÆÀÌÅÛ Ä«¿îÆ®¸¸Å* ¿ø·¡ ÀÚ¸®ÀÇ ¾ÆÀÌÅÛ Ä«¿îÆ® °¨¼Òplayer.SetItemCount(invenType, invenPos, maxCount - itemCount)self.refineItemInfo[dstSlotIndex] = (invenType, invenPos, itemCount)self.Refresh()return TRUE# °*È* °¡´ÉÇÑ ¾ÆÀÌÅÛÀÎÁö üũ# ¿ëÈ¥¼® °*È*´Â °*È* ·¹½ÃÇǸ¦ Á¤Çسõ°í ½ÃÀÛÇÏ´Â °ÍÀÌ ¾Æ´Ï¶ó,# óÀ½¿¡ °*È*â¿¡ ¿Ã¸° ¿ëÈ¥¼®¿¡ ÀÇÇØ °*È* ·¹½ÃÇÇ°¡ °áÁ¤µÈ´Ù.# ±×·¡¼* __CanRefineGrade, __CanRefineStep, __CanRefineStrength ÇÔ¼ö¿¡¼*# °*È* ·¹½ÃÇÇ°¡ ¾ø´Ù¸é(óÀ½ ¿Ã¸®´Â ¾ÆÀÌÅÛÀ̶ó¸é), °*È* ·¹½ÃÇǸ¦ ¼³Á¤ÇØÁÖ´Â ¿ªÇÒµµ ÇÑ´Ù.def __CheckCanRefine(self, vnum):if self.REFINE_TYPE_GRADE == self.currentRefineType:return self.__CanRefineGrade(vnum)elif self.REFINE_TYPE_STEP == self.currentRefineType:return self.__CanRefineStep(vnum)elif self.REFINE_TYPE_STRENGTH == self.currentRefineType:return self.__CanRefineStrength(vnum)else:return FALSEreturn TRUEdef __CanRefineGrade (self, vnum):ds_info = self.__GetDragonSoulTypeInfo(vnum)if DragonSoulRefineWindow.INVALID_DRAGON_SOUL_INFO == ds_info:self.__PopUp(locale.DRAGON_SOUL_IS_NOT_DRAGON_SOUL)return FALSEif self.currentRecipe:ds_type, grade, step, strength = ds_infocur_refine_ds_type, cur_refine_grade, cur_refine_step, cur_refine_strength = self.currentRecipe["ds_info"]if not (cur_refine_ds_type == ds_type and cur_refine_grade == grade):self.__PopUp(locale.DRAGON_SOUL_INVALID_DRAGON_SOUL)return FALSE# °*È* â¿¡ óÀ½ ¾ÆÀÌÅÛÀ» ¿Ã¸®´Â °æ¿ì, °*È* Àç·á¿¡ °üÇÑ Á¤º¸°¡ ¾ø´Ù.# ¿ëÈ¥¼® °*È*°¡, ·¹½ÃÇǸ¦ °¡Áö°í ½ÃÀÛÇÏ´Â °ÍÀÌ ¾Æ´Ï¶ó, °*È*â¿¡ óÀ½ ¿Ã¸®´Â ¾ÆÀÌÅÛÀÌ ¹«¾ùÀ̳Ŀ¡ µû¶ó,# ¹«¾ùÀ» °*È*ÇÏ°í, Àç·á°¡ ¹«¾ùÀÎÁö(ÀÌÇÏ ·¹½ÃÇÇ)°¡ Á¤ÇØÁø´Ù.# ·¹½ÃÇÇ°¡ ¾ø´Ù¸é, óÀ½ ¿Ã¸° ¾ÆÀÌÅÛÀ̶ó »ı°¢ÇÏ°í, vnumÀ» ¹ÙÅÁÀ¸·Î ·¹½ÃÇǸ¦ ¼ÂÆÃ.else:self.currentRecipe = self.__GetRefineGradeRecipe(vnum)if self.currentRecipe:self.refineSlotLockStartIndex = self.currentRecipe["need_count"]self.wndMoney.SetText(locale.NumberToMoneyString(self.currentRecipe["fee"]))return TRUEelse:# °*È* Á¤º¸ ¼ÂÆÿ¡ ½ÇÆĞÇÏ¸é ¿Ã¸± ¼ö ¾ø´Â ¾ÆÀÌÅÛÀ¸·Î ÆÇ´Ü.self.__PopUp(locale.DRAGON_SOUL_CANNOT_REFINE)return FALSEdef __CanRefineStep (self, vnum):ds_info = self.__GetDragonSoulTypeInfo(vnum)if DragonSoulRefineWindow.INVALID_DRAGON_SOUL_INFO == ds_info:self.__PopUp(locale.DRAGON_SOUL_IS_NOT_DRAGON_SOUL)return FALSEif self.currentRecipe:ds_type, grade, step, strength = ds_infocur_refine_ds_type, cur_refine_grade, cur_refine_step, cur_refine_strength = self.currentRecipe["ds_info"]if not (cur_refine_ds_type == ds_type and cur_refine_grade == grade and cur_refine_step == step):self.__PopUp(locale.DRAGON_SOUL_INVALID_DRAGON_SOUL)return FALSE# °*È* â¿¡ óÀ½ ¾ÆÀÌÅÛÀ» ¿Ã¸®´Â °æ¿ì, Àç·á¿¡ °üÇÑ Á¤º¸°¡ ¾ø´Ù.# ¿ëÈ¥¼® °*È*°¡, ·¹½ÃÇǸ¦ °¡Áö°í ½ÃÀÛÇÏ´Â °ÍÀÌ ¾Æ´Ï¶ó, °*È*â¿¡ óÀ½ ¿Ã¸®´Â ¾ÆÀÌÅÛÀÌ ¹«¾ùÀ̳Ŀ¡ µû¶ó,# ¹«¾ùÀ» °*È*ÇÏ°í, Àç·á°¡ ¹«¾ùÀÎÁö(ÀÌÇÏ ·¹½ÃÇÇ)°¡ Á¤ÇØÁø´Ù.# ·¹½ÃÇÇ°¡ ¾ø´Ù¸é, óÀ½ ¿Ã¸° ¾ÆÀÌÅÛÀ̶ó »ı°¢ÇÏ°í, vnumÀ» ¹ÙÅÁÀ¸·Î ·¹½ÃÇǸ¦ ¼ÂÆÃ.else:self.currentRecipe = self.__GetRefineStepRecipe(vnum)if self.currentRecipe:self.refineSlotLockStartIndex = self.currentRecipe["need_count"]self.wndMoney.SetText(locale.NumberToMoneyString(self.currentRecipe["fee"]))return TRUEelse:# °*È* Á¤º¸ ¼ÂÆÿ¡ ½ÇÆĞÇÏ¸é ¿Ã¸± ¼ö ¾ø´Â ¾ÆÀÌÅÛÀ¸·Î ÆÇ´Ü.self.__PopUp(locale.DRAGON_SOUL_CANNOT_REFINE)return FALSEdef __CanRefineStrength (self, vnum):# ¿ëÈ¥¼®ÀÎ °æ¿ì, ´õ ÀÌ»ó strength °*È*¸¦ ÇÒ ¼ö ¾ø´ÂÁö üũÇؾßÇÔ.if self.__IsDragonSoul(vnum):ds_type, grade, step, strength = self.__GetDragonSoulTypeInfo(vnum)import dragon_soul_refine_settingsif strength &--#62;= dragon_soul_refine_settings.dragon_soul_refine_info[ds_type]["strength_max_table"][grade][step]:self.__PopUp(locale.DRAGON_SOUL_CANNOT_REFINE_MORE)return FALSEelse:return TRUE# strength °*È*ÀÇ °æ¿ì, refine_recipe°¡ ¿ëÈ¥¼®ÀÇ Á¾·ù°¡ ¾Æ´Ñ, °*È*¼®ÀÇ Á¾·ù¿¡ µû¶ó ´Ş¶óÁø´Ù.# µû¶ó¼* ¿ëÈ¥¼®ÀÌ ¾Æ´Ï¶ó¸é,# ÀÌ¹Ì ·¹½ÃÇÇ°¡ ÀÖ´Â °æ¿ì´Â, °*È*¼®ÀÌ °*È*â¿¡ ÀÖ´Ù´Â °ÍÀ̹ǷÎ, return FALSE# ·¹½ÃÇÇ°¡ ¾ø´Â °æ¿ì´Â, °*È*¼®ÀÎÁö È®ÀÎÇÏ°í, ·¹½ÃÇǸ¦ ¼ÂÆÃÇÑ´Ù.else:if self.currentRecipe:self.__PopUp(locale.DRAGON_SOUL_IS_NOT_DRAGON_SOUL)return FALSEelse:refineRecipe = self.__GetRefineStrengthInfo(vnum)if refineRecipe:self.currentRecipe = refineRecipeself.wndMoney.SetText(locale.NumberToMoneyString(self.currentRecipe["fee"]))return TRUEelse:# ·¹½ÃÇǸ¦ ¼ÂÆÃÇÒ ¼ö ¾ø´Â °æ¿ìself.__PopUp(locale.DRAGON_SOUL_NOT_DRAGON_SOUL_REFINE_STONE)return FALSEdef __GetRefineGradeRecipe (self, vnum):ds_type, grade, step, strength = self.__GetDragonSoulTypeInfo(vnum)try:import dragon_soul_refine_settingsreturn {"ds_info" : (ds_type, grade, step, strength),"need_count" : dragon_soul_refine_settings.dragon_soul_refine_info[ds_type]["grade_need_count"][grade],"fee" : dragon_soul_refine_settings.dragon_soul_refine_info[ds_type]["grade_fee"][grade]}except:return Nonedef __GetRefineStepRecipe (self, vnum):ds_type, grade, step, strength = self.__GetDragonSoulTypeInfo(vnum)try:import dragon_soul_refine_settingsreturn {"ds_info" : (ds_type, grade, step, strength),"need_count" : dragon_soul_refine_settings.dragon_soul_refine_info[ds_type]["step_need_count"][step],"fee" : dragon_soul_refine_settings.dragon_soul_refine_info[ds_type]["step_fee"][step]}except:return None# strength °*È*ÀÇ °æ¿ì, refineInfo´Â °*È*¼®¿¡ µû¶ó ´Ş¶óÁø´Ù.def __GetRefineStrengthInfo (self, itemVnum):try:# À̳ğÀÇ À§Ä¡¸¦ ¾îÂîÇÏÁö....# °*È*¼®ÀÌ ¾Æ´Ï¸é ¾ÈµÊ.item.SelectItem(itemVnum)if not (item.ITEM_TYPE_MATERIAL == item.GetItemType()and (item.MATERIAL_DS_REFINE_NORMAL &--#60;= item.GetItemSubType() and item.GetItemSubType() &--#60;= item.MATERIAL_DS_REFINE_HOLLY)):return Noneimport dragon_soul_refine_settingsreturn { "fee" : dragon_soul_refine_settings.strength_fee[item.GetItemSubType()] }except:return Nonedef __IsDragonSoul(self, vnum):item.SelectItem(vnum)return item.GetItemType() == item.ITEM_TYPE_DS# ¿ëÈ¥¼® Vnum¿¡ ´ëÇÑ comment# ITEM VNUMÀ» 10¸¸ ÀÚ¸®ºÎÅÍ, FEDCBA¶ó°í ÇÑ´Ù¸é# FE : ¿ëÈ¥¼® Á¾·ù. D : µî±Ş# C : ´Ü°è B : °*È*# A : ¿©¹úÀÇ ¹øÈ£µé...def __GetDragonSoulTypeInfo(self, vnum):if not self.__IsDragonSoul(vnum):return DragonSoulRefineWindow.INVALID_DRAGON_SOUL_INFOds_type = vnum / 10000grade = vnum % 10000 /1000step = vnum % 1000 / 100strength = vnum % 100 / 10return (ds_type, grade, step, strength)def __MakeDragonSoulVnum(self, ds_type, grade, step, strength):return ds_type * 10000 + grade * 1000 + step * 100 + strength * 10## ºó ½½·Ô ¼±Åà Eventdef __SelectRefineEmptySlot(self, selectedSlotPos):try:if constInfo.GET_ITEM_DROP_QUESTION_DIALOG_STATUS() == 1:returnif selectedSlotPos &--#62;= self.refineSlotLockStartIndex:returnif mouseModule.mouseController.isAttached():attachedSlotType = mouseModule.mouseController.GetAttachedType()attachedSlotPos = mouseModule.mouseController.GetAttachedSlotNumber()attachedItemCount = mouseModule.mouseController.GetAttachedItemCount()attachedItemIndex = mouseModule.mouseController.GetAttachedItemIndex()mouseModule.mouseController.DeattachObject()if uiPrivateShopBuilder.IsBuildingPrivateShop():chat.AppendChat(chat.CHAT_TYPE_INFO, locale.MOVE_ITEM_FAILURE_PRIVATE_SHOP)returnattachedInvenType = player.SlotTypeToInvenType(attachedSlotType)if player.INVENTORY == attachedInvenType and player.IsEquipmentSlot(attachedSlotPos):returnif player.INVENTORY != attachedInvenType and player.DRAGON_SOUL_INVENTORY != attachedInvenType:returnif TRUE == self.__SetItem((attachedInvenType, attachedSlotPos), selectedSlotPos, attachedItemCount):self.Refresh()except Exception, e:import dbgdbg.TraceError("Exception : __SelectRefineEmptySlot, %s" % e)# Ŭ¸¯À¸·Î ½½·Ô¿¡¼* »èÁ¦.def __SelectRefineItemSlot(self, selectedSlotPos):if constInfo.GET_ITEM_DROP_QUESTION_DIALOG_STATUS() == 1:returntry:if not selectedSlotPos in self.refineItemInfo:# »õ·Î¿î ¾ÆÀÌÅÛÀ» °*È*â¿¡ ¿Ã¸®´Â ÀÛ¾÷.if mouseModule.mouseController.isAttached():attachedSlotType = mouseModule.mouseController.GetAttachedType()attachedSlotPos = mouseModule.mouseController.GetAttachedSlotNumber()attachedItemCount = mouseModule.mouseController.GetAttachedItemCount()attachedItemIndex = mouseModule.mouseController.GetAttachedItemIndex()mouseModule.mouseController.DeattachObject()if uiPrivateShopBuilder.IsBuildingPrivateShop():chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.MOVE_ITEM_FAILURE_PRIVATE_SHOP)returnattachedInvenType = player.SlotTypeToInvenType(attachedSlotType)if player.INVENTORY == attachedInvenType and player.IsEquipmentSlot(attachedSlotPos):returnif player.INVENTORY != attachedInvenType and player.DRAGON_SOUL_INVENTORY != attachedInvenType:returnself.AutoSetItem((attachedInvenType, attachedSlotPos), 1)returnelif mouseModule.mouseController.isAttached():returnattachedInvenType, attachedSlotPos, attachedItemCount = self.refineItemInfo[selectedSlotPos]selectedItemVnum = player.GetItemIndex(attachedInvenType, attachedSlotPos)# °*È*â¿¡¼* »èÁ¦ ¹× ¿ø·¡ Àκ¥ÀÇ ¾ÆÀÌÅÛ Ä«¿îÆ® ȸº¹invenType, invenPos, itemCount = self.refineItemInfo[selectedSlotPos]remainCount = player.GetItemCount(invenType, invenPos)player.SetItemCount(invenType, invenPos, remainCount + itemCount)del self.refineItemInfo[selectedSlotPos]# °*È*âÀÌ ºñ¾ú´Ù¸é, ÃʱâÈ*if not self.refineItemInfo:self.__Initialize()else:item.SelectItem(selectedItemVnum)# ¾ø¾Ø ¾ÆÀÌÅÛÀÌ °*È*¼®À̾ú´Ù¸é °*È* ·¹Çǽà ÃʱâÈ*if (item.ITEM_TYPE_MATERIAL == item.GetItemType()and (item.MATERIAL_DS_REFINE_NORMAL &--#60;= item.GetItemSubType() and item.GetItemSubType() &--#60;= item.MATERIAL_DS_REFINE_HOLLY)):self.currentRecipe = {}self.wndMoney.SetText(localeInfo.NumberToMoneyString(0))# ¿ëÈ¥¼®À̾ú´Ù¸é,# strength°*È*°¡ ¾Æ´Ñ °æ¿ì, °*È*â¿¡ ´Ù¸¥ ¿ëÈ¥¼®ÀÌ ³²¾ÆÀÖÀ¸¹Ç·Î, ·¹½ÃÇǸ¦ ÃʱâÈ*ÇÏ¸é ¾ÈµÊ.# strength°*È*ÀÇ °æ¿ì, °*È* ·¹½ÃÇÇ´Â °*È*¼®¿¡ Á¾¼ÓµÈ °ÍÀ̹ǷΠ´Ù¸¥ ó¸®ÇÒ ÇÊ¿ä°¡ ¾øÀ½.else:passexcept Exception, e:import dbgdbg.TraceError("Exception : __SelectRefineItemSlot, %s" % e)self.Refresh()def __OverInRefineItem(self, slotIndex):if self.refineItemInfo.has_key(slotIndex):inven_type, inven_pos, item_count = self.refineItemInfo[slotIndex]self.tooltipItem.SetInventoryItem(inven_pos, inven_type)def __OverInResultItem(self, slotIndex):if self.resultItemInfo.has_key(slotIndex):inven_type, inven_pos, item_count = self.resultItemInfo[slotIndex]self.tooltipItem.SetInventoryItem(inven_pos, inven_type)def __OverOutItem(self):if self.tooltipItem:self.tooltipItem.HideToolTip()def __PressDoRefineButton(self):for i in xrange(self.refineSlotLockStartIndex):if not i in self.refineItemInfo:self.wndPopupDialog.SetText(locale.DRAGON_SOUL_NOT_ENOUGH_MATERIAL)self.wndPopupDialog.Open()returnplayer.SendDragonSoulRefine(DragonSoulRefineWindow.DS_SUB_HEADER_DIC[self.currentRefineType], self.refineItemInfo)def OnPressEscapeKey(self):self.Close()return TRUEdef Refresh(self):self.__RefreshRefineItemSlot()self.__ClearResultItemSlot()def __RefreshRefineItemSlot(self):try:for slotPos in xrange(self.wndRefineSlot.GetSlotCount()):self.wndRefineSlot.ClearSlot(slotPos)if slotPos &--#60; self.refineSlotLockStartIndex:# self.refineItemInfo[slotPos]ÀÇ Á¤º¸È®ÀÎ# (½ÇÁ¦·Î ¾ÆÀÌÅÛÀÌ Á¸ÀçÇÏ´ÂÁö È®ÀÎ)# Á¸Àç -&--#62; ¾ÆÀÌÅÛ ¾ÆÀÌÄÜÀ» ½½·Ô¿¡ ¼ÂÆÃ.# ºñÁ¸Àç -&--#62; ¾ÆÀÌÅÛÀÌ ¾øÀ¸¹Ç·Î °*È*â¿¡¼* »èÁ¦.if slotPos in self.refineItemInfo:invenType, invenPos, itemCount = self.refineItemInfo[slotPos]itemVnum = player.GetItemIndex(invenType, invenPos)# if itemVnum:if itemVnum:self.wndRefineSlot.SetItemSlot(slotPos, player.GetItemIndex(invenType, invenPos), itemCount)else:del self.refineItemInfo[slotPos]# ºó ½½·Ô¿¡ reference ¾ÆÀÌÄÜÀ» alpha 0.5·Î ¼ÂÆÃ.if not slotPos in self.refineItemInfo:try:reference_vnum = 0# strength °*È*ÀÏ ¶§´Â,# 0¹ø ½½·Ô¿¡ °*È*¼®À», 1¹ø ½½·Ô¿¡ ¿ëÈ¥¼®À» ³õ´Â´Ù.if DragonSoulRefineWindow.REFINE_TYPE_STRENGTH == self.currentRefineType:if DragonSoulRefineWindow.REFINE_STONE_SLOT == slotPos:reference_vnum = 100300else:reference_vnum = self.__MakeDragonSoulVnum(*self.currentRecipe["ds_info"])if 0 != reference_vnum:item.SelectItem(reference_vnum)itemIcon = item.GetIconImage()(width, height) = item.GetItemSize()self.wndRefineSlot.SetSlot(slotPos, 0, width, height, itemIcon, (1.0, 1.0, 1.0, 0.5))# slot ¿ìÃø ÇÏ´Ü¿¡ ¼ıÀÚ ¶ß¸é ¾È ¿¹»İ...self.wndRefineSlot.SetSlotCount(slotPos, 0)except:pass# refineSlotLockStartIndex º¸´Ù ÀÛÀº ½½·ÔÀº ´İÈù À̹ÌÁö¸¦ º¸¿©ÁÖ¸é ¾ÈµÊ.self.wndRefineSlot.HideSlotBaseImage(slotPos)# slotPos &--#62;= self.refineSlotLockStartIndex:else:# Á¤»óÀûÀÎ °æ¿ì¶ó¸é ÀÌ if¹®¿¡ µé¾î°¥ ÀÏÀº ¾ø°ÚÁö¸¸,# (¾ÖÃÊ¿¡ À妽º°¡ refineSlotLockStartIndex ÀÌ»óÀÎ ½½·Ô¿¡´Â ¾ÆÀÌÅÛÀ» ³ÖÁö ¸øÇÏ°Ô Ç߱⠶§¹®)# Ȥ½Ã ¸ğ¸¦ ¿¡·¯¿¡ ´ëºñÇÔ.if slotPos in self.refineItemInfo:invenType, invenPos, itemCount = self.refineItemInfo[slotPos]remainCount = player.GetItemCount(invenType, invenPos)player.SetItemCount(invenType, invenPos, remainCount + itemCount)del self.refineItemInfo[selectedSlotPos]# refineSlotLockStartIndex ÀÌ»óÀÎ ½½·ÔÀº ´İÈù À̹ÌÁö¸¦ º¸¿©Áà¾ßÇÔ.self.wndRefineSlot.ShowSlotBaseImage(slotPos)# °*È*â¿¡ ¾Æ¹«·± ¾ÆÀÌÅÛÀÌ ¾ø´Ù¸é, ÃʱâÈ*ÇØÁÜ.# À§¿¡¼* Áß°£ Áß°£¿¡ "del self.refineItemInfo[slotPos]"¸¦ Ç߱⠶§¹®¿¡,# ¿©±â¼* Çѹø üũÇØÁà¾ßÇÔ.if not self.refineItemInfo:self.__Initialize()self.wndRefineSlot.RefreshSlot()except Exception, e:import dbgdbg.TraceError("Exception : __RefreshRefineItemSlot, %s" % e)def __GetEmptySlot(self, itemVnum = 0):# STRENGTH °*È*ÀÇ °æ¿ì, ¿ëÈ¥¼® ½½·Ô°ú °*È*¼® ½½·ÔÀÌ ±¸ºĞµÇ¾îÀֱ⠋š¹®¿¡# vnumÀ» ¾Ë¾Æ¾ß ÇÑ´Ù.if DragonSoulRefineWindow.REFINE_TYPE_STRENGTH == self.currentRefineType:if 0 == itemVnum:return -1if self.__IsDragonSoul(itemVnum):if not DragonSoulRefineWindow.DRAGON_SOUL_SLOT in self.refineItemInfo:return DragonSoulRefineWindow.DRAGON_SOUL_SLOTelse:if not DragonSoulRefineWindow.REFINE_STONE_SLOT in self.refineItemInfo:return DragonSoulRefineWindow.REFINE_STONE_SLOTelse:for slotPos in xrange(self.wndRefineSlot.GetSlotCount()):if not slotPos in self.refineItemInfo:return slotPosreturn -1def AutoSetItem(self, (invenType, invenPos), itemCount):itemVnum = player.GetItemIndex(invenType, invenPos)emptySlot = self.__GetEmptySlot(itemVnum)if -1 == emptySlot:returnself.__SetItem((invenType, invenPos), emptySlot, itemCount)def __ClearResultItemSlot(self):self.wndResultSlot.ClearSlot(0)self.resultItemInfo = {}def RefineSucceed(self, inven_type, inven_pos):self.__Initialize()self.Refresh()itemCount = player.GetItemCount(inven_type, inven_pos)if itemCount &--#62; 0:self.resultItemInfo[0] = (inven_type, inven_pos, itemCount)self.wndResultSlot.SetItemSlot(0, player.GetItemIndex(inven_type, inven_pos), itemCount)def RefineFail(self, reason, inven_type, inven_pos):if net.DS_SUB_HEADER_REFINE_ [img]import uiimport playerimport mouseModuleimport netimport appimport sndimport itemimport chatimport grpimport uiScriptLocaleimport uiRefineimport uiAttachMetinimport uiPickMoneyimport uiCommonimport uiPrivateShopBuilderimport localeimport constInfoimport imeimport uiInventoryimport sysITEM_FLAG_APPLICABLE = 1 &--#60;&--#60; 14# ¿ëÈ¥¼® Vnum¿¡ ´ëÇÑ comment# ITEM VNUMÀ» 10¸¸ ÀÚ¸®ºÎÅÍ, FEDCBA¶ó°í ÇÑ´Ù¸é# FE : ¿ëÈ¥¼® Á¾·ù. D : µî±Ş# C : ´Ü°è B : °*È*# A : ¿©¹úÀÇ ¹øÈ£µé...class DragonSoulWindow(ui.ScriptWindow):KIND_TAP_TITLES = [uiScriptLocale.DRAGONSOUL_TAP_TITLE_1, uiScriptLocale.DRAGONSOUL_TAP_TITLE_2,uiScriptLocale.DRAGONSOUL_TAP_TITLE_3, uiScriptLocale.DRAGONSOUL_TAP_TITLE_4, uiScriptLocale.DRAGONSOUL_TAP_TITLE_5, uiScriptLocale.DRAGONSOUL_TAP_TITLE_6]def __init__(self):ui.ScriptWindow.__init__(self)self.questionDialog = Noneself.tooltipItem = Noneself.sellingSlotNumber = -1self.isLoaded = 0self.isActivated = FALSEself.DSKindIndex = 0self.tabDict = Noneself.tabButtonDict = Noneself.deckPageIndex = 0self.inventoryPageIndex = 0self.SetWindowName("DragonSoulWindow")self.__LoadWindow()def __del__(self):ui.ScriptWindow.__del__(self)def Show(self):self.__LoadWindow()ui.ScriptWindow.Show(self)def __LoadWindow(self):if self.isLoaded == 1:returnself.isLoaded = 1try:pyScrLoader = ui.PythonScriptLoader()pyScrLoader.LoadScriptFile(self, uiScriptLocale.LOCALE_UISCRIPT_PATH + "dragonsoulwindow.py")except:import exceptionexception.Abort("dragonsoulwindow.LoadWindow.LoadObject")try:if locale.IsARABIC():self.board = self.GetChild("Equipment_Base")self.board.SetScale(-1.0, 1.0)self.board.SetRenderingRect(-1.0, 0.0, 1.0, 0.0)self.board = self.GetChild("Tab_01")self.board.SetScale(-1.0, 1.0)self.board.SetRenderingRect(-1.0, 0.0, 1.0, 0.0)self.board = self.GetChild("Tab_02")self.board.SetScale(-1.0, 1.0)self.board.SetRenderingRect(-1.0, 0.0, 1.0, 0.0)self.board = self.GetChild("Tab_03")self.board.SetScale(-1.0, 1.0)self.board.SetRenderingRect(-1.0, 0.0, 1.0, 0.0)self.board = self.GetChild("Tab_04")self.board.SetScale(-1.0, 1.0)self.board.SetRenderingRect(-1.0, 0.0, 1.0, 0.0)self.board = self.GetChild("Tab_05")self.board.SetScale(-1.0, 1.0)self.board.SetRenderingRect(-1.0, 0.0, 1.0, 0.0)self.board = self.GetChild("Tab_06")self.board.SetScale(-1.0, 1.0)self.board.SetRenderingRect(-1.0, 0.0, 1.0, 0.0)wndItem = self.GetChild("ItemSlot")wndEquip = self.GetChild("EquipmentSlot")self.activateButton = self.GetChild("activate")self.deckTab = []self.deckTab.append(self.GetChild("deck1"))self.deckTab.append(self.GetChild("deck2"))self.GetChild("TitleBar").SetCloseEvent(ui.__mem_func__(self.Close))self.inventoryTab = []self.inventoryTab.append(self.GetChild("Inventory_Tab_01"))self.inventoryTab.append(self.GetChild("Inventory_Tab_02"))self.inventoryTab.append(self.GetChild("Inventory_Tab_03"))self.inventoryTab.append(self.GetChild("Inventory_Tab_04"))self.inventoryTab.append(self.GetChild("Inventory_Tab_05"))self.tabDict = {0 : self.GetChild("Tab_01"),1 : self.GetChild("Tab_02"),2 : self.GetChild("Tab_03"),3 : self.GetChild("Tab_04"),4 : self.GetChild("Tab_05"),5 : self.GetChild("Tab_06"),}self.tabButtonDict = {0 : self.GetChild("Tab_Button_01"),1 : self.GetChild("Tab_Button_02"),2 : self.GetChild("Tab_Button_03"),3 : self.GetChild("Tab_Button_04"),4 : self.GetChild("Tab_Button_05"),5 : self.GetChild("Tab_Button_06"),}self.tabText = self.GetChild("tab_text_area")except:import exceptionexception.Abort("InventoryWindow.LoadWindow.BindObject")## DragonSoul Kind Tapfor (tabKey, tabButton) in self.tabButtonDict.items():tabButton.SetEvent(ui.__mem_func__(self.SetDSKindIndex), tabKey)## ItemwndItem.SetOverInItemEvent(ui.__mem_func__(self.OverInItem))wndItem.SetOverOutItemEvent(ui.__mem_func__(self.OverOutItem))wndItem.SetSelectItemSlotEvent(ui.__mem_func__(self.SelectItemSlot))wndItem.SetSelectEmptySlotEvent(ui.__mem_func__(self.SelectEmptySlot))wndItem.SetUnselectItemSlotEvent(ui.__mem_func__(self.UseItemSlot))wndItem.SetUseSlotEvent(ui.__mem_func__(self.UseItemSlot))## EquipmentwndEquip.SetSelectEmptySlotEvent(ui.__mem_func__(self.SelectEmptyEquipSlot))wndEquip.SetSelectItemSlotEvent(ui.__mem_func__(self.SelectEquipItemSlot))wndEquip.SetUnselectItemSlotEvent(ui.__mem_func__(self.UseEquipItemSlot))wndEquip.SetUseSlotEvent(ui.__mem_func__(self.UseEquipItemSlot))wndEquip.SetOverInItemEvent(ui.__mem_func__(self.OverInEquipItem))wndEquip.SetOverOutItemEvent(ui.__mem_func__(self.OverOutEquipItem))## Deckself.deckTab[0].SetToggleDownEvent(lambda arg=0: self.SetDeckPage(arg))self.deckTab[1].SetToggleDownEvent(lambda arg=1: self.SetDeckPage(arg))self.deckTab[0].SetToggleUpEvent(lambda arg=0: self.__DeckButtonDown(arg))self.deckTab[1].SetToggleUpEvent(lambda arg=1: self.__DeckButtonDown(arg))self.deckTab[0].Down()## Grade buttonself.inventoryTab[0].SetEvent(lambda arg=0: self.SetInventoryPage(arg))self.inventoryTab[1].SetEvent(lambda arg=1: self.SetInventoryPage(arg))self.inventoryTab[2].SetEvent(lambda arg=2: self.SetInventoryPage(arg))self.inventoryTab[3].SetEvent(lambda arg=3: self.SetInventoryPage(arg))self.inventoryTab[4].SetEvent(lambda arg=4: self.SetInventoryPage(arg))self.inventoryTab[0].Down()## Etcself.wndItem = wndItemself.wndEquip = wndEquipself.dlgQuestion = uiCommon.QuestionDialog2()self.dlgQuestion.Close()self.activateButton.SetToggleDownEvent(ui.__mem_func__(self.ActivateButtonClick))self.activateButton.SetToggleUpEvent(ui.__mem_func__(self.ActivateButtonClick))self.wndPopupDialog = uiCommon.PopupDialog()##self.listHighlightedSlot = []## Refreshself.SetInventoryPage(0)self.RefreshItemSlot()self.RefreshEquipSlotWindow()self.RefreshBagSlotWindow()self.SetDSKindIndex(0)self.activateButton.Enable()self.deckTab[self.deckPageIndex].Down()self.activateButton.SetUp()def Destroy(self):self.ClearDictionary()self.tooltipItem = Noneself.wndItem = 0self.wndEquip = 0self.activateButton = 0self.questionDialog = Noneself.mallButton = Noneself.inventoryTab = []self.deckTab = []self.equipmentTab = []self.tabDict = Noneself.tabButtonDict = Nonedef Close(self):if None != self.tooltipItem:self.tooltipItem.HideToolTip()self.Hide()def __DeckButtonDown(self, deck):self.deckTab[deck].Down()def SetInventoryPage(self, page):if self.inventoryPageIndex != page:self.__HighlightSlot_ClearCurrentPage()self.inventoryPageIndex = pageself.inventoryTab[(page+1)%5].SetUp()self.inventoryTab[(page+2)%5].SetUp()self.inventoryTab[(page+3)%5].SetUp()self.inventoryTab[(page+4)%5].SetUp()self.RefreshBagSlotWindow()def SetItemToolTip(self, tooltipItem):self.tooltipItem = tooltipItemdef RefreshItemSlot(self):self.RefreshBagSlotWindow()self.RefreshEquipSlotWindow()def RefreshEquipSlotWindow(self):for i in xrange(6):slotNumber = self.__InventoryLocalSlotPosToGlobalSlotPos(player.INVENTORY, player.DRAGON_SOUL_EQUIPMENT_SLOT_START + i)itemVnum = player.GetItemIndex(slotNumber)self.wndEquip.SetItemSlot(player.DRAGON_SOUL_EQUIPMENT_SLOT_START + i, itemVnum, 0)self.wndEquip.EnableSlot(player.DRAGON_SOUL_EQUIPMENT_SLOT_START + i)if itemVnum != 0:item.SelectItem(itemVnum)for j in xrange(item.LIMIT_MAX_NUM):(limitType, limitValue) = item.GetLimit(j)# ¹Ø¿¡¼* remain_timeÀÌ 0ÀÌÇÏÀÎÁö üũ Çϱ⠶§¹®¿¡ ÀÓÀÇÀÇ ¾ç¼ö·Î ÃʱâÈ*remain_time = 999# ÀÏ´Ü ÇöÀç ŸÀ̸Ӵ ÀÌ ¼¼°³ »ÓÀÌ´Ù.if item.LIMIT_REAL_TIME == limitType:remain_time = player.GetItemMetinSocket(player.INVENTORY, slotNumber, 0) - app.GetGlobalTimeStamp()elif item.LIMIT_REAL_TIME_START_FIRST_USE == limitType:remain_time = player.GetItemMetinSocket(player.INVENTORY, slotNumber, 0) - app.GetGlobalTimeStamp()elif item.LIMIT_TIMER_BASED_ON_WEAR == limitType:remain_time = player.GetItemMetinSocket(player.INVENTORY, slotNumber, 0)if remain_time &--#60;= 0:self.wndEquip.DisableSlot(player.DRAGON_SOUL_EQUIPMENT_SLOT_START + i)breakself.wndEquip.RefreshSlot()def RefreshStatus(self):self.RefreshItemSlot()def __InventoryLocalSlotPosToGlobalSlotPos(self, window_type, local_slot_pos):if player.INVENTORY == window_type:return self.deckPageIndex * player.DRAGON_SOUL_EQUIPMENT_FIRST_SIZE + local_slot_posreturn (self.DSKindIndex * 5 * player.DRAGON_SOUL_PAGE_SIZE) + self.inventoryPageIndex * player.DRAGON_SOUL_PAGE_SIZE + local_slot_posdef RefreshBagSlotWindow(self):getItemVNum=player.GetItemIndexgetItemCount=player.GetItemCountsetItemVnum=self.wndItem.SetItemSlotfor i in xrange(player.DRAGON_SOUL_PAGE_SIZE):self.wndItem.EnableSlot(i)#&--#60;- dragon soul kindslotNumber = self.__InventoryLocalSlotPosToGlobalSlotPos(player.DRAGON_SOUL_INVENTORY, i)itemCount = getItemCount(player.DRAGON_SOUL_INVENTORY, slotNumber)if 0 == itemCount:self.wndItem.ClearSlot(i)continueelif 1 == itemCount:itemCount = 0itemVnum = getItemVNum(player.DRAGON_SOUL_INVENTORY, slotNumber)setItemVnum(i, itemVnum, itemCount)if itemVnum != 0:item.SelectItem(itemVnum)for j in xrange(item.LIMIT_MAX_NUM):(limitType, limitValue) = item.GetLimit(j)# ¹Ø¿¡¼* remain_timeÀÌ À½¼öÀÎÁö üũ Çϱ⠶§¹®¿¡ ÀÓÀÇÀÇ ¾ç¼ö·Î ÃʱâÈ*remain_time = 999if item.LIMIT_REAL_TIME == limitType:remain_time = player.GetItemMetinSocket(player.DRAGON_SOUL_INVENTORY, slotNumber, 0)elif item.LIMIT_REAL_TIME_START_FIRST_USE == limitType:remain_time = player.GetItemMetinSocket(player.DRAGON_SOUL_INVENTORY, slotNumber, 0)elif item.LIMIT_TIMER_BASED_ON_WEAR == limitType:remain_time = player.GetItemMetinSocket(player.DRAGON_SOUL_INVENTORY, slotNumber, 0)if remain_time &--#60;= 0:self.wndItem.DisableSlot(i)breakself.__HighlightSlot_RefreshCurrentPage()self.wndItem.RefreshSlot()def ShowToolTip(self, window_type, slotIndex):if None != self.tooltipItem:if player.INVENTORY == window_type:self.tooltipItem.SetInventoryItem(slotIndex)else:self.tooltipItem.SetInventoryItem(slotIndex, player.DRAGON_SOUL_INVENTORY)def OnPressEscapeKey(self):self.Close()return TRUEdef OnTop(self):if None != self.tooltipItem:self.tooltipItem.SetTop()# item slot °ü·Ã ÇÔ¼ödef OverOutItem(self):self.wndItem.SetUsableItem(FALSE)if None != self.tooltipItem:self.tooltipItem.HideToolTip()def OverInItem(self, overSlotPos):self.wndItem.DeactivateSlot(overSlotPos)overSlotPos = self.__InventoryLocalSlotPosToGlobalSlotPos(player.DRAGON_SOUL_INVENTORY, overSlotPos)try:self.listHighlightedSlot.remove(overSlotPos)except:passself.wndItem.SetUsableItem(FALSE)self.ShowToolTip(player.DRAGON_SOUL_INVENTORY, overSlotPos)def __UseItem(self, slotIndex):ItemVNum = player.GetItemIndex(player.DRAGON_SOUL_INVENTORY, slotIndex)if 0 == player.GetItemMetinSocket(player.DRAGON_SOUL_INVENTORY, slotIndex, 0):self.wndPopupDialog.SetText(locale.DRAGON_SOUL_EXPIRED)self.wndPopupDialog.Open()returnself.__EquipItem(slotIndex)def __EquipItem(self, slotIndex):ItemVNum = player.GetItemIndex(player.DRAGON_SOUL_INVENTORY, slotIndex)item.SelectItem(ItemVNum)subType = item.GetItemSubType()equipSlotPos = player.DRAGON_SOUL_EQUIPMENT_SLOT_START + self.deckPageIndex * player.DRAGON_SOUL_EQUIPMENT_FIRST_SIZE + subTypesrcItemPos = (player.DRAGON_SOUL_INVENTORY, slotIndex)dstItemPos = (player.INVENTORY, equipSlotPos)self.__OpenQuestionDialog(TRUE, srcItemPos, dstItemPos)def SelectItemSlot(self, itemSlotIndex):if constInfo.GET_ITEM_DROP_QUESTION_DIALOG_STATUS() == 1:returnitemSlotIndex = self.__InventoryLocalSlotPosToGlobalSlotPos(player.DRAGON_SOUL_INVENTORY, itemSlotIndex)if mouseModule.mouseController.isAttached():attachedSlotType = mouseModule.mouseController.GetAttachedType()attachedSlotPos = mouseModule.mouseController.GetAttachedSlotNumber()attachedItemVID = mouseModule.mouseController.GetAttachedItemIndex()attachedInvenType = player.SlotTypeToInvenType(attachedSlotType)if player.RESERVED_WINDOW != attachedInvenType:net.SendItemUseToItemPacket(attachedInvenType, attachedSlotPos, player.DRAGON_SOUL_INVENTORY, itemSlotIndex)mouseModule.mouseController.DeattachObject()else:selectedItemVNum = player.GetItemIndex(player.DRAGON_SOUL_INVENTORY, itemSlotIndex)itemCount = player.GetItemCount(player.DRAGON_SOUL_INVENTORY, itemSlotIndex)mouseModule.mouseController.AttachObject(self, player.SLOT_TYPE_DRAGON_SOUL_INVENTORY, itemSlotIndex, selectedItemVNum, itemCount)self.wndItem.SetUseMode(FALSE)snd.PlaySound("sound/ui/pick.wav")def SelectEmptySlot(self, selectedSlotPos):if constInfo.GET_ITEM_DROP_QUESTION_DIALOG_STATUS() == 1:returnselectedSlotPos = self.__InventoryLocalSlotPosToGlobalSlotPos(player.DRAGON_SOUL_INVENTORY, selectedSlotPos)print "__debug", selectedSlotPosif mouseModule.mouseController.isAttached():attachedSlotType = mouseModule.mouseController.GetAttachedType()attachedSlotPos = mouseModule.mouseController.GetAttachedSlotNumber()attachedItemCount = mouseModule.mouseController.GetAttachedItemCount()attachedItemIndex = mouseModule.mouseController.GetAttachedItemIndex()attachedInvenType = player.SlotTypeToInvenType(attachedSlotType)if player.SLOT_TYPE_PRIVATE_SHOP == attachedSlotType:mouseModule.mouseController.RunCallBack("INVENTORY")elif player.SLOT_TYPE_SHOP == attachedSlotType:net.SendShopBuyPacket(attachedSlotPos)elif player.SLOT_TYPE_SAFEBOX == attachedSlotType:if player.ITEM_MONEY == attachedItemIndex:net.SendSafeboxWithdrawMoneyPacket(mouseModule.mouseController.GetAttachedItemCount())snd.PlaySound("sound/ui/money.wav")else:net.SendSafeboxCheckoutPacket(attachedSlotPos, player.DRAGON_SOUL_INVENTORY, selectedSlotPos)elif player.SLOT_TYPE_MALL == attachedSlotType:net.SendMallCheckoutPacket(attachedSlotPos, player.DRAGON_SOUL_INVENTORY, selectedSlotPos)elif player.RESERVED_WINDOW != attachedInvenType:if player.IsDSEquipmentSlot(attachedInvenType, attachedSlotPos):srcItemPos = (attachedInvenType, attachedSlotPos)dstItemPos = (player.DRAGON_SOUL_INVENTORY, selectedSlotPos)self.__OpenQuestionDialog(FALSE, srcItemPos, dstItemPos)else:itemCount = player.GetItemCount(attachedInvenType, attachedSlotPos)attachedCount = mouseModule.mouseController.GetAttachedItemCount()self.__SendMoveItemPacket(attachedInvenType, attachedSlotPos, player.DRAGON_SOUL_INVENTORY, selectedSlotPos, attachedCount)mouseModule.mouseController.DeattachObject()def UseItemSlot(self, slotIndex):if constInfo.GET_ITEM_DROP_QUESTION_DIALOG_STATUS():returnslotIndex = self.__InventoryLocalSlotPosToGlobalSlotPos(player.DRAGON_SOUL_INVENTORY, slotIndex)try:# ¿ëÈ¥¼® °*È*âÀÌ ¿*·ÁÀÖÀ¸¸é, ¾ÆÀÌÅÛ ¿ìŬ¸¯ ½Ã ÀÚµ¿À¸·Î °*È*âÀ¸·Î µé¾î°¨.if self.wndDragonSoulRefine.IsShow():if uiPrivateShopBuilder.IsBuildingPrivateShop():chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.MOVE_ITEM_FAILURE_PRIVATE_SHOP)returnself.wndDragonSoulRefine.AutoSetItem((player.DRAGON_SOUL_INVENTORY, slotIndex), 1)returnexcept:passself.__UseItem(slotIndex)mouseModule.mouseController.DeattachObject()self.OverOutItem()def __SendMoveItemPacket(self, srcSlotWindow, srcSlotPos, dstSlotWindow, dstSlotPos, srcItemCount):if uiPrivateShopBuilder.IsBuildingPrivateShop():chat.AppendChat(chat.CHAT_TYPE_INFO, locale.MOVE_ITEM_FAILURE_PRIVATE_SHOP)returnnet.SendItemMovePacket(srcSlotWindow , srcSlotPos, dstSlotWindow, dstSlotPos, srcItemCount)# equip ½½·Ô °ü·Ã ÇÔ¼öµé.def OverOutEquipItem(self):self.OverOutItem()def OverInEquipItem(self, overSlotPos):overSlotPos = self.__InventoryLocalSlotPosToGlobalSlotPos(player.INVENTORY, overSlotPos)self.wndItem.SetUsableItem(FALSE)self.ShowToolTip(player.INVENTORY, overSlotPos)def UseEquipItemSlot(self, slotIndex):if constInfo.GET_ITEM_DROP_QUESTION_DIALOG_STATUS():returnslotIndex = self.__InventoryLocalSlotPosToGlobalSlotPos(player.INVENTORY, slotIndex)self.__UseEquipItem(slotIndex)mouseModule.mouseController.DeattachObject()self.OverOutEquipItem()def __UseEquipItem(self, slotIndex):if uiPrivateShopBuilder.IsBuildingPrivateShop():chat.AppendChat(chat.CHAT_TYPE_INFO, locale.USE_ITEM_FAILURE_PRIVATE_SHOP)returnself.__OpenQuestionDialog(FALSE, (player.INVENTORY, slotIndex), (1, 1))def SelectEquipItemSlot(self, itemSlotIndex):if constInfo.GET_ITEM_DROP_QUESTION_DIALOG_STATUS() == 1:returnitemSlotIndex = self.__InventoryLocalSlotPosToGlobalSlotPos(player.INVENTORY, itemSlotIndex)if mouseModule.mouseController.isAttached():attachedSlotType = mouseModule.mouseController.GetAttachedType()attachedSlotPos = mouseModule.mouseController.GetAttachedSlotNumber()# ÀÚ±â ÀÚ½ÅÀ» ÀÚ±â Àڽſ¡°Ô µå·¡±×ÇÏ´Â °æ¿ìif player.SLOT_TYPE_INVENTORY == attachedSlotType and itemSlotIndex == attachedSlotPos:returnattachedItemVID = mouseModule.mouseController.GetAttachedItemIndex()attachedInvenType = player.SlotTypeToInvenType(attachedSlotType)if player.RESERVED_WINDOW != attachedInvenType:net.SendItemUseToItemPacket(attachedInvenType, attachedSlotPos, player.INVENTORY, itemSlotIndex)mouseModule.mouseController.DeattachObject()else:selectedItemVNum = player.GetItemIndex(player.INVENTORY, itemSlotIndex)itemCount = player.GetItemCount(player.INVENTORY, itemSlotIndex)mouseModule.mouseController.AttachObject(self, player.SLOT_TYPE_INVENTORY, itemSlotIndex, selectedItemVNum, itemCount)self.wndItem.SetUseMode(FALSE)snd.PlaySound("sound/ui/pick.wav")def SelectEmptyEquipSlot(self, selectedSlot):if constInfo.GET_ITEM_DROP_QUESTION_DIALOG_STATUS() == 1:returnselectedSlotPos = self.__InventoryLocalSlotPosToGlobalSlotPos(player.INVENTORY, selectedSlot)if mouseModule.mouseController.isAttached():attachedSlotType = mouseModule.mouseController.GetAttachedType()attachedSlotPos = mouseModule.mouseController.GetAttachedSlotNumber()attachedItemCount = mouseModule.mouseController.GetAttachedItemCount()attachedItemIndex = mouseModule.mouseController.GetAttachedItemIndex()if player.SLOT_TYPE_DRAGON_SOUL_INVENTORY == attachedSlotType:if 0 == player.GetItemMetinSocket(player.DRAGON_SOUL_INVENTORY, attachedSlotPos, 0):self.wndPopupDialog.SetText(locale.DRAGON_SOUL_EXPIRED)self.wndPopupDialog.Open()returnitem.SelectItem(attachedItemIndex)subType = item.GetItemSubType()if subType != (selectedSlot - player.DRAGON_SOUL_EQUIPMENT_SLOT_START):self.wndPopupDialog.SetText(locale.DRAGON_SOUL_UNMATCHED_SLOT)self.wndPopupDialog.Open()else:srcItemPos = (player.DRAGON_SOUL_INVENTORY, attachedSlotPos)dstItemPos = (player.INVENTORY, selectedSlotPos)self.__OpenQuestionDialog(TRUE, srcItemPos, dstItemPos)mouseModule.mouseController.DeattachObject()# equip ½½·Ô °ü·Ã ÇÔ¼öµé ³¡.# °æ°íâ °ü·Ãdef __OpenQuestionDialog(self, Equip, srcItemPos, dstItemPos):self.srcItemPos = srcItemPosself.dstItemPos = dstItemPosself.dlgQuestion.SetAcceptEvent(ui.__mem_func__(self.__Accept))self.dlgQuestion.SetCancelEvent(ui.__mem_func__(self.__Cancel))if Equip:self.dlgQuestion.SetText1(locale.DRAGON_SOUL_EQUIP_WARNING1)self.dlgQuestion.SetText2(locale.DRAGON_SOUL_EQUIP_WARNING2)else:self.dlgQuestion.SetText1(locale.DRAGON_SOUL_UNEQUIP_WARNING1)self.dlgQuestion.SetText2(locale.DRAGON_SOUL_UNEQUIP_WARNING2)self.dlgQuestion.Open()def __Accept(self):if (-1, -1) == self.dstItemPos:net.SendItemUsePacket(*srcItemPos)else:self.__SendMoveItemPacket(*(self.srcItemPos + self.dstItemPos + (0,)))self.dlgQuestion.Close()def __Cancel(self):self.srcItemPos = (0, 0)self.dstItemPos = (0, 0)self.dlgQuestion.Close()# °æ°íâ °ü·Ã ³¡def SetDSKindIndex(self, kindIndex):if self.DSKindIndex != kindIndex:self.__HighlightSlot_ClearCurrentPage()self.DSKindIndex = kindIndexfor (tabKey, tabButton) in self.tabButtonDict.items():if kindIndex!=tabKey:tabButton.SetUp()for tabValue in self.tabDict.itervalues():tabValue.Hide()self.tabDict[kindIndex].Show()self.tabText.SetText(DragonSoulWindow.KIND_TAP_TITLES[kindIndex])self.RefreshBagSlotWindow()def SetDeckPage(self, page):if page == self.deckPageIndex:returnif self.isActivated:self.DeactivateDragonSoul()net.SendChatPacket("/dragon_soul deactivate")self.deckPageIndex = pageself.deckTab .Down()self.deckTab[(page+1)%2].SetUp()self.RefreshEquipSlotWindow()# ¿ëÈ¥¼® È°¼ºÈ* °ü·Ãdef ActivateDragonSoulByExtern(self, deck):self.isActivated = TRUEself.activateButton.Down()self.deckPageIndex = deckself.deckTab[deck].Down()self.deckTab[(deck+1)%2].SetUp()self.RefreshEquipSlotWindow()def DeactivateDragonSoul(self):self.isActivated = FALSEself.activateButton.SetUp()def ActivateButtonClick(self):self.isActivated = self.isActivated ^ TRUEif self.isActivated:if self.__CanActivateDeck():net.SendChatPacket("/dragon_soul activate " + str(self.deckPageIndex))else:self.isActivated = FALSEself.activateButton.SetUp()else:net.SendChatPacket("/dragon_soul deactivate")def __CanActivateDeck(self):canActiveNum = 0for i in xrange(6):slotNumber = self.__InventoryLocalSlotPosToGlobalSlotPos(player.INVENTORY, player.DRAGON_SOUL_EQUIPMENT_SLOT_START + i)itemVnum = player.GetItemIndex(slotNumber)if itemVnum != 0:item.SelectItem(itemVnum)isNoLimit = TRUEfor i in xrange(item.LIMIT_MAX_NUM):(limitType, limitValue) = item.GetLimit(i)# LIMIT_TIMER_BASED_ON_WEAR´Â ¼ÒÄÏ0¿¡ ³²Àº ½Ã°£À» ¹Ú´Â´Ù.# LIMIT_REAL_TIMEÀº ½Ã°£ ´Ù µÇ¸é ¾ÆÀÌÅÛÀÌ »ç¶óÁö¹Ç·Î ÇÒ ÇÊ¿ä°¡ ¾ø´Ù.# LIMIT_REAL_TIME_START_FIRST_USE´Â ¼*¹ö¿¡ Á¦´ë·Î Á¤ÀǵÇÁö ¾Ê¾Æ ÀÏ´Ü ³ÀµĞ´Ù.if item.LIMIT_TIMER_BASED_ON_WEAR == limitType:isNoLimit = FALSEremain_time = player.GetItemMetinSocket(player.INVENTORY, slotNumber, 0)if 0 != remain_time:canActiveNum += 1break# ŸÀ̸Ӱ¡ ¾ø´Ù¸é ActivateÇÒ ¼ö ÀÖ´Â ¿ëÈ¥¼®.if isNoLimit:canActiveNum += 1return canActiveNum &--#62; 0# È°¼ºÈ* °ü·Ã ³¡# ½½·Ô highlight °ü·Ãdef __HighlightSlot_ClearCurrentPage(self):for i in xrange(self.wndItem.GetSlotCount()):slotNumber = self.__InventoryLocalSlotPosToGlobalSlotPos(player.DRAGON_SOUL_INVENTORY, i)if slotNumber in self.listHighlightedSlot:self.wndItem.DeactivateSlot(i)self.listHighlightedSlot.remove(slotNumber)def __HighlightSlot_RefreshCurrentPage(self):for i in xrange(self.wndItem.GetSlotCount()):slotNumber = self.__InventoryLocalSlotPosToGlobalSlotPos(player.DRAGON_SOUL_INVENTORY, i)if slotNumber in self.listHighlightedSlot:self.wndItem.ActivateSlot(i)def HighlightSlot(self, slot):if not slot in self.listHighlightedSlot:self.listHighlightedSlot.append (slot)# ½½·Ô highlight °ü·Ã ³¡def SetDragonSoulRefineWindow(self, wndDragonSoulRefine):if app.ENABLE_DRAGON_SOUL_SYSTEM:from _weakref import proxyself.wndDragonSoulRefine = proxy(wndDragonSoulRefine)## °*È*ÇÒ ¼ö ¾ø´Â °æ¿ì ³¯¸®´Â ¿¹¿Ü#class DragonSoulRefineException(Exception):#passclass DragonSoulRefineWindow(ui.ScriptWindow):REFINE_TYPE_GRADE, REFINE_TYPE_STEP, REFINE_TYPE_STRENGTH = xrange(3)DS_SUB_HEADER_DIC = {REFINE_TYPE_GRADE : player.DS_SUB_HEADER_DO_UPGRADE,REFINE_TYPE_STEP : player.DS_SUB_HEADER_DO_IMPROVEMENT,REFINE_TYPE_STRENGTH : player.DS_SUB_HEADER_DO_REFINE}REFINE_STONE_SLOT, DRAGON_SOUL_SLOT = xrange(2)INVALID_DRAGON_SOUL_INFO = -1def __init__(self):ui.ScriptWindow.__init__(self)self.tooltipItem = Noneself.sellingSlotNumber = -1self.isLoaded = 0self.refineChoiceButtonDict = Noneself.doRefineButton = Noneself.wndMoney = Noneself.SetWindowName("DragonSoulRefineWindow")self.__LoadWindow()def __del__(self):ui.ScriptWindow.__del__(self)def Show(self):self.__LoadWindow()ui.ScriptWindow.Show(self)def __LoadWindow(self):if self.isLoaded == 1:returnself.isLoaded = 1try:pyScrLoader = ui.PythonScriptLoader()pyScrLoader.LoadScriptFile(self, uiScriptLocale.LOCALE_UISCRIPT_PATH + "dragonsoulrefinewindow.py")except:import exceptionexception.Abort("dragonsoulrefinewindow.LoadWindow.LoadObject")try:if locale.IsARABIC():self.board = self.GetChild("DragonSoulRefineWindowBaseImage")self.board.SetScale(-1.0, 1.0)self.board.SetRenderingRect(-1.0, 0.0, 1.0, 0.0)wndRefineSlot = self.GetChild("RefineSlot")wndResultSlot = self.GetChild("ResultSlot")self.GetChild("TitleBar").SetCloseEvent(ui.__mem_func__(self.Close))self.refineChoiceButtonDict = {self.REFINE_TYPE_GRADE : self.GetChild("GradeButton"),self.REFINE_TYPE_STEP: self.GetChild("StepButton"),self.REFINE_TYPE_STRENGTH : self.GetChild("StrengthButton"),}self.doRefineButton = self.GetChild("DoRefineButton")self.wndMoney = self.GetChild("Money_Slot")except:import exceptionexception.Abort("DragonSoulRefineWindow.LoadWindow.BindObject")## Item SlotswndRefineSlot.SetOverInItemEvent(ui.__mem_func__(self.__OverInRefineItem))wndRefineSlot.SetOverOutItemEvent(ui.__mem_func__(self.__OverOutItem))wndRefineSlot.SetSelectEmptySlotEvent(ui.__mem_func__(self.__SelectRefineEmptySlot))wndRefineSlot.SetSelectItemSlotEvent(ui.__mem_func__(self.__SelectRefineItemSlot))wndRefineSlot.SetUseSlotEvent(ui.__mem_func__(self.__SelectRefineItemSlot))wndRefineSlot.SetUnselectItemSlotEvent(ui.__mem_func__(self.__SelectRefineItemSlot))wndResultSlot.SetOverInItemEvent(ui.__mem_func__(self.__OverInResultItem))wndResultSlot.SetOverOutItemEvent(ui.__mem_func__(self.__OverOutItem))self.wndRefineSlot = wndRefineSlotself.wndResultSlot = wndResultSlot## Buttonself.refineChoiceButtonDict[self.REFINE_TYPE_GRADE].SetToggleDownEvent(self.__ToggleDownGradeButton)self.refineChoiceButtonDict[self.REFINE_TYPE_STEP].SetToggleDownEvent(self.__ToggleDownStepButton)self.refineChoiceButtonDict[self.REFINE_TYPE_STRENGTH].SetToggleDownEvent(self.__ToggleDownStrengthButton)self.refineChoiceButtonDict[self.REFINE_TYPE_GRADE].SetToggleUpEvent(lambda : self.__ToggleUpButton(self.REFINE_TYPE_GRADE))self.refineChoiceButtonDict[self.REFINE_TYPE_STEP].SetToggleUpEvent(lambda : self.__ToggleUpButton(self.REFINE_TYPE_STEP))self.refineChoiceButtonDict[self.REFINE_TYPE_STRENGTH].SetToggleUpEvent(lambda : self.__ToggleUpButton(self.REFINE_TYPE_STRENGTH))self.doRefineButton.SetEvent(self.__PressDoRefineButton)## Dialogself.wndPopupDialog = uiCommon.PopupDialog()self.currentRefineType = self.REFINE_TYPE_GRADEself.refineItemInfo = {}self.resultItemInfo = {}self.currentRecipe = {}self.wndMoney.SetText(locale.NumberToMoneyString(0))self.refineChoiceButtonDict[self.REFINE_TYPE_GRADE].Down()self.__Initialize()def Destroy(self):self.ClearDictionary()self.tooltipItem = Noneself.wndItem = 0self.wndEquip = 0self.activateButton = 0self.questionDialog = Noneself.mallButton = Noneself.inventoryTab = []self.deckTab = []self.equipmentTab = []self.tabDict = Noneself.tabButtonDict = Nonedef Close(self):if None != self.tooltipItem:self.tooltipItem.HideToolTip()self.__FlushRefineItemSlot()player.SendDragonSoulRefine(player.DRAGON_SOUL_REFINE_CLOSE)self.Hide()def Show(self):self.currentRefineType = self.REFINE_TYPE_GRADEself.wndMoney.SetText(locale.NumberToMoneyString(0))self.refineChoiceButtonDict[self.REFINE_TYPE_GRADE].Down()self.refineChoiceButtonDict[self.REFINE_TYPE_STEP].SetUp()self.refineChoiceButtonDict[self.REFINE_TYPE_STRENGTH].SetUp()self.Refresh()ui.ScriptWindow.Show(self)def SetItemToolTip(self, tooltipItem):self.tooltipItem = tooltipItem# ¹öÆ° ´*·Á ÀÖ´Â »óŸ¦ Á¦¿ÜÇÑ ¸ğµç °*È*â °ü·Ã º¯¼öµéÀ» ÃʱâÈ*.def __Initialize(self):self.currentRecipe = {}self.refineItemInfo = {}self.resultItemInfo = {}if self.REFINE_TYPE_STRENGTH == self.currentRefineType:self.refineSlotLockStartIndex = 2else:self.refineSlotLockStartIndex = 1for i in xrange(self.refineSlotLockStartIndex):self.wndRefineSlot.HideSlotBaseImage(i)self.wndMoney.SetText(locale.NumberToMoneyString(0))def __FlushRefineItemSlot(self):## Item slot settings# ¿ø·¡ Àκ¥ÀÇ ¾ÆÀÌÅÛ Ä«¿îÆ® ȸº¹for invenType, invenPos, itemCount in self.refineItemInfo.values():remainCount = player.GetItemCount(invenType, invenPos)player.SetItemCount(invenType, invenPos, remainCount + itemCount)self.__Initialize()def __ToggleUpButton(self, idx):#if self.REFINE_TYPE_GRADE == self.currentRefineType:self.refineChoiceButtonDict[idx].Down()def __ToggleDownGradeButton(self):if self.REFINE_TYPE_GRADE == self.currentRefineType:returnself.refineChoiceButtonDict[self.currentRefineType].SetUp()self.currentRefineType = self.REFINE_TYPE_GRADEself.__FlushRefineItemSlot()self.Refresh()def __ToggleDownStepButton(self):if self.REFINE_TYPE_STEP == self.currentRefineType:returnself.refineChoiceButtonDict[self.currentRefineType].SetUp()self.currentRefineType = self.REFINE_TYPE_STEPself.__FlushRefineItemSlot()self.Refresh()def __ToggleDownStrengthButton(self):if self.REFINE_TYPE_STRENGTH == self.currentRefineType:returnself.refineChoiceButtonDict[self.currentRefineType].SetUp()self.currentRefineType = self.REFINE_TYPE_STRENGTHself.__FlushRefineItemSlot()self.Refresh()def __PopUp(self, message):self.wndPopupDialog.SetText(message)self.wndPopupDialog.Open()def __SetItem(self, (invenType, invenPos), dstSlotIndex, itemCount):if dstSlotIndex &--#62;= self.refineSlotLockStartIndex:return FALSEitemVnum = player.GetItemIndex(invenType, invenPos)maxCount = player.GetItemCount(invenType, invenPos)if itemCount &--#62; maxCount:raise Exception, ("Invalid attachedItemCount(%d). (base pos (%d, %d), base itemCount(%d))" % (itemCount, invenType, invenPos, maxCount))#return FALSE# strength °*È*ÀÏ °æ¿ì, 0¹ø¿£ °*È*¼®, 1¹ø¿£ ¿ëÈ¥¼®À» ³õµµ·Ï °*Á¦ÇÔ.if DragonSoulRefineWindow.REFINE_TYPE_STRENGTH == self.currentRefineType:if self.__IsDragonSoul(itemVnum):dstSlotIndex = 1else:dstSlotIndex = 0# ºó ½½·ÔÀ̾î¾ßÇÔ.if dstSlotIndex in self.refineItemInfo:return FALSE# °*È*â¿¡ ¿Ã¸± ¼ö ÀÖ´Â ¾ÆÀÌÅÛÀÎÁö °Ë»ç.if FALSE == self.__CheckCanRefine(itemVnum):return FALSE# ²ø¾î´Ù ³õÀº ¾ÆÀÌÅÛ Ä«¿îÆ®¸¸Å* ¿ø·¡ ÀÚ¸®ÀÇ ¾ÆÀÌÅÛ Ä«¿îÆ® °¨¼Òplayer.SetItemCount(invenType, invenPos, maxCount - itemCount)self.refineItemInfo[dstSlotIndex] = (invenType, invenPos, itemCount)self.Refresh()return TRUE# °*È* °¡´ÉÇÑ ¾ÆÀÌÅÛÀÎÁö üũ# ¿ëÈ¥¼® °*È*´Â °*È* ·¹½ÃÇǸ¦ Á¤Çسõ°í ½ÃÀÛÇÏ´Â °ÍÀÌ ¾Æ´Ï¶ó,# óÀ½¿¡ °*È*â¿¡ ¿Ã¸° ¿ëÈ¥¼®¿¡ ÀÇÇØ °*È* ·¹½ÃÇÇ°¡ °áÁ¤µÈ´Ù.# ±×·¡¼* __CanRefineGrade, __CanRefineStep, __CanRefineStrength ÇÔ¼ö¿¡¼*# °*È* ·¹½ÃÇÇ°¡ ¾ø´Ù¸é(óÀ½ ¿Ã¸®´Â ¾ÆÀÌÅÛÀ̶ó¸é), °*È* ·¹½ÃÇǸ¦ ¼³Á¤ÇØÁÖ´Â ¿ªÇÒµµ ÇÑ´Ù.def __CheckCanRefine(self, vnum):if self.REFINE_TYPE_GRADE == self.currentRefineType:return self.__CanRefineGrade(vnum)elif self.REFINE_TYPE_STEP == self.currentRefineType:return self.__CanRefineStep(vnum)elif self.REFINE_TYPE_STRENGTH == self.currentRefineType:return self.__CanRefineStrength(vnum)else:return FALSEreturn TRUEdef __CanRefineGrade (self, vnum):ds_info = self.__GetDragonSoulTypeInfo(vnum)if DragonSoulRefineWindow.INVALID_DRAGON_SOUL_INFO == ds_info:self.__PopUp(locale.DRAGON_SOUL_IS_NOT_DRAGON_SOUL)return FALSEif self.currentRecipe:ds_type, grade, step, strength = ds_infocur_refine_ds_type, cur_refine_grade, cur_refine_step, cur_refine_strength = self.currentRecipe["ds_info"]if not (cur_refine_ds_type == ds_type and cur_refine_grade == grade):self.__PopUp(locale.DRAGON_SOUL_INVALID_DRAGON_SOUL)return FALSE# °*È* â¿¡ óÀ½ ¾ÆÀÌÅÛÀ» ¿Ã¸®´Â °æ¿ì, °*È* Àç·á¿¡ °üÇÑ Á¤º¸°¡ ¾ø´Ù.# ¿ëÈ¥¼® °*È*°¡, ·¹½ÃÇǸ¦ °¡Áö°í ½ÃÀÛÇÏ´Â °ÍÀÌ ¾Æ´Ï¶ó, °*È*â¿¡ óÀ½ ¿Ã¸®´Â ¾ÆÀÌÅÛÀÌ ¹«¾ùÀ̳Ŀ¡ µû¶ó,# ¹«¾ùÀ» °*È*ÇÏ°í, Àç·á°¡ ¹«¾ùÀÎÁö(ÀÌÇÏ ·¹½ÃÇÇ)°¡ Á¤ÇØÁø´Ù.# ·¹½ÃÇÇ°¡ ¾ø´Ù¸é, óÀ½ ¿Ã¸° ¾ÆÀÌÅÛÀ̶ó »ı°¢ÇÏ°í, vnumÀ» ¹ÙÅÁÀ¸·Î ·¹½ÃÇǸ¦ ¼ÂÆÃ.else:self.currentRecipe = self.__GetRefineGradeRecipe(vnum)if self.currentRecipe:self.refineSlotLockStartIndex = self.currentRecipe["need_count"]self.wndMoney.SetText(locale.NumberToMoneyString(self.currentRecipe["fee"]))return TRUEelse:# °*È* Á¤º¸ ¼ÂÆÿ¡ ½ÇÆĞÇÏ¸é ¿Ã¸± ¼ö ¾ø´Â ¾ÆÀÌÅÛÀ¸·Î ÆÇ´Ü.self.__PopUp(locale.DRAGON_SOUL_CANNOT_REFINE)return FALSEdef __CanRefineStep (self, vnum):ds_info = self.__GetDragonSoulTypeInfo(vnum)if DragonSoulRefineWindow.INVALID_DRAGON_SOUL_INFO == ds_info:self.__PopUp(locale.DRAGON_SOUL_IS_NOT_DRAGON_SOUL)return FALSEif self.currentRecipe:ds_type, grade, step, strength = ds_infocur_refine_ds_type, cur_refine_grade, cur_refine_step, cur_refine_strength = self.currentRecipe["ds_info"]if not (cur_refine_ds_type == ds_type and cur_refine_grade == grade and cur_refine_step == step):self.__PopUp(locale.DRAGON_SOUL_INVALID_DRAGON_SOUL)return FALSE# °*È* â¿¡ óÀ½ ¾ÆÀÌÅÛÀ» ¿Ã¸®´Â °æ¿ì, Àç·á¿¡ °üÇÑ Á¤º¸°¡ ¾ø´Ù.# ¿ëÈ¥¼® °*È*°¡, ·¹½ÃÇǸ¦ °¡Áö°í ½ÃÀÛÇÏ´Â °ÍÀÌ ¾Æ´Ï¶ó, °*È*â¿¡ óÀ½ ¿Ã¸®´Â ¾ÆÀÌÅÛÀÌ ¹«¾ùÀ̳Ŀ¡ µû¶ó,# ¹«¾ùÀ» °*È*ÇÏ°í, Àç·á°¡ ¹«¾ùÀÎÁö(ÀÌÇÏ ·¹½ÃÇÇ)°¡ Á¤ÇØÁø´Ù.# ·¹½ÃÇÇ°¡ ¾ø´Ù¸é, óÀ½ ¿Ã¸° ¾ÆÀÌÅÛÀ̶ó »ı°¢ÇÏ°í, vnumÀ» ¹ÙÅÁÀ¸·Î ·¹½ÃÇǸ¦ ¼ÂÆÃ.else:self.currentRecipe = self.__GetRefineStepRecipe(vnum)if self.currentRecipe:self.refineSlotLockStartIndex = self.currentRecipe["need_count"]self.wndMoney.SetText(locale.NumberToMoneyString(self.currentRecipe["fee"]))return TRUEelse:# °*È* Á¤º¸ ¼ÂÆÿ¡ ½ÇÆĞÇÏ¸é ¿Ã¸± ¼ö ¾ø´Â ¾ÆÀÌÅÛÀ¸·Î ÆÇ´Ü.self.__PopUp(locale.DRAGON_SOUL_CANNOT_REFINE)return FALSEdef __CanRefineStrength (self, vnum):# ¿ëÈ¥¼®ÀÎ °æ¿ì, ´õ ÀÌ»ó strength °*È*¸¦ ÇÒ ¼ö ¾ø´ÂÁö üũÇؾßÇÔ.if self.__IsDragonSoul(vnum):ds_type, grade, step, strength = self.__GetDragonSoulTypeInfo(vnum)import dragon_soul_refine_settingsif strength &--#62;= dragon_soul_refine_settings.dragon_soul_refine_info[ds_type]["strength_max_table"][grade][step]:self.__PopUp(locale.DRAGON_SOUL_CANNOT_REFINE_MORE)return FALSEelse:return TRUE# strength °*È*ÀÇ °æ¿ì, refine_recipe°¡ ¿ëÈ¥¼®ÀÇ Á¾·ù°¡ ¾Æ´Ñ, °*È*¼®ÀÇ Á¾·ù¿¡ µû¶ó ´Ş¶óÁø´Ù.# µû¶ó¼* ¿ëÈ¥¼®ÀÌ ¾Æ´Ï¶ó¸é,# ÀÌ¹Ì ·¹½ÃÇÇ°¡ ÀÖ´Â °æ¿ì´Â, °*È*¼®ÀÌ °*È*â¿¡ ÀÖ´Ù´Â °ÍÀ̹ǷÎ, return FALSE# ·¹½ÃÇÇ°¡ ¾ø´Â °æ¿ì´Â, °*È*¼®ÀÎÁö È®ÀÎÇÏ°í, ·¹½ÃÇǸ¦ ¼ÂÆÃÇÑ´Ù.else:if self.currentRecipe:self.__PopUp(locale.DRAGON_SOUL_IS_NOT_DRAGON_SOUL)return FALSEelse:refineRecipe = self.__GetRefineStrengthInfo(vnum)if refineRecipe:self.currentRecipe = refineRecipeself.wndMoney.SetText(locale.NumberToMoneyString(self.currentRecipe["fee"]))return TRUEelse:# ·¹½ÃÇǸ¦ ¼ÂÆÃÇÒ ¼ö ¾ø´Â °æ¿ìself.__PopUp(locale.DRAGON_SOUL_NOT_DRAGON_SOUL_REFINE_STONE)return FALSEdef __GetRefineGradeRecipe (self, vnum):ds_type, grade, step, strength = self.__GetDragonSoulTypeInfo(vnum)try:import dragon_soul_refine_settingsreturn {"ds_info" : (ds_type, grade, step, strength),"need_count" : dragon_soul_refine_settings.dragon_soul_refine_info[ds_type]["grade_need_count"][grade],"fee" : dragon_soul_refine_settings.dragon_soul_refine_info[ds_type]["grade_fee"][grade]}except:return Nonedef __GetRefineStepRecipe (self, vnum):ds_type, grade, step, strength = self.__GetDragonSoulTypeInfo(vnum)try:import dragon_soul_refine_settingsreturn {"ds_info" : (ds_type, grade, step, strength),"need_count" : dragon_soul_refine_settings.dragon_soul_refine_info[ds_type]["step_need_count"][step],"fee" : dragon_soul_refine_settings.dragon_soul_refine_info[ds_type]["step_fee"][step]}except:return None# strength °*È*ÀÇ °æ¿ì, refineInfo´Â °*È*¼®¿¡ µû¶ó ´Ş¶óÁø´Ù.def __GetRefineStrengthInfo (self, itemVnum):try:# À̳ğÀÇ À§Ä¡¸¦ ¾îÂîÇÏÁö....# °*È*¼®ÀÌ ¾Æ´Ï¸é ¾ÈµÊ.item.SelectItem(itemVnum)if not (item.ITEM_TYPE_MATERIAL == item.GetItemType()and (item.MATERIAL_DS_REFINE_NORMAL &--#60;= item.GetItemSubType() and item.GetItemSubType() &--#60;= item.MATERIAL_DS_REFINE_HOLLY)):return Noneimport dragon_soul_refine_settingsreturn { "fee" : dragon_soul_refine_settings.strength_fee[item.GetItemSubType()] }except:return Nonedef __IsDragonSoul(self, vnum):item.SelectItem(vnum)return item.GetItemType() == item.ITEM_TYPE_DS# ¿ëÈ¥¼® Vnum¿¡ ´ëÇÑ comment# ITEM VNUMÀ» 10¸¸ ÀÚ¸®ºÎÅÍ, FEDCBA¶ó°í ÇÑ´Ù¸é# FE : ¿ëÈ¥¼® Á¾·ù. D : µî±Ş# C : ´Ü°è B : °*È*# A : ¿©¹úÀÇ ¹øÈ£µé...def __GetDragonSoulTypeInfo(self, vnum):if not self.__IsDragonSoul(vnum):return DragonSoulRefineWindow.INVALID_DRAGON_SOUL_INFOds_type = vnum / 10000grade = vnum % 10000 /1000step = vnum % 1000 / 100strength = vnum % 100 / 10return (ds_type, grade, step, strength)def __MakeDragonSoulVnum(self, ds_type, grade, step, strength):return ds_type * 10000 + grade * 1000 + step * 100 + strength * 10## ºó ½½·Ô ¼±Åà Eventdef __SelectRefineEmptySlot(self, selectedSlotPos):try:if constInfo.GET_ITEM_DROP_QUESTION_DIALOG_STATUS() == 1:returnif selectedSlotPos &--#62;= self.refineSlotLockStartIndex:returnif mouseModule.mouseController.isAttached():attachedSlotType = mouseModule.mouseController.GetAttachedType()attachedSlotPos = mouseModule.mouseController.GetAttachedSlotNumber()attachedItemCount = mouseModule.mouseController.GetAttachedItemCount()attachedItemIndex = mouseModule.mouseController.GetAttachedItemIndex()mouseModule.mouseController.DeattachObject()if uiPrivateShopBuilder.IsBuildingPrivateShop():chat.AppendChat(chat.CHAT_TYPE_INFO, locale.MOVE_ITEM_FAILURE_PRIVATE_SHOP)returnattachedInvenType = player.SlotTypeToInvenType(attachedSlotType)if player.INVENTORY == attachedInvenType and player.IsEquipmentSlot(attachedSlotPos):returnif player.INVENTORY != attachedInvenType and player.DRAGON_SOUL_INVENTORY != attachedInvenType:returnif TRUE == self.__SetItem((attachedInvenType, attachedSlotPos), selectedSlotPos, attachedItemCount):self.Refresh()except Exception, e:import dbgdbg.TraceError("Exception : __SelectRefineEmptySlot, %s" % e)# Ŭ¸¯À¸·Î ½½·Ô¿¡¼* »èÁ¦.def __SelectRefineItemSlot(self, selectedSlotPos):if constInfo.GET_ITEM_DROP_QUESTION_DIALOG_STATUS() == 1:returntry:if not selectedSlotPos in self.refineItemInfo:# »õ·Î¿î ¾ÆÀÌÅÛÀ» °*È*â¿¡ ¿Ã¸®´Â ÀÛ¾÷.if mouseModule.mouseController.isAttached():attachedSlotType = mouseModule.mouseController.GetAttachedType()attachedSlotPos = mouseModule.mouseController.GetAttachedSlotNumber()attachedItemCount = mouseModule.mouseController.GetAttachedItemCount()attachedItemIndex = mouseModule.mouseController.GetAttachedItemIndex()mouseModule.mouseController.DeattachObject()if uiPrivateShopBuilder.IsBuildingPrivateShop():chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.MOVE_ITEM_FAILURE_PRIVATE_SHOP)returnattachedInvenType = player.SlotTypeToInvenType(attachedSlotType)if player.INVENTORY == attachedInvenType and player.IsEquipmentSlot(attachedSlotPos):returnif player.INVENTORY != attachedInvenType and player.DRAGON_SOUL_INVENTORY != attachedInvenType:returnself.AutoSetItem((attachedInvenType, attachedSlotPos), 1)returnelif mouseModule.mouseController.isAttached():returnattachedInvenType, attachedSlotPos, attachedItemCount = self.refineItemInfo[selectedSlotPos]selectedItemVnum = player.GetItemIndex(attachedInvenType, attachedSlotPos)# °*È*â¿¡¼* »èÁ¦ ¹× ¿ø·¡ Àκ¥ÀÇ ¾ÆÀÌÅÛ Ä«¿îÆ® ȸº¹invenType, invenPos, itemCount = self.refineItemInfo[selectedSlotPos]remainCount = player.GetItemCount(invenType, invenPos)player.SetItemCount(invenType, invenPos, remainCount + itemCount)del self.refineItemInfo[selectedSlotPos]# °*È*âÀÌ ºñ¾ú´Ù¸é, ÃʱâÈ*if not self.refineItemInfo:self.__Initialize()else:item.SelectItem(selectedItemVnum)# ¾ø¾Ø ¾ÆÀÌÅÛÀÌ °*È*¼®À̾ú´Ù¸é °*È* ·¹Çǽà ÃʱâÈ*if (item.ITEM_TYPE_MATERIAL == item.GetItemType()and (item.MATERIAL_DS_REFINE_NORMAL &--#60;= item.GetItemSubType() and item.GetItemSubType() &--#60;= item.MATERIAL_DS_REFINE_HOLLY)):self.currentRecipe = {}self.wndMoney.SetText(localeInfo.NumberToMoneyString(0))# ¿ëÈ¥¼®À̾ú´Ù¸é,# strength°*È*°¡ ¾Æ´Ñ °æ¿ì, °*È*â¿¡ ´Ù¸¥ ¿ëÈ¥¼®ÀÌ ³²¾ÆÀÖÀ¸¹Ç·Î, ·¹½ÃÇǸ¦ ÃʱâÈ*ÇÏ¸é ¾ÈµÊ.# strength°*È*ÀÇ °æ¿ì, °*È* ·¹½ÃÇÇ´Â °*È*¼®¿¡ Á¾¼ÓµÈ °ÍÀ̹ǷΠ´Ù¸¥ ó¸®ÇÒ ÇÊ¿ä°¡ ¾øÀ½.else:passexcept Exception, e:import dbgdbg.TraceError("Exception : __SelectRefineItemSlot, %s" % e)self.Refresh()def __OverInRefineItem(self, slotIndex):if self.refineItemInfo.has_key(slotIndex):inven_type, inven_pos, item_count = self.refineItemInfo[slotIndex]self.tooltipItem.SetInventoryItem(inven_pos, inven_type)def __OverInResultItem(self, slotIndex):if self.resultItemInfo.has_key(slotIndex):inven_type, inven_pos, item_count = self.resultItemInfo[slotIndex]self.tooltipItem.SetInventoryItem(inven_pos, inven_type)def __OverOutItem(self):if self.tooltipItem:self.tooltipItem.HideToolTip()def __PressDoRefineButton(self):for i in xrange(self.refineSlotLockStartIndex):if not i in self.refineItemInfo:self.wndPopupDialog.SetText(locale.DRAGON_SOUL_NOT_ENOUGH_MATERIAL)self.wndPopupDialog.Open()returnplayer.SendDragonSoulRefine(DragonSoulRefineWindow.DS_SUB_HEADER_DIC[self.currentRefineType], self.refineItemInfo)def OnPressEscapeKey(self):self.Close()return TRUEdef Refresh(self):self.__RefreshRefineItemSlot()self.__ClearResultItemSlot()def __RefreshRefineItemSlot(self):try:for slotPos in xrange(self.wndRefineSlot.GetSlotCount()):self.wndRefineSlot.ClearSlot(slotPos)if slotPos &--#60; self.refineSlotLockStartIndex:# self.refineItemInfo[slotPos]ÀÇ Á¤º¸È®ÀÎ# (½ÇÁ¦·Î ¾ÆÀÌÅÛÀÌ Á¸ÀçÇÏ´ÂÁö È®ÀÎ)# Á¸Àç -&--#62; ¾ÆÀÌÅÛ ¾ÆÀÌÄÜÀ» ½½·Ô¿¡ ¼ÂÆÃ.# ºñÁ¸Àç -&--#62; ¾ÆÀÌÅÛÀÌ ¾øÀ¸¹Ç·Î °*È*â¿¡¼* »èÁ¦.if slotPos in self.refineItemInfo:invenType, invenPos, itemCount = self.refineItemInfo[slotPos]itemVnum = player.GetItemIndex(invenType, invenPos)# if itemVnum:if itemVnum:self.wndRefineSlot.SetItemSlot(slotPos, player.GetItemIndex(invenType, invenPos), itemCount)else:del self.refineItemInfo[slotPos]# ºó ½½·Ô¿¡ reference ¾ÆÀÌÄÜÀ» alpha 0.5·Î ¼ÂÆÃ.if not slotPos in self.refineItemInfo:try:reference_vnum = 0# strength °*È*ÀÏ ¶§´Â,# 0¹ø ½½·Ô¿¡ °*È*¼®À», 1¹ø ½½·Ô¿¡ ¿ëÈ¥¼®À» ³õ´Â´Ù.if DragonSoulRefineWindow.REFINE_TYPE_STRENGTH == self.currentRefineType:if DragonSoulRefineWindow.REFINE_STONE_SLOT == slotPos:reference_vnum = 100300else:reference_vnum = self.__MakeDragonSoulVnum(*self.currentRecipe["ds_info"])if 0 != reference_vnum:item.SelectItem(reference_vnum)itemIcon = item.GetIconImage()(width, height) = item.GetItemSize()self.wndRefineSlot.SetSlot(slotPos, 0, width, height, itemIcon, (1.0, 1.0, 1.0, 0.5))# slot ¿ìÃø ÇÏ´Ü¿¡ ¼ıÀÚ ¶ß¸é ¾È ¿¹»İ...self.wndRefineSlot.SetSlotCount(slotPos, 0)except:pass# refineSlotLockStartIndex º¸´Ù ÀÛÀº ½½·ÔÀº ´İÈù À̹ÌÁö¸¦ º¸¿©ÁÖ¸é ¾ÈµÊ.self.wndRefineSlot.HideSlotBaseImage(slotPos)# slotPos &--#62;= self.refineSlotLockStartIndex:else:# Á¤»óÀûÀÎ °æ¿ì¶ó¸é ÀÌ if¹®¿¡ µé¾î°¥ ÀÏÀº ¾ø°ÚÁö¸¸,# (¾ÖÃÊ¿¡ À妽º°¡ refineSlotLockStartIndex ÀÌ»óÀÎ ½½·Ô¿¡´Â ¾ÆÀÌÅÛÀ» ³ÖÁö ¸øÇÏ°Ô Ç߱⠶§¹®)# Ȥ½Ã ¸ğ¸¦ ¿¡·¯¿¡ ´ëºñÇÔ.if slotPos in self.refineItemInfo:invenType, invenPos, itemCount = self.refineItemInfo[slotPos]remainCount = player.GetItemCount(invenType, invenPos)player.SetItemCount(invenType, invenPos, remainCount + itemCount)del self.refineItemInfo[selectedSlotPos]# refineSlotLockStartIndex ÀÌ»óÀÎ ½½·ÔÀº ´İÈù À̹ÌÁö¸¦ º¸¿©Áà¾ßÇÔ.self.wndRefineSlot.ShowSlotBaseImage(slotPos)# °*È*â¿¡ ¾Æ¹«·± ¾ÆÀÌÅÛÀÌ ¾ø´Ù¸é, ÃʱâÈ*ÇØÁÜ.# À§¿¡¼* Áß°£ Áß°£¿¡ "del self.refineItemInfo[slotPos]"¸¦ Ç߱⠶§¹®¿¡,# ¿©±â¼* Çѹø üũÇØÁà¾ßÇÔ.if not self.refineItemInfo:self.__Initialize()self.wndRefineSlot.RefreshSlot()except Exception, e:import dbgdbg.TraceError("Exception : __RefreshRefineItemSlot, %s" % e)def __GetEmptySlot(self, itemVnum = 0):# STRENGTH °*È*ÀÇ °æ¿ì, ¿ëÈ¥¼® ½½·Ô°ú °*È*¼® ½½·ÔÀÌ ±¸ºĞµÇ¾îÀֱ⠋š¹®¿¡# vnumÀ» ¾Ë¾Æ¾ß ÇÑ´Ù.if DragonSoulRefineWindow.REFINE_TYPE_STRENGTH == self.currentRefineType:if 0 == itemVnum:return -1if self.__IsDragonSoul(itemVnum):if not DragonSoulRefineWindow.DRAGON_SOUL_SLOT in self.refineItemInfo:return DragonSoulRefineWindow.DRAGON_SOUL_SLOTelse:if not DragonSoulRefineWindow.REFINE_STONE_SLOT in self.refineItemInfo:return DragonSoulRefineWindow.REFINE_STONE_SLOTelse:for slotPos in xrange(self.wndRefineSlot.GetSlotCount()):if not slotPos in self.refineItemInfo:return slotPosreturn -1def AutoSetItem(self, (invenType, invenPos), itemCount):itemVnum = player.GetItemIndex(invenType, invenPos)emptySlot = self.__GetEmptySlot(itemVnum)if -1 == emptySlot:returnself.__SetItem((invenType, invenPos), emptySlot, itemCount)def __ClearResultItemSlot(self):self.wndResultSlot.ClearSlot(0)self.resultItemInfo = {}def RefineSucceed(self, inven_type, inven_pos):self.__Initialize()self.Refresh()itemCount = player.GetItemCount(inven_type, inven_pos)if itemCount &--#62; 0:self.resultItemInfo[0] = (inven_type, inven_pos, itemCount)self.wndResultSlot.SetItemSlot(0, player.GetItemIndex(inven_type, inven_pos), itemCount)def RefineFail(self, reason, inven_type, inven_pos):if net.DS_SUB_HEADER_REFINE_ [img]http://cyber-gamers.org/public/style_emoticons/<#EMO_DIR#>/55158.gif[/img]http://cyber-gamers.org/public/style_emoticons/<#EMO_DIR#>/55158.gif[/img] == reason:self.__Initialize()self.Refresh()itemCount = player.GetItemCount(inven_type, inven_pos)if itemCount &--#62; 0:self.resultItemInfo[0] = (inven_type, inven_pos, itemCount)self.wndResultSlot.SetItemSlot(0, player.GetItemIndex(inven_type, inven_pos), itemCount)else:self.Refresh()def SetInventoryWindows(self, wndInventory, wndDragonSoul):self.wndInventory = wndInventoryself.wndDragonSoul = wndDragonSoul Adicionar game.py
    ## Inventory Suche

    Add Game.py

    # END_OF_CUBE

    Add Game.py
    onPressKeyDict[app.DIK_I] = lambda : self.interface.ToggleInventoryWindow() e adicioná-lo

    onPressKeyDict[app.DIK_O] = lambda : self.interface.ToggleDragonSoulWindowWithNoInfo() Add Game.py
    # UNKNOWN_UPDATE
    def BINARY_NEW_AddAffect(self, type, pointIdx, value, duration): self.affectShower.BINARY_NEW_AddAffect(type, pointIdx, value, duration) if chr.NEW_AFFECT_DRAGON_SOUL_DECK1 == type or chr.NEW_AFFECT_DRAGON_SOUL_DECK2 == type: self.interface.DragonSoulActivate(type - chr.NEW_AFFECT_DRAGON_SOUL_DECK1) elif chr.NEW_AFFECT_DRAGON_SOUL_QUALIFIED == type: self.BINARY_DragonSoulGiveQuilification() def BINARY_NEW_RemoveAffect(self, type, pointIdx): self.affectShower.BINARY_NEW_RemoveAffect(type, pointIdx) if chr.NEW_AFFECT_DRAGON_SOUL_DECK1 == type or chr.NEW_AFFECT_DRAGON_SOUL_DECK2 == type: self.interface.DragonSoulDeactivate()
    Fonte : EPVP
    Cumprimentos,
  9. Upvote
    purabrisa reacted to тнєℓιƒє in [Tut]Alterar Porta Ssh & Mysql   
    Olá Comunidade..
    Depois do tópcio da configuração da dedicada (Topico adicionado abaixo), Deu para ver que cometi algumas falhas, Em termos da configuração... Por esta mesma razão Decidi então fazer novo tópico, e completar... Mas dadas as circunstâncias, que este mesmo Tutorial também serve para Servidores caseiros, até fica em conta ele ser feito em um tópico diferente.
    http://cyber-gamers.org/index.php?/topic/11660-tutinstalar-metin2kernelfirewall-em-dedicada/
    Sem mais histórias, passemos ao tópico.

    Parte 1 - Mudança da porta ssh (Filezila/WinSCP/Putty)
    Ponto1:
    Para alterar este ponto, vão até a maquina e digitam:
    ee /etc/ssh/sshd_config Ponto 2:
    Depois de executarem o comando acima, Devem Localizar a Linha:
    #Port 22 Agora Retiram o # , Ficando apenas assim:
    Port 22 Ponto 3:

    Seguindo o Ponto 2, Alteram o numero 22, Por outra Porta... (Exemplo 3304 )
    Port 3304 Depois disto, Clicam ESC, E Clicam 2 vezes "a" para guardarem as alterações..

    Ponto 4:
    Agora vamos dar Reload ao ssh, Usando o comando:
    /etc/rc.d/sshd reload Após fazerem Reload, verão que a dedicada deixou de vos responder, Pois a porta 22 foi desactivada, e foi activada a porta 3304 (Porque que vocês escolheram)...
    É so alterarem a porta 22 por a vossa escolhida (no meu caso 3304), e Entram normalmente :).




    Parte 2 - Mudança da Porta do MYSQL
    Ponto 1:
    Para este ponto vamos a consola (Maquina) e Digitamos:
    cp /usr/local/share/mysql/my-large.cnf /usr/local/etc/my.cnf PS: Caso o Codigo acima não deia, testem o postado abaixo


    Ponto 2:
    Após fazemos a criação do my.cnf Devemos então alterar a porta... Para isso usem o comando ee (editor).

    cd /usr/local/etc/my.cnf && ee my.cnf Ponto 3:
    Vamos então alterar a porta do mysql
    Agora localizem:
    [mysqld]port = 3306 Alterem por a porta Desejada, Exemplo:
    [mysqld]port = 13021
    Ponto 4:
    Após concluido o ponto 3, Fazem ESC e Clicam 2 Vezes "a" para que possamos fazer Reload ao mysql.
    Agora digitam na maquina:
    cd /root && /usr/local/etc/rc.d/mysql-server restart Feito isto, é so alterarem a porta no navicat para a que meteram no servidor, e tem a porta do mysql alterada.



    Aviso: Para alterares a porta do mysql, Convém que tenhas o servidor desligado, Pois não vais reiniciar a DB, com o Servidor ligado.
    Créditos do Tutorial:
    TheLife
    Sem outro assunto,
    TheLife.
  10. Upvote
    purabrisa reacted to тнєℓιƒє in [Tut]Instalar Metin2+Kernel+Firewall Em Dedicada   
    Olá Comunidade...

    Muita gente, tem vindo a pedir tutoriais sobre instalação do dedicado, Protecção do mesmo.
    Estavas a procura deste tutorial, Acabaste de o encontrar ( http://cyber-gamers.org/public/style_emoticons/default/684881.gif ).

    Bem muitos dos utilizadores de metin2, usam IPFW para Protecção das portas, Bloqueando assim os IP's externos a entrada de "algumas" portas. (fazendo assim com que utilizadores exteriores não consigam conectar-se via ssh).

    Mas na dedicada, as coisas mudam, pois precisamos que nós mesmos entremos... Mas porque activar e utilizar uma coisa, quando podemos fazer 2 coisas em apenas 1? :)
    Bem vamos passar ao tutorial, que é o assunto do tópico...
    Atenção: Este tutorial, foi criado e Estruturado por mim....
    Atenção 2: Esta configuração sempre foi testada e usual por parte de alguns servidores portuguêses (No qual não vou referir nomes).
    Atenção 3: Tenho a agradecer apenas a 1 pessoa que em tempos antigos contribuiu para este tutorial... ( Ivan Santos ).



    1º de tudo:
    Deverás saber a versão do teu FreeBSD.

    2º Saca as Libs, Conforme a Versão do FreeBSD:
    Lib 32 Bits: http://www.mediafire...63uu644yad0e40k
    Lib 64 Bits: http://www.mediafire...jjggj1vpkd6q0fs

    3º Deverás fazer este tutorial com máxima atenção.

    4º Em caso de algum erro, Contacta-me através deste tópico.

    5º Deverás ter o VDI do teu servidor (Caseiro) para que possas Retirar backups, e Instala-los na Dedicada.






    Vamos passar ao tutorial...


    Parte 1 - Backup do VDI/Servidor
    Servidor normal:
    1º Backup do Sistema de Metin2/Quest's/Mapas/data/channels
    Vais até a consola e Escreves:
    cd /root && tar -zcf game.tar.gz /usr/home/game PS: Muda o directório /usr/home/game, conforme seja o directório das tuas serverfiles.

    2º Backup do Mysql:
    Vai até a consola, e escreve:
    tar -zcf mysql.tar.gz /var/db/mysql 3º Vais via SSH (Filezilla ou WinSCP) e No directório /root retiras os ficheiros: game.tar.gz & mysql.tar.gz, Para o teu ambiente de trabalho (Ou a pasta onde os quiseres guardar).

    Servidor By Ivan Santos:
    1º Backup do Sistema de Metin2/Quest's/Mapas/data/channels
    Vais até a consola e Escreves:
    cd /root && tar -zcf metin2.tar.gz /metin2 2º Backup do Mysql:
    Vai até a consola, e escreve:
    tar -zcf mysql.tar.gz /var/db/mysql PS: O 3º Ponto é igual ao primeiro, Logo é so ires ao /root buscar os .tar.gz.






    Parte 2 - Configuração e Instalação do Kernel
    Instalação do Kernel & Firewall:

    Ponto 1:
    Vamos até a maquina e escrevemos:
    cd /../ && fetch ftp://ftp.freebsd.org/pub/FreeBSD/releases/amd64/amd64/9.0-RELEASE/src.txz PS: Onde diz /9.0-RELEASE/ Alteram conforme a versão do vosso sistema. Exemplo: pub/FreeBSD/releases/amd64/amd64/8.2-RELEASE/src.txz


    Depois de efectuarem o download passam ao Ponto 2 da Parte - 2.

    Ponto 2:
    Vamos até a maquina e escrevemos:
    tar -xzvf src.txz Quando o mesmo acabar de Extrair, Passam ao Ponto 3 da Parte - 2.

    Ponto 3:
    Vão novamente até a maquina, e Escrevemos:
    cd /usr/src/sys/amd64/conf Após isto, Voltamos a Digitar:
    cp GENERIC THELIFE Após isto, Voltamos a Digitar:
    ee THELIFE Onde diz:
    ident GENERIC Escrevem:
    ident THELIFE Depois disto, Vamos até ao fim do Arquivo Damos 1 enter e Escrevemos:
    # Firewalloptions IPFIREWALLoptions IPFIREWALL_VERBOSEoptions IPFIREWALL_VERBOSE_LIMIT=5options IPFIREWALL_DEFAULT_TO_ACCEPToptions IPDIVERT[ENTER] Após isto, Clicam ESC, e Clicam 2 vezes no "a" para Salvarem a edição.

    Ponto 4:
    Depois do ponto 3 concluido, passamos a instalação e configuração do kernel...
    fazemos então:
    cd ../../../ && make buildkernel KERNCONF=THELIFE PS: Este processo irá demorar cerca de 20-30Minutos (Dependendo da velocidade de cada dedicada).

    Ponto 5:
    Após o ponto 4 tar concluido, Passamos a instalação do Kernel..
    Para isto, usamos o comando:
    make installkernel KERNCONF=THELIFE Após este processo estar concluido, Reiniciamos a dedicada, E temos o Kernel e Firewall Activos.






    Parte 3 - Extracção das Portsnap e UPDATE.
    Depois de terem concluido a Parte 2,Vamos extrair e fazer update as nossas Ports.

    Ponto 1: Vamos até a maquina e digitamos:
    portsnap fetch extract Ponto 2: Actualização do Portsnap
    Vamos a maquina e digitamos:
    portsnap fetch update Depois deste processo vamos até ao Parte 4.





    Parte 4 - Instalação/Configuração do MYSQL
    Ponto 1:
    Vamos a maquina e digitamos:
    cd /usr/ports/databases/mysql55-server/ && make WITH_XCHARSET=all install clean Após este processo estar concluido, sigam até ao ponto 2.

    Ponto 2:
    Digitam:
    ee /etc/rc.conf Ponto 3:
    Dentro do rc.conf Vão escrever:
    mysql_enable="YES" Ponto 4:
    Após o mysql instalado, vamos reinicia-lo, Para isso vamos usar o comando:
    /usr/local/etc/rc.d/mysql-server restart Ponto 5:
    Vamos configurar os Users do mysql.. Para isso temos de entrar no mysql 1º. Então usamos o comando:
    mysql -u root -p Ponto 6:
    Agora vamos criar os Users...
    Escrevem na maquina:
    GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'cyber-gamers.org' WITH GRANT OPTION; Ponto 7:
    Agora tornam a escrever:
    GRANT ALL PRIVILEGES ON *.* TO 'mt2'@'localhost' IDENTIFIED BY 'mt2!@#' WITH GRANT OPTION; Após isto, escrevem:
    Flush privileges; E depois:
    quit Mais uma vez, Reiniciam o Mysql:
    /usr/local/etc/rc.d/mysql-server restart Após estes pontos, Ja podemos logar com o Navicat, Com o IP do Servidor e com os seguintes dados:
    user: root
    password: cyber-gamers.org

    Ponto 8:
    O Mysql, Cria contas automatizadas, Assim que o mesmo é instalado, Vamos entrar através de navicat, E apagar todos os users, Exepto os users Referidos abaixo:
    mt2@localhostroot@% Todos os outros utilizadores podem apagar.
    PS: Aconselho a mudarem o User root, Para outro nome, para uma maior protecção do Mysql :)







    Parte 5 - Instalação das LIB's
    Ponto 1:
    Caso o teu FreeBSD Seja uma versão 32 Bits, Salta para o Ponto 3, Ignorando assim o Ponto 2.

    Ponto 2:
    Se o teu sistema é FreeBSD 64BIT's deverás instalar o LIB 32. Para isso usamos os comandos:
    echo CHECKSUM.SHA256 CHECKSUM.MD5 install.sh lib32.a{a,b,c,d,e,f,g,h,i,j,k,l,m} lib32.inf lib32.mtree | xargs -n 1 -I%s fetch ftp://ftp-archive.freebsd.org/pub/FreeBSD-Archive/old-releases/amd64/8.2-RELEASE/lib32/%s Após escrito o comando acima, Escreves este comando:
    chmod -R 777 install.sh Após feito o comando acima Torna a Escrever:
    ./install.sh PS: Feito isto, o LIB32 está instalado sem qualquer problema.

    Ponto 3:
    Para 32Bits:
    Extrais o Ficheiro 32Libs.rar (No teu pc) e Passas todos os ficheiros extraidos (sem a pasta, somente os ficheiros) para o directorio:
    /usr/lib Para 64Bits:
    Extrais o ficheiro 64Libs.rar (No teu pc) e Passas todos os ficheiros extraidos da Pasta Lib para:
    /usr/lib E os ficheiros da Pasta lib32 para o directório:
    /usr/lib32

    Ponto 6 - Instalação das ServerFiles + Base de Dados.
    Sistema Normal:

    Ponto 1:
    Vais a maquina e escreves:
    tar -xzvf game.tar.gz Após isto, Fazes o comando:
    mkdir /usr/home/ Após este comando escreves este:
    mv game /usr/home/ Após isto, Vamos fazer:
    cd /root %% tar -xzvf mysql.tar.gz Depois disto vamos fazer:
    cd /root/var/db/mysql Após feito este comando, Fazemos:
    mv account /var/db/mysql && mv common /var/db/mysql && mv hotbackup /var/db/mysql && mv log /var/db/mysql && mv player /var/db/mysql Após este processo fazemos:
    cd /root && rm -R /root/var Agora vamos dar permissões a todos os ficheiros de metin2, Usando o comando:
    chmod -R 777 /usr/home/game && chown -R root /usr/home/game && chmod -R 777 /var/db/mysql && chown -R mysql /var/db/mysql Feito isto, é so fazerem:
    cd /root e Depois:
    ee iniciar.sh Dentro escrevem:
    cd /usr/home/game && ./start.sh Fazem ESC, Clicam 2 Vezes no "a" e Voltam a fazer o seguinte comando:
    ee parar.sh Dentro escrevem:
    cd /usr/home/game && ./close.sh Fazem ESC, Clicam 2 Vezes no "a" e Voltam a fazer o seguinte comando:
    chmod -R 777 iniciar.sh && chmod -R 777 parar.sh

    Servidor By Ivan Santos:
    Ponto 1:
    Fazem:
    tar -xzvf metin2.tar.gz Depois disto fazem:
    mv metin2 / Depois disto vamos fazer:
    cd /root/var/db/mysql Após feito este comando, Fazemos:
    mv account /var/db/mysql && mv common /var/db/mysql && mv hotbackup /var/db/mysql && mv log /var/db/mysql && mv player /var/db/mysql Após este processo fazemos:
    cd /root && rm -R /root/var Agora vamos dar permissões a todos os ficheiros de metin2, Usando o comando:
    chmod -R 777 /metin2 && chown -R metin2 /metin2 && chmod -R 777 /var/db/mysql && chown -R mysql /var/db/mysql Ponto 2:
    Vamos criar um User chamado Metin2, Utilizando o comando:
    adduser Feito isto Sigam o Exemplo abaixo:
    Username: metin2Full name: O Vosso NomeUid (Leave empty for default):Login group [jru]:Login group is jru. Invite jru into other groups? []:Login class [default]:Shell (sh csh tcsh zsh nologin) [sh]: shHome directory [/home]: /metin2Home directory permissions (Leave empty for default):Use password-based authentication? [yes]:Use an empty password? (yes/no) [no]:Use a random password? (yes/no) [no]:Enter password: VossaPasswordEnter password again: VossaPasswordLock out the account after creation? [no]:Username : metin2Password : ****Full Name : O Vosso NomeUid : 1001Class :Groups :Home : /metin2Shell : /usr/local/bin/shLocked : noOK? (yes/no): yesadduser: INFO: Successfully added (metin2) to the user database.Add another user? (yes/no): noGoodbye!

    PS: Quando vos aparecer: "Use an empty password? (yes/no) [no]:" e "Use a random password? (yes/no) [no]:" Dão enter, não escrevam nada.
    PS2: Onde diz VossaPassword, Escrevem a password que querem para o utilizador.




    Feito Todos estes processos, No caso do Sistema normal, é so darem ./iniciar.sh, e o Vosso sistema de metin2, irá iniciar sem problemas :)

    No caso das ServerFiles do Ivan Santos, Fazem login na maquina com o User "metin2", e é so fazerem:
    iniciar.



    Créditos do tutorial:
    TheLife




    Espero que sirva para ajudar a comunidade.

    Sem outro assunto,
    TheLife.
  11. Upvote
    purabrisa reacted to 'PACI in Launcher Do Sura Pó Invoice   
    Oi gente. Eu não sei qual é a cena de não poderem usar a cena do sura num cliente como novo binário õ.ô i mean, por exemplo no cliente do invoice.
    Não sabem renomear o bin/exe dele para metin2.bin?!?!?!?!?!?!?
    P.S: invoice == syserr !!!
    Eu cá no meu cliente, também tenho a ceninha aquela da 6ª dança e o coise funfa nas boas.
    Btw, eu vou deixar aqui a minha dica.
    Peguem num launcher do sura + .dll + serverip.txt (No meu caso do cliente do omega) e colem lá no cliente.
    E o TiiToino testou e funfou portanto aqui têem...

    Download
    VT

    Imagem de prova:


    Créditos e Agradecimentos:
    - Eu pelo tópico;
    - Omega pelo launcher;
    - TiiToino por testar.

    Agora já podem usar isse pós caseiros.
  12. Upvote
    purabrisa reacted to WildEgo in [Pyhon] Petgui Do Client Design Skyfall By Cristal   
    Boas toda a comunidade de metin2 da cyber-gamers,
    Venho-vos apresentar uma PetGui nunca antes postada (Nunca foi postada uma pet-gui no fórum)
    A Pet-Gui funciona a 100% no client do Invoice.
    Print Screen:

    Código Python para o ficheiro game.py (Encontra-se no Root):

    ##START_PETGUI BY DASKUCHEN PetGuiBg = ui.AniImageBox() PetGuiBg.AddFlag("not_pick") PetGuiBg.AppendImage("d:/ymir work/ui/petgui.dds") self.PetGuiBg = PetGuiBg self.PetGuiBg.SetPosition(wndMgr.GetScreenWidth()-460,5) self.PetName = ui.TextLine() self.PetName.SetDefaultFontName() self.PetName.SetPosition((wndMgr.GetScreenWidth()-394)+120, 43) self.PetName.SetText("Haustierbesitzer: NONE") self.PetName.SetOutline() self.PetLevel = ui.TextLine() self.PetLevel.SetDefaultFontName() self.PetLevel.SetPosition((wndMgr.GetScreenWidth()-517)+120, 15) self.PetLevel.SetText("Haustierlevel: NONE") self.PetLevel.SetOutline() self.PetBonus1 = ui.TextLine() self.PetBonus1.SetDefaultFontName() self.PetBonus1.SetPosition((wndMgr.GetScreenWidth()-460)+120, 63) self.PetBonus1.SetText("1. Bonus: NONE") self.PetBonus1.SetOutline() self.PetBonus2 = ui.TextLine() self.PetBonus2.SetDefaultFontName() self.PetBonus2.SetPosition((wndMgr.GetScreenWidth()-460)+120, 84) self.PetBonus2.SetText("2. Bonus: NONE") self.PetBonus2.SetOutline() self.PetBonus3 = ui.TextLine() self.PetBonus3.SetDefaultFontName() self.PetBonus3.SetPosition((wndMgr.GetScreenWidth()-460)+120, 103) self.PetBonus3.SetText("3. Bonus: NONE") self.PetBonus3.SetOutline() PetExpBar = ui.AniImageBox() PetExpBar.AddFlag("not_pick") PetExpBar.AppendImage("d:/ymir work/ui/pattern/charbar_main_yellow.tga") PetExpBar.SetPercentage(0,1) self.PetExpBar = PetExpBar self.PetExpBar.SetPosition((wndMgr.GetScreenWidth()-465)+65, 125) self.PetExpLabel = ui.TextLine() self.PetExpLabel.SetDefaultFontName() self.PetExpLabel.SetPosition((wndMgr.GetScreenWidth()-465)+150, 125) self.PetExpLabel.SetText("0%") self.PetExpLabel.SetOutline() ##CLOSE_PETGUI BY DASKUCHEN No download vêm os ficheiros .eix e .epk da pet-gui, não se esqueçam de adicionar na index:
    *petgui*Download: https://mega.co.nz/#!uUMD3a4K!S-KG42jf5nN8UJCWPTvPPEleBZoABjJFKKdUtRMqKFQ VirusTotal: https://www.virustotal.com/pt/file/c6b41a10f1eedbd7645ab045f53a2fd03f78e8100fc1885ef5e8eeb0a4e07a74/analysis/1370860998/
    Créditos:
    [*]AirMaax - Código .python
    [*]CristalPrime - Design
    [*]Luis Bizarro - Upload & Tópico

    Cumpz,
    Luis Bizarro // .HaveGone
  13. Upvote
    purabrisa reacted to WildEgo in [Menu] [Resoluções] Invoice 2013Er Files   
    Boas comunidade,
    Venho-vos apresentar um menu de resoluções e etc.. para files 2013er by Invoice.
    Este tópico contêm Descompatadores & Compatadores e Erros & Resoluções para as mesmas.
    O tópico pode ser atualizado a qualquer momento sendo adicionadas/apagadas/alteradas resoluções!
    Erros e Resoluções:
    [*]Não é possivel ler livros
    RESOLUÇÃO: Alterar Type 17 por 18 nos Livros
    [*]Armas de 75 e 30 Sem DM nem DH
    RESOLUÇÃO: Abra o Item-Proto e procure cada arma e procure a coluna "addon_type" e coloque o valor "-1"
    [*]Costume System e Correção dos icons
    RESOLUÇÃO: https://mega.co.nz/#!HUUgGKDC!EnoO73aodETIzdp1OhjY933t4QFGRifgut5ZIn4P6HM
    [*]Disfarces desaparecem 2 segundos depois de Aumentar Hablidades ou Status
    RESOLUÇÃO: Sem resolução até agora!
    [*]Devils Catacomb não funcionam
    RESOLUÇÃO: Atlasinfo

    metin2_map_devilscatacomb 407200 4203200 7 7metin2_map_devilscatacomb 407200 4203200 8 8E adicionar "devilscatacomb" no index [*]Teleporte para os "Beta-Maps"
    RESOLUÇÃO:

    /warp 10240 16640 = Cape Dragon Head/warp 11264 15104 = Mt Thunder/warp 11776 16640 = Dawnmistwood/warp 10496 15104 = Bay Black Sand [*]Vidro/Espelho da Visão não funciona
    RESOLUÇÃO: O VNUM é 71113
    [*]Armadura Ossea têm icon errado no iventario
    RESOLUÇÃO: Atulizar item-list com:
    20500 ETC icon/item/20500.tga20501 ETC icon/item/20500.tga20502 ETC icon/item/20500.tga20503 ETC icon/item/20500.tga20504 ETC icon/item/20500.tga20505 ETC icon/item/20500.tga20506 ETC icon/item/20500.tga20507 ETC icon/item/20500.tga20508 ETC icon/item/20500.tga20509 ETC icon/item/20500.tga [*]Quest da Pedra da Alma não funciona
    RESOLUÇÃO:
    quest training_grandmaster_skill beginstate start beginwhen 50513.use beginsay_title ( "Seelenstein" )if pc . get_skill_group ( ) == 0 thensay ( "§A¨S¦³¥ô¦ó¾·~." .. pc . get_skill_group ( ) )returnendif get_time ( ) < pc . getqf ( "next_time" ) thenif pc . is_skill_book_no_delay ( ) thensay ( "Hiermit kannst du eine" )say ( "Fertigkeit perfektionieren." )say ( "" )wait ( )say_title ( "Seelenstein" )elsesay ( "Du kannst erst morgen wieder" )say ( "einen Seelenstein nutzen!" )returnendendlocal result = training_grandmaster_skill . BuildGrandMasterSkillList ( pc . get_job ( ) , pc . get_skill_group ( ) )local vnum_list = result [ 1 ]local name_list = result [ 2 ]if table . getn ( vnum_list ) == 0 thensay ( "Deine Fertigkeiten sind bereits perfekt!" )returnendsay ( "Wähle eine Fertigkeit aus." )say ( "" )local menu_list = { }table . foreach ( name_list , function ( i , name ) table . insert ( menu_list , name ) end )table . insert ( menu_list , "Abbrechen" )local s = select_table ( menu_list )if table . getn ( menu_list ) == s thenreturnendlocal skill_name = name_list [ s ]local skill_vnum = vnum_list [ s ]local skill_level = pc . get_skill_level ( skill_vnum )local cur_alignment = pc . get_real_alignment ( )local need_alignment = 1000 + 500 * ( skill_level - 30 )test_chat ( "²{¦bµ½´c: " .. cur_alignment )test_chat ( "Benötigte Rangpunkte: " .. need_alignment )local title = string . format ( "Fertigkeit perfektionieren:" , skill_name , skill_level - 30 + 1 )say_title ( title )say ( "Beim lesen des Seelensteins" )say ( "verlierst du Rangpunkte! " )say ( "" )if cur_alignment < - 19000 + need_alignment thensay_reward ( "Leider hast du nicht genügend Rangpunkte " )returnendif cur_alignment < 0 thensay_reward ( string . format ( "Benötigte Rangpunkte: %d -> %d" , need_alignment , need_alignment * 2 ) )need_alignment = need_alignment * 2elseif cur_alignment < need_alignment thensay_reward ( string . format ( "Benötigte Rangpunkte: %d" , need_alignment ) )elsesay_reward ( string . format ( "Benötigte Rangpunkte: %d" , need_alignment ) )endsay ( "" )local s = select ( "Weiter" , "Abbrechen" )if s == 2 thenreturnendif cur_alignment >= 0 and cur_alignment < need_alignment thensay_title ( string . format ( "Fertigkeit perfektionieren:" , title ) )say ( "Es ist soweit!" )say ( "Um zu trainieren," )say ( "gib bitte ein: Trainieren" )local s = input ( )if s ~= "Trainieren" thenreturnendendif get_time ( ) < pc . getqf ( "next_time" ) thenif pc . is_skill_book_no_delay ( ) thenpc . remove_skill_book_no_delay ( )elsesay ( "[°ª¯Åµ¥¯Å]§Þ¯àm¿ù»~: ¥ð®§¤¤" )returnendendpc . setqf ( "next_time" , get_time ( ) + time_hour_to_sec ( number ( 8 , 12 ) ) )if need_alignment > 0 thenif pc . learn_grand_master_skill ( skill_vnum ) thenpc . change_alignment ( - need_alignment )say_title ( string . format ( "%s Erfolgreich!" , title ) )if 40 == pc . get_skill_level ( skill_vnum ) thensay ( string . format ( "Herzlichen glückwunsch! =)" , skill_name ) )elsesay ( string . format ( "[°ª¯Åµ¥¯Å]mªº %s¬O %d µ¥¯Å." , skill_name , skill_level - 30 + 1 + 1 ) )endsay ( "" )say_reward ( "Perfektionieren erfolgreich!" )say_reward ( string . format ( "Rangpunkte verloren: %d " , need_alignment ) )say ( "" )elsesay_title ( string . format ( "%s Fehlgeschlagen!" , title ) )say ( "Pech gehabt " )say ( "" )say_reward ( "Perfektionieren fehlgeschlagen!" )say ( "" )pc . change_alignment ( - number ( need_alignment / 3 , need_alignment / 2 ) )endenditem . remove ( )endfunction BuildGrandMasterSkillList(job, group)GRAND_MASTER_SKILL_LEVEL = 30PERFECT_MASTER_SKILL_LEVEL = 40[/color][color=#FFF0F5]local skill_list = special.active_skill_list[job+1][group]local ret_vnum_list = {}local ret_name_list = {}[/color][color=#FFF0F5]-- test_chat(string.format("job=%d, group=%d", job, group))[/color][color=#FFF0F5]table.foreach(skill_list,function(i, skill_vnum)local skill_level = pc.get_skill_level(skill_vnum)[/color][color=#FFF0F5]-- test_chat(string.format("[%d]=%d", skill_vnum, skill_level))if skill_level >= GRAND_MASTER_SKILL_LEVEL and skill_level < PERFECT_MASTER_SKILL_LEVEL then[/color][color=#FFF0F5]table.insert(ret_vnum_list, skill_vnum)local name=locale.GM_SKILL_NAME_DICT[skill_vnum]if name == nil then name=skill_vnum endtable.insert(ret_name_list, name)endend)return {ret_vnum_list, ret_name_list}[/color][color=#FFF0F5]--return {ret_vnum_list, ret_name_list}endendend
    Descompatadores:
    [*]Metin2 File Tool (Balika01)
    Download: https://mega.co.nz/#!XVkD2LDS!Y508eRpSqCLjD_VgA0OuiTFPRbp7OXKcuzz1QlJHxrY
    [*]EternNexus (Crysus Technologies)
    Download: https://mega.co.nz/#!qcIFXSjY!YVTayTradq7UwZDRrmr5EijAgEAURnvo1w5XZL13V8w


  14. Upvote
    purabrisa got a reaction from larimalakian in Exp Bugada No Servidor Overgame Do Rancoroso   
    Adiciona diff de rates 1000%no gameAtt.purabrisa
  15. Upvote
    purabrisa reacted to .Cadito in [MySQL] Converter queries mob_proto 2006 para 2010   
    Olá Pessoal da Cyber-Gamers :)
    Venho disponibilizar um tutorial feito pelo IvanSantos a demonstrar como converter as queries do mob_proto de 2006 para 2010
    Introdução
    Da passagem do sistema metin2 de 2006 para 2010, foram adicionadas 6 novas colunas ao mob_proto.
    Neste tutorial, vais adicionar uma tabela nova mob_proto_2006. É nesta tabela que vão adicionar os mobs.
    Depois, para converter, vão criar uma tabela chamada mob_proto_2010, que É uma tabela intermediária entre o mob_proto_2006 e o mob_proto normal. De seguida adicionam colunas ao mob_proto_2010 e depois copiam os valores para o mob_proto normal.
    PASSO 1
    Criar a tabela mob_proto 2006
    Para a criação da tabela teremos de fazer uma simples querie que irei colocar em baixo
    CREATE TABLE player.mob_proto_2006 (
    `vnum` int(11) NOT NULL DEFAULT '0',
    `name` varchar(24) NOT NULL DEFAULT 'Noname',
    `locale_name` varbinary(24) NOT NULL DEFAULT 'Noname',
    `rank` tinyint(2) NOT NULL DEFAULT '0',
    `type` tinyint(2) NOT NULL DEFAULT '0',
    `battle_type` tinyint(1) NOT NULL DEFAULT '0',
    `level` smallint(3) NOT NULL DEFAULT '1',
    `size` enum('SMALL','MEDIUM','BIG') NOT NULL DEFAULT 'SMALL',
    `ai_flag` set('AGGR','NOMOVE','COWARD','NOATTSHINSU','NOATTCHUNJO','NOATTJINNO','ATTMOB','BERSERK','STONESKIN','GODSPEED','DEATHBLOW','REVIVE') DEFAULT NULL,
    `mount_capacity` tinyint(2) NOT NULL DEFAULT '0',
    `setRaceFlag` set('ANIMAL','UNDEAD','DEVIL','HUMAN','ORC','MILGYO','INSECT','FIRE','ICE','DESERT') NOT NULL DEFAULT '',
    `setImmuneFlag` set('STUN','SLOW','FALL','CURSE','POISON','TERROR') NOT NULL DEFAULT '',
    `empire` tinyint(4) NOT NULL DEFAULT '0',
    `folder` varchar(100) NOT NULL DEFAULT '',
    `on_click` tinyint(4) NOT NULL DEFAULT '0',
    `st` smallint(5) unsigned NOT NULL DEFAULT '0',
    `dx` smallint(5) unsigned NOT NULL DEFAULT '0',
    `ht` smallint(5) unsigned NOT NULL DEFAULT '0',
    `iq` smallint(5) unsigned NOT NULL DEFAULT '0',
    `damage_min` smallint(5) unsigned NOT NULL DEFAULT '0',
    `damage_max` smallint(5) unsigned NOT NULL DEFAULT '0',
    `max_hp` int(10) unsigned NOT NULL DEFAULT '0',
    `regen_cycle` tinyint(3) unsigned NOT NULL DEFAULT '0',
    `regen_percent` tinyint(3) unsigned NOT NULL DEFAULT '0',
    `gold_min` int(11) NOT NULL DEFAULT '0',
    `gold_max` int(11) NOT NULL DEFAULT '0',
    `exp` int(10) NOT NULL DEFAULT '0',
    `def` smallint(5) unsigned NOT NULL DEFAULT '0',
    `attack_speed` smallint(6) unsigned NOT NULL DEFAULT '100',
    `move_speed` smallint(6) unsigned NOT NULL DEFAULT '100',
    `aggressive_hp_pct` tinyint(3) unsigned NOT NULL DEFAULT '0',
    `aggressive_sight` smallint(10) unsigned NOT NULL DEFAULT '0',
    `attack_range` smallint(5) unsigned NOT NULL DEFAULT '0',
    `drop_item` int(10) unsigned NOT NULL DEFAULT '0',
    `resurrection_vnum` int(10) unsigned NOT NULL DEFAULT '0',
    `enchant_curse` tinyint(4) unsigned NOT NULL DEFAULT '0',
    `enchant_slow` tinyint(4) unsigned NOT NULL DEFAULT '0',
    `enchant_poison` tinyint(4) unsigned NOT NULL DEFAULT '0',
    `enchant_stun` tinyint(3) unsigned NOT NULL DEFAULT '0',
    `enchant_critical` tinyint(3) unsigned NOT NULL DEFAULT '0',
    `enchant_penetrate` tinyint(3) unsigned NOT NULL DEFAULT '0',
    `resist_sword` tinyint(4) NOT NULL DEFAULT '0',
    `resist_twohand` tinyint(4) NOT NULL DEFAULT '0',
    `resist_dagger` tinyint(4) NOT NULL DEFAULT '0',
    `resist_bell` tinyint(4) NOT NULL DEFAULT '0',
    `resist_fan` tinyint(4) NOT NULL DEFAULT '0',
    `resist_bow` tinyint(4) NOT NULL DEFAULT '0',
    `resist_fire` tinyint(4) NOT NULL DEFAULT '0',
    `resist_elect` tinyint(4) NOT NULL DEFAULT '0',
    `resist_magic` tinyint(4) NOT NULL DEFAULT '0',
    `resist_wind` tinyint(4) NOT NULL DEFAULT '0',
    `resist_poison` tinyint(4) NOT NULL DEFAULT '0',
    `dam_multiply` float DEFAULT NULL,
    `summon` int(11) DEFAULT NULL,
    `drain_sp` int(11) DEFAULT NULL,
    `mob_color` int(10) unsigned DEFAULT NULL,
    `polymorph_item` int(10) unsigned NOT NULL DEFAULT '0',
    `skill_level0` tinyint(3) unsigned DEFAULT NULL,
    `skill_vnum0` int(10) unsigned DEFAULT NULL,
    `skill_level1` tinyint(3) unsigned DEFAULT NULL,
    `skill_vnum1` int(10) unsigned DEFAULT NULL,
    `sp_berserk` tinyint(4) NOT NULL DEFAULT '0',
    `sp_stoneskin` tinyint(4) NOT NULL DEFAULT '0',
    `sp_godspeed` tinyint(4) NOT NULL DEFAULT '0',
    `sp_deathblow` tinyint(4) NOT NULL DEFAULT '0',
    `sp_revive` tinyint(4) NOT NULL DEFAULT '0',
    PRIMARY KEY (`vnum`)
    ) ENGINE=MyISAM DEFAULT CHARSET=big5;
    PASSO 2
    Abrem o Notepad++ e coloquem lá as queries que gostariam de colocar no vosso mob_proto
    onde diz mob_proto alteram para mob_proto_2006
    Aqui está uma imagem para vos ajudar
    http://img826.imageshack.us/img826/9870/print1l.png
    ps: sempre podem usar o substituir para vos facilitar a vida e não ser tão cansativo para substituir carreguem naquele icon que são uns binóculos
    PASSO 3
    Coloquem as queries no navicat
    e façam run ( como É óbvio )
    de seguida coloquem estas façam está querie
    DROP TABLE IF EXISTS player.mob_proto_2010;
    CREATE TABLE player.mob_proto_2010 LIKE player.mob_proto_2006;
    INSERT player.mob_proto_2010 SELECT * FROM player.mob_proto_2006;
    ALTER TABLE player.mob_proto_2010 ADD `skill_level2` tinyint(3) unsigned default NULL;
    ALTER TABLE player.mob_proto_2010 ADD `skill_vnum2` int(10) unsigned default NULL;
    ALTER TABLE player.mob_proto_2010 ADD `skill_level3` tinyint(3) unsigned default NULL;
    ALTER TABLE player.mob_proto_2010 ADD `skill_vnum3` int(10) unsigned default NULL;
    ALTER TABLE player.mob_proto_2010 ADD `skill_level4` tinyint(3) unsigned default NULL;
    ALTER TABLE player.mob_proto_2010 ADD `skill_vnum4` int(10) unsigned default NULL;
    INSERT player.mob_proto SELECT * FROM player.mob_proto_2010;







    Pessoal sempre que quiserem adicionar novas queries repitam o PASSO 2 e o PASSO 3
    CrÉditos: IvanSantos
    Pessoal se gostaram do tutorial sempre podem carregar no botão "+"
    pois talvez irei publicar mais tutoriais da minha autoria e outros não.
  16. Upvote
    purabrisa reacted to luiscarlosgraca in Relatório do Projecto de Programação de Sistemas Informáticos [Metin2 Servidor Privado]   
    A professora pediu-nos que fizessemos um projecto e eu como gosto de Metin2 desenvolvi isto:
    Ver este Tutorial em PDF

    Espero que gostem
    E s c o l a S e c u n d á r i a D r . J o r g e C o r r e i a
    por: Paulo Gonçalves
    Aluno nº19 da turma TGPSI
    De 24/04/2012 a 08/05/2012
    Relatório do Projecto de Programação de Sistemas Informáticos
    1
    Paulo Gonçalves – Projecto de PSI
    Índice
    Índice 1
    Introdução 2
    Objectivos 3
    Desenvolvimento do Projecto 4
    Ponto 1 – Instalação e configuração dos Ficheiros do Servidor 4
    Ponto 2 – Instalação e configuração dos programas de acesso ao servidor 7
    Parte I – Instalação e configuração do Navicat 7
    Parte II - instalação e configuração do Filezilla 7
    Ponto 3 – Criação de uma conta e tornar o nosso personagem GameMaster (administrador) 8
    Parte I – Criação de uma conta. 8
    Parte II – Tornar o nosso personagem GameMaster (administrador) 9
    Ponto 4 – Ligar o cliente ao servidor. 10
    Ponto 5 – Estudo das bases de Dados. 11
    Parte I – Estudo da Base de Dados Accounts. 11
    Parte II – Base de Dados common . 12
    Parte III – Base de Dados Player. 13
    Ponto 6 – Implementação de itens, NPCS e monstros(mobs) 15
    Parte I – Implementação de itens. 15
    Parte II – Implementação de NPCS. 20
    Parte III – Implementação de monstros(mobs). 22
    Dificuldades Sentidas. 25
    Conclusão. 26
    Girias utilizadas neste documento e no mundo dos jogos. 27
    Bibliografia e Netgrafia. 28
    2
    Paulo Gonçalves – Projecto de PSI
    Introdução
    Neste módulo foi proposto pela professora desenvolvermos-mos um projecto individual sobre algo aprendido na disciplina de Programação de Sistemas de Informação e propus-me a desenvolver e explicar o processo de instalação e configuração de um servidor de jogos,
    Metin2, e ainda conectar as bases de dados do servidor com o cliente de jogo. Escolhi este projecto porque engloba várias áreas da informática, nomeadamente Sistemas Operativos, Arquitectura de Computadores, Redes de Comunicações e Programação de Sistemas de Informação.
    Para tal efeito utilizei os seguintes programas:
    -Navicat 10.0;
    -Notepad++;
    -Filezilla;
    -Virtual PC 2007;
    -M2 extractor;
    -Portmap;
    -DUC Client No-ip;
    -Ficheiros do Servidor;
    -GIMP 2.8
    -Cliente.
    O servidor como requer bibliotecas somente disponibilizadas pelo sistema operativo FreeBSD toda a configuração e instalação foi feita numa máquina virtual. Os ficheiros do servidor assim como as bases de dados foram criados por outras pessoas sendo o meu objectivo apenas o de
    melhorar os aspectos defeituosos deixados pelos criadores. Todo o conhecimento que adquiri sobre este assunto foi nos fóruns da Internet, Youtube e na
    escola, tendo tido muito trabalho de pesquisa antes de poder fazer qualquer alteração.
    3
    Paulo Gonçalves – Projecto de PSI
    Objectivos
    Este projecto tem como objectivos principais:
    -Instalação e Configuração do Servidor de Metin2;
    -Instalação e Configuração dos programas de acesso;
    -Criar uma conta e tornar o nosso personagem GameMaster (administrador);
    -Ligar o cliente ao servidor;
    -Estudo das Bases de Dados;
    -Implementação de novos itens, NPCS e monstros (mobs).
    -Desenvolvimento de um programa para fazer a transferência dos arquivos mais recentes e
    actualizados em relação ao servidor (Patcher).
    4
    Paulo Gonçalves – Projecto de PSI
    Imagem 1 - Escolha da placa de rede
    Desenvolvimento do Projecto
    Ponto 1 – Instalação e configuração dos Ficheiros do Servidor
    Primeiro comecei por fazer a instalação de uma nova placa de rede. Para este passo fui no menu Iniciar do Windows, depois na pesquisa escrevi hdwwiz. Carreguei no botão Seguinte, seleccionei o ponto Instalar o hardware que eu seleccionar manualmente a partir de uma lista e carreguei no botão
    Seguinte. Nesta lista seleccionei a aba placas de rede e cliquei no botão seguinte. Na aba fabricante escolhi Microsoft e depois
    Microsoft Adaptor Loopback. Depois Seguinte, Seguinte e ele instala. Quando a placa de rede for instalada cliquei em concluir.

    Depois segue-se a configuração da placa de rede. Para este passo fui ao Menu Iniciar, Painel de Controlo, Centro de rede e partilha e no
    meu caso cliquei na conexão local 3. Fui as propriedades e editei as configurações IP v4. Pus
    para atribuir um IP fixo com as seguintes configurações.

    Ilustração 2 - Propriedade do Protocolo IP v4
    Pus um visto no Validar Definições ao Sair e OK.
    5
    Paulo Gonçalves – Projecto de PSI

    Feito isto tive que fazer três transferências.
    Ficheiros do Servidor + Maquina Virtual: http://depositfiles....files/g1o5m24f6
    Virtual PC 2007:http://www.microsoft.com/en-us/download/details.aspx?id=4580
    Portmap: http://www.mediafire...v1fvn8e62f8zb4a

    Extrai o Portmap e os ficheiros do Servidor e instalei como um programa normal o virtual PC.
    A senha dos ficheiros do servidor é “cyber-gamers.org”.

    De seguida abri o Virtual PC e cliquei no botão New...,
    Next, Create a Virtual Machine, Next, Next. No Operating System coloquei Others, Next, Adjusting the RAM, pus 1024MB de RAM e Next.
    Escolhi a opção An existing Virtual Hard Disk e Next.
    Coloquei a localização dos ficheiros do Servidor extraÍdos (um ficheiro .vhd) e cliquei Next.
    Tendo feito isto seleccionei a máquina e cliquei em Settings. Na aba Networking seleccionei o Microsoft Adaptor Loopback.
    Depois cliquei Finish. Seleccionei a minha máquina e cliquei Start.
    O programa Virtual PC vai iniciar um sistema operativo virtual. O utilizador que usamos é o root com a password mcncc.com
    (pode ser mudada posteriormente). Depois de colocar o login e a password na consola escrevi sysinstall. Depois escolhi a opção configure



    e depois Networking, Interfaces. Optei pela opção de0 e carreguei em No, No e coloquei as seguintes configurações:



    Ok, Yes, Esc, Esc. Outra configuração que fiz neste menu foi a configuração do Teclado. Para isso fui à opção Keymap e escolhi Portuguese (accent).
    Feito isto carreguei ESC e escrevi na linha de comandos /etc/rc.d/netif restart para reiniciar as configurações de rede.
    Depois escrevi reboot para reiniciar a máquina.
    Quando a máquina reiniciou inseri o login e password e escrevi na linha de comandos ./start para iniciar o servidor.
    Depois liguei o Portmap abrindo o programa.
    Chegando ao fim da instalação e configuração da máquina fui configurar os programas de acesso.
    7
    Paulo Gonçalves – Projecto de PSI

    Ponto 2 – Instalação e configuração dos programas de acesso ao servidor
    Parte I – Instalação e configuração do Navicat Primeiro transferi o programa. http://www.mediafire...s82q276b8gd8wtd
    Extrai e instalei normalmente. Quando me pediu para inserir o Serial abri o programa encontrado na pasta
    LZ0 (keygen.exe). Colei o serial e registei o programa. Abri o navicat e fui configurar uma nova ligação.
    Para isto cliquei na opção connect e escolhi mysql.


    Ilustração 5 - Nova ligação SQL

    Depois no connection name pus um nome à minha escolha
    (metin2). No host name coloquei 192.168.5.100. O port fica igual (3306). O utilizador fica root e a password é
    123456. Pus um visto no Save Password e Cliquei no OK.
    A parte da ligação à base de dados está feita.
    Parte II - instalação e configuração do Filezilla Efectuei a transferência no site:
    http://filezilla-project.org/
    Instalei como um programa normal e procedi a configuração. Para tal fui a aba Ficheiro, Gestor de Sitios, Novo sitio.


    Ilustração 6 - Novo Sitio

    No anfitrião coloquei 192.168.5.100, na Porta 22, no protocolo SFTPD – SSH File Transfer Protocol. Na parte
    do tipo de inÍcio de sessão coloquei normal e no utilizador root com a palavra passe mcncc.com.
    Feito isto cliquei em OK e a configuração do Filezilla está feita.
    8
    Paulo Gonçalves – Projecto de PSI

    Ponto 3 – Criação de uma conta e tornar o nosso personagem GameMaster (administrador)
    Parte I – Criação de uma conta.
    Este passo é indispensável pois sem uma conta não é possÍvel fazer a ligação ao servidor através de um cliente. Neste caso usei o navicat, mas de futuro usarei uma página criada por mim, para qualquer pessoa ter acesso e poder criar uma conta.
    Para tal efeito abri o navicat e acedi à ligação previamente configurada. Seleccionei a base de dados account e abri a tabela accounts.
    Na coluna id coloquei um número que ainda não foi usado(neste caso 2) e no login o nome usado para efectuar o login no cliente.


    Ilustração 7 - Adicionar uma conta

    A password utiliza uma encriptação por tive que fazer uma consulta antes, de modo que, fui a parte query, New Query, e escrevi
    SELECT PASSWORD(‘123456’);

    Ilustração 8 – Query para gerar a password encriptada

    Cliquei em run e copiei o valor obtido e colei na coluna password.
    Depois no real_name pus o nome verdadeiro, social_id o código para apagar as personagens, e no email o meu email.
    Feito isto a conta estava criada.
    9
    Paulo Gonçalves – Projecto de PSI

    Parte II – Tornar o nosso personagem GameMaster (administrador)
    Agora com a conta criada deveremos nos tornar administradores do jogo para que possamos fazer testes e outras coisas.
    No navicat abri a base de dados common e a tabela gmlist. Lá inseri um novo registo e coloquei os seguintes valores:
    mID: um número que ainda não fosse utilizado;
    mAccount: o login da conta que foi criada anteriormente;
    mName: o nome que o personagem irá ter;
    mAuthority: IMPLEMENTOR.


    Ilustração 9 - Adicionar uma personagem à tabela dos GMs

    Quando acabei este passo ao fazer ligação com aquela conta e ao criar um personagem com o nome escolhido, este se tornava GameMaster.
    10
    Paulo Gonçalves – Projecto de PSI

    Ponto 4 – Ligar o cliente ao servidor
    Após as configurações anteriores tive que criar o personagem e testar se o servidor estava a funcionar correctamente.
    Para isso fiz as configurações necessárias no cliente para poder ligarme ao servidor.
    Para efectuar a transferência do cliente acedi a este link:
    http://uploaded.to/file/jlxzczc8
    Extrai, abri o ficheiro serverimfo.py com o notepad++ , e coloquei o ip da máquina virtual (192.168.5.100).
    Abri o programa metin2_2010.exe cliquei em START e pus as minhas credências da conta.


    Ilustração 10 - Metin2_2010.exe


    Ilustração 11 - Inserir as credenciais de conta

    Fiz a ligação ao servidor e cliquei no botão criar. Escolhi a classe e o sexo (Guerreiro e Masculino),


    Ilustração 13 - Criar o Personagem

    o nome foi aquele que coloquei previamente na tabela de gmlist e escolhi a cor que desejava que o equipamento fosse (cor 2).
    Cliquei em criar e depois quando me apareceu para escolher o personagem cliquei em começar.
    Esperei o loading e apreceu o meu personagem com o simbolo GM acima da cabeça (significando que é GameMaster).


    Ilustração 12 - Personagem no Mundo do Jogo

    Como conseguimos jogar, o servidor estava funcional.
    11
    Paulo Gonçalves – Projecto de PSI

    Ponto 5 – Estudo das bases de Dados
    Existem 3 bases de dados que são fundamentais à execução do servidor.
    Elas são Accounts, Common e Player.
    Dentro das mesmas existem tabelas que exigem a nossa compreenção. Sem saber para que serve um campo em questão uma alteração na base de dados pode
    compremeter todo o funcionamento do servidor, desde dar erro ao escolher a personagem a o servidor nem ligar.
    Parte I – Estudo da Base de Dados Accounts
    Esta base de dados serve para guardar as contas que são criadas.
    Dentro desta existe apenas uma tabela que se precisa compreender, accounts, que tem os seguintes campos:

    Id, login, password, real_name, social_id, email, phone1, phone2, zipcode, adress,
    create_time, question1, answer1, question2, answer2, is_testor, status, securitycode,
    newsletter, empire, name_checked, availDt, cash, gold_expire, silver_expire, safebox_expire,
    autoloot_expire, fish_mind_expire, marriage_fast_expire, money_drop_rate_expire,
    ttl_cash, ttl_mileage, channel_company, last_play.
    Destes todos apenas precisei de compreender o funcionamento dos seguintes:
    Id, login, password, real_name, social_id, email, phone1, phone2, zipcode, adress, question1,
    answer1, question2, answer2, status, gold_expire, silver_expire, safebox_expire,
    autoloot_expire, fish_mind_expire, marriage_fast_expire e money_drop_rate_expire.

    Destes apenas os seguintes não podem ser nulos:
    Id, login, password, social_id

    Após estudar o funcionamento de cada campo cheguei a conclusão de que os campos actuam segundo o seguinte:
    Id, é uma chave primária. Serve para identificar a que conta os personagens pertencem.
    Este campo é auto increment por isso não precisamos de especificar um valor.
    Login, é o nome utilizado para se fazer o login no cliente. Este campo tem que ser único.
    Password, é a password utilizada para se fazer o login no cliente. Este campo utiliza a
    encriptação de Password do MySQL. Este processo é irreversivel, portanto só se pode encriptar
    e não se pode desencriptar fazendo com que seja uma palavra passe muito segura.
    Social_id, é o código que vai ser utilizado ao eliminar uma personagem, fazendo assim com
    que a personagem só possa ser eliminada pelo criador da conta.
    Real_name, é o nome real do dono da conta.
    Email, é o email a que a conta está associada. Se usarmos num site uma recuperação da
    password por email, este campo torna-se essencial.
    Phone1, phone2, é um campo para que se coloque o número de telemóvel.
    Não tem muito interesse pois o utilizador nunca vai ser contactado via telemovel e no jogo não há nada que seja feito a partir do telemovel.

    Zipcode, adress, Informações relactivamente a morada. Não tem muita utilidade nesta base de dados.
    Question1, question2, São as perguntas de segurança. Se for feito a reposição de password com perguntas secretas estes campos tornam-se essenciais.
    Answer1, answer2, São as respostas as perguntas de segurança.
    Se for feito a reposição de password com perguntas secretas estes campos tornam-se essenciais.
    Status, Quando o valor deste campo for OK, poderemos fazer o login no cliente normalmente.
    Este campo é de extrema utilidade se utilizarmos algum método de validação por email.
    gold_expire, silver_expire, safebox_expire, autoloot_expire, fish_mind_expire, marriage_fast_expire e money_drop_rate_expire,
    bónus do jogo, são do tipo data e guardam
    até que dia estes bónus estão activos. São extremamente uteis caso queiramos fazer um sistema VIP.
    Feito este estudo cheguei a conclusão de que a query óptima para acrescentar uma nova conta é:

    INSERT INTO accounts(login, password, social_id, email, question1, question2, answer1,answer2, status, gold_expire, silver_expire, safebox_expire, autoloot_expire,fish_mind_expire, marriage_fast_expire e money_drop_rate_expire) VALUES (‘login’,PASSWORD(‘password’), ‘código de apagar a personagem’, ‘email’, ‘questão 1’, ‘questão2’,‘resposta1’, ‘resposta2’, ‘OK’, ‘data de hoje mais dez dias’, data de hoje mais dez dias’, datade hoje mais dez dias’, data de hoje mais dez dias’, data de hoje mais dez dias’, data de hojemais dez dias’, data de hoje mais dez dias’); Parte II – Base de Dados common
    Esta base de dados serve para guardar as coisas comuns ao servidor.
    Uma das tabelas é a gmlist, que serve para guardar os GameMasters que o servidor tem.
    Esta tem os seguintes campos: mID, mAccount, mName, mAuthority, mContactIP, mServerIP
    Destes apenas os seguintes não podem ser nulos:
    mID, mAccount, mName, mAuthority Depois de estudar esta tabela cheguei à conclusão que:
    O campo mID é a chave primária e guarda o número do GM.
    O campo mAccount serve para dizer a que conta o GM pertence, para que se for criado um
    personagem com o mesmo nome do GM este não ter poderes de administração.
    O campo mName é o nome do personagem que é GM.
    O campo mAuthority é onde se designa que tipo de GM ele é, Implementor, que tem acesso a
    tudo ou apenas um Wizard, que pode só fazer apenas algumas coisas.


    13
    Paulo Gonçalves – Projecto de PSI

    Com isto cheguei a conclusão que a query optima é:

    INSERT INTO gmlist(mID, mAccount, mName, mAuthority, mServerIP) VALUES (‘id’, ‘nome daconta’, ‘nome do personagem’, ‘IMPLEMENTOR’, ‘ALL’); Parte III – Base de Dados Player
    Esta base de dados guarda todos os dados relactivamente ao jogo.
    Todas as tabelas são deveras importantes, embora para atingir o meu objectivo só precisei compreender as tabelas
    item_proto e mob_proto. Outras tabelas importantes são a player que guarda os registos dos
    personagems, guild, que guarda todas as alianças feitas no jogo, land, que guarda os terrenos das alianças, item, que guarda a quem pertence tal item, item_atrr, que guarda os especiais e quantidades que podem ser aplicados nos items, shop, que designa a determinado NPC uma
    loja e shop_item que determina que lojas vendem determinado item e que quantidades.
    Vou começar por falar da tabela item_proto.
    Ao estudar a tabela vi que tem os seguintes campos:

    Vnum, name, locale_name,type, subtype, weight, size, antiflag, flag, wearflag, immuneflag,
    gold, shop_buy_price, refined_vnum, refine_set, refine_set2, magic_pct, limittype0,
    limitvalue0, limittype1, limitvalue1, applytype0, applyvalue0, applytype1, applyvalue1,
    applytype2, applyvalue2, value0, value1, value2, value3, value4, value5, socket0, socket1,
    socket2, socket3, socket4, socket5, specular, socket_pct, addon_type.

    Vnum serve para identificar o id do item.
    Name serve para identificar o nome do item nos ficheiros do servidor.
    Locale_name serve para identificar os nomes dos itens no cliente.
    Type, subtype, servem para identificar qual o tipo de item (espada, leque, poção, item normal,).
    Size, o tamanho que ocupa no inventario.
    Antiflag, flag, wearflag, immuneflag, Restrições de raça, se pode ser vendido e se se pode deixar cair.
    Shop_buy_price, preço ao vender o item numa loja do jogo.
    Refined_vnum, refine_set, refine_set2, informações sobre a refinação do item.
    limittype0, limitvalue0, limittype1, limitvalue1, restrições de nivel.
    applytype0, applyvalue0, applytype1, applyvalue1, applytype2, applyvalue2, bonus daquela arma.
    value0, value1, value2, value3, value4, value5, valores referentes ao tipo de item que é.
    E depois estudei a tabela mob_proto que tem os seguintes campos:

    14
    Paulo Gonçalves – Projecto de PSI

    vnum, name, locale_name, rank, type, battle_type, level, size, ai_flag, mount_capacity,
    setRaceFlag, setImmuneFlag, empire, folder, on_click, st, dx, ht, iq, damage_min,
    damage_max, max_hp, regen_cycle, regen_percent, gold_min, gold_max, exp, def,
    attack_speed, move_speed, aggressive_hp_pct, aggressive_sight, attack_range, drop_item,
    resurrection_vnum, enchant_curse, enchant_slow, enchant_poison, enchant_stun,
    enchant_critical, enchant_penetrate, resist_sword, resist_twohand, resist_dagger, resist_bell,
    resist_fan, resist_bow, resist_fire, resist_elect, resist_magic, resist_wind, resist_poison,
    dam_multiply, summon, drain_sp, mob_color, polymorph_item, skill_level0, skill_vnum0,
    skill_level1, skill_vnum1, sp_berserk, sp_stoneskin, sp_godspeed, sp_deathblow, sp_revive,
    skill_level2, skill_vnum2, skill_level3, skill_vnum3, skill_level4, skill_vnum4

    vnum, o id que identifica o mob.
    Name, o nome que identifica nos ficheiros do servidor.
    Locale_name, o numero que identifica no cliente.
    Rank, o nivel de dificuldade.
    Type, o tipo de mob que é.
    Level, o nivel do mob.
    Ai_flag, como o mob se comporta.
    Empire, o império ao qual pertence o moob.
    On_click, o que o mob faz quando se clica nele.
    St, dx, ht, iq, status do mob.
    Damage_min, damage_max, dam_multiply, valores de dano do mob.
    skill_level1, skill_vnum1, skill_level2, skill_vnum2, skill_level3, skill_vnum3, skill_level4, skill_vnum4, que habilidades o moob tem.
    resist_sword, resist_twohand, resist_dagger, resist_bell, resist_fan, resist_bow, resist_fire, resist_elect, resist_magic, resist_wind, resist_poison, resistencias aos personagens que o mob tem.

    15
    Paulo Gonçalves – Projecto de PSI

    Ponto 6 – Implementação de itens, NPCS e monstros(mobs)
    Para concluir este passo já é preciso descompactar ficheiros do servidor. Para tal usamos a ferramenta do M2 Extractor.
    Como já é uma ferramenta antigo que eu possuo e não aencontro já disponibilizada na internet eu próprio fiz o upload.
    Primeiro fiz a transferência do M2 Extractor http://www.mediafire.com/?jxao19gjw5oboqa
    Depois copiei para o caminho C:m2 e extrai. Fiquei com um programa chamado m2.exe.
    Este programa trabalha com os ficheiros .eix e .epk do cliente através de ficheiros .xml.
    Para o usar tive que ir à linha de comandos do Windows (Menu Iniciar e na pesquisa escrever cmd) e ir para a pasta do programa (cd c:m2).
    Feito isto tive que criar um ficheiro .xml e copiar o arquivo que desejo descompactar do cliente.
    Depois escrevi na consola m2 ficheiro.xml e ele extraiu-me os ficheiros para a pasta Source.Depois tive que ir através do navegador do Windows (explorer) ir a pasta c:m2source e lá encontravam-se todos os ficheiros que estavam dentro do ficheiro .epk.
    Parte I – Implementação de itens.
    Nesta parte adicionei 3 itens comuns que irão fazer parte de uma missão. O nome desses itens
    são, Chave de Azurite, Cabeça Encolhida e Totem do Resto. Todos estes itens têm um Ícone. Os Ícones podem ser encontrados nestes links:
    Chave de Azurite
    Cabeça Encolhida
    Totem do Resto
    Guardei as 3 imagens no meu computador.
    De seguida criei 4 ficheiros XML, icon.xml, root.xml, locale_de.xml, item_proto.xml em que os conteúdos eram os seguintes:
    icon.xml

    <Buildfile version="1.1"><Action type="extract" archivePath="C:m2icon" outputPath="Source" extractAll="YES"createXML="YES" xmlPath="iconpack.xml" /></Buildfile>16
    Paulo Gonçalves – Projecto de PSI

    locale_de.xml
    item_proto.xml
    De seguida copiei os ficheiros icon.epk, icon.eix, locale_de.epk, locale_de.eix da pasta pack do cliente para a pasta c:m2 e os ficheiros criados para a pasta c:m2.
    Abri a consola e fui para a pasta m2. Escrevi m2 root.xml. O programa extraiu sem quaisquer erros.
    Ilustração 14 - Linha de comandos Windows

    Fiz o mesmo para o ficheiro icon.xml e locale_de.xml. Foi criado a pasta Source, o ficheiro
    rootpack.xml,o ficheiro locale_depack.xml e o ficheiro iconpack.xml.
    No explorador do Windows fui à pasta c:m2Source e lá tinha os ficheiros todos que estavam dentro dos ficheiros .epk.
    Feito isto editei as imagens no GIMP para passar de png para tga, o formato de imagem do metin2.
    Para efectuar este passo abri as imagens no GIMP e na
    aba ficheiro -> exportar selecionei a extensão .tga.

    Ilustração 15 - Edição das imagens no GIMP

    Primeiro copiei as três imagens editadas para a pasta c:m2sourceiconitem

    <Buildfile version="1.1"><Action type="extract" archivePath="C:m2locale_de" outputPath="Source" extractAll="YES"createXML="YES" xmlPath="locale_depack.xml" /></Buildfile><Buildfile version="1.1"><Action type="item_proto_extract" path="item_proto" output="item_proto_dump.xml" /></Buildfile>17
    Paulo Gonçalves – Projecto de PSI

    Depois abri o ficheiro c:m2sourcelocaledeitemlist.txt com o notepad++.
    Efectuei uma pesquisa (CTRL + F) com o número 30311, 30312 e 30319 para verificar se já existiam entradas
    desse número nesse ficheiro. Como não existia entrada para esses números eu fui acrescentar estas linhas:
    Depois editei o ficheiro c:m2sourcelocaledeitem_desc.txt com o notepad++. Efectuei uma
    pesquisa (CTRL + F) com o número 30311, 30312 e 30319 para verificar se já existiam entradas
    desse número nesse ficheiro. Como não existia adicionei as seguintes linhas:
    Agora copiei o ficheiro c:m2Sourcelocaledeitem_proto para a pasta c:m2. Executei na
    consola do Windows, na pasta c:m2, o comando m2 item_proto.xml. Isto criou o ficheiro item_proto_dump.xml.
    Editei esse ficheiro. Fiz a pesquisa acima referida, e mais uma vez como não existia adicionei as seguintes linhas:

    30311 ETC icon/item/30311.tga30312 ETC icon/item/30312.tga30319 ETC icon/item/30319.tga30311 Chave de Azurite Esta delicada chave, com uma pedra de Azurite, abre a
    passagem para o 2º Andar das Catacumbas do Demónio.
    30312 Totem de Rosto Este pedaço de madeira com um rosto cravado serve como
    chave para o 6º Andar das Catacumbas do Demónio.
    30319 Cabeça Encolhida Esta cabeça de demónio encolhida abre o selo para o 3º Andar das Catacumbas do Demónio. Este item é negociável.

    <Item vnum="30311" name="Chave de Azurite" gb2312name="Chave de Azurite" type="5" subtype="0"weight="0" size="1" antiflag="0" flag="4" wearflag="0" immuneflag="0" gold="0" buy_price="0" limittype0="0"limitvalue0="0" limittype1="0" limitvalue1="0" applytype0="0" applyvalue0="0" applytype1="0" applyvalue1="0"applytype2="0" applyvalue2="0" value0="0" value1="0" value2="0" value3="0" value4="0" value5="0" socket0="0"socket1="64944" socket2="127" socket3="65008" socket4="21631" socket5="4855" refine_vnum="0" refine_set="0"magic_pct="0" specular="0" socket_pct="0" /><Item vnum="30312" name="Totem do Resto" gb2312name="Totem do Resto" type="5" subtype="0" weight="0"size="1" antiflag="0" flag="4" wearflag="0" immuneflag="0" gold="0" buy_price="0" limittype0="0" limitvalue0="0"limittype1="0" limitvalue1="0" applytype0="0" applyvalue0="0" applytype1="0" applyvalue1="0" applytype2="0"applyvalue2="0" value0="0" value1="0" value2="0" value3="0" value4="0" value5="0" socket0="0" socket1="64944"socket2="127" socket3="65008" socket4="21631" socket5="4855" refine_vnum="0" refine_set="0" magic_pct="0"specular="0" socket_pct="0" /><Item vnum="30319" name="Cabeça Encolhida" gb2312name="Cabeça Encolhida" type="5" subtype="0"weight="0" size="1" antiflag="0" flag="4" wearflag="0" immuneflag="0" gold="0" buy_price="0" limittype0="0"limitvalue0="0" limittype1="0" limitvalue1="0" applytype0="0" applyvalue0="0" applytype1="0" applyvalue1="0"applytype2="0" applyvalue2="0" value0="0" value1="0" value2="0" value3="0" value4="0" value5="0" socket0="0"socket1="64944" socket2="127" socket3="65008" socket4="21631" socket5="4855" refine_vnum="0" refine_set="0"magic_pct="0" specular="0" socket_pct="0" />18
    Paulo Gonçalves – Projecto de PSI

    Agora compactei os arquivos de novo para colocar no cliente.
    Para tal o que eu fiz primeiro foi a criacção de um outro ficheiro .xml, item_protopack.xml com o seguinte conteudo:
    Ainda acrescentei no ficheiro iconpack.xml as seguintes linhas:
    Executei na consola do Windows, na pasta c:m2, o comando m2 item_protopack.xml.
    Isto criou o ficheiro item_proto. Copiei o item_proto para a pasta c:m2Sourcelocalede e
    Voltei a compactar tudo com os seguintes comandos:
    m2 locale_depack.xml
    m2 iconpack.xml
    Copiei os ficheiros icon.epk, icon.eix, locale_de.epk e locale_de.eix para a pasta pack do cliente.
    Abri o navicat, liguei-me a ligação ahamachi(nome escolhido anteriormente), escolhi a base de dados player e em new query inseri a seguinte query:

    <Buildfile version="1.1"><Action type="item_proto_create" path="item_proto_dump.xml" output="item_proto" /></Buildfile>INSERT INTO item_proto VALUES ('30311', 'Chave de Azurite', 'Chave de Azurite', '5', '0', '0', '1','0', '4', '0', '', '0','0', '0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0', '-1', '-1', '-1', '-1','-1', '-1', '0', '0', '0');INSERT INTO item_proto VALUES ('30312', 'Totem do Resto', 'Totem do Resto', '5', '0', '0', '1','0', '4', '0', '', '0','0', '0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0', '-1', '-1', '-1', '-1','-1', '-1', '0', '0', '0');INSERT INTO item_proto VALUES ('30319', 'Cabeça Encolhida', 'Cabeça Encolhida', '5', '0', '0', '1','0', '4', '0', '', '0','0', '0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0', '-1', '-1', '-1', '-1','-1', '-1', '0', '0', '0');<File archivedPath="icon/item/30311.tga"type="1"><![CDATA[Sourceiconitem30311.tga]]></File><File archivedPath="icon/item/30312.tga"type="1"><![CDATA[Sourceiconitem30312.tga]]></File><File archivedPath="icon/item/30319.tga"type="1"><![CDATA[Sourceiconitem30319.tga]]></File>19
    Paulo Gonçalves – Projecto de PSI

    Feito isto fui ao cliente, fiz login, escolhi a personagem e no chat escrevi /reload p para fazer um recarregamento as tabelas _proto.
    Depois no chat fiz /i 30311. Verifiquei se apareceu o item. Repeti o mesmo passo para os items 30312 e 30319.
    Ilustração 16 - Os três novos itens

    20
    Paulo Gonçalves – Projecto de PSI

    Parte II – Implementação de NPCS.
    Nesta parte foi adicionado um NPC (Non Playable Character), para fazer o teletransporte para dentro uma nova zona implementada.
    Para isso usei um modelo já existente de NPC (um ficheiro .gr2).
    As únicas coisas que fiz foi a instrução SQL e integrar o NPC com o cliente para que o possamos visionar.
    O primeiro passo que tomei foi extrair o ficheiro root.epk, e para tal efeito criei o ficheiro root.xml.
    Nele escrevi o seguinte:
    Copiei os ficheiros root.epk e root.eix, executei o seguinte comando na pasta c:m2: m2 root.xml e o programa descompactou os ficheiros contidos dentro do ficheiro root.
    Editei o documento c:m2sourcenpclist.txt com o notepad++ e pesquisei para ver se existe a linha 20133.
    Como não existia adicionei a seguinte linha nesse mesmo ficheiro:
    Feito isto guardei o documento e na consola executei o comando m2 rootpack.xml.
    Copiei o root.epk e root.eix gerados e colei dentro da pasta pack do cliente.

    Ilustração 17 - Modelo do NPC

    <Buildfile version="1.1"><Action type="extract" archivePath="C:m2root"outputPath="Source" extractAll="YES" createXML="YES"xmlPath="rootpack.xml" /></Buildfile>20133 jinno_patrol_spear21
    Paulo Gonçalves – Projecto de PSI

    Depois fiz a query SQL:
    Fiz login no jogo, digitei no chat /reload p e depois /m 20133.
    Ilustração 18 - NPC adicionado

    INSERT INTO mob_proto VALUES (20133, 'Guardião das Catacumbas', 'Guardião dasCatacumbas', '5', '1', '0', '120', '', 'NOMOVE', '0', '', 'STUN,SLOW,CURSE,TERROR', '0', '', '2','0','0','0','0','0','0', '120', '3', '1', '0','0', '100', '4', '100', '100', '0', '2000', '150', '0', '0', '0', '0', '0','0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0','0', '0', null, null, null, null, null, null);[/center][center]22
    Paulo Gonçalves – Projecto de PSI

    Parte III – Implementação de monstros(mobs).
    O cliente que fiz a transferência já tem todos os monstros que quero inserir implementados,
    portanto só precisei de trabalhar as querys SQL que foram as seguintes:
    INSERT INTO `mob_proto` VALUES ('2501', 'zombie_diseased_kid', 0x48F66C6C656E7175616C6C65, '1', '0', '0', '100', '', 'AGGR', '0', 'HUMAN', '', '0', '', '0','30', '40', '200', '10', '300', '450', '15000', '3', '3', '5000000', '5000000', '350000', '70', '100', '100', '100', '2000', '120', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0','0', '0', '0', '0', '0', '0', '0', '0', '1.2', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0');INSERT INTO `mob_proto` VALUES ('2502', 'zombie_diseased_dog', 0x48F66C6C656E68756E64, '1', '0', '0', '98', '', 'AGGR', '0', 'HUMAN', '', '0', '', '0', '33','40', '200', '10', '300', '450', '15000', '3', '3', '5000000', '5000000', '350000', '70', '100', '100', '100', '2000', '120', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0','0', '0', '0', '0', '0', '0', '0', '1.2', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0');INSERT INTO `mob_proto` VALUES ('2503', 'Zombie', 0x48F66C6C656E6F6666697A696572, '2', '0', '0', '105', '', 'AGGR', '0', 'HUMAN', '', '0', '', '0', '34', '40','200', '10', '300', '450', '15000', '3', '3', '5000000', '5000000', '350000', '70', '100', '100', '100', '2000', '120', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0','0', '0', '0', '0', '0', '1.2', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0');INSERT INTO `mob_proto` VALUES ('2504', 'zombie_diseased_sword', 0x48F66C6C656E6F6666697A696572, '2', '0', '0', '105', '', 'AGGR', '0', 'HUMAN', '', '0','', '0', '40', '40', '200', '10', '300', '450', '15000', '3', '3', '5000000', '5000000', '350000', '70', '100', '100', '100', '2000', '120', '0', '0', '0', '0', '0', '0', '0', '0', '0','0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '1.2', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0');INSERT INTO `mob_proto` VALUES ('2505', 'zombie_diseased_spear', 0x48F66C6C656E77E46368746572, '2', '0', '0', '110', '', 'AGGR', '0', 'HUMAN','SLOW,FALL,CURSE,POISON,TERROR', '0', '', '0', '120', '40', '150', '10', '300', '700', '50000', '3', '3', '5000000', '5000000', '350000', '70', '100', '100', '100','5000', '120', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '1.2', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0');INSERT INTO `mob_proto` VALUES ('2506', 'zombie_diseased_bow', 0x5A7765696B6F70662D48F66C6C656E736368FC747A65, '2', '0', '0', '105', '', 'AGGR','0', 'HUMAN', '', '0', '', '0', '43', '40', '200', '10', '300', '450', '15000', '3', '3', '5000000', '5000000', '350000', '70', '100', '100', '100', '2000', '120', '0', '0', '0', '0','0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '1.2', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0');INSERT INTO `mob_proto` VALUES ('2507', 'zombie_diseased_boss', 0x48F66C6C656E67726569666572, '4', '0', '0', '105', '', 'AGGR', '0', 'HUMAN', '', '0', '','0', '47', '40', '200', '10', '300', '450', '15000', '3', '3', '5000000', '5000000', '350000', '70', '100', '100', '100', '2000', '120', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0','0', '0', '0', '0', '0', '0', '0', '0', '0', '1.2', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0');INSERT INTO `mob_proto` VALUES ('2508', 'zombie_soldier_scythe', 0x48F66C6C656E6B726965676572, '3', '0', '0', '105', '', 'AGGR', '0', 'HUMAN', '', '0', '','0', '65', '40', '200', '10', '600', '800', '150000', '3', '3', '5000000', '5000000', '350000', '70', '100', '100', '100', '2000', '120', '11974', '0', '0', '0', '0', '0', '0', '0','0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '1.2', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0');INSERT INTO `mob_proto` VALUES ('2509', 'zombie_soldier_bow', 0x48F66C6C656E736368FC747A65, '3', '0', '0', '105', '', 'AGGR', '0', 'HUMAN', '', '0', '', '0','59', '40', '200', '10', '300', '450', '30000', '3', '3', '5000000', '5000000', '350000', '70', '100', '100', '100', '2000', '120', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0','0', '0', '0', '0', '0', '0', '0', '0', '1.2', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0');INSERT INTO `mob_proto` VALUES ('2510', 'zombie_soldier_spear', 0x48F66C6C656E73706565726BE46D70666572, '3', '0', '0', '105', '', 'AGGR', '0','HUMAN', '', '0', '', '0', '70', '40', '200', '10', '300', '450', '30000', '3', '3', '5000000', '5000000', '350000', '70', '100', '100', '100', '2000', '120', '0', '0', '0', '0', '0','0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '1.2', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0');INSERT INTO `mob_proto` VALUES ('2511', 'zombie_magician', 0x48F66C6C656E7072696573746572, '3', '0', '0', '105', '', 'AGGR', '0', 'HUMAN', '', '0', '', '0','80', '40', '200', '10', '300', '450', '30000', '3', '3', '5000000', '5000000', '350000', '70', '100', '100', '100', '2000', '120', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0','0', '0', '0', '0', '0', '0', '0', '0', '1.2', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0');INSERT INTO `mob_proto` VALUES ('2512', 'zombie_bigboss', 0x48F66C6C656E6D616A6F72, '4', '0', '0', '105', '', 'AGGR', '0', 'HUMAN', '', '0', '', '0', '80', '40','200', '10', '300', '450', '30000', '3', '3', '5000000', '5000000', '350000', '70', '100', '100', '100', '2000', '120', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0','0', '0', '0', '0', '0', '1.2', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0');INSERT INTO `mob_proto` VALUES ('2513', 'zombie_ghost', 0x48F66C6C656E6D65747A6C6572, '2', '0', '0', '105', '', 'AGGR', '0', 'HUMAN', '', '0', '', '0', '67','40', '200', '10', '300', '450', '30000', '3', '3', '5000000', '5000000', '350000', '70', '100', '100', '100', '2000', '120', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0','0', '0', '0', '0', '0', '0', '0', '1.2', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0');INSERT INTO `mob_proto` VALUES ('2514', 'zombie_general', 0x48F66C6C656E67656E6572616C, '4', '0', '0', '105', '', 'AGGR', '0', 'HUMAN', '', '0', '', '0', '86','40', '200', '10', '300', '450', '30000', '3', '3', '5000000', '5000000', '350000', '70', '100', '100', '100', '2000', '120', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0','0', '0', '0', '0', '0', '0', '0', '1.2', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0');23
    Paulo Gonçalves – Projecto de PSI

    INSERT INTO `mob_proto` VALUES ('2541', 'zombie_soldier_scy', 0x42F67365722048F66C6C656E6B726965676572, '4', '0', '0', '105', '', 'AGGR', '0', 'HUMAN', '', '0', '', '0', '81', '40', '200', '10', '600','800', '150000', '3', '3', '8500000', '5000000', '350000', '70', '100', '100', '100', '2000', '120', '11973', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '1.2', '0', '0', '0', '0', '0', '0', '0', '0', '0','0', '0', '0', '0', '0', '0', '0', '0', '0', '0');INSERT INTO `mob_proto` VALUES ('2542', 'zombie_soldier_bow', 0x42F67365722048F66C6C656E736368FC747A65, '2', '0', '0', '105', '', 'AGGR', '0', 'HUMAN', '', '0', '', '0', '66', '40', '200', '10', '300','450', '50000', '3', '3', '5000000', '5000000', '350000', '70', '100', '100', '100', '2000', '120', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '1.2', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0','0', '0', '0', '0', '0', '0', '0', '0', '0');INSERT INTO `mob_proto` VALUES ('2543', 'zombie_soldier_spear', 0x42F67365722048F66C6C656E73706565726BE46D70666572, '2', '0', '0', '105', '', 'AGGR', '0', 'HUMAN', '', '0', '', '0', '70', '40', '200','10', '300', '450', '50000', '3', '3', '5000000', '5000000', '350000', '70', '100', '100', '100', '2000', '120', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '1.2', '0', '0', '0', '0', '0', '0', '0','0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0');INSERT INTO `mob_proto` VALUES ('2544', 'zombie_magician', 0x42F67365722048F66C6C656E7072696573746572, '2', '0', '0', '105', '', 'AGGR', '0', 'HUMAN', '', '0', '', '0', '59', '40', '200', '10', '300','450', '50000', '3', '3', '5000000', '5000000', '350000', '70', '100', '100', '100', '2000', '120', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '1.2', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0','0', '0', '0', '0', '0', '0', '0', '0', '0');INSERT INTO `mob_proto` VALUES ('2545', 'zombie_bigboss', 0x42F67365722048F66C6C656E6D616A6F72, '4', '0', '0', '105', '', 'AGGR', '0', 'HUMAN', '', '0', '', '0', '76', '40', '200', '10', '300', '450','50000', '3', '3', '5000000', '5000000', '350000', '70', '100', '100', '100', '2000', '120', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '1.2', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0','0', '0', '0', '0', '0', '0', '0');INSERT INTO `mob_proto` VALUES ('2546', 'zombie_ghost', 0x42F67365722048F66C6C656E6D65747A6C6572, '3', '0', '0', '105', '', 'AGGR', '0', 'HUMAN', '', '0', '', '0', '80', '40', '200', '10', '300', '450','50000', '3', '3', '5000000', '5000000', '350000', '70', '100', '100', '100', '2000', '120', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '1.2', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0','0', '0', '0', '0', '0', '0', '0');INSERT INTO `mob_proto` VALUES ('2547', 'zombie_general', 0x42F67365722048F66C6C656E67656E6572616C, '5', '0', '0', '105', '', 'AGGR', '0', 'HUMAN', 'SLOW,FALL,CURSE,POISON,TERROR', '0', '','0', '90', '40', '200', '10', '300', '450', '50000', '3', '3', '5000000', '5000000', '350000', '70', '100', '100', '100', '2000', '120', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '1.2', '0', '0','0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0');INSERT INTO `mob_proto` VALUES ('2591', 'zombie_king', 0x5461727461726F73, '5', '0', '0', '105', '', 'AGGR', '0', 'HUMAN', 'SLOW,FALL,CURSE,POISON,TERROR', '0', '', '0', '90', '40', '200', '10', '450','800', '200000', '3', '3', '12000000', '12000000', '350000', '70', '100', '100', '100', '2000', '120', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '1.2', '0', '0', '0', '0', '0', '0', '0', '0', '0','0', '0', '0', '0', '0', '0', '0', '0', '0', '0');INSERT INTO `mob_proto` VALUES ('2592', 'zombie_king', 0x48F66C6C656E62617374617264, '5', '0', '0', '105', '', 'AGGR', '0', 'HUMAN', 'SLOW,FALL,CURSE,POISON,TERROR', '0', '', '0', '90', '40', '200','10', '450', '800', '200000', '3', '3', '12000000', '12000000', '350000', '70', '100', '100', '100', '2000', '120', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '1.2', '0', '0', '0', '0', '0', '0','0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0');INSERT INTO `mob_proto` VALUES ('2593', 'zombie_king', 0x48F66C6C656E62617374617264, '5', '0', '0', '105', '', 'AGGR', '0', 'HUMAN', 'SLOW,FALL,CURSE,POISON,TERROR', '0', '', '0', '90', '40', '200','10', '450', '800', '200000', '3', '3', '12000000', '12000000', '350000', '70', '100', '100', '100', '2000', '120', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '1.2', '0', '0', '0', '0', '0', '0','0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0');INSERT INTO `mob_proto` VALUES ('2594', 'zombie_king', 0x48F66C6C656E62617374617264, '5', '0', '0', '105', '', 'AGGR', '0', 'HUMAN', 'SLOW,FALL,CURSE,POISON,TERROR', '0', '', '0', '90', '40', '200','10', '450', '800', '200000', '3', '3', '14000000', '14000000', '350000', '70', '100', '100', '100', '2000', '120', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '1.2', '0', '0', '0', '0', '0', '0','0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0');INSERT INTO `mob_proto` VALUES ('2595', 'zombie_king', 0x457265626F73, '5', '0', '0', '105', '', 'AGGR', '0', 'HUMAN', 'SLOW,FALL,CURSE,POISON,TERROR', '0', '', '0', '90', '40', '200', '10', '450', '800','200000', '3', '3', '14000000', '14000000', '350000', '70', '100', '100', '100', '2000', '120', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '1.2', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0','0', '0', '0', '0', '0', '0', '0', '0');INSERT INTO `mob_proto` VALUES ('2596', 'zombie_king', 0x417A7261656C732042727574, '5', '0', '0', '105', '', 'AGGR', '0', 'HUMAN', 'SLOW,FALL,CURSE,POISON,TERROR', '0', '', '0', '90', '40', '200', '10','700', '900', '200000', '3', '3', '14000000', '14000000', '350000', '70', '100', '100', '100', '2000', '120', '11972', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '1.2', '0', '0', '0', '0', '0', '0','0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0');INSERT INTO `mob_proto` VALUES ('2597', 'zombie_god', 0x436861726F6E, '5', '0', '0', '120', '', 'AGGR', '0', 'HUMAN', 'SLOW,FALL,CURSE,POISON,TERROR', '0', '', '0', '90', '40', '200', '10', '700', '800','200000', '3', '3', '16000000', '16000000', '350000', '70', '100', '100', '100', '2000', '120', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '1.2', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0','0', '0', '0', '0', '0', '0', '0', '0');INSERT INTO `mob_proto` VALUES ('2598', 'zombie_god', 0x417A7261656C, '5', '0', '0', '120', '', 'AGGR', '0', 'HUMAN', 'SLOW,FALL,CURSE,POISON,TERROR', '0', '', '0', '120', '40', '150', '10', '800', '1000','250000', '3', '3', '16000000', '16000000', '600000', '70', '100', '100', '100', '5000', '120', '11971', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '1.2', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0','0', '0', '0', '0', '0', '0', '0', '0', '0');24
    Paulo Gonçalves – Projecto de PSI

    Tendo efectuado as querys foi ao cliente, fiz /reload p e expirimentei evocar todos os mobs que adicionei tendo sido eles:

    2501, 2502, 2503, 2504, 2505, 2506, 2507, 2508, 2509, 2510, 2511, 2512, 2513, 2514, 2541,
    2542, 2543, 2544, 2545, 2546, 2547, 2591, 2592, 2593, 2594, 2595, 2596, 2507, 2598, 30101,
    30102, 30103, 30104, 30111, 30112, 30113, 30114, 30115, 30116, 30117, 30118, 30119.
    Ilustração 19 - Monstros implementados

    INSERT INTO `mob_proto` VALUES ('30101', '?????', 0x53746174756520646573204B7564, '5', '1', '0', '70', '', 'NOMOVE', '0', '', 'STUN,SLOW,CURSE,TERROR', '0', '', '2', '0', '0', '0', '0', '0', '0', '3954','3', '1', '0', '0', '562', '79', '100', '100', '0', '2000', '150', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0');INSERT INTO `mob_proto` VALUES ('30102', '?????', 0x426173616C742D4F62656C69736B, '5', '1', '0', '70', '', 'NOMOVE', '0', '', 'STUN,SLOW,CURSE,TERROR', '0', '', '2', '0', '0', '0', '0', '0', '0', '3954','3', '1', '0', '0', '562', '79', '100', '100', '0', '2000', '150', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0');INSERT INTO `mob_proto` VALUES ('30103', '?????', 0x536368696C646B72F674656E66656C73, '5', '1', '0', '70', '', 'NOMOVE', '0', '', 'STUN,SLOW,CURSE,TERROR', '0', '', '2', '0', '0', '0', '0', '0', '0','3954', '3', '1', '0', '0', '562', '79', '100', '100', '0', '2000', '150', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0','0', '0');INSERT INTO `mob_proto` VALUES ('30104', '?????', 0x52756E656E706661686C, '5', '1', '0', '70', '', 'NOMOVE', '0', '', 'STUN,SLOW,CURSE,TERROR', '0', '', '2', '0', '0', '0', '0', '0', '0', '3954', '3', '1', '0','0', '562', '79', '100', '100', '0', '2000', '150', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0');INSERT INTO `mob_proto` VALUES ('30111', 'zombie_ghost_door', 0x312E20546F72206465722056657264616D6D6E6973, '5', '0', '0', '120', '', 'AGGR', '0', 'HUMAN','SLOW,FALL,CURSE,POISON,TERROR', '0', '', '0', '120', '40', '150', '10', '800', '1000', '250000', '3', '3', '16000000', '16000000', '600000', '70', '100', '100', '100', '5000', '120', '11971', '0', '0', '0', '0','0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '1.2', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0');INSERT INTO `mob_proto` VALUES ('30112', 'zombie_ghost_door', 0x322E20546F72206465722056657264616D6D6E6973, '5', '0', '0', '120', '', 'AGGR', '0', 'HUMAN','SLOW,FALL,CURSE,POISON,TERROR', '0', '', '0', '120', '40', '150', '10', '800', '1000', '250000', '3', '3', '16000000', '16000000', '600000', '70', '100', '100', '100', '5000', '120', '11971', '0', '0', '0', '0','0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '1.2', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0');INSERT INTO `mob_proto` VALUES ('30113', 'zombie_ghost_door', 0x332E20546F72206465722056657264616D6D6E6973, '5', '0', '0', '120', '', 'AGGR', '0', 'HUMAN','SLOW,FALL,CURSE,POISON,TERROR', '0', '', '0', '120', '40', '150', '10', '800', '1000', '250000', '3', '3', '16000000', '16000000', '600000', '70', '100', '100', '100', '5000', '120', '11971', '0', '0', '0', '0','0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '1.2', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0');INSERT INTO `mob_proto` VALUES ('30114', 'zombie_ghost_door', 0x342E20546F72206465722056657264616D6D6E6973, '5', '0', '0', '120', '', 'AGGR', '0', 'HUMAN','SLOW,FALL,CURSE,POISON,TERROR', '0', '', '0', '120', '40', '150', '10', '800', '1000', '250000', '3', '3', '16000000', '16000000', '600000', '70', '100', '100', '100', '5000', '120', '11971', '0', '0', '0', '0','0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '1.2', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0');INSERT INTO `mob_proto` VALUES ('30115', 'zombie_ghost_door', 0x352E20546F72206465722056657264616D6D6E6973, '5', '0', '0', '120', '', 'AGGR', '0', 'HUMAN','SLOW,FALL,CURSE,POISON,TERROR', '0', '', '0', '120', '40', '150', '10', '800', '1000', '250000', '3', '3', '16000000', '16000000', '600000', '70', '100', '100', '100', '5000', '120', '11971', '0', '0', '0', '0','0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '1.2', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0');INSERT INTO `mob_proto` VALUES ('30116', 'zombie_ghost_door', 0x362E20546F72206465722056657264616D6D6E6973, '5', '0', '0', '120', '', 'AGGR', '0', 'HUMAN','SLOW,FALL,CURSE,POISON,TERROR', '0', '', '0', '120', '40', '150', '10', '800', '1000', '250000', '3', '3', '16000000', '16000000', '600000', '70', '100', '100', '100', '5000', '120', '11971', '0', '0', '0', '0','0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '1.2', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0');INSERT INTO `mob_proto` VALUES ('30117', 'zombie_ghost_door', 0x372E20546F72206465722056657264616D6D6E6973, '5', '0', '0', '120', '', 'AGGR', '0', 'HUMAN','SLOW,FALL,CURSE,POISON,TERROR', '0', '', '0', '120', '40', '150', '10', '800', '1000', '250000', '3', '3', '16000000', '16000000', '600000', '70', '100', '100', '100', '5000', '120', '11971', '0', '0', '0', '0','0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '1.2', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0');INSERT INTO `mob_proto` VALUES ('30118', 'zombie_ghost_door', 0x382E20546F72206465722056657264616D6D6E6973, '5', '0', '0', '120', '', 'AGGR', '0', 'HUMAN','SLOW,FALL,CURSE,POISON,TERROR', '0', '', '0', '120', '40', '150', '10', '800', '1000', '250000', '3', '3', '16000000', '16000000', '600000', '70', '100', '100', '100', '5000', '120', '11971', '0', '0', '0', '0','0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '1.2', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0');INSERT INTO `mob_proto` VALUES ('30119', 'zombie_ghost_door', 0x392E20546F72206465722056657264616D6D6E6973, '5', '0', '0', '120', '', 'AGGR', '0', 'HUMAN','SLOW,FALL,CURSE,POISON,TERROR', '0', '', '0', '120', '40', '150', '10', '800', '1000', '250000', '3', '3', '16000000', '16000000', '600000', '70', '100', '100', '100', '5000', '120', '11971', '0', '0', '0', '0','0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '1.2', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0');25
    Paulo Gonçalves – Projecto de PSI

    Dificuldades Sentidas
    Uma das dificuldades que senti no desenvolvimento deste projecto foi o de encontrar uns ficheiros de servior funcionais,
    pois todas as transferências que efectuei davam erros de configuração.
    Outra dificuldade foi o tempo que tive para a concretização do mesmo.

    26
    Paulo Gonçalves – Projecto de PSI

    Conclusão
    Diverti-me a realizar este projecto pois é uma coisa de que gosto muito.
    Embora não tenha conseguido concretizar todos os objectivos por falta de tempo, penso que o tempo foi bem
    distribuido para as tarefas, e consegui fazer o máximo que o tempo me permitia.
    Passei grandes momentos a fazer pesquisas, falar com outras pessoas sobre problemas encontrados
    nos ficheiros do servidor e a publicar tuturiais de minha autoria sobre este assunto.
    Tive ajuda do meu irmão Luis Carlos Graça, pois ele me disponibilizou um computador para montar os ficheiros de servidor,
    embora esteja a usar o meu computador de momento por falhas de configurações.
    No futuro desejo abrir o servidor ao público para que mais pessoas possam disfrutar do meu
    trabalho e desenvolver os objectivos que me faltam. Desejo ainda implementar mais coisas a
    nivel de missões, profissões, masmorras e campos de batalha.
    Para concluir espero que este relatório seja objectivo e de fácil compreensão.
    Paulo Gonçalves

    27
    Paulo Gonçalves – Projecto de PSI

    Girias utilizadas neste documento e no mundo dos jogos
    Download – Transferência;
    Upload – Alojar o ficheiro num servidor;
    Cliente – Programa que estabelece a ligação entre o utilizador e o servidor;
    NPC – Non Playable Character – Personagem comandada pelo computador;
    Mob – NPC com o qual o jogador luta para adquirir experiência, bens e dinheiro;
    Masmorras – Mapa que se tem de fazer determinadas condições para ir passando para a
    próxima área, normalmente precisa-se de um grupo para conseguir completar uma masmorra;
    Campo de Batalha – Mapa em que os jogadores se defrontam com o objectivo de marcar mais
    pontos. Cada morte de um jogador equivale a um ponto;
    Alianças – Uniões feitas entre jogadores com os mesmos ideais ou fins;
    Grupo – Junção temporário de Vários jogadores com o fim de atingir determinado objectivo;
    HP – Health Points – Pontos de Vida, é o tanto de vida que um jogador tem;
    SP – Spirit Points – Pontos de Espirito, é o tanto de mana que o jogador tem para executar as habilidades;
    Skills – Habilidades – Ataques especiais que só podem ser executados por determinada raça;
    Noob – Jogador novato, sem experiência de jogo;
    Leet – Jogador experiente, já jogou bastantes horas o jogo de forma que aprendeu muitos
    truques e dicas para fazer o máximo dinheiro e/ou experiência;
    Experiência – Quando se chega a uns determinados pontos de experiência o jogador sobe um nÍvel.
    Dinheiro – Moeda de troca no jogo.

    28
    Paulo Gonçalves – Projecto de PSI

    Bibliografia e Netgrafia
    http://cyber-gamers.org/ - Tutoriais escritos em português
    http://www.youtube.com/user/mt2tuguinha - Tutoriais em Video
    http://newmetin2.net/2010/02/02/codigos-gm-pt-pt/ - Códigos utilizados pelos GMs
    http://www.elitepvpers.com/forum/metin2-pserver-discussions-questions/ - Tutoriais escritos em alemão.
  17. Upvote
    purabrisa reacted to Cσяvσ⋆ in [Release] Files 2013Er + Cliente   
    Olá comunidade, gostaram das files que o lauling fez? Gostaram? Tenho aqui um tipo de v2 para as files dele!
    Linguagem: Alemão
    Apresentação do cliente:
    - Cliente 2013 com possibilidade de edição e com proteções a hacks
    - item_proto + mob_proto ajustado ao oficial
    - Sistema de costumes instalado de paylasici
    - Sistema de energia
    - Skybox para o novo exe (binário)
    - 4 Canais (Files + Cliente)
    - Tudo o que existe no original deste momento
    - Todos os Costumes
    - Pots automáticos
    - Fumo azul original
    - mob_proto actualizado
    - Sistema de costumes expande-se
    - Binário do cliente r34669
    Apresentação das files:
    - 4 Canais
    - Sistema de Costumes by Zero(
    - Moobs beta dos oficiais
    - Armaduras beta dos oficiais
    - game by zero (Sistema de pets full -&--#62; pet + cavalo)
    - Questlib inserida pelo Mijago
    - Proteção a Kickhack
    - Nível máximo 105
    - Quests do biólogo oficiais
    - Pedra Arco-Iris desbugada
    - Tabela de logs reparada
    - OX oficial em alemão
    - Grupo de moobs beta a funcionar corretamente
    - Mapas beta dos oficiais
    - Sistema de montadas inserido
    - Cabelos beta dos oficiais
    - Mais moobs inseridos e corretamente desbugados
    - Quest de cofre pôr Zero
    - Bugs do cliente arranjados
    - Evento "Páscoa" e "Natal" a funcionar corretamente
    - Efeito dos novos aneis corretamente desbugado
    - Dança do GangnamStyle no 6
    - Sistema de costumes a expandir
    - Novos minérios
    - Cinco núcleos por ch e game99
    - Quest do DR
    - Ida ao dragão
    - Fix para a Api-toll
    - Quest dos cabelos desbugada
    - Sistema de energia
    - V3 (igual ao alemão)
    - Proteção para DC's
    - Script de Backup
    - "Ctrl + G" para subir e descer de uma montada (igual ao oficial)
    - Quest das renas
    - Mapas beta a funcionar corretamente
    - Portal do V2 para o V3 a funcionar corretamente
    - "Espirito do sura" no mesmo lugar que o oficial
    Dados das files:
    Mysql:
    id: root
    pw: (não tem)
    Conta ingame:
    id: admin
    pw: (não tem)
    Prints:

    Download das files
    .vdi: https://mega.co.nz/#...cHvmeQTNbphbK84
    .tar.gz: https://mega.co.nz/#...IwDEK_dwwm20tRA
    Cliente: https://mega.co.nz/#...iFE-lQfHa3ZAv0c
    Extractor (se não tiverem): https://mega.co.nz/#...ZCvxF_2_MWDWQdw
    ATUALIZAÇÕES:
    BIN atualizado com diff para montadas a atacar!
    Download: https://mega.co.nz/#...i_1p2NlID6XGtxA
    VirusTotal: https://www.virustot...sis/1370172218/ (7/46 Falsos Positivos)
    Video de How-To:

    http-~~-//www.youtube.com/watch?feature=player_embedded&v=z1CjgkSqZOI
    Créditos: Invoice™
    Créditos do tópico visto (novos links): Dane (pro-area)
    O melhor do mercado...
    Divirtam-se :D
  18. Upvote
    purabrisa reacted to RuanSombra in [Novo Server] Uriel3 Games   
    Olá Comunidade Cyber-Gamers
    Venho posta um novo topico do meu Servidor UrieL3 Games
    Um Novo Servidor PvP , Servidor PvP ( Sem itemshop )!
    Servidor Free tudo ingame !
    Servidor Brasileiro Online a 8 Dias
    Metas de Plays Batidos por dias 50-60
    Servidor Diferente de muitos , que Passam uma duas semanas Onlines é Fecham
    Servidor com Administrador Responsavel édedicado ao Servidor !!
    Servidor FreeBSD 9.0 !
    Proteçoes em nosso servidor !
    Estou esperando vocês nessa nova aventura UrieL3 Games a Nova Revolução
    Servidor Criado Para Jogabilidade dos Play's não para fins Lucrativos !
    Espero que vocês gostem do meu trabalho é do Servidor !
    URIEL3 GAMES UM SERVIDOR SÉRIO COM VOCÊS !
    Servidor será Desenvolvido no seu tempo cérto novas coissas estão , por vim em nosso Servidor UrieL3 Games
    Tudo no seu tempo Galera !
    Novo Web Site Desenvolvido Para UrieL3 Games !
    Mais Informaçoes em nosso Forum é na nossa pagina do facebook !
    Dowloand do cliente em nosso site !
    Apagem o topico antigo !
    Pegeno video de apresentação do nosso servidor !!
    http-~~-//www.youtube.com/watch?v=ikjX0jmMLj0





    Paginas da web !
    Forum do nosso Servidor : http://www.uriel3games.com.br/Forum/
    Site do nosso Servidor : http://www.uriel3games.com.br





    Paginas do facebook !
    http://www.facebook.com/Uriel3Servidor
    http://www.facebook....07081265978483/

    Bom jogo a todos !
  19. Upvote
    purabrisa reacted to EliminaEstaContaSff in Virtualizar Ficheiros Para Dentro Do .Bin\.Exe   
    Se uma imagem vale mil palavras, quantas valerão um vídeo?

    https-~~-//www.youtube.com/watch?v=eKxwHjmWjfI
    Dúvidas erros e outras coisas postem aqui que alguém vos ajudará '-'
    Download
    https://mega.co.nz/#!oxxTXLzb!TeZcynolNGsXSJva6qhZdwQ1vMci9xJgC3VK7soxi_8
    SCAN
    https://www.virustotal.com/pt/file/cbd28c87218a2b397c138ff1b932c7813fc0c0da7cb94fcfdeeeea60803dc7be/analysis/1363363892/
  20. Upvote
    purabrisa reacted to Cσяvσ⋆ in [Lauling] Id'S Dos Itens Novos   
    Olá comunidade, mais um tópico.
    2 horas à procura de todos os itens.. uh.
    Vou ver se agora faço também dos moobs novos ._.
    Armas:

    460 - Espada Runica470 - Espada Runica 2 (Sura)1340 - Adagas Runicas2370 - Arco Runico5340 - Campainha Runica7370 - Leque Runico Armaduras:
    20000 - Armadura Runica para Warrior20250 - Armadura Runica para Ninja20500 - Armadura Runica para Shaman20750 - Armadura Runica para Sura Acessórios:
    13140 - Escudo Titã14220 - Pulseira de Azurite15370 - Botas serenes15390 - Botas Pele de dragão15410 - Botas Aquaticas15430 - Botas Celestiais16220 - Colar de Azurite17220 - Brincos de Azurite Costumes:
    41006 até 41054 Pets:
    53001 - Fenix de fogo53002 - Rena bebé53003 - Fenix de gelo53005 - Pequeno Azrael53006 - Lobo bebé53007 - Leão bebé (No meu aparece um javali -_-)53008 - javali bebé53009 - Tigre bebé Montadas:
    71131 - Cavalo negro (30m)71128 - Montada do leão negro (480h)71127 - Montada do tigre negro (480h)71126 - Montada do Lobo da tempestade (480h)71125 - Montada do Javali Negro (480h)71119 - Montada do Tigre (1x)71117 - Montada do Lobo (1x)52090 - Montada da Rena Azul (+100 ataque)52089 - Montada da Rena Azul (+150 defesa)52088 - Montada da Rena Azul (+500 Hp)52087 - Montada da Rena Azul (+5% exp)52086 - Montada da Rena Azul (+5% monstros)52085 - Montada da Rena Vermelha (+30 ataque)52084 - Montada da Rena Vermelha (+50 defesa)52083 - Montada da Rena Vermelha (+250 Hp)52082 - Montada da Rena Vermelha (+3% exp)52081 - Montada da Rena Vermelha (+3% monstros)52076 - Montada da Rena52060 - Montada do Tigre Armado52050 - Montada do Tigre Cinzento52045 - Montada do Leão Armado52035 - Montada do Leão Cinzento52030 - Montada do Lobo Armado52020 - Montada do Tigre Cinzento52015 - Montada do Javali Armado52005 - Montada do Javali cinzento Extras:
    71109 - Pergaminho impuro71108 - Poção da reneração (800 Hp)71107 - Pessego da Honra (+3k rank)71106 - Pergaminho da Destreza71105 - Pergaminho da Força71104 - Pergaminho da Inteligência71103 - Pergaminho da Vida71101 - Poção do cooldown (+20%)71100 - Certificado de leitura51002 - Cristal de Energia51001 - Cristal Azul50156 - Chave arco-iris50155 - Chave Amarela50154 - Chave Laranja50153 - Chave Roxa50152 - Chave Azul50151 - Chave Verde50150 - Chave Vermelha50137 - Baú Amarelo50136 - Baú Laranja50135 - Baú Roxo50134 - Baú Azul50133 - Baú Verde50132 - Baú Vermelho50131 - Baú Amarelo aberto50130 - Baú Laranja aberto50129 - Baú Roxo aberto50128 - Baú Azul aberto50127 - Baú Verde aberto50126 - Baú Vermelho aberto50124 - Baú de madeira50122 - Baú dos brincos50121 - Baú dos colares50120 - Baú das pulseiras50115 - Caixa lilás50114 - Caixa azul50113 - Caixa verde50112 - Caixa verde claro50111 - Caixa amarela50110 - Caixa castanha50109 - Caixa vermelha50096 - Bola de futebol50095 - Cabeça de Abóbora50094 - Sushi de Peixe-gato50093 - Sushi de Salmão50092 - Sushi de Carpa50091 - Sushi de Peixe-Dourado50086 - Bolo de abóbora50085 - Semente embrulhada Refines:
    71129 - Garra do dragão azul71123 - Escama do dragão azul Penteados:
    Shaman Masculino:75620 - Máscara de Abóbora75619 - Turbante75618 - Lenço do deserto75617 - Chapéu vermelho75616 - Chapéu samurai75614 - Cabelo AfroSura Femenino:75420 - Máscara de abóbora75419 - Turbante75418 - Lenço do deserto75417 - Véu75416 - Chapéu samurai75414 - Cabelo AfroNinja Masculino:75220 - Máscara de Abóbora75219 - Turbante75218 - Lenço do deserto75217 - Chapéu vermelho75216 - Chapéu samurai75214 - Cabelo AfroWarrior Femenino:75020 - Máscara de Abóbora75019 - Turbante75018 - Lenço do deserto75017 - Chapéu vermelho75016 - Chapéu samurai75014 - Cabelo AfroWarrior Masculino:74020 - Máscara de Abóbora74019 - Turbante74018 - Lenço do deserto74017 - Chapéu vermelho74016 - Chapéu samurai74014 - Cabelo AfroNinja Feminino:74270 - Máscara de Abóbora74269 - Turbante74268 - Lenço do deserto74267 - Chapéu vermelho74266 - Chapéu samurai74264 - Cabelo AfroSura Masculino:74520 - Máscara de Abóbora74519 - Turbante74518 - Lenço do deserto74517 - Chapéu vermelho74516 - Chapéu samurai74514 - Cabelo AfroShaman Feminino:74770 - Máscara de Abóbora74769 - Turbante74768 - Lenço do deserto74767 - Chapéu vermelho74766 - Chapéu samurai74764 - Cabelo Afro Poções:
    Benção do Sol:72726 - (xxl)72725 - (grande)72724 - (médio)72723 - (pequeno)Benção da lua:72730 - (xxl)72729 - (grande)72728 - (médio)72727 - (pequeno) Aneis & Etc:
    72712 - Pulseira do dragão (-30% dano do oponente)72711 - Brincos do dragão (+30% dano de habilidade)72710 - Pulseira do tigre (+300 armadura)72709 - Brincos do tigre (+200 valor de ataque)71150 - Ovo dourado71149 - Anel da força letal71148 - Anel da sabedoria71143 - Anel da felicidade71136 - ChupaChupa71135 - Anel Lua Crescente Se faltar alguma coisa avisem ai em baixo :D
  21. Upvote
    purabrisa reacted to тнєℓιƒє in [Tut]Dance6 + Dif   
    Olá comunidade.
    Após o sr.paulo me lançar o desafio da dif da Dance6, Lá fui eu po IDA, Ver a cena...
    Após 30 minutos lá fiz o que muita gente esperava há algum tempo.
    Venho tornar publico, uma coisa não existente(Pelo menos para o público).
    Foi testado, e Demorei a fazer a DIF, até porque enganei-me várias fezes e foi feita de forma manual... Ou seja, Tive de verificar Hex a hex, Do antigo po Novo, e Alinha a Alinha.
    Venho então Postar a DIF Publicamente.
    Esta DIF, é Para o comando /dance6, (A ultima dança que saiu nos clientes oficiais).
    Antes de lançar a DIF, Para quem não usa os novos binários, Pode obtar por Fazer este "emotion.py" para que a mesma funcione sem estar inserida no novo binário:



    Quem usa os clientes oficiais, Não precisa disto.
    DIF, é somente para o 2089M e Irei trabalhar para o 2019 Caso encontre o Game por ai.




    A DIF, Foi criada Exclusivamente por mim, Agradeço que não Retirem créditos da mesma.
    Agradecimentos:
    Paulo Ferreira - Pelo desafio.
    Download da DIF: http://www.mediafire...i54la9l2sqv8cuc
    Scan: https://www.virustot...sis/1368890955/
    Download do DIF_Patcher: http://www.mediafire...0h74v47ydgyiuau
    Scan: https://www.virustot...sis/1368891012/

    Créditos da DIF: xP3NG3R
    Créditos do Tópico: TheLife (Eu)

    Sejam felizes com a Nova dança :)
    Sem mais,
    TheLife
  22. Upvote
    purabrisa got a reaction from KTHG in [Resolvido] [Pedido] " Locale " Client Raizen   
    Diretório: /pack/raizen_br.eix e epk
    Download:https://mega.co.nz/#!jBATzCwb!JytsGCfZglGQIa5Ijx54qixB5AcY8_YQ8OIUgcO8CN8
    VirusTotal:https://www.virustotal.com/pt/file/d3a92686a76a97fe44b3cf0d454dbb3c3030034e6717e4d4162eef2068a8ed88/analysis/1363226764/
    Abraços.
    Ajudei. Não custa dar um http://cyber-gamers.org/public/style_emoticons/default/451960.gif .
  23. Upvote
    purabrisa got a reaction from KTHG in [Resolvido] [Pedido] " Locale " Client Raizen   
    Diretório: /pack/raizen_br.eix e epk
    Download:https://mega.co.nz/#!jBATzCwb!JytsGCfZglGQIa5Ijx54qixB5AcY8_YQ8OIUgcO8CN8
    VirusTotal:https://www.virustotal.com/pt/file/d3a92686a76a97fe44b3cf0d454dbb3c3030034e6717e4d4162eef2068a8ed88/analysis/1363226764/
    Abraços.
    Ajudei. Não custa dar um http://cyber-gamers.org/public/style_emoticons/default/451960.gif .
  24. Upvote
    purabrisa got a reaction from KTHG in [Resolvido] [Pedido] " Locale " Client Raizen   
    Diretório: /pack/raizen_br.eix e epk
    Download:https://mega.co.nz/#!jBATzCwb!JytsGCfZglGQIa5Ijx54qixB5AcY8_YQ8OIUgcO8CN8
    VirusTotal:https://www.virustotal.com/pt/file/d3a92686a76a97fe44b3cf0d454dbb3c3030034e6717e4d4162eef2068a8ed88/analysis/1363226764/
    Abraços.
    Ajudei. Não custa dar um http://cyber-gamers.org/public/style_emoticons/default/451960.gif .
  25. Upvote
    purabrisa got a reaction from KTHG in [Resolvido] [Pedido] " Locale " Client Raizen   
    Diretório: /pack/raizen_br.eix e epk
    Download:https://mega.co.nz/#!jBATzCwb!JytsGCfZglGQIa5Ijx54qixB5AcY8_YQ8OIUgcO8CN8
    VirusTotal:https://www.virustotal.com/pt/file/d3a92686a76a97fe44b3cf0d454dbb3c3030034e6717e4d4162eef2068a8ed88/analysis/1363226764/
    Abraços.
    Ajudei. Não custa dar um http://cyber-gamers.org/public/style_emoticons/default/451960.gif .