Jump to content
metin2dev
Metin2International

xP3NG3Rx

Honorable Member
  • Content Count

    525
  • Joined

  • Last visited

  • Days Won

    141

Everything posted by xP3NG3Rx

  1. xP3NG3Rx

    People for translate

    Ja ja genau, du musst in Ruhe bleiben. Matuszka is a good guy, sometimes he is so naive, but he deserves the money, I guess. Also he's making precise work.
  2. xP3NG3Rx

    c++ Fixing charselect "update bugs"

    Tell me what else should I do on a stupid post what u left behind.
  3. xP3NG3Rx

    Emoji in TextLine

    Hi, folks! With this guide you will be able to combine textlines with images, like rubinum does. Usage is simple: emojiTextLine.SetText("|Eemoji/key_ctrl|e + |Eemoji/key_x|e + |Eemoji/key_rclick|e - Direct sell") The files are located in the icon pack, so basically the code will load from icon/{GIVEN_PATH}.tga - in the sample the path for the X is: icon/emoji/key_x.tga Here are the images from rubinum client:  Howto: Have fun Sorry for arab players , for sure they have also developers, so let's go guys, finish it If you have problem, maybe I made a mistake in the guide of missed out something, just leave a comment below. PS.: Sometimes the code tag of the board puts an extra invisible character mostly the end of the lines, if your IDE cries for syntax error, but it seems correct, check that part of the file with notepad++, it will show a ?(question mark) where the problem is.
  4. xP3NG3Rx

    Emoji in TextLine

    If you mean you need a function which shows the correct keyboard combination with text and also make it to work like what does it say, just hire a dev who can code it to you.
  5. xP3NG3Rx

    Emoji in TextLine

    What do you mean?
  6. xP3NG3Rx

    Emoji in TextLine

    Wow, thank you, looks nice
  7. xP3NG3Rx

    Patcher Key Founder by Helia01

    This site is not that kind of board, dude.
  8. Hi devs! The original equipment viewer is not updated for the new equipments I am thinking of costumes + rings + belt Here is the extended version. Images: Here are my modified files to root and uiscript package, the .py files: uiEquipDialog.py Pastebin ~ MEGA UIScriptEquipmentDialog.py Pastebin ~ MEGA UIScriptCostumeEquipmentDialog.py Pastebin ~ MEGA Ehm yeah this was the easiest part of this, now comin' the serverside and binary parts. Server: 1.) Open gamepacket.h than search for: "typedef struct pakcet_view_equip" and replace all structure with this: typedef struct pakcet_view_equip { BYTE header; DWORD vid; struct { DWORD vnum; BYTE count; long alSockets[ITEM_SOCKET_MAX_NUM]; TPlayerItemAttribute aAttr[ITEM_ATTRIBUTE_MAX_NUM]; } equips[16]; } TPacketViewEquip; PS: lel "pakcet" xD nevermind Save&Close 2.) Open char.cpp and search for this: "void CHARACTER::SendEquipment(LPCHARACTER ch)" and replace the event with this(Thanks ATAG): void CHARACTER::SendEquipment(LPCHARACTER ch) { TPacketViewEquip p; p.header = HEADER_GC_VIEW_EQUIP; p.vid = GetVID(); int pos[16] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 19, 20, 21, 22, 23 }; for (int i = 0; i < 16; i++) { LPITEM item = GetWear(pos[i]); if (item) { p.equips[i].vnum = item->GetVnum(); p.equips[i].count = item->GetCount(); thecore_memcpy(p.equips[i].alSockets, item->GetSockets(), sizeof(p.equips[i].alSockets)); thecore_memcpy(p.equips[i].aAttr, item->GetAttributes(), sizeof(p.equips[i].aAttr)); } else { p.equips[i].vnum = 0; } } ch->GetDesc()->Packet(&p, sizeof(p)); } Serverside done! - Build! Binary: 1.) Open UserInterfacePacket.h than search for this: "typedef struct pakcet_view_equip" and replace with this: typedef struct pakcet_view_equip { BYTE header; DWORD dwVID; TEquipmentItemSet equips[16]; } TPacketGCViewEquip; PS: we met again with pakcet xD, Save&Close. 2.) Open UserInterfacePythonNetworkStreamPhaseGame.cpp than search for this: "bool CPythonNetworkStream::RecvViewEquipPacket()" and replace with this: bool CPythonNetworkStream::RecvViewEquipPacket() { TPacketGCViewEquip kViewEquipPacket; if (!Recv(sizeof(kViewEquipPacket), &kViewEquipPacket)) return false; PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "OpenEquipmentDialog", Py_BuildValue("(i)", kViewEquipPacket.dwVID)); for (int i = 0; i < 16; ++i) { TEquipmentItemSet & rItemSet = kViewEquipPacket.equips[i]; PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "SetEquipmentDialogItem", Py_BuildValue("(iiii)", kViewEquipPacket.dwVID, i, rItemSet.vnum, rItemSet.count)); for (int j = 0; j < ITEM_SOCKET_SLOT_MAX_NUM; ++j) PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "SetEquipmentDialogSocket", Py_BuildValue("(iiii)", kViewEquipPacket.dwVID, i, j, rItemSet.alSockets[j])); for (int k = 0; k < ITEM_ATTRIBUTE_SLOT_MAX_NUM; ++k) PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "SetEquipmentDialogAttr", Py_BuildValue("(iiiii)", kViewEquipPacket.dwVID, i, k, rItemSet.aAttr[k].bType, rItemSet.aAttr[k].sValue)); } return true; } Binaryside done! - Build! ---Edit---- Multiple opening bugfix: Open interFaceModule.py and search for this: "def OpenEquipmentDialog(self, vid):" if you found it replace that function with this: def OpenEquipmentDialog(self, vid): if self.equipmentDialogDict.has_key(vid): self.equipmentDialogDict[vid].Destroy() self.CloseEquipmentDialog(vid) dlg = uiEquipmentDialog.EquipmentDialog() dlg.SetItemToolTip(self.tooltipItem) dlg.SetCloseEvent(ui.__mem_func__(self.CloseEquipmentDialog)) dlg.Open(vid) self.equipmentDialogDict[vid] = dlg Show the "View equip" button on the targetbar: Open uitarget.py and check this diff to fix it for yourself: https://www.diffchecker.com/lqi9xdb7 ( ----EndEdit---- Ohh I almost forgot, here are the bgs ^^-> ui.7z - MEGA All done, press escape to exit... :')
  9. Hi ppl. Today is an another day, another reversed small stuff from the official game. Any problem? Feedback? Just write a comment below.
  10. Hello devs. I don't want to talk a lot about nothing, but I have to say what is this. With this little modification the party and the friend requests are cancelled automatically in seconds what you can change in the Open method. ( pyObj.Open(sec) ) Preview video: Make a backup before you are implementing it! And if you found a bug, please explain it. 0.) Open your uiCommon.py file and import chat module. 1.) Replace the whole QuestionDialogWithTimeLimit class in the uiCommon.py file with this: class QuestionDialogWithTimeLimit(QuestionDialog2): def __init__(self): ui.ScriptWindow.__init__(self) self.__CreateDialog() self.endTime = 0 self.timeOverMsg = 0 self.timeOverEvent = None self.timeOverEventArgs = None def __del__(self): QuestionDialog2.__del__(self) def __CreateDialog(self): pyScrLoader = ui.PythonScriptLoader() pyScrLoader.LoadScriptFile(self, "uiscript/questiondialog2.py") self.board = self.GetChild("board") self.textLine1 = self.GetChild("message1") self.textLine2 = self.GetChild("message2") self.acceptButton = self.GetChild("accept") self.cancelButton = self.GetChild("cancel") def Open(self, timeout): self.SetCenterPosition() self.SetTop() self.Show() self.endTime = app.GetTime() + timeout def SetTimeOverEvent(self, event, *args): self.timeOverEvent = event self.timeOverEventArgs = args def SetTimeOverMsg(self, msg): self.timeOverMsg = msg def OnTimeOver(self): if self.timeOverEvent: apply(self.timeOverEvent, self.timeOverEventArgs) if self.timeOverMsg: chat.AppendChat(chat.CHAT_TYPE_INFO, self.timeOverMsg) def OnUpdate(self): leftTime = max(0, self.endTime - app.GetTime()) self.SetText2(localeInfo.UI_LEFT_TIME % (leftTime)) if leftTime <= 0: self.OnTimeOver() 2.) Open your game.py file and replace each of these three methods to these: def OnMessengerAddFriendQuestion(self, name): messengerAddFriendQuestion = uiCommon.QuestionDialogWithTimeLimit() messengerAddFriendQuestion.SetText1(localeInfo.MESSENGER_DO_YOU_ACCEPT_ADD_FRIEND % (name)) messengerAddFriendQuestion.SetTimeOverMsg(localeInfo.MESSENGER_ADD_FRIEND_ANSWER_TIMEOVER) messengerAddFriendQuestion.SetTimeOverEvent(self.OnDenyAddFriend) messengerAddFriendQuestion.SetAcceptEvent(ui.__mem_func__(self.OnAcceptAddFriend)) messengerAddFriendQuestion.SetCancelEvent(ui.__mem_func__(self.OnDenyAddFriend)) messengerAddFriendQuestion.Open(10) messengerAddFriendQuestion.name = name self.messengerAddFriendQuestion = messengerAddFriendQuestion def RecvPartyInviteQuestion(self, leaderVID, leaderName): partyInviteQuestionDialog = uiCommon.QuestionDialogWithTimeLimit() partyInviteQuestionDialog.SetText1(leaderName + localeInfo.PARTY_DO_YOU_JOIN) partyInviteQuestionDialog.SetTimeOverMsg(localeInfo.PARTY_ANSWER_TIMEOVER) partyInviteQuestionDialog.SetTimeOverEvent(self.AnswerPartyInvite, False) partyInviteQuestionDialog.SetAcceptEvent(lambda arg=True: self.AnswerPartyInvite(arg)) partyInviteQuestionDialog.SetCancelEvent(lambda arg=False: self.AnswerPartyInvite(arg)) partyInviteQuestionDialog.Open(10) partyInviteQuestionDialog.partyLeaderVID = leaderVID self.partyInviteQuestionDialog = partyInviteQuestionDialog def BINARY_OnQuestConfirm(self, msg, timeout, pid): confirmDialog = uiCommon.QuestionDialogWithTimeLimit() confirmDialog.SetText1(msg) confirmDialog.Open(timeout) confirmDialog.SetAcceptEvent(lambda answer=True, pid=pid: m2net.SendQuestConfirmPacket(answer, pid) or self.confirmDialog.Hide()) confirmDialog.SetCancelEvent(lambda answer=False, pid=pid: m2net.SendQuestConfirmPacket(answer, pid) or self.confirmDialog.Hide()) self.confirmDialog = confirmDialog 3.) Open your locale/xy/locale_game.txt and add these if these aren't exists: MESSENGER_ADD_FRIEND_ANSWER_TIMEOVER Friend request was cancelled. PARTY_ANSWER_TIMEOVER Party invite was cancelled. Remove MESSENGER_DO_YOU_ACCEPT_ADD_FRIEND_2 line and change MESSENGER_DO_YOU_ACCEPT_ADD_FRIEND_1 with this: MESSENGER_DO_YOU_ACCEPT_ADD_FRIEND %s added you as a friend, accept? At last take a look at your files and correct the net module calls and the True-False syntax. net <--> m2net, True <--> TRUE
  11. Old but gold, thank you for publishing.
  12. Hello, This little thing is marks your pet seal into your inventory like the autopotion. This arrives with the v17.5 patch. Open PetSystem.cpp and replace or make it fit for you: void CPetActor::SetSummonItem(LPITEM pItem) { if (NULL == pItem) { LPITEM pSummonItem = ITEM_MANAGER::instance().FindByVID(m_dwSummonItemVID); if (NULL != pSummonItem) pSummonItem->SetSocket(1, FALSE); m_dwSummonItemVID = 0; m_dwSummonItemVnum = 0; return; } pItem->SetSocket(1, TRUE); m_dwSummonItemVID = pItem->GetVID(); m_dwSummonItemVnum = pItem->GetVnum(); } After that open the uiInventory.py and paste this code below the autopotion if-statement in the RefreshBagSlotWindow function. elif itemVnum >= 53001 and itemVnum <= 53256: metinSocket = [player.GetItemMetinSocket(globalSlotNumber, j) for j in xrange(player.METIN_SOCKET_MAX_NUM)]# <!> globalSlotNumber may be different <!> isActivated = 0 != metinSocket[1] if isActivated: self.wndItem.ActivateSlot(i) else: self.wndItem.DeactivateSlot(i)
  13. xP3NG3Rx

    open Search some functions and Lists

    At the moment I still don't know they are using it for special instances or not, because every mob has the same value 0.0 which means 100.0f by default. Of course the calculations are different than before, but still, I'm not sure about this. I tried to make it to my own, but I've caused some problems during the PvP so I had to put back the old one. Maybe one day I will give another try.
  14. xP3NG3Rx

    open [Py] Chat history improvement

    Probably not the uiChat.py file is the corrupted one. Check the last modified files via: python -m py_compile game.py If you will not get error message you will get the compiled pyc code, this means the file has no syntax error.
  15. Hello everyone. It's a good day to share an old code with you. First of all you need to know: I don't help to install it. Don't even take the contact with me about it. The whole code is written by me, and reversed from official binaries. At the beginning do a backup for your files(srcs+pys) and READ CAREFULLY the readme. W/o brain.exe please close this tab, or your browser, thank you for your understanding. Preview: Download.exe Enjoy & #h4v3fun, pngr
  16. xP3NG3Rx

    c++ Chat history update

    Hello everyone. Here is a little snippet for the chat history. I made this to turn back the "All" state if you turn off every each button.
  17. xP3NG3Rx

    solved New Function

    { "Over", wndButtonOver, METH_VARARGS }, PyObject * wndButtonOver(PyObject * poSelf, PyObject * poArgs) { UI::CWindow * pWindow; if (!PyTuple_GetWindow(poArgs, 0, &pWindow)) return Py_BuildException(); ((UI::CButton*)pWindow)->Over(); return Py_BuildNone(); }
  18. Official v18.5 XMas patch v18.5.6 r22630 Christmas pet, mount, costumes. New "miniboss" minigame gui + dungeon map. Download Full client: Download And please stop asking for root python files, I don't have them...
  19. Hi everyone. Here are some functions what I reversed from official binary about the PythonEventManager. 1.) event.SetVisibleLineCount(descIndex, iCount) - This limits the visible count of the lines in the 'textbox'. Used in battlefield and minigames. 2.) event.GetLineHeight(descIndex) - Gives back the height of the textline. Used in battlefield and minigames. 3.) event.SetYPosition(descIndex, iY) - Sets the Y position of the texts. Used for nothing yet. 4.) event.GetProcessedLineCount(descIndex) - Gives back the number of the processed text lines count. Used in battlefield and minigames. 5.) event.AllProcessEventSet(descIndex) - Instantly shows every text lines under a second. Used in battlefield and minigames. Faster than the zero delay 6.) event.GetTotalLineCount(descIndex) - Gives back the total line of the textbox. Used for new char- select and create, battlefield and minigames. If you have any problem, just write a comment below.
  20. xP3NG3Rx

    [RLS] Reversed event functions

    Hell yeah, I thought that one isn't new . But it changes the CurrentColor instead of the Diffuse int __thiscall CPythonEventManager::SetFontColor(_DWORD *this, int a2, float a3, float a4, float a5) { int result; // eax unsigned int v6; // edx float *v7; // ecx _DWORD *v8; // [esp+0h] [ebp-18h] v8 = this; *(float *)&result = COERCE_FLOAT(sub_49A2C40(a2)); if ( (_BYTE)result ) { v6 = (v8[13] - v8[12]) >> 2; if ( a2 >= v6 ) dummyshit00(v8 + 9, v6); v7 = (float *)(*(_DWORD *)(v8[12] + 4 * a2) + 32); // + 32 ! *v7 = a3; v7[1] = a4; v7[2] = a5; *(float *)&result = 1.0; v7[3] = 1.0; } return result; } _DWORD *__userpurge CPythonEventManager::__InitEventSet@<eax>(const char *a1@<ecx>, int a2@<ebx>, int a3@<edi>, int a4@<esi>, int a5) { v5 = a1; *(_DWORD *)(a5 + 4) = 0; // ix *(_DWORD *)(a5 + 8) = 0; // iy *(_DWORD *)(a5 + 12) = 0; // iw *(_DWORD *)(a5 + 16) = 0; // iyl *(_BYTE *)(a5 + 20) = 0; // islock *(_DWORD *)(a5 + 24) = 0; // lastdelaytime *(_DWORD *)(a5 + 28) = 0; // curletter v6 = (float *)(a5 + 32); // curcolor + 32 ! *v6 = 1.0; v6[1] = 1.0; v6[2] = 1.0; v6[3] = 1.0; void CPythonEventManager::__InitEventSet(TEventSet& rEventSet) { rEventSet.ix = 0; rEventSet.iy = 0; rEventSet.iWidth = 0; rEventSet.iyLocal = 0; rEventSet.isLock = false; rEventSet.lLastDelayTime = 0; rEventSet.iCurrentLetter = 0; rEventSet.CurrentColor = D3DXCOLOR(1, 1, 1, 1); //[...] }
  21. Hello everyone. I reversed something new from the official binary what I would like to share with you. Download PS.: Let me know if you found any mistake in the guide.
  22. xP3NG3Rx

    solved [BUG] Item_Attr

    Now I can see, your english is terrible sorry, I didn't understand what was your problem just after the 3rd read. And actually you removed the bonuses from the enum of apply in the database, what is non-sense to me why. You have to keep up to date the apply enum in the database with the applies in the source.
  23. xP3NG3Rx

    solved [BUG] Item_Attr

    First of all what you want to fix? If you don't want to set for example MAX_HP in armors just set the value of the body column to 0 at the MAX_HP row.
  24. xP3NG3Rx

    [Search]BETA client skill window

    I think this was the first skill window when the game came out. Btw Build it your own.
  25. xP3NG3Rx

    open Hide weapon while emotion is acting

    What "up"? Is that really difficult to make a function to public from private? Hm.
×