Jump to content

Welcome to M2Tec

The global development community for Metin2

Knowledge is Freedom

Feel free to share your ideas, your knowledge in our community, your community.

Follow the Rules

Respect the rules of the community, the users and their administrative team. Let's be friends!
M2Tec - Community Maintenance Read more... ×

Kuroro

Developer
  • Content Count

    24
  • Posts on chatbox

    5
  • Joined

  • Last visited

  • Days Won

    4

Kuroro last won the day on June 19

Kuroro had the most liked content!

Community Reputation

158 Excellent

About Kuroro

  • Rank
    Member
  • Birthday 03/18/1999

Recent Profile Visitors

128 profile views

Mood

  • Strong
  • Currently Feeling Strong
  1. Kuroro

    clean Serverfiles + source + client

    A little cheeky I find. You sell a product without description, you do not even bother to detail the changes and additions made. If you had really worked hard on your project, you would have bothered to detail it with pleasure but here you have the typical profile of a scammer. I invite you to detail all that you have done on your sources, the forum does not need to be polluted from this kind of ad Kings regards
  2. Hello, Where did I specify that it was me who had depack? I just share the official files for the community
  3. Not for the moment
  4. Patch v19.3.9 Contains: Download
  5. Kuroro

    discussion KuroroDev - Serverfiles

    #6. Update: Some picture: costume hide.mp4 auto refine option.mp4 Video of Gaya system: Special thanks to @Itachi
  6. Kuroro

    discussion KuroroDev - Serverfiles

    #5. Update: destroy item.mp4 special storage.mp4
  7. Kuroro

    discussion KuroroDev - Serverfiles

    #4. Update: tab targeting.mp4 attr transfer system.mp4 Short video about transmutation syste, quiver and costume weapon:
  8. Kuroro

    discussion KuroroDev - Serverfiles

    #3. Update: Here are some recent screen additions: acce_absorb.mp4 acce_combine.mp4 acce_remove_bonus.mp4 hp_decimal.mp4 quiver_system.mp4 enchant bonus attr.mp4
  9. Kuroro

    discussion KuroroDev - Serverfiles

    #2. Update: Here are some recent screen additions: hd shadow.mp4 inventorysort_safebox.mp4 inventory sort system.mp4 mount system.mp4
  10. Kuroro

    discussion KuroroDev - Serverfiles

    #1. Update: Here are some recent screen additions: Dragon soul: dragon_soul.mp4 Biolog system: biolog.mp4 New drop dialog:
  11. Hello to the community , I'm here to present the project I am currently working on. This is the design of a clean, stable and complete source similar to the official. I started by removing all useless systems from Ymir that are not used or are useless. There are currently 265 .cpp files in the game (basic there were 365). I then cleaned the code and finally, I proceeded to fix the main and secondary as well as minor changes that can improve the game. My goal is to design sources blaming a maximum of the official with some personal modifications. I added a lot of #define in the sources in order to have some dynamic thing if you want to enable / disable some system. My files will be available in German, English and French only. All official quests will be translated via translate.lua. I added a lot of shortcuts in CONFIG, which will allow you to quickly modify the minor changes available. For protos, it has the ability to use TXT and SQL, both are currently up to date. Most pars syserr were fixed and not just hidden. Regarding the wolfman, I have not started to set it up yet but it is planned. On the client side, the compressed client size is 800MB The files will be free and shared except for the source. I intend to do several updates as a result of this topic to show you the progress. I. CONFIG II. ServerSource III. ClientSource IV. Client Do not hesitate to give me suggestions, ideas or advice, I'm here to learn too... I would update this topic over time, I would add some screen also.
  12. Hello, I come to share my knowledge on what I discovered recently on the encryption of packets. Some may tell me, but this has already been shared by MartySama. In reality, this one is not complete, it has forgotten a very important factor which I will present to you subsequently. But suddenly, you have to wonder what is happening if we disable the encryption of packets, by the way he shared it? Well, we may have an overload at the buffers, which may cause crashes game without error, or rather strange bugs. I could see different strange bugs. The most common was the fact that we can no longer perform an action that requires an agreement with the game. Example, after 15 minutes of play with a few connected players, some can no longer click on an item, or others will not be able to talk, etc ... There was a lot of debate about this, I took advice left and right and I pulled a problem. Why these bugs were not present before the encryption of packets? Simply because the structure was edited. Indeed, we can see that in the protocol.h Game, the function buffer_adjust_size was commented. Also, in the desc.cpp, they completely removed the condition in the function: void DESC::Packet But why ? Simply because it is no longer useful, the new system no longer requires a size adjuster for buffers (it seems to me) Or, they coded something else that automatically adjusts the size of the buffers but I have not watched yet. Why would I disable this system? Connection time LARGELY decreased (as we no longer use Cipher) Loading time also decreased Better fluidity (personal opinion) Size of the game enormously diminished as well as that of the launcher Here is a small preview video: Server side changes: A. Service.h file (Common) Look for this line: #define _IMPROVED_PACKET_ENCRYPTION_ And comment or delete the line like this: //#define _IMPROVED_PACKET_ENCRYPTION_ B. Protocol.h file (Game) Look for this line: //buffer_adjust_size(pbuf, length); Uncomment it like this: buffer_adjust_size(pbuf, length); C. desc.cpp file (Game) Look for this line: void DESC::Packet(const void * c_pvData, int iSize) Replace the entire function with this: void DESC::Packet(const void * c_pvData, int iSize) { assert(iSize > 0); if (m_iPhase == PHASE_CLOSE) // 끊는 상태면 보내지 않는다. return; if (m_stRelayName.length() != 0) { // Relay 패킷은 암호화하지 않는다. TPacketGGRelay p; p.bHeader = HEADER_GG_RELAY; strlcpy(p.szName, m_stRelayName.c_str(), sizeof(p.szName)); p.lSize = iSize; if (!packet_encode(m_lpOutputBuffer, &p, sizeof(p))) { m_iPhase = PHASE_CLOSE; return; } m_stRelayName.clear(); if (!packet_encode(m_lpOutputBuffer, c_pvData, iSize)) {  m_iPhase = PHASE_CLOSE; return; } } else { if (m_lpBufferedOutputBuffer) { buffer_write(m_lpBufferedOutputBuffer, c_pvData, iSize); c_pvData = buffer_read_peek(m_lpBufferedOutputBuffer); iSize = buffer_size(m_lpBufferedOutputBuffer); } // TRAFFIC_PROFILE if (g_bTrafficProfileOn) TrafficProfiler::instance().Report(TrafficProfiler::IODIR_OUTPUT, *(BYTE *) c_pvData, iSize); // END_OF_TRAFFIC_PROFILER #ifdef _IMPROVED_PACKET_ENCRYPTION_ void* buf = buffer_write_peek(m_lpOutputBuffer); if (packet_encode(m_lpOutputBuffer, c_pvData, iSize)) {  if (cipher_.activated()) { cipher_.Encrypt(buf, iSize); } } else { m_iPhase = PHASE_CLOSE; } #else if (!m_bEncrypted) { if (!packet_encode(m_lpOutputBuffer, c_pvData, iSize)) {  m_iPhase = PHASE_CLOSE; } } else { if (buffer_has_space(m_lpOutputBuffer) < iSize + 8) { buffer_adjust_size(m_lpOutputBuffer, iSize); if (buffer_has_space(m_lpOutputBuffer) < iSize + 8) { sys_err( "desc buffer mem_size overflow : ", " memsize(%u) ",  " write_pos(%u)", " iSize(%d)", m_lpOutputBuffer->mem_size, m_lpOutputBuffer->write_point_pos, iSize); m_iPhase = PHASE_CLOSE; } } else { // 암호화에 필요한 충분한 버퍼 크기를 확보한다. /* buffer_adjust_size(m_lpOutputBuffer, iSize + 8); */ DWORD * pdwWritePoint = (DWORD *) buffer_write_peek(m_lpOutputBuffer); if (packet_encode(m_lpOutputBuffer, c_pvData, iSize)) { int iSize2 = TEA_Encrypt(pdwWritePoint, pdwWritePoint, GetEncryptionKey(), iSize); if (iSize2 > iSize) buffer_write_proceed(m_lpOutputBuffer, iSize2 - iSize); } } } #endif // _IMPROVED_PACKET_ENCRYPTION_ SAFE_BUFFER_DELETE(m_lpBufferedOutputBuffer); } //sys_log(0, "%d bytes written (first byte %d)", iSize, *(BYTE *) c_pvData); if (m_iPhase != PHASE_CLOSE) fdwatch_add_fd(m_lpFdw, m_sock, this, FDW_WRITE, true); } Warning ! Do not forget to compile your Game & your DB Client side change: D. ServiceDefs file (Eterpack) Look for this line: #define _IMPROVED_PACKET_ENCRYPTION_ Comment or delete like this: //#define _IMPROVED_PACKET_ENCRYPTION_ E. Locale.cpp file (Userinterface) Look for this line: #define LSS_SECURITY_KEY "testtesttesttest" Edit like this: #define LSS_SECURITY_KEY "1234abcd5678efgh" If you want to share this tutorial elsewhere, please quote the source. Kuroro
  13. Hello everyone, I just share a system that I designed a while ago. It will allow you to hide any type of costume (hairstyle, costume, sash, weapon costume) all in the game option. Read the .txt information I did in the tutorial. Before you start, you need the module CFG that I shared HERE System Insights: hide costume system.mp4 Download: [C++] Hide costume by Kuroro.rar
  14. Kuroro

    c++ [C++] New Module Python CFG

    minIni.h /* minIni - Multi-Platform INI file parser, suitable for embedded systems * * Copyright (c) CompuPhase, 2008-2012 * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy * of the License at * * [Hidden Content] * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. * * Version: $Id: minIni.h 44 2012-01-04 15:52:56Z thiadmer.riemersma@gmail.com $ */ #ifndef MININI_H #define MININI_H #include "minGlue.h"  #if (defined _UNICODE || defined __UNICODE__ || defined UNICODE) && !defined MININI_ANSI #include <tchar.h> #define mTCHAR TCHAR #else /* force TCHAR to be "char", but only for minIni */ #define mTCHAR char #endif #if !defined INI_BUFFERSIZE #define INI_BUFFERSIZE 512 #endif #if defined __cplusplus extern "C" { #endif int ini_getbool(const mTCHAR *Section, const mTCHAR *Key, int DefValue, const mTCHAR *Filename); long ini_getl(const mTCHAR *Section, const mTCHAR *Key, long DefValue, const mTCHAR *Filename); int ini_gets(const mTCHAR *Section, const mTCHAR *Key, const mTCHAR *DefValue, mTCHAR *Buffer, int BufferSize, const mTCHAR *Filename); int ini_getsection(int idx, mTCHAR *Buffer, int BufferSize, const mTCHAR *Filename); int ini_getkey(const mTCHAR *Section, int idx, mTCHAR *Buffer, int BufferSize, const mTCHAR *Filename); #if defined INI_REAL INI_REAL ini_getf(const mTCHAR *Section, const mTCHAR *Key, INI_REAL DefValue, const mTCHAR *Filename); #endif #if !defined INI_READONLY int ini_putl(const mTCHAR *Section, const mTCHAR *Key, long Value, const mTCHAR *Filename); int ini_puts(const mTCHAR *Section, const mTCHAR *Key, const mTCHAR *Value, const mTCHAR *Filename); #if defined INI_REAL int ini_putf(const mTCHAR *Section, const mTCHAR *Key, INI_REAL Value, const mTCHAR *Filename); #endif #endif /* INI_READONLY */ #if !defined INI_NOBROWSE typedef int (*INI_CALLBACK)(const mTCHAR *Section, const mTCHAR *Key, const mTCHAR *Value, const void *UserData); int ini_browse(INI_CALLBACK Callback, const void *UserData, const mTCHAR *Filename); #endif /* INI_NOBROWSE */ #if defined __cplusplus } #endif #if defined __cplusplus #if defined __WXWINDOWS__ #include "wxMinIni.h" #else #include <string> /* The C++ class in minIni.h was contributed by Steven Van Ingelgem. */ class minIni { public: minIni(const std::string& filename) : iniFilename(filename) { }  bool getbool(const std::string& Section, const std::string& Key, bool DefValue=false) const { return ini_getbool(Section.c_str(), Key.c_str(), int(DefValue), iniFilename.c_str()) != 0; } long getl(const std::string& Section, const std::string& Key, long DefValue=0) const { return ini_getl(Section.c_str(), Key.c_str(), DefValue, iniFilename.c_str()); } int geti(const std::string& Section, const std::string& Key, int DefValue=0) const { return static_cast<int>(this->getl(Section, Key, long(DefValue))); } std::string gets(const std::string& Section, const std::string& Key, const std::string& DefValue="") const { char buffer[INI_BUFFERSIZE]; ini_gets(Section.c_str(), Key.c_str(), DefValue.c_str(), buffer, INI_BUFFERSIZE, iniFilename.c_str()); return buffer; } std::string getsection(int idx) const { char buffer[INI_BUFFERSIZE]; ini_getsection(idx, buffer, INI_BUFFERSIZE, iniFilename.c_str()); return buffer; } std::string getkey(const std::string& Section, int idx) const { char buffer[INI_BUFFERSIZE]; ini_getkey(Section.c_str(), idx, buffer, INI_BUFFERSIZE, iniFilename.c_str()); return buffer; } #if defined INI_REAL INI_REAL getf(const std::string& Section, const std::string& Key, INI_REAL DefValue=0) const { return ini_getf(Section.c_str(), Key.c_str(), DefValue, iniFilename.c_str()); } #endif #if ! defined INI_READONLY bool put(const std::string& Section, const std::string& Key, long Value) const { return ini_putl(Section.c_str(), Key.c_str(), Value, iniFilename.c_str()) != 0; } bool put(const std::string& Section, const std::string& Key, int Value) const { return ini_putl(Section.c_str(), Key.c_str(), (long)Value, iniFilename.c_str()) != 0; } bool put(const std::string& Section, const std::string& Key, bool Value) const { return ini_putl(Section.c_str(), Key.c_str(), (long)Value, iniFilename.c_str()) != 0; } bool put(const std::string& Section, const std::string& Key, const std::string& Value) const { return ini_puts(Section.c_str(), Key.c_str(), Value.c_str(), iniFilename.c_str()) != 0; } bool put(const std::string& Section, const std::string& Key, const char* Value) const { return ini_puts(Section.c_str(), Key.c_str(), Value, iniFilename.c_str()) != 0; } #if defined INI_REAL bool put(const std::string& Section, const std::string& Key, INI_REAL Value) const { return ini_putf(Section.c_str(), Key.c_str(), Value, iniFilename.c_str()) != 0; } #endif bool del(const std::string& Section, const std::string& Key) const { return ini_puts(Section.c_str(), Key.c_str(), 0, iniFilename.c_str()) != 0; } bool del(const std::string& Section) const { return ini_puts(Section.c_str(), 0, 0, iniFilename.c_str()) != 0; } #endif private: std::string iniFilename; }; #endif /* __WXWINDOWS__ */ #endif /* __cplusplus */ #endif /* MININI_H */
  15. Hi to the community, I just share a module named "CFG" that will serve you for a lot of things, including backup or generation of .cfg file. It can also be used for a lot of things. Suppose you have added an option to switch between day and night, with the module "cfg", you will then be able to save the environment (day / night) in use by a cfg file. Download: I had already done the tutorial before, here is the link: HERE
×