Jump to content

Search the Community

Showing results for tags 'python'.

  • Search By Tags

    Type tags separated by commas.
  • Search By Author

Content Type


Forums

  • Metin2 Dev
    • Announcements
  • Community
    • Member Representations
    • Off Topic
  • Miscellaneous
    • Metin2
    • Showcase
    • File Requests
    • Community Support - Questions & Answers
    • Paid Support / Searching / Recruiting
  • Metin2 Development
  • Metin2 Development
    • Basic Tutorials / Beginners
    • Guides & HowTo
    • Binaries
    • Programming & Development
    • Web Development & Scripts / Systems
    • Tools & Programs
    • Maps
    • Quests
    • 3D Models
    • 2D Graphics
    • Operating Systems
    • Miscellaneous
  • Private Servers
    • Private Servers
  • Uncategorized
    • Drafts
    • Trash
    • Archive
    • Temporary
    • Metin2 Download

Product Groups

  • Small Advertisement
  • Large Advertisement
  • Advertising

Categories

  • Third Party - Providers Directory

Categories

  • Feature Plan

Categories

  • Release Notes

Categories

  • Overview
  • Pages
    • Overview
    • File Formats
    • Network
    • Extensions

Calendars

  • Community Calendar

Find results in...

Find results that contain...


Date Created

  • Start

    End


Last Updated

  • Start

    End


Filter by number of...

Joined

  • Start

    End


Group


Pillory


Marketplace


Game Server


Country


Nationality


Github


Gitlab


Discord


Skype


