Jump to content

xP3NG3Rx

Honorable Member
  • Posts

    856
  • Joined

  • Days Won

    402
  • Feedback

    100%

xP3NG3Rx last won the day on November 4 2025

xP3NG3Rx had the most liked content!

About xP3NG3Rx

Recent Profile Visitors

43345 profile views

xP3NG3Rx's Achievements

God

God (16/16)

  • Well Followed Rare
  • Reacting Well
  • Dedicated
  • Very Popular Rare
  • One Year In

Recent Badges

24.9k

Reputation

  1. Hello, If you have free time and passion for dealing with this kind of stuff, read forward. This may insult you, but if the shoe doesn't fit, don't wear it. There are more and more reverse engineers whom does this for their own purpose instead of helping the community. This might open a door for newbies to recreate the official codes for others. 1. First you need to start the binary. Enter to the game or import/load as many resources as you want to reverse on the login screen. For example: If you want to reverse the uiINewInventory.py, you need to import it first, otherwise you won't see the offest of pythonobject at the dword_OFFSET in the debugger. This is how will look like: .data:03A39B50 dword_3A39B50 dd 0h --> Here the 0h should be the offset of the pythonobject 2. Dump the binary from process. 3. Load the dumped process(.exe) into debugger and w8 until the analysis finishes. 4. You can start looking for functions to reverse. In every disassembled function must check every function calls and their parameters. Disassemble them to see their parameters are valid in the function you want to reverse, sometimes ida misunderstands or skips them. 5. PythonObjects are demonstrated in the video and how to read their values from memory if it has been loaded. About LLMs Be careful with them. If they sense that your code might be under copyrights they won't help you. You need to lie to them as I did in the videos. (= Also never trust their codes without checking them. They can also write complete stupid codes without apology. Videos Enjoy. ps. Big IF. When I will have the time I will drop the uiScalesItem (compare items) and the scrollable itemtooltip.
  2. Nobody cares what it does if it could do more. There will always be one or two who will show you what is missing from everything. Mr. Perfectos they are. Not even a respond they worth.
  3. * Additional informations Before this version(v26.0.5) they have added these in the v24.2.11: ENABLE_COUNTLINE_RENDER_AFTER_UI ENABLE_RENDER_COUNTLINE_ATTACHED_MOUSE -> New render layer: MOUSE_ATTACHED ui.NumberLine("MOUSE_ATTACHED") References of ENABLE_RENDER_COUNTLINE_ATTACHED_MOUSE: -> uiGuildBank.py -> uiSafebox.py Reference of ENABLE_COUNTLINE_RENDER_AFTER_UI: -> mouseModule.py Before: After:
  4. The fail_type came with v25.1.6. and the custom mining motion type in 2018. The texts are not in the locale, they forgot to add them, since then it still spams into syserr.
  5. It is kind of a "how the flour has made" in a how to make cake question. Back to the topic, I do not know when and why but they already added a change for this which may be invalid (long time did not put that much focus on this section especially reverse engineering, the code below is a potencial maybe): // PythonApplicationModule.cpp struct SCameraDistance { float fShortDistance; float fLongDistance; }; static std::map<std::string, SCameraDistance> gs_mapCamera; static bool gs_bCameraMapInit = false; static inline void InitializeCameraDistances() { if (gs_bCameraMapInit) return; gs_bCameraMapInit = true; gs_mapCamera["metin2_map_n_flame_dragon"] = { 6000.0f, 6000.0f }; gs_mapCamera["metin2_12zi_stage"] = { 5000.0f, 5000.0f }; gs_mapCamera["metin2_map_defensewave"] = { 5000.0f, 5000.0f }; gs_mapCamera["metin2_map_mists_of_island"] = { 5000.0f, 5000.0f }; gs_mapCamera["metin2_map_guild_whitedragon_boss"] = { 7000.0f, 7000.0f }; gs_mapCamera["metin2_map_moonlight_boss"] = { 2500.0f, 5500.0f }; gs_mapCamera["metin2_map_greedy_room"] = { 7000.0f, 7000.0f }; } PyObject* appSetCameraMaxDistance(PyObject* poSelf, PyObject* poArgs) { InitializeCameraDistances(); SCameraDistance rDistance = { 2500.0f, 3500.0f }; const char* c_szCurMapName = CPythonBackground::Instance().GetWarpMapName(); std::map<std::string, SCameraDistance>::iterator it = gs_mapCamera.find(c_szCurMapName); float fMaxDistance = 0.0f; if (it == gs_mapCamera.end()) { if (!PyTuple_GetFloat(poArgs, 0, &fMaxDistance)) return Py_BuildException(); fMaxDistance = fMINMAX(rDistance.fShortDistance, fMaxDistance, rDistance.fLongDistance); // this line is not in the official one, I added to it. } else { rDistance = it->second; if (CPythonSystem::Instance().GetCameraMode()) fMaxDistance = rDistance.fLongDistance; else fMaxDistance = rDistance.fShortDistance; } CCamera::SetCameraMaxDistance(fMaxDistance); return Py_BuildNone(); } This will ignore the default values from the constInfo on the predefined maps and will set the data from the std::map regarding the options.
  6. When does it happen? Because, from that log it does not coming out, you might have sent a wrong log file. It is an errorless close of the client. Here your cursor was on the serverexitbutton, which means you clicked on it and then the phasecurtain came which is already the closing time in the networkStream.MainStream.__ChangePhaseWindow -> app.Exit() Then the destructor of the classes run down successfully.
  7. GF-v25.1.8 Halloween Alternative download link → M2DL GF-v25.1.8 Root Meta Alternative download link → M2DL 25.1.8 Halloween icon Alternative download link → M2DL
  8. GF v25.1.6 Root Meta Alternative download link → M2DL
  9. Download
  10. PSD Files
  11. That's correct, use that for your own. Btw, they made this. I just reversed from their binary. (item.CheckAffect)
  12. GF v24.3.8 Root Meta Alternative download links →M2DL (Includes msm files, dumped binary for IDA)
  13. In the item_manager.cpp -> ITEM_MANAGER::CreateDropItem Give a try to change the "Drop Item Group" (m_map_pkDropItemGroup) iteration like so: // Drop Item Group { itertype(m_map_pkDropItemGroup) it; it = m_map_pkDropItemGroup.find(pkChr->GetRaceNum()); if (it != m_map_pkDropItemGroup.end()) { typeof(it->second->GetVector()) v = it->second->GetVector(); for (DWORD i = 0; i < v.size(); ++i) { int iPercent = (v[i].dwPct * iDeltaPercent) / 100; if (iPercent >= number(1, iRandRange)) { item = CreateItem(v[i].dwVnum, v[i].iCount, 0, true); if (item) { if (item->GetType() == ITEM_POLYMORPH) { if (item->GetVnum() == pkChr->GetPolymorphItemVnum()) { item->SetSocket(0, pkChr->GetRaceNum()); } } //##!! else if (item->GetType() == ITEM_SKILLBOOK) // also you can add && pkChr->IsStone() { if (item->GetVnum() == ITEM_SKILLBOOK_VNUM) { if (number(1, 100) <= 30) // 30% { extern const DWORD GetRandomSkillVnum(BYTE bJob = JOB_MAX_NUM, BYTE bSkillGroup = 0); item->SetSocket(0, GetRandomSkillVnum(pkKiller->GetJob(), pkKiller->GetSkillGroup())); } //else //{ // //not needed. CreateItem does the job //} } } //##!! vec_item.push_back(item); } } } } }
  14. The problem is in front of your eyes. Check again the item_proto or your dump_proto. When the dump_proto has no valid subtype handling (it may be in macro what the compiler doesn't see) it will set it to -1 which will be 255.
×
×
  • 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.