-
Posts
173 -
Joined
-
Last visited
-
Days Won
5 -
Feedback
100%
Mitachi last won the day on September 11 2025
Mitachi had the most liked content!
About Mitachi

- Birthday 11/26/2002
Informations
-
Gender
Male
-
Country
Italy
-
Nationality
Italian
Development
Recent Profile Visitors
17236 profile views
Mitachi's Achievements
-
Mitachi changed their profile photo
-
Players. That's it. Spend money to get players, then those players attract more players. The hardest part of running a Metin2 server today is making it look alive long enough for it to actually become alive. A mediocre server full of people will usually attract more players than a great server that looks empty. Metin2 players don't even seem that attached to a specific style anymore. The same guy can play a 2009 oldschool, a 2014 middleschool, and a completely custom newstyle with basically zero official content, all within the same 2 months
-
I'm working on my 5.2, so I wrote down a list of bugs to fix, but I couldn't remember how to reproduce this particular one. I guess I need to be careful when asking on Metin2Dev how to trigger bugs I'm already working on, unless I want to see the fix published the very next day just to farm some rep. Shit happens, however: a desync there in PythonNetworkStreamPhaseGame.cpp: case GUILD_SUBHEADER_GC_GUILD_INVITE: { DWORD dwGuildID; if (!Recv(sizeof(dwGuildID), &dwGuildID)) return false; char szGuildName[GUILD_NAME_MAX_LEN+1]; if (!Recv(GUILD_NAME_MAX_LEN + 1, &szGuildName)) /* @mitafix.client.44 */ return false; szGuildName[GUILD_NAME_MAX_LEN] = 0; PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "RecvGuildInviteQuestion", Py_BuildValue("(is)", dwGuildID, szGuildName)); Tracef(" <Guild Invite> %d, %s\n", dwGuildID, szGuildName); break; } This was causing: When you invite someone in the guild, he accept but he can't see the guild name above his head (only in the new member client) a simple UpdatePacket will fix, like equipping/unequipping something. What I was doing to make it happen (not all process are needed ig): Log in with two characters: the guild leader and a guild member. Disband the guild. Create a new guild using the same character as leader. Invite the former member to the newly created guild. This doesn't happen every time due to packet timing/buffering. Depending on how the packets are grouped and processed, the leftover byte doesn't always result in the same visible failure, so you may try 2/3 times before to notice the bug.
- 1 reply
-
- 3
-
-
-
-
Not many days ago we talked about this, gg When Kolen wants something he will do
-
Almost everyone here offers some kind of paid service, and releases on m2dev have always been a way to showcase skills and stay visible in the market. No one is truly concerned that people can access interesting content for free. Distraught followed the same approach, with the difference that what he chose to release had little commercial value for him. However, when discussions move toward areas that are valuable to him such as bgfx or renderer-related changes he understandably becomes protective, much like those who previously sold py3/64bit/d3d9ex ports. I am listed as a contributor, but my involvement was minimal fewer than three small commits. Before releasing the project, Distraught discussed it with a few of us, myself included. I agreed with the release because the goal was clearly defined: to modernize the codebase, nothing more. There was never any intention to aggregate hundreds of fixes, prepare the project for production use, or introduce gameplay systems and features. His vision has remained consistent. Fixing gameplay details such as attack calculations while polymorphed was never the priority. The focus was strictly on updating technologies, libraries, and core systems. These files were created and shared as resources, not as a ready-to-run solution. At this point, many of the pull requests seem to pursue goals that are the exact opposite of the original intent, or they stem from a misunderstanding of that intent altogether. It feels like some contributors have invested so much time that they’ve begun projecting their own vision onto the project. But @ Distraught (Stop me when I'm wrong )never aimed to undermine the work of file sellers like myself, Marty, Owsap, or others, nor to create a definitive free server base maintained by dozens of developers, for free. Including commits such as "CMake, Py3, D3D9Ex" aligns with the modernization objective. Adding content like "Razador," "Nemere," or anything tied to gameplay changes, fixes, or features does not. It shifts the project in a direction it was never meant to take. That said, it's just my opinion, I'm not pissed off even though I could have made +3k in the last few months selling files, AI is updating, and that's how it should be.I feel sorry mostly for the people who will never be able to build a reputation today, not being taken seriously because of AI.
-
Mitachi started following Need Help with a Script (Payment Possible if Needed)
-
Not mentioned but required: .gr2 -> 3D models used by props and buildings .mdatr -> metadata paired with .gr2 .spt -> SpeedTree models for trees effect/ -> particle and visual effects referenced by props or environment sound/ -> ambient sounds and reverb zones .msenv so skybox/ -> sky textures used in the environment probably more ++ don't forget we're using CRC32 table to get some prop files, copy the table. I wrote a version in Python, because it's definitely the best choice for vibecoding, but without realizing that I would have to use such a granny bind to be able to extract the texture lists from the .gr2 files I would export, You would encounter the same problem doing it in C#. You need something that parses the .gr2 files, extracting the names of the texture files it uses. Since I had already done it in Python and everything worked except for extracting the texture files related to gr2, I made a small C++ console app to take care of it, which I still call from Python, rofl. The result at this point is something that seems functional, even if it's ugly. I would rewrite it in C++, but I needed it quickly one night because some of the team couldn't find all the files used in a map. Honestly, many people are definitely looking for a tool like this, but I know for a fact that it's already quite widespread, and I believe that some mappers have already paid developers in the past to make one to keep for themselves, so I don't know how nice it would be to release something like this. It created a _TUTORIAL{mapname} folder with all the files used by the map, with the exact directory
-
If you are using Owsap files or newer versions of Martysama files, you will need to make some changes. Since they use proto's APPLY_MOUNT on their mounting system, as does the official version, Marty v5 does not have this, but in the newer version, it has refactored the mounts, which do not work with that system. If you are a Marty customer, you can talk to @ TAUMP, I fixed it for him once. However, I need to update it, I made some changes to make it work with skin mounting and smarter bonus management, I will try to incorporate the changes in the next few days. This system is the default on my server files. All my customers use it and no one has any problems, as it is very simple and consists of only a few lines of code. I don't even consider it a system, so for any kind of problem, check the warnings I posted at the beginning of the thread and the readme.
-
[Server Crash Fix] Packet sending and buffer reallocation
Mitachi replied to Distraught's topic in Bug Fixes
This fix is very useful; I'm probably the only file seller who keeps IPE disabled, which means that out of 100 servers, at least 90 (counting those who don't disable it) will have it enabled. Therefore, fixing it/making it stabler is a good move. protobuf have nothing to do with data encryption, it is a serialization system -
If you are using marty files you don't need this additional fix, he's already doing that. IsLoadedAffect is only set if you actually have an Affect or LoadAffect won't load, which is a problem. Not only for this fix, but in general, IsLoadedAffect is used in anti-exploit contexts. It is necessary that they are loaded even if you do not have affect, so, you got another fix there CDBManager::instance().ReturnQuery(szQuery, QID_AFFECT, peer->GetHandle(), new ClientHandleInfo(dwHandle)); // to CDBManager::instance().ReturnQuery(szQuery, QID_AFFECT, peer->GetHandle(), new ClientHandleInfo(dwHandle, packet->player_id)); //... case QID_AFFECT: sys_log(0, "QID_AFFECT %u", info->dwHandle); // fix: if there are no affects, make an empty one to send the packet if (!mysql_num_rows(pSQLResult)) { TPacketAffectElement pAffElem{}; DWORD dwCount = 1; peer->EncodeHeader(HEADER_DG_AFFECT_LOAD, info->dwHandle, sizeof(DWORD) + sizeof(DWORD) + sizeof(TPacketAffectElement) * dwCount); peer->Encode(&info->player_id, sizeof(DWORD)); peer->Encode(&dwCount, sizeof(DWORD)); peer->Encode(&pAffElem, sizeof(TPacketAffectElement) * dwCount); break; } RESULT_AFFECT_LOAD(peer, pSQLResult, info->dwHandle); break;
- 1 reply
-
- 2
-
-
Hi, I guess I am spending too much time with @ Syreldar. If you would like a full explanation: If you want just the simple fix: [Hidden Content]
- 1 reply
-
- 108
-
-
-
-
-
-
-
It seems they were last seen at the M2Dev Conference organized by @ Distraught, and we haven't heard from them since #freemarty #freeowsap
-
Just check lMapIndex is less than 10000, patched in main topic #ifdef ENABLE_SUPERSTONE_EVENT if (pkMob->m_table.bType == CHAR_TYPE_STONE && lMapIndex < 10000 && quest::CQuestManager::instance().GetEventFlag("superstone_event") > 0) { SpawnExtraStones(pkMob, lMapIndex, x, y, z, bShow, bSpawnMotion #ifdef ENABLE_WJ_SHOW_MOB_INFO , bAggressive #endif ); } #endif
-
Thanks, unfortunately, I haven't found any specific guide to be honest, In Italy, we call it ‘Metin a grappolo d'uva’ (Metin grape cluster) However, to simulate the fact that the gf does not spawn all multipliers but only some of them, a random number could be added. #ifdef ENABLE_SUPERSTONE_EVENT if (pkMob->m_table.bType == CHAR_TYPE_STONE && lMapIndex < 10000 && quest::CQuestManager::instance().GetEventFlag("superstone_event") > 0) { // 30% chance to trigger extra spawn if (number(1, 100) <= 30) { SpawnExtraStones(pkMob, lMapIndex, x, y, z, bShow, bSpawnMotion #ifdef ENABLE_WJ_SHOW_MOB_INFO , bAggressive #endif ); } } #endif I'm pretty sure they actually made some extra regens, stingy as they are. I've seen different versions of this event, some people use them in groups of 2, some even use them on bosses
-
Ye, actually a guy just explained me I was living a lie, maybe Super Event Stone isn't even the right name of that event! However, maybe a simple random if do or not the multiple spawn, can emulate the official behaviour.
-
What exactly does it do? When the event is active, Metinstones spawn on top of each other, 5 in total instead of 1. So by attacking just one, you're hitting 5, basically a Metinstone x5. (I made the extra number customisable via ef) I've often seen this system used by hard-coding regens or similar stuff. They asked me to do it and it seemed like a clean way to do it. If you notice any errors, let me know. Official pic (yes it's from a video): From my client: Usage: In Game Command: /e superstone_event 4 4 is the amount of extra metin, with 4 it's like official but you could also do 2, so it will be 3 in total e.g Code: [Hidden Content]
- 8 replies
-
- 146
-
-
-
-
-
-
-
But he is right, paradoxically you could lose more players using that WebView2 than DirectX11 / 64 bit, It's not worth the risk (?) Also consider that many servers don't even use the in-game browser anymore (commonly used just for itemshop and some vote4buff)
