Informations
Jump to content

Lorem Ipsum...

Click to Dismiss this Notification

Programing

  • "Any fool can write code that a computer can understand. Good programmers write code that humans can understand." - Martin Fowler

  • "Simplicity is the ultimate sophistication." - Leonardo da Vinci

  • "Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it." - Brian W. Kernighan

  • "The best thing about a boolean is even if you are wrong, you are only off by a bit." - Anonymous

  • "It’s not at all important to get it right the first time. It’s vitally important to get it right the last time." - Andrew Hunt and David Thomas.

Read more

Hacking - Cheating

  • "Hacking is like playing chess. If you can see a few moves ahead, you can plan your strategy accordingly."

  • "Cheating is like a virus in a computer system. It spreads and destroys everything in its path."

  • "Hacking is an art form that requires creativity, curiosity, and technical expertise."

  • "Hacking is like playing a musical instrument. The more you practice, the better you become."

  • "Cheating is a symptom of a lack of self-confidence. Believe in yourself and your abilities, and you won't feel the need to cheat."

Read more

Firewall Linux - DDOS

  • "A firewall is like a security guard at the front door of a building. It helps keep the bad guys out."

  • "DDOS attacks are like a mob trying to break down the front door. The firewall is the first line of defense against this type of attack."

  • "DDOS attacks are like a fire in a crowded theater. The firewall is the fire extinguisher that helps put out the flames."

  • "A firewall is only as strong as the rules it enforces. Make sure your firewall has the proper rules in place to protect against DDOS attacks."

  • "DDOS attacks are a constant threat in the world of online security. A firewall is a crucial tool in preventing these types of attacks and keeping your network secure."

Read more

Cryptocurrency Protecting Your Digital Wealth

  • "In the world of cryptocurrencies, a digital wallet is like a safe where you store your valuable assets. It's a place that ensures the security of your holdings while allowing you to use them freely."
  • "When you invest in cryptocurrencies, cyber threats can feel like the risk of theft from your safe. That’s why having the right security measures in place is essential to protect your digital wealth."
  • "In the dynamic environment of blockchain, hacking attacks are like unexpected storms. A well-secured wallet acts as a sturdy roof, shielding you from unforeseen dangers."
  • "Remember, the security of your cryptocurrency wallet depends on the technologies and practices you employ. Make sure you utilize the latest solutions to keep your assets safe at all times."