Website

  1. [Hidden Content] [Hidden Content] Reversed from 22.2.7.0 Client part is from 2018 official root List of functions: Be careful about IsDIsable, it's actually IsEnable. They use like this:
  2. M2 Download Center Download Here ( Internal ) You need to install this first: [Hidden Content] You can use it in guild wars, tournaments etc.
  3. Hello. As you know, the LibJPEG library in Metin2 is only useful for taking screenshots. Other than that, it doesn't have any duties. Those who have Directx9 and want to take better quality screenshots with this method can follow this guide carefully. Those who use Directx8 can update the code I will give according to Directx8 and try it, I did not have the chance to try it. Make sure you are determined before following the steps here. Because as a result of these operations, you will no longer have the libjpeg library, and the screenshot files will reach larger sizes than the jpg file, depending on the quality. (between 3-8MB) The explanation will be a bit complicated, but if you follow each process in order, you will not have any problems. If you still have a problem, you can report it below. First, let's get rid of libjpeg: -> Enter the Client src/extern/lib folder and delete the .lib files whose file name starts with libjpeg... -> Enter the Client src/EterLib folder and delete the JpegFile.cpp & JpegFile.h files. Open the EterLib project in Visual Studio in the same way, select these two files and remove them. -> Open the client src/EterPythonLib/PythonGraphic.cpp file and remove the following include line and functions: #include "../eterLib/JpegFile.h" --------------------------------- void GenScreenShotTag(const char* src, DWORD crc32, char* leaf, size_t leafLen){ const char* p = src; const char* n = p; while (n = strchr(p, '\\')) p = n + 1; _snprintf(leaf, leafLen, "YMIR_METIN2:%s:0x%.8x", p, crc32); } bool CPythonGraphic::SaveJPEG(const char* pszFileName, LPBYTE pbyBuffer, UINT uWidth, UINT uHeight) { return jpeg_save(pbyBuffer, uWidth, uHeight, 100, pszFileName) != 0; } -> Where you delete these, you will see this function: bool CPythonGraphic::SaveScreenShot(const char* c_pszFileName) { -> Replace this function completely like this: bool CPythonGraphic::SaveScreenShot() { LPDIRECT3DSURFACE9 lpSurface = nullptr; D3DSURFACE_DESC stSurfaceDesc = {}; uint32_t uWidth = stSurfaceDesc.Width; uint32_t uHeight = stSurfaceDesc.Height; ms_lpd3dDevice->CreateOffscreenPlainSurface(uWidth, uHeight, D3DFMT_A8R8G8B8, D3DPOOL_SYSTEMMEM, &lpSurface, NULL); if (SUCCEEDED(ms_lpd3dDevice->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &lpSurface))) { if (!CreateDirectory("screenshot", NULL) && ERROR_ALREADY_EXISTS != GetLastError()) //yoksa oluştur return false; SYSTEMTIME st; GetSystemTime(&st); char szFileName[MAX_PATH]; sprintf_s(szFileName, "screenshot/screenshot_%04d%02d%02d_%02d%02d%02d.bmp", // eşsiz st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond); D3DXSaveSurfaceToFile(szFileName, D3DXIFF_BMP, lpSurface, NULL, NULL); } else TraceError("CPythonGraphic::SaveScreenShot() - ScreenShot Basarisiz!"); // yok et if (lpSurface) { lpSurface->Release(); lpSurface = nullptr; } return true; } -> Then remove the following from the PythonGraphic.h file: bool SaveJPEG(const char* pszFileName, LPBYTE pbyBuffer, UINT uWidth, UINT uHeight); -> In the same file there will be: bool SaveScreenShot(const char* szFileName); -> Update this to: bool SaveScreenShot(); -> Open PythonGraphicModule.cpp and delete this PyObject* grpSaveScreenShot(PyObject* poSelf, PyObject* poArgs) { struct tm* tmNow; time_t ct; ct = time(0); tmNow = localtime(&ct); char szPath[MAX_PATH + 256]; SHGetSpecialFolderPath(NULL, szPath, CSIDL_PERSONAL, TRUE); //GetTempPath(); strcat(szPath, "\\METIN2\\"); if (-1 == _access(szPath, 0)) if (!CreateDirectory(szPath, NULL)) { TraceError("Failed to create directory [%s]\n", szPath); return Py_BuildValue("(is)", FALSE, ""); } sprintf(szPath + strlen(szPath), "%02d%02d_%02d%02d%02d.jpg", tmNow->tm_mon + 1, tmNow->tm_mday, tmNow->tm_hour, tmNow->tm_min, tmNow->tm_sec); BOOL bResult = CPythonGraphic::Instance().SaveScreenShot(szPath); return Py_BuildValue("(is)", bResult, szPath); } -> and delete this: { "SaveScreenShot", grpSaveScreenShot, METH_VARARGS }, -> Find the following function in the same file PyObject* grpSaveScreenShotToPath(PyObject* poSelf, PyObject* poArgs) { -> Replace this function completely with the code I gave below. PyObject* grpSaveScreenShotToPath(PyObject* poSelf, PyObject* poArgs) { CPythonGraphic::Instance().SaveScreenShot(); return Py_BuildNone(); } -> We are done with the client src. Now open root/game.py and find this function: def SaveScreen(self): print "save screen" # SCREENSHOT_CWDSAVE if SCREENSHOT_CWDSAVE: if not os.path.exists(os.getcwd()+os.sep+"screenshot"): os.mkdir(os.getcwd()+os.sep+"screenshot") (succeeded, name) = grp.SaveScreenShotToPath(os.getcwd()+os.sep+"screenshot"+os.sep) elif SCREENSHOT_DIR: (succeeded, name) = grp.SaveScreenShot(SCREENSHOT_DIR) else: (succeeded, name) = grp.SaveScreenShot() # END_OF_SCREENSHOT_CWDSAVE if succeeded: pass """ chat.AppendChat(chat.CHAT_TYPE_INFO, name + localeInfo.SCREENSHOT_SAVE1) chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.SCREENSHOT_SAVE2) """ else: chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.SCREENSHOT_SAVE_FAILURE) -> ..and update it like this: def SaveScreen(self): grp.SaveScreenShotToPath() You can also search and delete the variables in the original Python code above from root. I'm sorry for my bad english.
  4. Download Merry Christmas to everyone, I saw that here is not the best option, so I want to offer you the official system, it is not a complicated system, but maybe someone needs it.
  5. M2 Download Center Download Here ( Internal ) Description: [Hidden Content] // 1. PythonPlayerInput.cpp // 1.0. Search: void CPythonPlayer::PickCloseItem() { ... } // 1.0. Add after: void CPythonPlayer::PickCloseItemVector() { CInstanceBase * pkInstMain = NEW_GetMainActorPtr(); if (!pkInstMain) return; TPixelPosition kPPosMain; pkInstMain->NEW_GetPixelPosition(&kPPosMain); std::vector<DWORD> itemVidList; CPythonItem& rkItem=CPythonItem::Instance(); if (!rkItem.GetCloseItemVector(pkInstMain->GetNameString(), kPPosMain, itemVidList)) return; if(itemVidList.empty()) return; for(int i = 0; i < itemVidList.size(); i++) SendClickItemPacket(itemVidList[i]); } // 2. PythonItem.cpp // 2.0. Search: bool CPythonItem::GetCloseItem (const std::string& myName, const TPixelPosition& c_rPixelPosition, DWORD* pdwItemID, DWORD dwDistance) { .... } // 2.0. Add after: bool CPythonItem::GetCloseItemVector(const std::string& myName, const TPixelPosition& c_rPixelPosition, std::vector<DWORD>& itemVidList) { DWORD dwCloseItemDistance = 1000 * 1000; TGroundItemInstanceMap::iterator i; for (i = m_GroundItemInstanceMap.begin(); i != m_GroundItemInstanceMap.end(); ++i) { TGroundItemInstance * pInstance = i->second; DWORD dwxDistance = DWORD(c_rPixelPosition.x - pInstance->v3EndPosition.x); DWORD dwyDistance = DWORD(c_rPixelPosition.y - (-pInstance->v3EndPosition.y)); DWORD dwDistance = DWORD(dwxDistance * dwxDistance + dwyDistance * dwyDistance); if (dwDistance < dwCloseItemDistance && (pInstance->stOwnership == "" || pInstance->stOwnership == myName)) { itemVidList.push_back(i->first); } } return true; } // 3. PythonItem.h // 3.0. Search: bool GetCloseMoney(const TPixelPosition & c_rPixelPosition, DWORD* dwItemID, DWORD dwDistance=300); // 3.0. Adauga sub: bool GetCloseItemVector(const std::string& myName, const TPixelPosition& c_rPixelPosition, std::vector<DWORD>& itemVidList); // 4. PythonPlayer.cpp // 4.0. Search and replace: void CPythonPlayer::SendClickItemPacket(DWORD dwIID) { if (IsObserverMode()) return; const char * c_szOwnerName; if (!CPythonItem::Instance().GetOwnership(dwIID, &c_szOwnerName)) return; if (strlen(c_szOwnerName) > 0) if (0 != strcmp(c_szOwnerName, GetName())) { CItemData * pItemData; if (!CItemManager::Instance().GetItemDataPointer(CPythonItem::Instance().GetVirtualNumberOfGroundItem(dwIID), &pItemData)) { Tracenf("CPythonPlayer::SendClickItemPacket(dwIID=%d) : Non-exist item.", dwIID); return; } if (!IsPartyMemberByName(c_szOwnerName) || pItemData->IsAntiFlag(CItemData::ITEM_ANTIFLAG_DROP | CItemData::ITEM_ANTIFLAG_GIVE)) { PyCallClassMemberFunc(m_ppyGameWindow, "OnCannotPickItem", Py_BuildValue("()")); return; } } CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance(); rkNetStream.SendItemPickUpPacket(dwIID); } // 5. PythonPlayerModule.cpp // 5.0. Search: PyObject * playerPickCloseItem(PyObject* poSelf, PyObject* poArgs) { CPythonPlayer::Instance().PickCloseItem(); return Py_BuildNone(); } // 5.0. Add after: PyObject * playerPickCloseItemVector(PyObject* poSelf, PyObject* poArgs) { CPythonPlayer::Instance().PickCloseItemVector(); return Py_BuildNone(); } // 5.1. Search: { "PickCloseItem", playerPickCloseItem, METH_VARARGS }, // 5.1.Add after:: { "PickCloseItemVector", playerPickCloseItemVector, METH_VARARGS }, // 6. PythonPlayer,h // 6.0. Search: void PickCloseItem(); // 6.0. Add after: void PickCloseItemVector(); // 7. game.py // 7. Search: player.PickCloseItem() // 7. Replace with: player.PickCloseItemVector() // You can make option for fast pickup or not.
  6. [Hidden Content] [Hidden Content] Preview[OFF-ON]: Enable:
  7. Download Other Mirros Download Here (GitHub) Download Here (Mega) Ship Defense is a dungeon accessible only in groups (minimum 2 players, maximum 8) in which players set sail for the new continent defending the ship’s mast from increasingly stronger and more numerous monsters until they defeat all three heads of the Hydra boss. Once the mission is complete, the participants will receive some rewards (determined by chance). Information Demonstration
  8. Download Alternative download links → Github
  9. Because why not... Only a few changes are necessary, and the input width has remained unchanged. Preview of the Quest Width Expansion Guide Client • Srcs •
  10. M2 Download Center Download Here ( Internal ) Download
  11. Download Metin2 Download [Hidden Content]
  12. M2 Download Center Download Here ( Internal ) SYSTEM : DOWLOAD VT : CLİCK
  13. M2 Download Center Download Here ( Internal ) Hi devs, today I will release the fix I made for the skill cooldown, already fixed on official servers, this is the bug it self: And this is the fix: Regards! Fix skill cooldown ~ Shang.rar ### root/ui.py ### Search: def SetSlotCoolTimeColor(self, slotIndex, r, g, b, a): wndMgr.SetSlotCoolTimeColor(self.hWnd, slotIndex, r, g, b, a) ### Add after: def StoreSlotCoolTime(self, key, slotIndex, coolTime, elapsedTime = 0.0): wndMgr.StoreSlotCoolTime(self.hWnd, key, slotIndex, coolTime, elapsedTime) def RestoreSlotCoolTime(self, key): wndMgr.RestoreSlotCoolTime(self.hWnd, key) Thanks to @Horinna for report that bug. Here's the fix: """ Find this: elif (not self.__CanUseSkillNow()) or (skillGrade != j): skillPage.SetSlotCount(realSlotIndex, 0) skillPage.DisableCoverButton(realSlotIndex) Add this under:""" skillPage.DeactivateSlot(realSlotIndex) # After the else, paste this: if player.IsSkillActive(slotIndex) and (skillGrade == j): # fix001 skillPage.ActivateSlot(realSlotIndex) # The if should look like this: if (skillGrade == skill.SKILL_GRADE_COUNT) and j == (skill.SKILL_GRADE_COUNT-1): skillPage.SetSlotCountNew(realSlotIndex, skillGrade, skillLevel) elif (not self.__CanUseSkillNow()) or (skillGrade != j): skillPage.SetSlotCount(realSlotIndex, 0) skillPage.DisableCoverButton(realSlotIndex) skillPage.DeactivateSlot(realSlotIndex) # fix else: skillPage.SetSlotCountNew(realSlotIndex, skillGrade, skillLevel) if player.IsSkillActive(slotIndex) and (skillGrade == j): # fix skillPage.ActivateSlot(realSlotIndex)
  14. M2 Download Center Download Here ( Internal ) [Hidden Content] [Hidden Content] [Hidden Content]
  15. Download Metin2 Download The items allows you to switch the current damage & skill damage attrs in the item either to its maximium or just changing the values. The value of the event flag "e_special_attr" adds to the value of the normal hit damage, If activated. Preview: [Hidden Content] Download: MEGA Github VirusTotal
  16. M2 Download Center Download Here ( Internal ) Download Here ( GitHub ) Just add \n example:
  17. M2 Download Center Download Here ( Internal ) Download Here ( GitHub ) Download Here ( MEGA ) As the title indicates, the system allows you to change the default keyboard keys. Click here to check the tutorial for adding new keys & functions. Click here for tab targeting key support.
  18. M2 Download Center Download Here ( Internal ) I know many people like me come here or try to find in another forums this select new character official.. and is just a part or is incomplete.. but i find a full version and i come here to reupload. so GL on servers. For make large description on characters / kingdoms: Check change BOX_VISIBLE_LINE_COUNT from 5 to 14 in PythonEventManager.h Thanks @Lajk Download: [Hidden Content]
  19. M2 Download Center Download Here ( Internal ) 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.
  20. M2 Download Center Download Here ( Internal ) By default, the GM mark in the envelope only appears when the GM writes to us or writes back. This modification will improve this and add a new special envelope. The solution comes from KoYGeR, a user of this forum. ///SERVER 1. Open cmd.cpp and add (intuitively, among other acmd lines): ACMD(do_get_gmlist); Find this: { "\n", NULL, 0, POS_DEAD, GM_IMPLEMENTOR } And add above: { "get_gmlist", do_get_gmlist, 0, POS_DEAD, GM_PLAYER }, 2. Open cmd_gm.cpp and at the end of the file add: ACMD(do_get_gmlist) { std::auto_ptr<SQLMsg> pmsg(DBManager::instance().DirectQuery("SELECT `mName` FROM `common`.`gmlist`")); if (pmsg->Get()->uiNumRows > 0) { for (int i = 0; i < pmsg->Get()->uiNumRows; i++) { MYSQL_ROW row = mysql_fetch_row(pmsg->Get()->pSQLResult); ch->ChatPacket(CHAT_TYPE_COMMAND, "AddGameMaster %s", row[0]); } } else { ch->ChatPacket(CHAT_TYPE_INFO, "Nie znaleziono..."); } } ///CLIENT GAME 3. Open constinfo.py and add (intuitively, without much meaning where): GM_LIST = [] 4. Open game.py and find this: net.SendEnterGamePacket() And add below: net.SendChatPacket("/get_gmlist") Find this: "PlayMusic" : self.__PlayMusic, # END_OF_WEDDING And add below: "AddGameMaster" : self.AddGameMaster, At the end of the file add: def AddGameMaster(self, gmName): constInfo.GM_LIST.append(gmName) 5. Open interfacemodule.py and find this: def __MakeWhisperButton(self, name): whisperButton = uiWhisper.WhisperButton() whisperButton.SetUpVisual("d:/ymir work/ui/game/windows/btn_mail_up.sub") whisperButton.SetOverVisual("d:/ymir work/ui/game/windows/btn_mail_up.sub") whisperButton.SetDownVisual("d:/ymir work/ui/game/windows/btn_mail_up.sub") if self.IsGameMasterName(name): whisperButton.SetToolTipTextWithColor(name, 0xffffa200) else: whisperButton.SetToolTipText(name) And change to this: def __MakeWhisperButton(self, name): whisperButton = uiWhisper.WhisperButton() if name in constInfo.GM_LIST: whisperButton.SetUpVisual("d:/ymir work/ui/mail_gm_closed.tga") whisperButton.SetOverVisual("d:/ymir work/ui/mail_gm_open.tga") whisperButton.SetDownVisual("d:/ymir work/ui/mail_gm_open.tga") whisperButton.SetToolTipTextWithColor(name, 0xffffa200) else: whisperButton.SetUpVisual("d:/ymir work/ui/mail_normal_closed.tga") whisperButton.SetOverVisual("d:/ymir work/ui/mail_normal_opend.tga") whisperButton.SetDownVisual("d:/ymir work/ui/mail_normal_opend.tga") whisperButton.SetToolTipText(name) 6. Open uiwhisper.py and add (intuitively, among other imports): import constInfo Find this: def AcceptTarget(self): And at the end of the function add: if name in constInfo.GM_LIST: self.SetGameMasterLook() Find this: def OpenWithTarget(self, targetName): And at the end of the function add: if targetName in constInfo.GM_LIST: self.SetGameMasterLook() 7. Download the envelope and put in your game (etc\ymir work\ui): [Hidden Content]
  21. M2 Download Center Download Here ( Internal ) [Hidden Content]
  22. Download Metin2 Download or Mega Hello! I know, this system is released on a lot of forums but those are not the full systems. I left a "readme" in the playersettingsmodule.py, please read. If you miss something, tell me. If you have problem with the system, i can try to help you. And last but not least, THE BASE SYSTEM IS NOT MINE. I just re-edited and "fixed". Proof vid: Sorry for my bad english.. UPDATE InstanceBase.cpp: Search: if (dwSash == 85020) { m_dwSashEffect = EFFECT_REFINED + EFFECT_WINGS_NEWS2; __EffectContainer_AttachEffect(m_dwSashEffect); } Rreplace with: if (dwSash == 85020) { fSpecular += 35; // im the new m_dwSashEffect = EFFECT_REFINED + EFFECT_WINGS_NEWS2; __EffectContainer_AttachEffect(m_dwSashEffect); } __VT__
×
×
  • Create New...

Important Information

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