Jump to content

Leaderboard

Popular Content

Showing content with the highest reputation on 11/27/2021 in all areas

  1. Ir até ao ficheiro game.py (root): Procurar por: from _weakref import proxy Adicionar por baixo: from switchbot import Bot Procurar por: self.quickSlotPageIndex = 0 Adicionar por baixo: self.switchbit = Bot() self.switchbot.hide() Procurar por: onPressKeyDict[app.DIK_F4] =lambda : self.__PressQuickSlot(7) Adicionar por baixo: onPressKeyDict[app.DIK_F6] =lambda : self.__toogleSwitchbot() Adicionar no fim do ficheiro: def __toggleSwitchbot(self): if self.switchbot.bot_shown == 1: self.switchbot.Hide() else: self.switchbot.Show() Colocar o ficheiro switchbot.py dentro da pasta root. switchbot.py
    1 point
  2. ld-elf32.so.1: /usr/lib32/libstdc++.so.6: version GLIBCXX_3.4.21 required by /home/Metin2/srv1/share/bin/db not found ld-elf32.so.1: Shared object "libssl.so.9" not found, required by "game" ld-elf32.so.1: Shared object "libssl.so.9" not found, required by "game" ld-elf32.so.1: Shared object "libssl.so.9" not found, required by "game" ld-elf32.so.1: Shared object "libssl.so.9" not found, required by "game" Versão Freebsd : 12.2-RELEASE FreeBSD 12.2-RELEASE r366954 GENERIC amd64
    1 point
  3. Olá, Como o próprio título diz seguindo este tutorial irão conseguir expandir o vosso número de inventários para 12. Source common/length.h - INVENTORY_MAX_NUM = 135, + INVENTORY_MAX_NUM = 540, common/tables.h typedef struct SQuickslot { BYTE type; - BYTE pos; + UINT pos; } TQuickslot; game/src/char.h - BYTE bItemGrid[iNVENTORY_AND_EQUIP_SLOT_MAX]; + UINT bItemGrid[iNVENTORY_AND_EQUIP_SLOT_MAX]; - void SyncQuickslot(BYTE bType, BYTE bOldPos, BYTE bNewPos); + void SyncQuickslot(BYTE bType, UINT bOldPos, UINT bNewPos); - bool GetQuickslot(BYTE pos, TQuickslot ** ppSlot); + bool GetQuickslot(UINT pos, TQuickslot ** ppSlot); - bool SetQuickslot(BYTE pos, TQuickslot & rSlot); + bool SetQuickslot(UINT pos, TQuickslot & rSlot); - bool DelQuickslot(BYTE pos); + bool DelQuickslot(UINT pos); - bool SwapQuickslot(BYTE a, BYTE b); + bool SwapQuickslot(UINT a, UINT b); - void ChainQuickslotItem(LPITEM pItem, BYTE bType, BYTE bOldPos); + void ChainQuickslotItem(LPITEM pItem, BYTE bType, UINT bOldPos); - void SetWear(BYTE bCell, LPITEM item); + void SetWear(UINT bCell, LPITEM item); - LPITEM GetWear(BYTE bCell) const; + LPITEM GetWear(UINT bCell) const; - bool RefineInformation(BYTE bCell, BYTE bType, int iAdditionalCell = -1); + bool RefineInformation(UINT bCell, BYTE bType, int iAdditionalCell = -1); - bool SwapItem(BYTE bCell, BYTE bDestCell); + bool SwapItem(UINT bCell, UINT bDestCell); game/src/char_battle.cpp ## 1000 kann nach belieben angepasst werden sollte bei 6 Inventar seiten über 255 sein. ## 2 x vorhanden beide ersetzen! - SyncQuickslot(QUICKSLOT_TYPE_ITEM, vec_bSlots[i], 255); + SyncQuickslot(QUICKSLOT_TYPE_ITEM, vec_bSlots[i], 1000); ## 2 x vorhanden beide ersetzen! - SyncQuickslot(QUICKSLOT_TYPE_ITEM, WEAR_UNIQUE1, 255); + SyncQuickslot(QUICKSLOT_TYPE_ITEM, WEAR_UNIQUE1, 1000); game/src/char_item.cpp ## 1000 kann nach belieben angepasst werden sollte bei 6 Inventar seiten über 255 sein. - SyncQuickslot(QUICKSLOT_TYPE_ITEM, i, 255); + SyncQuickslot(QUICKSLOT_TYPE_ITEM, i, 1000); - BYTE bCell = Cell.cell; + UINT bCell = Cell.cell; ## 2 x vorhanden beide ersetzen! - if (m_pointsInstant.bItemGrid[bCell] == iExceptionCell) + if (m_pointsInstant.bItemGrid[bCell] == (UINT)iExceptionCell) ## 2 x vorhanden beide ersetzen! - BYTE bPage = bCell / (INVENTORY_MAX_NUM / 3); + UINT bPage = bCell / (INVENTORY_MAX_NUM / 12); ## 2 x vorhanden beide ersetzen! - BYTE p = bCell + (5 * j); + UINT p = bCell + (5 * j); ## 2 x vorhanden beide ersetzen! - if (p / (INVENTORY_MAX_NUM / 3) != bPage) + if (p / (INVENTORY_MAX_NUM / 12) != bPage) ## 3 x vorhanden beide ersetzen! - BYTE bCell = item->GetCell(); + UINT bCell = item->GetCell(); -bool CHARACTER::RefineInformation(BYTE bCell, BYTE bType, int iAdditionalCell) +bool CHARACTER::RefineInformation(UINT bCell, BYTE bType, int iAdditionalCell) - SyncQuickslot(QUICKSLOT_TYPE_ITEM, Cell.cell, 255); + SyncQuickslot(QUICKSLOT_TYPE_ITEM, Cell.cell, 1000); -bool CHARACTER::SwapItem(BYTE bCell, BYTE bDestCell) +bool CHARACTER::SwapItem(UINT bCell, UINT bDestCell) - BYTE bEquipCell = item2->GetCell() - INVENTORY_MAX_NUM; + INT bEquipCell = item2->GetCell() - INVENTORY_MAX_NUM; - BYTE bInvenCell = item1->GetCell(); + UINT bInvenCell = item1->GetCell(); - BYTE bCell1 = item1->GetCell(); + UINT bCell1 = item1->GetCell(); - BYTE bCell2 = item2->GetCell(); + UINT bCell2 = item2->GetCell(); - BYTE bOldCell = item->GetCell(); + UINT bOldCell = item->GetCell(); game/src/char_quickslot.cpp -void CHARACTER::SyncQuickslot(BYTE bType, BYTE bOldPos, BYTE bNewPos) +void CHARACTER::SyncQuickslot(BYTE bType, UINT bOldPos, UINT bNewPos) - if (bNewPos == 255) + if (bNewPos == 1000) -bool CHARACTER::GetQuickslot(BYTE pos, TQuickslot ** ppSlot) +bool CHARACTER::GetQuickslot(UINT pos, TQuickslot ** ppSlot) -bool CHARACTER::SetQuickslot(BYTE pos, TQuickslot & rSlot) +bool CHARACTER::SetQuickslot(UINT pos, TQuickslot & rSlot) -bool CHARACTER::DelQuickslot(BYTE pos) +bool CHARACTER::DelQuickslot(UINT pos) -bool CHARACTER::SwapQuickslot(BYTE a, BYTE b) +bool CHARACTER::SwapQuickslot(UINT a, UINT b) -void CHARACTER::ChainQuickslotItem(LPITEM pItem, BYTE bType, BYTE bOldPos) +void CHARACTER::ChainQuickslotItem(LPITEM pItem, BYTE bType, UINT bOldPos) game/src/cmd_general.cpp - for (BYTE i=0; i<INVENTORY_MAX_NUM; ++i) + for (UINT i=0; i<INVENTORY_MAX_NUM; ++i) game/src/cmd_gm.cpp - ch->SyncQuickslot(QUICKSLOT_TYPE_ITEM, i, 255); + ch->SyncQuickslot(QUICKSLOT_TYPE_ITEM, i, 1000); ## 3 x vorhanden beide ersetzen! - BYTE cell = 0; + UINT cell = 0; game/src/exchange.cpp iPos = s_grid6.FindBlank(1, itemSize); if (iPos >= 0) { s_grid6.Put(iPos, 1, itemSize); continue; } iPos = s_grid7.FindBlank(1, itemSize); if (iPos >= 0) { s_grid7.Put(iPos, 1, itemSize); continue; } iPos = s_grid8.FindBlank(1, itemSize); if (iPos >= 0) { s_grid8.Put(iPos, 1, itemSize); continue; } iPos = s_grid9.FindBlank(1, itemSize); if (iPos >= 0) { s_grid9.Put(iPos, 1, itemSize); continue; } iPos = s_grid10.FindBlank(1, itemSize); if (iPos >= 0) { s_grid10.Put(iPos, 1, itemSize); continue; } iPos = s_grid11.FindBlank(1, itemSize); if (iPos >= 0) { s_grid11.Put(iPos, 1, itemSize); continue; } iPos = s_grid12.FindBlank(1, itemSize); if (iPos >= 0) { s_grid12.Put(iPos, 1, itemSize); continue; } return false; } } return true; } exchange.cpp - m_pOwner->SyncQuickslot(QUICKSLOT_TYPE_ITEM, item->GetCell(), 255); + m_pOwner->SyncQuickslot(QUICKSLOT_TYPE_ITEM, item->GetCell(), 1000); game/src/fishing.cpp ## 2 x vorhanden beide ersetzen! - BYTE bCell = rod->GetCell(); + UINT bCell = rod->GetCell(); game/src/input_main.cpp case SHOP_SUBHEADER_CG_SELL2: { - if (uiBytes < sizeof(BYTE) + sizeof(BYTE)) + if (uiBytes < sizeof(UINT) + sizeof(BYTE)) return -1; - BYTE pos = *(c_pData++); + UINT pos = *reinterpret_cast<const UINT*>(c_pData++); BYTE count = *(c_pData); sys_log(0, "INPUT: %s SHOP: SELL2", ch->GetName()); CShopManager::instance().Sell(ch, pos, count); - return sizeof(BYTE) + sizeof(BYTE); + return sizeof(UINT) + sizeof(BYTE); } - ch->SyncQuickslot(QUICKSLOT_TYPE_ITEM, p->ItemPos.cell, 255); + ch->SyncQuickslot(QUICKSLOT_TYPE_ITEM, p->ItemPos.cell, 1000); game/src/item.cpp - pOwner->SyncQuickslot(QUICKSLOT_TYPE_ITEM, wCell, 255); + pOwner->SyncQuickslot(QUICKSLOT_TYPE_ITEM, wCell, 1000); - m_pOwner->SyncQuickslot(QUICKSLOT_TYPE_ITEM, m_wCell, 255); + m_pOwner->SyncQuickslot(QUICKSLOT_TYPE_ITEM, m_wCell, 1000); -bool CItem::EquipTo(LPCHARACTER ch, BYTE bWearCell) +bool CItem::EquipTo(LPCHARACTER ch, UINT bWearCell) game/src/item.h - bool EquipTo(LPCHARACTER ch, BYTE bWearCell); + bool EquipTo(LPCHARACTER ch, UINT bWearCell); game/src/item_manager.cpp - o->SyncQuickslot(QUICKSLOT_TYPE_ITEM, item->GetCell(), 255); + o->SyncQuickslot(QUICKSLOT_TYPE_ITEM, item->GetCell(), 1000); game/src/minig.cpp ## 2 x vorhanden beide ersetzen! - BYTE bCell = rkOldPick.GetCell(); + UINT bCell = rkOldPick.GetCell(); game/src/packet.h typedef struct command_quickslot_add { BYTE header; - BYTE pos; + UINT pos; TQuickslot slot; } TPacketCGQuickslotAdd; typedef struct command_quickslot_del { BYTE header; - BYTE pos; + UINT pos; } TPacketCGQuickslotDel; typedef struct command_quickslot_swap { BYTE header; - BYTE pos; + UINT pos; - BYTE change_pos; + UINT change_pos; } TPacketCGQuickslotSwap; typedef struct packet_item_del { BYTE header; - BYTE pos; + UINT pos; } TPacketGCItemDel; struct packet_quickslot_add { BYTE header; - BYTE pos; + UINT pos; TQuickslot slot; }; struct packet_quickslot_del { BYTE header; - BYTE pos; + UINT pos; }; struct packet_quickslot_swap { BYTE header; - BYTE pos; + UINT pos; - BYTE pos_to; + UINT pos_to; }; typedef struct SPacketCGRefine { BYTE header; - BYTE pos; + UINT pos; BYTE type; } TPacketCGRefine; typedef struct SPacketCGRequestRefineInfo { BYTE header; - BYTE pos; + UINT pos; } TPacketCGRequestRefineInfo; typedef struct SPacketGCRefineInformaion { BYTE header; BYTE type; - BYTE pos; + UINT pos; DWORD src_vnum; DWORD result_vnum; BYTE material_count; game/src/questlua_global.cpp ## 2 x vorhanden beide ersetzen! - BYTE bCell = (BYTE) lua_tonumber(L,-1); + UINT bCell = lua_tonumber(L, -1); game/src/questlua_item.cpp - BYTE bCell = pItem->GetCell(); + UINT bCell = pItem->GetCell(); game/src/questlua_pc.cpp , - BYTE bCell = (BYTE)lua_tonumber(L, 1); + UINT bCell = lua_tonumber(L game/src/safebox.cpp -LPITEM CSafebox::GetItem(BYTE bCell) +LPITEM CSafebox::GetItem(INT bCell) -bool CSafebox::MoveItem(BYTE bCell, BYTE bDestCell, BYTE count) +bool CSafebox::MoveItem(INT bCell, INT bDestCell, BYTE count) game/src/safebox.h - bool MoveItem(BYTE bCell, BYTE bDestCell, BYTE count); + bool MoveItem(INT bCell, INT bDestCell, BYTE count); - LPITEM GetItem(BYTE bCell); + LPITEM GetItem(INT bCell); game/src/shop.cpp - m_pkPC->SyncQuickslot(QUICKSLOT_TYPE_ITEM, item->GetCell(), 255); + m_pkPC->SyncQuickslot(QUICKSLOT_TYPE_ITEM, item->GetCell( game/src/shop_manager.cpp -void CShopManager::Sell(LPCHARACTER ch, BYTE bCell, BYTE bCount) +void CShopManager::Sell(LPCHARACTER ch, UINT bCell, BYTE bCount) ), 1000); game/src/shop_manager.h - void Sell(LPCHARACTER ch, BYTE bCell, BYTE bCount=0); + void Sell(LPCHARACTER ch, UINT bCell, BYTE bCount = 0); Cliente Client/UserInterface/AbstractPlayer.h - virtual void AddQuickSlot(int QuickslotIndex, char IconType, char IconPosition) = 0; + virtual void AddQuickSlot(int QuickslotIndex, char IconType, INT IconPosition) = 0; Client/UserInterface/GameType.h -const DWORD c_Inventory_Page_Count +const DWORD c_Inventory_Page_Count = 12; typedef struct SQuickSlot { BYTE Type; - BYTE Position; + UINT Position; } TQuickSlot; Client/UserInterface/Packet.h typedef struct command_quickslot_add { BYTE header; - BYTE pos; + UINT pos; TQuickSlot slot; }TPacketCGQuickSlotAdd; typedef struct command_quickslot_del { BYTE header; - BYTE pos; + UINT pos; }TPacketCGQuickSlotDel; typedef struct command_quickslot_swap { BYTE header; - BYTE pos; + UINT pos; - BYTE change_pos; + UINT change_pos; }TPacketCGQuickSlotSwap; typedef struct SPacketCGRefine { BYTE header; - BYTE pos; + UINT pos; BYTE type; } TPacketCGRefine; typedef struct packet_item_del { BYTE header; - BYTE pos; + UINT pos; } TPacketGCItemDel; typedef struct packet_quickslot_add { BYTE header; - BYTE pos; + UINT pos; TQuickSlot slot; } TPacketGCQuickSlotAdd; typedef struct packet_quickslot_del { BYTE header; - BYTE pos; + UINT pos; } TPacketGCQuickSlotDel; typedef struct packet_quickslot_swap { BYTE header; - BYTE pos; + UINT pos; - BYTE change_pos; + UINT change_pos; } TPacketGCQuickSlotSwap; typedef struct SPacketGCRefineInformation { BYTE header; - BYTE pos; + UINT pos; TRefineTable refine_table; } TPacketGCRefineInformation; typedef struct SPacketGCRefineInformationNew { BYTE header; BYTE type; - BYTE pos; + UINT pos; TRefineTable refine_table; } TPacketGCRefineInformationNew; Client/UserInterface/PythonNetworkStream.h - bool SendQuickSlotAddPacket(BYTE wpos, BYTE type, BYTE pos); + bool SendQuickSlotAddPacket(UINT wpos, BYTE type, UINT pos); - bool SendQuickSlotDelPacket(BYTE wpos); + bool SendQuickSlotDelPacket(UINT wpos); - bool SendQuickSlotMovePacket(BYTE wpos, BYTE change_pos); + bool SendQuickSlotMovePacket(UINT wpos, UINT change_pos); - bool SendShopSellPacketNew(BYTE bySlot, BYTE byCount); + bool SendShopSellPacketNew(UINT bySlot, BYTE byCount); - bool SendRefinePacket(BYTE byPos, BYTE byType); + bool SendRefinePacket(UINT byPos, BYTE byType); Client/UserInterface/PythonNetworkStreamPhaseGame.cpp -bool CPythonNetworkStream::SendRefinePacket(BYTE byPos, BYTE byType) +bool CPythonNetworkStream::SendRefinePacket(UINT byPos, BYTE byType) Client/UserInterface/PythonNetworkStreamPhaseGameItem.cpp ## Das ganze Packet sollte so aussehen -bool CPythonNetworkStream::SendShopSellPacketNew(BYTE bySlot, BYTE byCount) +bool CPythonNetworkStream::SendShopSellPacketNew(UINT bySlot, BYTE byCount) +{ + if (!__CanActMainInstance()) + return true; + TPacketCGShop PacketShop; + PacketShop.header = HEADER_CG_SHOP; + PacketShop.subheader = SHOP_SUBHEADER_CG_SELL2; + if (!Send(sizeof(TPacketCGShop), &PacketShop)) + { + Tracef("SendShopSellPacket Error\n"); + return false; + } + if (!Send(sizeof(UINT), &bySlot)) + { + Tracef("SendShopAddSellPacket Error\n"); + return false; + } + if (!Send(sizeof(BYTE), &byCount)) + { + Tracef("SendShopAddSellPacket Error\n"); + return false; + } + Tracef(" SendShopSellPacketNew(bySlot=%d, byCount=%d)\n", bySlot, byCount); + return SendSequence(); +} -bool CPythonNetworkStream::SendQuickSlotAddPacket(BYTE wpos, BYTE type, BYTE pos) +bool CPythonNetworkStream::SendQuickSlotAddPacket(UINT wpos, BYTE type, UINT pos) -bool CPythonNetworkStream::SendQuickSlotDelPacket(BYTE pos) +bool CPythonNetworkStream::SendQuickSlotDelPacket(UINT pos) -bool CPythonNetworkStream::SendQuickSlotMovePacket(BYTE pos, BYTE change_pos) +bool CPythonNetworkStream::SendQuickSlotMovePacket(UINT pos, UINT change_pos) Client/UserInterface/PythonPlayer.cpp - for (BYTE i = 0; i < QUICKSLOT_MAX_NUM; ++i) + for (UINT i = 0; i < QUICKSLOT_MAX_NUM; ++i) - rkNetStream.SendQuickSlotMovePacket((BYTE) dwGlobalSrcSlotIndex, (BYTE)dwGlobalDstSlotIndex); + rkNetStream.SendQuickSlotMovePacket((UINT) dwGlobalSrcSlotIndex, (UINT)dwGlobalDstSlotIndex); - rkNetStream.SendQuickSlotAddPacket((BYTE)dwGlobalSlotIndex, (BYTE)dwWndType, (BYTE)dwWndItemPos); + rkNetStream.SendQuickSlotAddPacket((UINT)dwGlobalSlotIndex, (BYTE)dwWndType, (UINT)dwWndItemPos); - rkNetStream.SendQuickSlotDelPacket((BYTE)dwGlobalSlotIndex); + rkNetStream.SendQuickSlotDelPacket((UINT)dwGlobalSlotIndex); -void CPythonPlayer::AddQuickSlot(int QuickSlotIndex, char IconType, char IconPosition) +void CPythonPlayer::AddQuickSlot(int QuickSlotIndex, char IconType, INT IconPosition) Client/UserInterface/PythonPlayer.h - void AddQuickSlot(int QuickslotIndex, char IconType, char IconPosition); + void AddQuickSlot(int QuickslotIndex, char IconType, INT IconPosition); Irei deixar para download a parte em python ( uiinventorywindow.py // uiinventory.py ) Download: https://mega.nz/#!alUkSSLA!4bH6hOUaFeXJOnUfOnzSZvXwju_-ZxrQiXUOVVV5ls4 Resultado Final: Créditos: Dennis Cumprimentos, Sadness.
    1 point
  4. Alguém poderia me ajudar com este erro ? ld-elf.so.1: /usr/local/lib/libpython3.7m.so.1.0: Undefined symbol "close_range@FBSD_1.6" 12.1-RELEASE FreeBSD 12.1-RELEASE r354233 GENERIC amd64
    1 point
  5. Na tua makefile do game, adiciona isto após "LIBS=" -static Ficando assim: Depois recompila o jogo. Todas as libs deverão ficar incorporadas dentro do ficheiro game e não deverá ocorrer problemas ao usa-lo na máquina destino depois.
    1 point
  6. Introdução Olá TMoore's visto que muitos muitos querem adquirir novos conhecimentos criar seus próprios projectos, só que como algumas pessoas tem um pouco de receio de mexer sem saber e danificar algo muitos optam por sacar algo prefeito e meter online editando apenas algumas coisinhas, isso tem vindo a transformar o metin2 cada vez mais depressivo, tendo em conta que já existia um tópico semelhante do @ tierrilopes mas já não se encontra activo e ainda tendo em conta do tópico das Files TMoore Tutorials e como muitas pessoas pediram-me a source das files e não a partilhei ainda, então decide criar este tópico para vos poder explicar como criar as "vossas" próprias server files isso iria fazer com que vocês criassem algo vosso e não simplesmente sacar as files quaisquer e meter online. Claro que este tutorial não será feito todo de uma vez porque isto será um processo demorado e o mais todos claro possível para que todos possam acompanhar todos os processos sem se perder, lembrando que são livres de colocar questões sempre que possível (Apenas no tópico, não respondo a qualquer questão relacionado a este tópico caso a questão não tenha sido feita no tópico.) 1 - Ferramentas & Recursos Primeiramente vou deixar neste tutorial o link de todas as ferramentas necessárias para prosseguir com o tutorial Winscp - Link Sim é necessário ser o Winscp porque vamos trabalhar com atalhos e é mais rápido trabalhar com atalhos através do winscp do que linha de comandos e também indico o winscp porque penso que não é possível criar atalhos através do filezilla ou Bitvise (que eu saiba) Notepad++ - Link Ou Sublime Text - Link Eu pessoalmente utilizo o notepad++ com mais frequência mas existem casos em que o notepad++ não é o mais indicado, por exemplo quando edito coisas mínimas no mob_proto ou item_proto, editando com o notepad++ ocorre erros porque o notepad++ altera algumas formatações do documento. Bitvise - Link Aconselho a utilização deste software porque utilizando este software não será necessário abrir mais outro software para nos permitir conectar via sftp ou ssh isso porque esse software por si já permite fazer ambas das conexões. Navicat - Link Este software será utilizado para a gestão da base de dados. Eter Manager - Link Aconselho a utilização deste software e não o eternexus porque trabalhando com este software podemos trabalhar de uma forma mais organizada e mais rápido do que com o eternexus. Cliente Metin2PT 2014 R40K - Link Também pode ser utilizado outro cliente sendo que não aconselho porque poderá vir a surgir duvidas devido a utilização de outro cliente diferente do tutorial. Dedicado, vps ou localhost - Caso a vossa ideia seja só testar etc, sem ter objectivo de abrir o servidor ao publico podem comprar um dedicado ou uma vps numa das seguintes hospedagens: BlazingFast VPS; EterHost VPS (Não aconselho); Kimsufi "Dedicados"; Ou podem utilizar também localhost utilizando uma das seguintes ferramentas: Virtual Box, VMware, caso a vossa ideia seja começar um projeto mais avançado com o intuito de o abrir ao publico aconselho dedicados com mais potencias tais como: OVH, Soyoustart, BlazingFast Dedicados, entre outros, isso vai ser escolha vossa dependendo do que desejam e também com o montante que pretendem gastar. Poderá existir alguns software que não foram adicionados ao tópico e que também seja necessário mais a frente serão adicionados, este tópico será actualizado uma vez por dia com um novo capitulo do tutorial, lembrando que o objectivo deste tutorial é ensinar como organizar a estrutura da files e cliente, envolvendo assim tutorias de vários temas relacionados ao metin2. Nenhum conteúdo feio no tutorial será disponibilizado para download para que todos tenham de fazer por si próprio todos os conteúdos aqui desenvolvidos. ​Próxima actualização a este tópico será para falar sobre a "Organização da área de trabalho" e "instalação das ferramentas de trabalho". Obrigado ao TierriLopes pelos conhecimentos e divulgação das ferramentas a utilizar neste tutorial, Mustafa Eroğlu pelo link do Navicat, GunnerMBT pelo Eter Manager, Rafa pelo cliente Metin2Pt. Cumprimentos Dynamic Things
    1 point
×
×
  • Create New...