Read more
Ładowanie danych...
  1. Techrooms©

    Official announcements, news, updates, and documentation regarding Techrooms© and its blockchain-related projects.

    Development resources, guides, and technical discussions for blockchain developers working on Techrooms© projects and integrations.

    Discussions and updates on tokenomics, blockchain utilities, token creation, and economic models within the Techrooms© ecosystem.

    No posts here yet

    Official Techrooms© airdrop announcements, rules, participation guides, and community feedback. Claim free tokens through verified campaigns.

    No posts here yet

  2. Money

    Learn how to monetize websites, content, and social media. Affiliate programs, advertising networks, and real user experiences.

    Airdrops

    • 6 posts

    Latest and verified airdrops, free tokens, how to participate, how to claim rewards, and tips to avoid scams.

    Cryptocoins

    • 187 posts

    Talk about Bitcoin, Ethereum, and altcoins. Market trends, blockchain projects, crypto wallets, security, and investments.

    Technical help and troubleshooting for blockchain, wallets, exchanges, and crypto trading tools. Ask questions, share solutions.

    No posts here yet

  3. Programming Languages & Coding & Game Engines

    General coding tutorials, best practices, and help with programming challenges across all languages.

    C & C++

    • 5 posts

    Focused discussions, tutorials, and script sharing for C and C++ programming languages.

    NET Framework

    • 9 posts

    Resources, tutorials, and support for programming with the .NET Framework.

    JAVA

    • 3 posts

    Discussions, tutorials, and code sharing for Java programming language.

    AutoIt

    • 6 posts

    Everything related to AutoIt scripting language: tutorials, script releases, and problem-solving.

    Python

    • 9 posts

    Python programming discussions, tutorials, script sharing, and debugging help.

    WEB DEV

    • 8 posts

    Web development tutorials, scripts, and support including HTML, PHP, and related technologies.

    Support and discussions about operating systems including Windows, Android, Linux, and hosting services.

    Comprehensive course materials and discussions on hacking techniques and firewall security.

    Tutorials, script releases, and questions about other programming languages not covered in main sections.

    No posts here yet

  4. MMO - Online Games Forum

    Diablo

    • 4 posts

    All about Diablo games including guides, hacks, and troubleshooting.

  5. FPS - Shooter

  6. WEB Browser Games - Mobile Games

  7. Marketplace

    Marketplace for buying and selling various products. Safe trading environment for sellers and buyers.

    No posts here yet

    Trading and selling of game and service accounts. Buy and sell accounts safely.

    No posts here yet

    Marketplace for various services offered by community members.

    No posts here yet

    Buy and sell graphic design services and digital art assets.

    No posts here yet

  8. Trash & Archive

    Trash

    • 30 posts
    100%

    No posts here yet

    No posts here yet

  • Donation Box

    Please donate to support the community.
    We appreciate all donations!
  • Premium Groups

  • Most Points

    1. 1
      100%
      100%
      163,371
    2. 2
    3. 3
      Andromeda
      Andromeda
      23,161
    4. 4
    5. 5
      Queen
      Queen
      12,283
  • Biggest Gamblers

    1. 1
      100%
      100%
      78,800
    2. 2
  • Tell a friend

    Love Techrooms – Blockchain, Programming, Gaming & Crypto Forum? Tell a friend!
  • FAQ

    • Question 1

      Answer 1

  • Forum Statistics

    • Total Topics
      1.2k
    • Total Posts
      1.2k
  • Popular Contributors

    Nobody has received reputation this week.

  • Member Statistics

    • Total Members
      119
    • Most Online
      792

    Newest Member
    Rosa_Mariva
    Joined
  • Topics

  • Posts

    • Hi TechroomsBOT 👋 Thanks for starting a new topic on Techrooms – Blockchain, Programming, Gaming & Crypto Forum!   If you’re new here — welcome. If you’ve been around for a while — great to have you back 😊 To help you get the most out of TechRooms, here are a few useful places to explore: ──────────────────────────────────── 💎 Premium Membership (Optional) Support the community and unlock extra perks: • 🚫 Ad-free browsing   • ⚡ Faster access & priority support   • 📊 Private analysis & signals   • 🧪 Early access to beta features & tools   • 📥 Downloadable premium resources   🎟️ Upgrade here: Premium Link ──────────────────────────────────── 🧠 Popular Sections You Might Like 📊 Crypto Signals & Market Analysis   Get free signals and market insights: Signals 💾 Tech Tools & Programs   Automation, software, utilities & security tools: Tools Techrooms 🗣️ Discussions & Q&A   Ask questions, share knowledge, help others: Forum 📚 Tech Book Library   Books, guides and resources for members: Books 📚 Quizzes   Members Quizzes: Quizzes 🎓 Learning & Courses   Blockchain, security, coding and more: Blockchain Courses 🧠 Hacking & Firewall Courses  Hacking, security, firewall and more: Firewall Courses 🪙 Earn Tokens for Posting   Create valuable content and get rewarded 🃏 Blackjack   Take a break and play: Blackjack 💖 Support via Crypto Donation (Optional) Cosmos Wallet: cosmos1p5sjqcu3gp9vkjdyc9uee2mw4a4zvjvqz2lj2g  Donate: Donate 📜 Forum Rules   Please read before posting: Techrooms Rules ──────────────────────────────────── Stay connected. Stay ahead. Stay TechRooms. 🚀  
    • As most server administrators know, the default limit of 3 socket slots on Metin2 PvP servers can create major balancing issues. When players maximize their gear with Warrior, Sura, and Ninja resistance or against-stones, they are often left completely defenseless against Shamans. To restore class balance and create a fairer PvP environment, this guide will show you how to expand your item system to support 4 Sockets. We will go through the process step-by-step, covering Server Source, DB Source, Client Source, and essential bug fixes. 📁 Section 1: Server-Side Source Changes 1️⃣ Modify Item Configuration Open common/item_length.h and search for the maximum socket constant: C++ ITEM_SOCKET_MAX_NUM = 3, Change the value from 3 to 4: C++ ITEM_SOCKET_MAX_NUM = 4, 2️⃣ Update Player Item Loading Open db/src/ClientManagerPlayer.cpp and search for the following line: C++ str_to_number(item.alSockets[2], row[cur++]); Directly underneath it, add the tracking line for the 4th socket: C++ str_to_number(item.alSockets[3], row[cur++]); 3️⃣ Update the Player Item SQL Queries Still inside db/src/ClientManagerPlayer.cpp, locate the following SQL query segment: SQL SELECT id,window+0,pos,count,vnum,socket0,socket1,socket2 ,attrtype0,attrvalue0,attrtype1,attrvalue1,attrtyp e2,attrvalue2,attrtype3,attrvalue3,attrtype4,attrv alue4,attrtype5,attrvalue5,attrtype6,attrvalue6 Replace it entirely with this updated query to include socket3: SQL SELECT id,window+0,pos,count,vnum,socket0,socket1,socket2,socket3,attrtype0,attrvalue0,attrtype1,attrvalue1,attrtype2,attrvalue2,attrtype3,attrvalue3,attrtype4,attrvalue4,attrtype5,attrvalue5,attrtype6,attrvalue6 Now, find the second instance of the item selection query within the same file: SQL SELECT id,window+0,pos,count,vnum,socket0,socket1,socket2,attrtype0,attrvalue0,attrtype1,attrvalue1,attrtype2,attrvalue2,attrtype3,attrvalue3,attrtype4,attrvalue4,attrtype5,attrvalue5,attrtype6,attrvalue6 Replace it with: SQL SELECT id,window+0,pos,count,vnum,socket0,socket1,socket2,socket3,attrtype0,attrvalue0,attrtype1,attrvalue1,attrtype2,attrvalue2,attrtype3,attrvalue3,attrtype4,attrvalue4,attrtype5,attrvalue5,attrtype6,attrvalue6 4️⃣ Update Client Manager Queries Open db/src/ClientManager.cpp and search for: SQL SELECT id, window+0, pos, count, vnum, socket0, socket1, socket2 Modify it to fetch the fourth socket field: SQL SELECT id, window+0, pos, count, vnum, socket0, socket1, socket2, socket3 5️⃣ Update Cache Serialization Open db/src/Cache.cpp and locate this line: C++ iLen += snprintf(szColumns + iLen, sizeof(szColumns) iLen, , socket0, socket1, socket2, socket3); Replace that block completely with the following implementation: C++ if (isSocket) { iLen += snprintf(szColumns + iLen, sizeof(szColumns) - iLen, ", socket0, socket1, socket2, socket3"); iValueLen += snprintf(szValues + iValueLen, sizeof(szValues) - iValueLen, ", %lu, %lu, %lu, %lu", p->alSockets[0], p->alSockets[1], p->alSockets[2], p->alSockets[3]); iUpdateLen += snprintf(szUpdate + iUpdateLen, sizeof(szUpdate) - iUpdateLen, ", socket0=%lu, socket1=%lu, socket2=%lu, socket3=%lu", p->alSockets[0], p->alSockets[1], p->alSockets[2], p->alSockets[3]); } 6️⃣ Configure Default Item Sockets Open game/src/constants.cpp and search for aiWeaponSocketQty[WEAPON_NUM_TYPES]. Update the item type configuration array to allow 4 slots:   C++ const int32_t aiWeaponSocketQty[WEAPON_NUM_TYPES] = { 4, // WEAPON_SWORD, 4, // WEAPON_DAGGER, 4, // WEAPON_BOW, 4, // WEAPON_TWO_HANDED, 4, // WEAPON_BELL, 4, // WEAPON_FAN, 0, // WEAPON_ARROW, 0, // WEAPON_MOUNT_SPEAR }; Next, locate aiArmorSocketQty[ARMOR_NUM_TYPES] and change the body armor slot value to 4: C++ const int32_t aiArmorSocketQty[ARMOR_NUM_TYPES] = { 4, // ARMOR_BODY, 1, // ARMOR_HEAD, 1, // ARMOR_SHIELD, 0, // ARMOR_WRIST, 0, // ARMOR_FOOTS, 0 // ARMOR_ACCESSORY }; 🖥️ Section 2: Client-Side Source Changes 7️⃣ Update Client Max Sockets Open your client source and navigate to UserInterface/GameType.h. Search for ITEM_SOCKET_SLOT_MAX_NUM and change its value from 3 to 4. 💾 Section 3: Database Update (MySQL) ⚠️ CRITICAL WARNING: Even though your source code is ready, items will not accept a 4th stone until your database structure is modified. You must update your item_proto via Navicat / MySQL. Do not change the client-side locale item_proto manually for this step, or you risk breaking item glows! Run the following SQL query to automatically shift all 3-socket items to 4 sockets: SQL UPDATE item_proto SET socket_pct=4 WHERE socket_pct=3; 🐛 Section 4: Critical Bug Fixes Adding a 4th socket exposes a few legacy bugs in the Metin2 codebase. Apply the following fixes to ensure system stability. 📌 Fix A: The Warehouse / Storeroom Bug Description: Storing an item with 4 stones inside the warehouse causes the 4th stone to disappear or resets the item slots back to 3 upon item retrieval. Open db/src/ClientManager.cpp and search for: C++ void CClientManager::QUERY_ITEM_SAVE(CPeer * pkPeer, const char * c_pData) Look slightly below it for the following query string: C++ REPLACE INTO item%s (id, owner_id, window, pos, count, vnum, socket0, socket1, socket2, Change it to include socket3: C++ REPLACE INTO item%s (id, owner_id, window, pos, count, vnum, socket0, socket1, socket2, socket3, Now, locate the matching VALUES string directly underneath: C++ VALUES(%u, %u, %d, %d, %u, %u, %ld, %ld, %ld, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d) Replace it with an additional parameter placeholder: C++ VALUES(%u, %u, %d, %d, %u, %u, %ld, %ld, %ld, %ld, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d) Finally, find where the socket data array is passed: C++ p->alSockets[2], Add the fourth slot index directly underneath it: C++ p->alSockets[3], 📌 Fix B: Item Linking / Glass of Insight Bug Description: Items linked in chat (via Glass of Insight) will show up blank or won't display tooltips when clicked because the data string length changed. 1. Open UserInterface/PythonPlayerModule.cpp Find playerGetItemLink and replace the function block completely: C++ PyObject * playerGetItemLink(PyObject * poSelf, PyObject * poArgs) { TItemPos Cell; switch (PyTuple_Size(poArgs)) { case 1: if (!PyTuple_GetInteger(poArgs, 0, &Cell.cell)) return Py_BuildException(); break; case 2: if (!PyTuple_GetByte(poArgs, 0, &Cell.window_type)) return Py_BuildException(); if (!PyTuple_GetInteger(poArgs, 1, &Cell.cell)) return Py_BuildException(); break; default: return Py_BuildException(); } const TItemData * pPlayerItem = CPythonPlayer::Instance().GetItemData(Cell); CItemData * pItemData = NULL; char buf[1024]; if (pPlayerItem && CItemManager::Instance().GetItemDataPointer(pPlayerItem->vnum, &pItemData)) { char itemlink[256]; int len; bool isAttr = false; len = snprintf(itemlink, sizeof(itemlink), "item:%x:%x:%x:%x:%x:%x:%x:%x", pPlayerItem->vnum, pPlayerItem->flags, pPlayerItem->alSockets[0], pPlayerItem->alSockets[1], pPlayerItem->alSockets[2] , pPlayerItem->alSockets[3], pPlayerItem->alSockets[4], pPlayerItem->alSockets[5]); for (int i = 0; i < ITEM_ATTRIBUTE_SLOT_MAX_NUM; ++i) if (pPlayerItem->aAttr[i].bType != 0) { len += snprintf(itemlink + len, sizeof(itemlink) - len, ":%x:%d", pPlayerItem->aAttr[i].bType, pPlayerItem->aAttr[i].sValue); isAttr = true; } if( GetDefaultCodePage() == CP_ARABIC ) { if (isAttr) //"item:vnum:flag:socket0:socket1:socket2" snprintf(buf, sizeof(buf), " |h|r[%s]|cffffc700|H%s|h", pItemData->GetName(), itemlink); else snprintf(buf, sizeof(buf), " |h|r[%s]|cfff1e6c0|H%s|h", pItemData->GetName(), itemlink); } else { if (isAttr) //"item:vnum:flag:socket0:socket1:socket2" snprintf(buf, sizeof(buf), "|cffffc700|H%s|h[%s]|h|r", itemlink, pItemData->GetName()); else snprintf(buf, sizeof(buf), "|cfff1e6c0|H%s|h[%s]|h|r", itemlink, pItemData->GetName()); } } else buf[0] = '\0'; return Py_BuildValue("s", buf); } 2. Open UserInterface/PythonChatModule.cpp Find chatGetLinkFromHyperlink and replace it entirely with: C++ PyObject * chatGetLinkFromHyperlink(PyObject * poSelf, PyObject * poArgs) { char * szHyperlink; if (!PyTuple_GetString(poArgs, 0, &szHyperlink)) return Py_BuildException(); std::string stHyperlink(szHyperlink); std::vector<std::string> results; split_string(stHyperlink, ":", results, false); // item:vnum:flag:socket0:socket1:socket2:socket3:socket4:socket5 if (0 == results[0].compare("item")) { if (results.size() < 9) return Py_BuildValue("s", ""); CItemData * pItemData = NULL; if (CItemManager::Instance().GetItemDataPointer(htoi(results[1].c_str()), &pItemData)) { char buf[1024] = { 0 }; char itemlink[256]; int len; bool isAttr = false; len = snprintf(itemlink, sizeof(itemlink), "item:%x:%x:%x:%x:%x:%x:%x:%x", htoi(results[1].c_str()), htoi(results[2].c_str()), htoi(results[3].c_str()), htoi(results[4].c_str()), htoi(results[5].c_str()), htoi(results[6].c_str()), htoi(results[7].c_str()), htoi(results[8].c_str())); if (results.size() >= 11) { for (int i = 9; i < results.size(); i += 2) { len += snprintf(itemlink + len, sizeof(itemlink) - len, ":%x:%d", htoi(results[i].c_str()), atoi(results[i+1].c_str())); isAttr = true; } } if (isAttr) //"item:vnum:flag:socket0:socket1:socket2" snprintf(buf, sizeof(buf), "|cffffc700|H%s|h[%s]|h|r", itemlink, pItemData->GetName()); else snprintf(buf, sizeof(buf), "|cfff1e6c0|H%s|h[%s]|h|r", itemlink, pItemData->GetName()); return Py_BuildValue("s", buf); } } return Py_BuildValue("s", ""); } 3. Open root/uiinventory.py Search for the attribute index evaluation check: Python if attrCount<4: Change the condition requirement to 5: Python if attrCount<5: 4. Open root/uitooltip.py Search for def SetHyperlinkItem(self, tokens): and update it with the following adjusted parsing token rule block: Python def SetHyperlinkItem(self, tokens): minTokenCount = 3 + player.METIN_SOCKET_MAX_NUM maxTokenCount = minTokenCount + 2 * player.ATTRIBUTE_SLOT_MAX_NUM if tokens and len(tokens) >= minTokenCount and len(tokens) <= maxTokenCount: head, vnum, flag = tokens[:3] itemVnum = int(vnum, 16) metinSlot = [int(metin, 16) for metin in tokens[3:9]] rests = tokens[9:] if rests: attrSlot = [] rests.reverse() while rests: key = int(rests.pop(), 16) if rests: val = int(rests.pop()) attrSlot.append((key, val)) attrSlot += [(0, 0)] * (player.ATTRIBUTE_SLOT_MAX_NUM - len(attrSlot)) else: attrSlot = [(0, 0)] * player.ATTRIBUTE_SLOT_MAX_NUM self.ClearToolTip() self.AddItemData(itemVnum, metinSlot, attrSlot) ItemToolTip.OnUpdate(self) 📌 Fix 😄 Mount / Unique Item Expiration Bug Description: Increasing ITEM_SOCKET_MAX_NUM directly shifts the evaluation calculations for unique timers, causing mount durations to break.   To prevent this, hardcode the historical references within the structure offset definition block. Locate enum EItemUniqueSockets and adjust the math logic: Find: C++ enum EItemUniqueSockets { ITEM_SOCKET_UNIQUE_SAVE_TIME = ITEM_SOCKET_MAX_NUM - 2, ITEM_SOCKET_UNIQUE_REMAIN_TIME = ITEM_SOCKET_MAX_NUM - 1 }; Replace with: C++ enum EItemUniqueSockets { ITEM_SOCKET_UNIQUE_SAVE_TIME = 3 - 2, ITEM_SOCKET_UNIQUE_REMAIN_TIME = 3 - 1 }; 🎉 Congratulations! Your implementation is complete. Recompile your server and client binaries, restart your database services, and enjoy a fully functional, bug-free 4-Socket system! Feel free to drop a reply below if you have any questions.   This is the hidden content, please Sign In or Sign Up This is the hidden content, please Sign In or Sign Up This is the hidden content, please Sign In or Sign Up This is the hidden content, please Sign In or Sign Up This is the hidden content, please Sign In or Sign Up  
    • Hi TechroomsBOT 👋 Thanks for starting a new topic on Techrooms – Blockchain, Programming, Gaming & Crypto Forum!   If you’re new here — welcome. If you’ve been around for a while — great to have you back 😊 To help you get the most out of TechRooms, here are a few useful places to explore: ──────────────────────────────────── 💎 Premium Membership (Optional) Support the community and unlock extra perks: • 🚫 Ad-free browsing   • ⚡ Faster access & priority support   • 📊 Private analysis & signals   • 🧪 Early access to beta features & tools   • 📥 Downloadable premium resources   🎟️ Upgrade here: Premium Link ──────────────────────────────────── 🧠 Popular Sections You Might Like 📊 Crypto Signals & Market Analysis   Get free signals and market insights: Signals 💾 Tech Tools & Programs   Automation, software, utilities & security tools: Tools Techrooms 🗣️ Discussions & Q&A   Ask questions, share knowledge, help others: Forum 📚 Tech Book Library   Books, guides and resources for members: Books 📚 Quizzes   Members Quizzes: Quizzes 🎓 Learning & Courses   Blockchain, security, coding and more: Blockchain Courses 🧠 Hacking & Firewall Courses  Hacking, security, firewall and more: Firewall Courses 🪙 Earn Tokens for Posting   Create valuable content and get rewarded 🃏 Blackjack   Take a break and play: Blackjack 💖 Support via Crypto Donation (Optional) Cosmos Wallet: cosmos1p5sjqcu3gp9vkjdyc9uee2mw4a4zvjvqz2lj2g  Donate: Donate 📜 Forum Rules   Please read before posting: Techrooms Rules ──────────────────────────────────── Stay connected. Stay ahead. Stay TechRooms. 🚀  
    • Hello everyone! 👋 Today I am sharing a comprehensive guide on how to properly increase the maximum level cap on your server. This guide refactors the standard level variable from a BYTE (which limits the level to 255) to an int, successfully unlocking higher level caps. Unlike many public shares that contain broken tab alignments, indentation errors, or cause guild glitches, character selection drops, and reboot issues, this solution has been thoroughly cleaned up and tested. You can implement it into your project with complete peace of mind. Let's dive into the step-by-step modifications! 🚀 📁 Game Source Modifications 🔹 char.cpp Search for: C++ void CHARACTER::SetLevel(BYTE level) Replace with: C++ void CHARACTER::SetLevel(int level) 🔹 char.h Search for: C++ void SetLevel(BYTE level); Replace with: C++ void SetLevel(int level); Search for the following line (located right under typedef struct character_point😞 C++ BYTE level; Replace with: C++ int level; 🔹 party.cpp Search for: C++ void CParty::P2PSetMemberLevel(DWORD pid, BYTE level) Replace with: C++ void CParty::P2PSetMemberLevel(DWORD pid, int level) Search for: C++ BYTE CParty::GetMemberMaxLevel() { BYTE bMax = 0; Replace with: C++ int CParty::GetMemberMaxLevel() { int bMax = 0; Search for: C++ BYTE CParty::GetMemberMinLevel() { BYTE bMin = PLAYER_MAX_LEVEL_CONST; Replace with: C++ int CParty::GetMemberMinLevel() { int bMin = PLAYER_MAX_LEVEL_CONST; Search for: C++ void CParty::RequestSetMemberLevel(DWORD pid, BYTE level) Replace with: C++ void CParty::RequestSetMemberLevel(DWORD pid, int level) 🔹 party.h Search for the following line (located under typedef struct SMember😞 C++ BYTE bLevel; Replace with: C++ int bLevel; Search for: C++ BYTE GetMemberMaxLevel(); BYTE GetMemberMinLevel(); Replace with: C++ int GetMemberMaxLevel(); int GetMemberMinLevel(); Search for: C++ void RequestSetMemberLevel(DWORD pid, BYTE level); void P2PSetMemberLevel(DWORD pid, BYTE level); Replace with: C++ void RequestSetMemberLevel(DWORD pid, int level); void P2PSetMemberLevel(DWORD pid, int level); 🔹 char_battle.cpp Search for: C++ struct FPartyTotaler { int total; Replace with: C++ struct FPartyTotaler { long total; Search for: C++ struct FPartyDistributor { int total; LPCHARACTER c; int x, y; DWORD _iExp; int m_iMode; int m_iMemberCount; FPartyDistributor(LPCHARACTER center, int member_count, int total, DWORD iExp, int iMode) Replace with: C++ struct FPartyDistributor { long total; LPCHARACTER c; int x, y; DWORD _iExp; int m_iMode; int m_iMemberCount; FPartyDistributor(LPCHARACTER center, int member_count, long total, DWORD iExp, int iMode) 🔹 config.h Search for: C++ extern BYTE PK_PROTECT_LEVEL; Replace with: C++ extern int PK_PROTECT_LEVEL; 🔹 locale_service.cpp Search for: C++ BYTE PK_PROTECT_LEVEL Replace with: C++ int PK_PROTECT_LEVEL 🔹 constants.cpp You will need to adapt the experience and configuration tables here. Once you look at the structure, the logic becomes straightforward. Locate these tables: C++ const DWORD exp_table_euckr[PLAYER_EXP_TABLE_MAX + 1] const DWORD exp_table_common[PLAYER_EXP_TABLE_MAX + 1] const DWORD exp_table_newcibn[PLAYER_EXP_TABLE_MAX + 1 ] const DWORD party_exp_distribute_table[PLAYER_MAX_LEVEL_CONST + 1] const int aiExpLossPercents[PLAYER_EXP_TABLE_MAX + 1] Four of these tables follow a specific format. Here is how you should restructure the data block to support higher levels (as seen in references like lq5g3B.png😞 C++ 2500000000, // 250 2500000000, 2500000000, 2500000000, 2500000000, 2500000000, // 255 2500000000, 2500000000, 2500000000, 2500000000, 2500000000, // 260 2500000000, 2500000000, 2500000000, 2500000000, 2500000000, // 265 2500000000, 2500000000, 2500000000, 2500000000, 2500000000, // 270 2500000000, 2500000000, 2500000000, 2500000000, 2500000000, // 275 2500000000, 2500000000, 2500000000, 2500000000, 2500000000, // 280 2500000000, 2500000000, 2500000000, 2500000000, 2500000000, // 285 2500000000, 2500000000, 2500000000, 2500000000, 2500000000, // 290 2500000000, 2500000000, 2500000000, 2500000000, 2500000000, // 295 2500000000, 2500000000, 2500000000, 2500000000, 2500000000, // 300 }; For the remaining distribution rules up to your target level cap, structure it like this (referencing layout format 8aRy8A.png😞 C++ 10, 10, 10, 10, 15, 15, 20, 25, 30, 40, // 1 - 10 50, 60, 80, 100, 120, 140, 160, 184, 210, 240, // 11 - 20 270, 300, 330, 360, 390, 420, 450, 480, 510, 550, // 21 - 30 600, 640, 700, 760, 820, 880, 940, 1000, 1100, 1180, // 31 - 40 1260, 1320, 1380, 1440, 1500, 1560, 1620, 1680, 1740, 1800, // 41 - 50 1860, 1920, 2000, 2100, 2200, 2300, 2450, 2600, 2750, 2900, // 51 - 60 3050, 3200, 3350, 3500, 3650, 3800, 3950, 4100, 4250, 4400, // 61 - 70 4600, 4800, 5000, 5200, 5400, 5600, 5800, 6000, 6200, 6400, // 71 - 80 6600, 6800, 7000, 7200, 7400, 7600, 7800, 8000, 8200, 8400, // 81 - 90 8600, 8800, 9000, 9200, 9400, 9600, 9800, 10000, 10200, 10400, // 91 - 100 10600, 10800, 11000, 11200, 11400, 11600, 11800, 12000, 12200, 12400, // 101 - 110 12600, 12800, 13000, 13200, 13400, 13600, 13800, 14000, 14200, 14400, // 111 - 120 14600, 14800, 15000, 15200, 15400, 15600, 15800, 16000, 16200, 16400, // 121 - 130 16600, 16800, 17000, 17200, 17400, 17600, 17800, 18000, 18200, 18400, // 131 - 140 18600, 18800, 19000, 19200, 19400, 19600, 19800, 20000, 20200, 20400, // 141 - 150 20600, 20800, 21000, 21200, 21400, 21600, 21800, 22000, 22200, 22400, // 151 - 160 22600, 22800, 23000, 23200, 23400, 23600, 23800, 24000, 24200, 24400, // 161 - 170 24600, 24800, 25000, 25200, 25400, 25600, 25800, 26000, 26200, 26400, // 171 - 180 26600, 26800, 27000, 27200, 27400, 27600, 27800, 28000, 28200, 28400, // 181 - 190 28600, 28800, 29000, 29200, 29400, 29600, 29800, 30000, 30200, 30400, // 191 - 200 30600, 30800, 31000, 31200, 31400, 31600, 31800, 32000, 32200, 32400, // 201 - 210 32600, 32800, 33000, 33200, 33400, 33600, 33800, 34000, 34200, 34400, // 211 - 220 34600, 34800, 35000, 35200, 35400, 35600, 35800, 36000, 36200, 36400, // 221 - 230 36600, 36800, 37000, 37200, 37400, 37600, 37800, 38000, 38200, 38400, // 231 - 240 38600, 38800, 39000, 39200, 39400, 39600, 39800, 40000, 40200, 40400, // 241 - 250 38600, 38800, 39000, 39200, 39400, 39600, 39800, 40000, 40200, 40400, // 251 - 260 38600, 38800, 39000, 39200, 39400, 39600, 39800, 40000, 40200, 40400, // 261 - 270 38600, 38800, 39000, 39200, 39400, 39600, 39800, 40000, 40200, 40400, // 271 - 280 38600, 38800, 39000, 39200, 39400, 39600, 39800, 40000, 40200, 40400, // 281 - 290 38600, 38800, 39000, 39200, 39400, 39600, 39800, 40000, 40200, 40400, // 291 - 300 🔹 log.h Search for: C++ void LoginLog(bool isLogin, DWORD dwAccountID, DWORD dwPID, BYTE bLevel, BYTE bJob, DWORD dwPlayTime); Replace with: C++ void LoginLog(bool isLogin, DWORD dwAccountID, DWORD dwPID, int bLevel, BYTE bJob, DWORD dwPlayTime); 🔹 log.cpp Search for: C++ void LogManager::LoginLog(bool isLogin, DWORD dwAccountID, DWORD dwPID, BYTE bLevel, BYTE bJob, DWORD dwPlayTime) Replace with: C++ void LogManager::LoginLog(bool isLogin, DWORD dwAccountID, DWORD dwPID, int bLevel, BYTE bJob, DWORD dwPlayTime) 🔹 guild.h Search for: C++ typedef struct SGuildMemberPacketData { DWORD pid; BYTE grade; BYTE is_general; BYTE job; BYTE level; DWORD offer; BYTE name_flag; char name[CHARACTER_NAME_MAX_LEN+1]; } TGuildMemberPacketData; Replace with: C++ typedef struct SGuildMemberPacketData { DWORD pid; BYTE byGrade; BYTE byIsGeneral; BYTE byJob; int byLevel; DWORD dwOffer; BYTE byNameFlag; } TGuildMemberPacketData; Search for: C++ void ChangeMemberData(DWORD pid, DWORD offer, BYTE level, BYTE grade); Replace with: C++ void ChangeMemberData(DWORD pid, DWORD offer, int level, BYTE grade); Search for: C++ SGuildMember(DWORD pid, BYTE grade, BYTE is_general, BYTE job, BYTE level, DWORD offer_exp, char* name); Replace with: C++ SGuildMember(DWORD pid, BYTE grade, BYTE is_general, BYTE job, int level, DWORD offer_exp, char* name); Search for: C++ DWORD pid; // player table ID; primary key BYTE grade; // Member grade within guild 1 to 15 (1 is Leader) BYTE is_general; BYTE job; BYTE level; DWORD offer_exp; // Contributed experience points BYTE _dummy; Replace with: C++ DWORD pid; // player table ID; primary key BYTE grade; // Member grade within guild 1 to 15 (1 is Leader) BYTE is_general; BYTE job; int level; DWORD offer_exp; // Contributed experience points BYTE _dummy; Search for: C++ void LevelChange(DWORD pid, BYTE level); Replace with: C++ void LevelChange(DWORD pid, int level); 🔹 guild.cpp Search for: C++ BYTE level = (BYTE)strtoul(row[4], (char**) NULL, 10); Replace with: C++ int level = (int)strtoul(row[4], (char**) NULL, 10); Search for: C++ sys_log(0, "GUILD: AddMember PID %u, grade %u, job %u, level %u, offer %u, name %s ptr %p", Replace with: C++ sys_log(0, "GUILD: AddMember PID %u, grade %u, job %u, level %d, offer %u, name %s ptr %p", Search for the complete function block of CGuild::ChangeMemberData and replace it entirely: C++ void CGuild::ChangeMemberData(DWORD pid, DWORD offer, int level, BYTE grade) { TGuildMemberContainer::iterator cit = m_member.find(pid); if (cit == m_member.end()) return; cit->second.offer_exp = offer; cit->second.level = level; cit->second.grade = grade; cit->second._dummy = 0; TPacketGCGuild pack; TGuildMemberPacketData mbData; pack.header = HEADER_GC_GUILD; pack.subheader = GUILD_SUBHEADER_GC_LIST; pack.size = sizeof(TPacketGCGuild); pack.size += sizeof(TGuildMemberPacketData); for (TGuildMemberOnlineContainer::iterator it = m_memberOnline.begin(); it != m_memberOnline.end(); ++it) { LPDESC d = (*it)->GetDesc(); if (d) { TEMP_BUFFER buf; buf.write(&pack, sizeof(pack)); mbData.byNameFlag = 0; mbData.byGrade = cit->second.grade; mbData.byIsGeneral = cit->second.is_general; mbData.byJob = cit->second.job; mbData.byLevel = cit->second.level; mbData.dwOffer = cit->second.offer_exp; mbData.pid = cit->second.pid; buf.write(&mbData, sizeof(TGuildMemberPacketData)); d->Packet(buf.read_peek(), buf.size()); } } } Search for the complete function block of CGuild::LevelChange and replace it entirely:   C++ void CGuild::LevelChange(DWORD pid, int level) { TGuildMemberContainer::iterator cit = m_member.find(pid); if (cit == m_member.end()) return; cit->second.level = level; TPacketGuildChangeMemberData gd_guild; gd_guild.guild_id = GetID(); gd_guild.pid = pid; gd_guild.offer = cit->second.offer_exp; gd_guild.grade = cit->second.grade; gd_guild.level = level; db_clientdesc->DBPacket(HEADER_GD_GUILD_CHANGE_MEMBER_DATA, 0, &gd_guild, sizeof(gd_guild)); TPacketGCGuild pack; TGuildMemberPacketData mbData; pack.header = HEADER_GC_GUILD; pack.subheader = GUILD_SUBHEADER_GC_LIST; pack.size = sizeof(TPacketGCGuild); pack.size += sizeof(TGuildMemberPacketData); cit->second._dummy = 0; for (TGuildMemberOnlineContainer::iterator it = m_memberOnline.begin(); it != m_memberOnline.end(); ++it) { LPDESC d = (*it)->GetDesc(); if (d) { TEMP_BUFFER buf; buf.write(&pack, sizeof(pack)); mbData.byNameFlag = 0; mbData.byGrade = cit->second.grade; mbData.byIsGeneral = cit->second.is_general; mbData.byJob = cit->second.job; mbData.byLevel = cit->second.level; mbData.dwOffer = cit->second.offer_exp; mbData.pid = cit->second.pid; buf.write(&mbData, sizeof(TGuildMemberPacketData)); d->Packet(buf.read_peek(), buf.size()); } } } Search for the complete function block of CGuild::OfferExp and replace it entirely:   C++ bool CGuild::OfferExp(LPCHARACTER ch, int amount) { TGuildMemberContainer::iterator cit = m_member.find(ch->GetPlayerID()); if (cit == m_member.end()) return false; if (m_data.exp+amount < m_data.exp) return false; if (amount < 0) return false; if (ch->GetExp() < (DWORD) amount) { ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<Guild> The EXP amount you want to invest is greater than your remaining EXP.")); return false; } if (ch->GetExp() - (DWORD) amount > ch->GetExp()) { sys_err("Wrong guild offer amount %d by %s[%u]", amount, ch->GetName(), ch->GetPlayerID()); return false; } ch->PointChange(POINT_EXP, -amount); TPacketGuildExpUpdate guild_exp; guild_exp.guild_id = GetID(); guild_exp.amount = amount / 100; db_clientdesc->DBPacket(HEADER_GD_GUILD_EXP_UPDATE, 0, &guild_exp, sizeof(guild_exp)); GuildPointChange(POINT_EXP, amount / 100, true); cit->second.offer_exp += amount / 100; cit->second._dummy = 0; TPacketGCGuild pack; TGuildMemberPacketData mbData; pack.header = HEADER_GC_GUILD; pack.subheader = GUILD_SUBHEADER_GC_LIST; pack.size = sizeof(TPacketGCGuild); pack.size += sizeof(TGuildMemberPacketData); for (TGuildMemberOnlineContainer::iterator it = m_memberOnline.begin(); it != m_memberOnline.end(); ++it) { LPDESC d = (*it)->GetDesc(); if (d) { TEMP_BUFFER buf; buf.write(&pack, sizeof(pack)); mbData.byNameFlag = 0; mbData.byGrade = cit->second.grade; mbData.byIsGeneral = cit->second.is_general; mbData.byJob = cit->second.job; mbData.byLevel = cit->second.level; mbData.dwOffer = cit->second.offer_exp; mbData.pid = cit->second.pid; buf.write(&mbData, sizeof(TGuildMemberPacketData)); d->Packet(buf.read_peek(), buf.size()); } } SaveMember(ch->GetPlayerID()); TPacketGuildChangeMemberData gd_guild; gd_guild.guild_id = GetID(); gd_guild.pid = ch->GetPlayerID(); gd_guild.offer = cit->second.offer_exp; gd_guild.level = ch->GetLevel(); gd_guild.grade = cit->second.grade; db_clientdesc->DBPacket(HEADER_GD_GUILD_CHANGE_MEMBER_DATA, 0, &gd_guild, sizeof(gd_guild)); return true; } Search for the complete function block of CGuild::SendListPacket and replace it entirely: C++ void CGuild::SendListPacket(LPCHARACTER ch) { /* List Packet Header Count (byte) [ ... name_flag 1 - Whether to send name or not name CHARACTER_NAME_MAX_LEN+1 ] * Count */ LPDESC d; if (!(d=ch->GetDesc())) return; TPacketGCGuild pack; pack.header = HEADER_GC_GUILD; pack.size = sizeof(TPacketGCGuild); pack.subheader = GUILD_SUBHEADER_GC_LIST; pack.size += sizeof(TGuildMemberPacketData) * m_member.size(); pack.size += (CHARACTER_NAME_MAX_LEN + 1) * m_member.size(); TEMP_BUFFER buf; TGuildMemberPacketData mbData; buf.write(&pack,sizeof(pack)); char c[CHARACTER_NAME_MAX_LEN+1]; for (TGuildMemberContainer::iterator it = m_member.begin(); it != m_member.end(); ++it) { it->second._dummy = 1; mbData.byNameFlag = 1; mbData.byGrade = it->second.grade; mbData.byIsGeneral = it->second.is_general; mbData.byJob = it->second.job; mbData.byLevel = it->second.level; mbData.dwOffer = it->second.offer_exp; mbData.pid = it->second.pid; buf.write(&mbData, sizeof(TGuildMemberPacketData)); strlcpy(c, it->second.name.c_str(), MIN(sizeof(c), it->second.name.length() + 1)); buf.write(c, CHARACTER_NAME_MAX_LEN+1 ); if ( test_server ) sys_log(0 ,"name %s job %d ", it->second.name.c_str(), it->second.job ); } d->Packet(buf.read_peek(), buf.size()); for (TGuildMemberOnlineContainer::iterator it = m_memberOnline.begin(); it != m_memberOnline.end(); ++it) { SendLoginPacket(ch, *it); } for (TGuildMemberP2POnlineContainer::iterator it = m_memberP2POnline.begin(); it != m_memberP2POnline.end(); ++it) { SendLoginPacket(ch, *it); } } Search for the complete function block of CGuild::SendListOneToAll and replace it entirely: C++ void CGuild::SendListOneToAll(DWORD pid) { TPacketGCGuild pack; pack.header = HEADER_GC_GUILD; pack.size = sizeof(TPacketGCGuild); pack.subheader = GUILD_SUBHEADER_GC_LIST; pack.size += sizeof(TGuildMemberPacketData); TGuildMemberPacketData mbData; char c[CHARACTER_NAME_MAX_LEN+1]; memset(c, 0, sizeof(c)); TGuildMemberContainer::iterator cit = m_member.find(pid); if (cit == m_member.end()) return; for (TGuildMemberOnlineContainer::iterator it = m_memberOnline.begin(); it!= m_memberOnline.end(); ++it) { LPDESC d = (*it)->GetDesc(); if (!d) continue; TEMP_BUFFER buf; buf.write(&pack, sizeof(pack)); cit->second._dummy = 1; mbData.byNameFlag = 1; mbData.byGrade = cit->second.grade; mbData.byIsGeneral = cit->second.is_general; mbData.byJob = cit->second.job; mbData.byLevel = cit->second.level; mbData.dwOffer = cit->second.offer_exp; mbData.pid = cit->second.pid; //buf.write(&(cit->second), sizeof(DWORD) * 3 +1); buf.write(&mbData, sizeof(TGuildMemberPacketData)); buf.write(cit->second.name.c_str(), cit->second.name.length()); buf.write(c, CHARACTER_NAME_MAX_LEN + 1 - cit->second.name.length()); d->Packet(buf.read_peek(), buf.size()); } } Search for:   C++ SGuildMember::SGuildMember(DWORD pid, BYTE grade, BYTE is_general, BYTE job, BYTE level, DWORD offer_exp, char* name) Replace with:   C++ SGuildMember::SGuildMember(DWORD pid, BYTE grade, BYTE is_general, BYTE job, int level, DWORD offer_exp, char* name) 📁 Common Source Modifications 🔹 tables.h Search for: C++ BYTE byLevel; Replace with: C++ int byLevel; Search for: C++ BYTE level; Replace with: C++ int level; Search for: C++ BYTE level; Replace with: C++ int level; Search for the following line (located right below typedef struct SPacketPartySetMemberLevel😞 C++ BYTE bLevel; Replace with: C++ int bLevel; Search for the following line (located right below typedef struct SPacketDGGuildMember😞 C++ BYTE bLevel; Replace with: C++ int bLevel; 🔹 length.h Search for and change to your desired target max level: C++ PLAYER_EXP_TABLE_MAX = 120, PLAYER_MAX_LEVEL_CONST = 120, 📁 DB Source Modifications 🔹 clientmanager.h Search for: C++ struct TPartyInfo { BYTE bRole; BYTE bLevel; Replace with: C++ struct TPartyInfo { BYTE bRole; int bLevel; 🔹 clientmanager.cpp Search for: C++ pkPeer->Encode(&it_member->second.bLevel, sizeof(BYTE)); Replace with: C++ pkPeer->Encode(&it_member->second.bLevel, sizeof(int)); 🔹 clientmanagerplayer.cpp Search for: C++ "PLAYER_DELETE FAILED LEVEL %u >= DELETE LIMIT %d" Replace with: C++ "PLAYER_DELETE FAILED LEVEL %d >= DELETE LIMIT %d" Search for it a second time: C++ "PLAYER_DELETE FAILED LEVEL %u >= DELETE LIMIT %d" Replace with: C++ "PLAYER_DELETE FAILED LEVEL %d >= DELETE LIMIT %d" 📁 Client Source Modifications 🔹 packet.h Search for: C++ BYTE byLevel; Replace with: C++ int byLevel; Search for: C++ BYTE byLevel; Replace with: C++ int byLevel; 🔹 PythonGuild.h Search for: C++ BYTE byLevel; Replace with: C++ int byLevel; Every single step here has been individually documented and meticulously verified. It works seamlessly and resolves all limitations tied to character levels. Best of luck with your server development! 🛠️ Customizations are always smoother with clean code.
    • Hi TechroomsBOT 👋 Thanks for starting a new topic on Techrooms – Blockchain, Programming, Gaming & Crypto Forum!   If you’re new here — welcome. If you’ve been around for a while — great to have you back 😊 To help you get the most out of TechRooms, here are a few useful places to explore: ──────────────────────────────────── 💎 Premium Membership (Optional) Support the community and unlock extra perks: • 🚫 Ad-free browsing   • ⚡ Faster access & priority support   • 📊 Private analysis & signals   • 🧪 Early access to beta features & tools   • 📥 Downloadable premium resources   🎟️ Upgrade here: Premium Link ──────────────────────────────────── 🧠 Popular Sections You Might Like 📊 Crypto Signals & Market Analysis   Get free signals and market insights: Signals 💾 Tech Tools & Programs   Automation, software, utilities & security tools: Tools Techrooms 🗣️ Discussions & Q&A   Ask questions, share knowledge, help others: Forum 📚 Tech Book Library   Books, guides and resources for members: Books 📚 Quizzes   Members Quizzes: Quizzes 🎓 Learning & Courses   Blockchain, security, coding and more: Blockchain Courses 🧠 Hacking & Firewall Courses  Hacking, security, firewall and more: Firewall Courses 🪙 Earn Tokens for Posting   Create valuable content and get rewarded 🃏 Blackjack   Take a break and play: Blackjack 💖 Support via Crypto Donation (Optional) Cosmos Wallet: cosmos1p5sjqcu3gp9vkjdyc9uee2mw4a4zvjvqz2lj2g  Donate: Donate 📜 Forum Rules   Please read before posting: Techrooms Rules ──────────────────────────────────── Stay connected. Stay ahead. Stay TechRooms. 🚀  
  • Popular Tags

  • Books

×
×
  • Create New...

Important Information

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.

spacer.png

Disable AdBlock
The popup will be closed in 5 seconds...