"SEQUENCE %x mismatch 0x%x != 0x%x header %u" hatası ile oyundan atmaları engellemek için kullanabilirsiniz
*game/packet_info.cpp
Arat:
Değiştir:
*root/intrologin.py
Arat:
Değiştir:
Sequence'i Devre Dışı Bırakma
Metin2 özel sunucularında geliştirme yaparken bazı durumlarda sequence sistemini devre dışı bırakmak isteyebilirsiniz. Bu özellikle PvP sistemlerinde veya belirli C++ tabanlı modifikasyonlar yaparken önemli olabilir. Sequence sistemi, oyuncu hareketlerini ve eylemleri sıraya sokarak game server tarafında daha stabil çalışmayı sağlar ancak bazen bu sistemin kontrolü elinize almanız gerekir.
Sequence Nedir?
Sequence, Metin2 oyun motorunda client ve server arasındaki senkronizasyonu sağlayan bir özelliktir. Oyuncunun yaptığı her eylem, server tarafından bir sıra numarasıyla kontrol edilir. Bu sistem sayesinde hile yapma riski azaltılır ve eylemlerin doğru sırayla işlenmesi sağlanır. Ancak bazı gelişmiş source edit işlemleri sırasında bu sistemin engel teşkil etmesi mümkündür.
Neden Sequence Devre Dışı Bırakılır?[/BR][/BR]
Özellikle custom PvP sistem tasarımı yapılırken, sequence sisteminin bazı hareketleri engellemesi istenmeyen sonuçlar doğurabilir. Örneğin, hızlı saldırı kombinasyonları veya özel beceri dizileri sırasında gecikmeler oluşabilir. Bu gibi durumlarda sequence sistemini kapatmak, daha akıcı bir deneyim sunar. Ayrıca Python GUI ile entegre çalışan uiscript sistemlerinde, sequence kontrolü manuel olarak yapılmak istenebilir.
Sequence Nasıl Devre Dışı Bırakılır?[/BR][/BR]
Sequence sistemi genellikle game server tarafında kodlanmıştır. Bu işlem için C++ source code üzerinde değişiklik yapılması gerekir. Özellikle Martysama veya benzeri Metin2Dev araçları kullanılırken, sequence kontrolünün yapıldığı fonksiyonlar bulunur ve burada bypass işlemleri uygulanabilir. Bu değişiklikler, core seviyesinde yapıldığı için dikkatli olunmalıdır.
Teknik Uygulama[/BR][/BR]
Sequence sistemini devre dışı bırakmak için game/src dizinindeki packet_process.cpp dosyasında bulunan sequence kontrolünü atlamak üzere bir bypass fonksiyonu yazmak gerekir. Bu işlem sırasında auth server ile olan bağlantıda da sequence kontrolü varsa burada da düzenleme yapılmalıdır. Bu işlemler sırasında db core üzerinde de değişiklik gerekebilir.
Sonuç[/BR][/BR]
Sequence sistemini devre dışı bırakmak, Metin2 özel sunucularında daha özelleştirilmiş ve akıcı sistemler kurmanıza olanak tanır. Ancak bu işlem security ve stability açısından dikkatle yapılmalıdır. Metin2lobby kullanıcıları olarak, bu tür gelişmiş source edit konularında deneyim kazanmak için sürekli öğrenmeye ve test etmeye açığız.
Disabling Sequence
While developing on Metin2 private servers, there may be cases where you want to disable the sequence system. This can especially be important in PvP systems or during certain C++-based modifications. The sequence system ensures that player actions are queued and processed stably on the game server, but sometimes you may need to take control away from this system.
What Is Sequence?[/BR][/BR]
Sequence is a feature in the Metin2 game engine that ensures synchronization between the client and server. Each action taken by the player is controlled via a sequence number on the server side. This system reduces cheating risks and ensures actions are processed in correct order. However, during advanced source edit operations, this system might become an obstacle.
Why Disable Sequence?[/BR][/BR]
Especially when designing custom PvP systems, the sequence system might interfere with quick action sequences or combos. For instance, delays can occur during rapid skill combinations. In such cases, disabling sequence allows for a smoother gameplay experience. Additionally, in uiscript systems integrated with Python GUI, manual sequence handling might be preferred.
How to Disable Sequence?[/BR][/BR]
The sequence system is usually coded on the game server side. To modify it, changes must be made in C++ source code. When using tools like Martysama or other Metin2Dev utilities, functions controlling sequence can be found and bypassed. Since these changes occur at core level, they require careful attention.
Technical Implementation[/BR][/BR]
To disable sequence, locate the sequence check function inside the packet_process.cpp file under the game/src directory and implement a bypass mechanism. If sequence checks exist in the connection with the auth server, those must also be modified. Such modifications may also affect the db core.
Conclusion[/BR][/BR]
Disabling the sequence system allows for more customized and fluid gameplay systems in Metin2 private servers. However, this process requires careful attention to security and stability. As Metin2lobby users, we remain open to learning and testing in advanced source edit topics like these.
*game/packet_info.cpp
Arat:
Kod:
CPacketInfoCG::CPacketInfoCG() { Set(HEADER_CG_TEXT, sizeof(TPacketCGText), "Text", false); Set(HEADER_CG_HANDSHAKE, sizeof(TPacketCGHandshake), "Handshake", false); Set(HEADER_CG_TIME_SYNC, sizeof(TPacketCGHandshake), "TimeSync", true); Set(HEADER_CG_MARK_LOGIN, sizeof(TPacketCGMarkLogin), "MarkLogin", false); Set(HEADER_CG_MARK_IDXLIST, sizeof(TPacketCGMarkIDXList), "MarkIdxList", false); Set(HEADER_CG_MARK_CRCLIST, sizeof(TPacketCGMarkCRCList), "MarkCrcList", false); Set(HEADER_CG_MARK_UPLOAD, sizeof(TPacketCGMarkUpload), "MarkUpload", false); #ifdef _IMPROVED_PACKET_ENCRYPTION_ Set(HEADER_CG_KEY_AGREEMENT, sizeof(TPacketKeyAgreement), "KeyAgreement", false); #endif Set(HEADER_CG_GUILD_SYMBOL_UPLOAD, sizeof(TPacketCGGuildSymbolUpload), "SymbolUpload", false); Set(HEADER_CG_SYMBOL_CRC, sizeof(TPacketCGSymbolCRC), "SymbolCRC", false); Set(HEADER_CG_LOGIN, sizeof(TPacketCGLogin), "Login", true); Set(HEADER_CG_LOGIN2, sizeof(TPacketCGLogin2), "Login2", true); Set(HEADER_CG_LOGIN3, sizeof(TPacketCGLogin3), "Login3", true); Set(HEADER_CG_LOGIN5_OPENID, sizeof(TPacketCGLogin5), "Login5", true); //OpenID Set(HEADER_CG_ATTACK, sizeof(TPacketCGAttack), "Attack", true); Set(HEADER_CG_CHAT, sizeof(TPacketCGChat), "Chat", true); Set(HEADER_CG_WHISPER, sizeof(TPacketCGWhisper), "Whisper", true); Set(HEADER_CG_CHARACTER_SELECT, sizeof(TPacketCGPlayerSelect), "Select", true); Set(HEADER_CG_CHARACTER_CREATE, sizeof(TPacketCGPlayerCreate), "Create", true); Set(HEADER_CG_CHARACTER_DELETE, sizeof(TPacketCGPlayerDelete), "Delete", true); Set(HEADER_CG_ENTERGAME, sizeof(TPacketCGEnterGame), "EnterGame", true); Set(HEADER_CG_ITEM_USE, sizeof(TPacketCGItemUse), "ItemUse", true); Set(HEADER_CG_ITEM_DROP, sizeof(TPacketCGItemDrop), "ItemDrop", true); Set(HEADER_CG_ITEM_DROP2, sizeof(TPacketCGItemDrop2), "ItemDrop2", true); Set(HEADER_CG_ITEM_MOVE, sizeof(TPacketCGItemMove), "ItemMove", true); Set(HEADER_CG_ITEM_PICKUP, sizeof(TPacketCGItemPickup), "ItemPickup", true); Set(HEADER_CG_QUICKSLOT_ADD, sizeof(TPacketCGQuickslotAdd), "QuickslotAdd", true); Set(HEADER_CG_QUICKSLOT_DEL, sizeof(TPacketCGQuickslotDel), "QuickslotDel", true); Set(HEADER_CG_QUICKSLOT_SWAP, sizeof(TPacketCGQuickslotSwap), "QuickslotSwap", true); Set(HEADER_CG_SHOP, sizeof(TPacketCGShop), "Shop", true); Set(HEADER_CG_ON_CLICK, sizeof(TPacketCGOnClick), "OnClick", true); Set(HEADER_CG_EXCHANGE, sizeof(TPacketCGExchange), "Exchange", true); Set(HEADER_CG_CHARACTER_POSITION, sizeof(TPacketCGPosition), "Position", true); Set(HEADER_CG_SCRIPT_ANSWER, sizeof(TPacketCGScriptAnswer), "ScriptAnswer", true); Set(HEADER_CG_SCRIPT_BUTTON, sizeof(TPacketCGScriptButton), "ScriptButton", true); Set(HEADER_CG_QUEST_INPUT_STRING, sizeof(TPacketCGQuestInputString), "QuestInputString", true); Set(HEADER_CG_QUEST_CONFIRM, sizeof(TPacketCGQuestConfirm), "QuestConfirm", true); Set(HEADER_CG_MOVE, sizeof(TPacketCGMove), "Move", true); Set(HEADER_CG_SYNC_POSITION, sizeof(TPacketCGSyncPosition), "SyncPosition", true); Set(HEADER_CG_FLY_TARGETING, sizeof(TPacketCGFlyTargeting), "FlyTarget", true); Set(HEADER_CG_ADD_FLY_TARGETING, sizeof(TPacketCGFlyTargeting), "AddFlyTarget", true); Set(HEADER_CG_SHOOT, sizeof(TPacketCGShoot), "Shoot", true); Set(HEADER_CG_USE_SKILL, sizeof(TPacketCGUseSkill), "UseSkill", true); Set(HEADER_CG_ITEM_USE_TO_ITEM, sizeof(TPacketCGItemUseToItem), "UseItemToItem", true); Set(HEADER_CG_TARGET, sizeof(TPacketCGTarget), "Target", true); Set(HEADER_CG_WARP, sizeof(TPacketCGWarp), "Warp", true); Set(HEADER_CG_MESSENGER, sizeof(TPacketCGMessenger), "Messenger", true); Set(HEADER_CG_PARTY_REMOVE, sizeof(TPacketCGPartyRemove), "PartyRemove", true); Set(HEADER_CG_PARTY_INVITE, sizeof(TPacketCGPartyInvite), "PartyInvite", true); Set(HEADER_CG_PARTY_INVITE_ANSWER, sizeof(TPacketCGPartyInviteAnswer), "PartyInviteAnswer", true); Set(HEADER_CG_PARTY_SET_STATE, sizeof(TPacketCGPartySetState), "PartySetState", true); Set(HEADER_CG_PARTY_USE_SKILL, sizeof(TPacketCGPartyUseSkill), "PartyUseSkill", true); Set(HEADER_CG_PARTY_PARAMETER, sizeof(TPacketCGPartyParameter), "PartyParam", true); Set(HEADER_CG_EMPIRE, sizeof(TPacketCGEmpire), "Empire", true); Set(HEADER_CG_SAFEBOX_CHECKOUT, sizeof(TPacketCGSafeboxCheckout), "SafeboxCheckout", true); Set(HEADER_CG_SAFEBOX_CHECKIN, sizeof(TPacketCGSafeboxCheckin), "SafeboxCheckin", true); Set(HEADER_CG_SAFEBOX_ITEM_MOVE, sizeof(TPacketCGItemMove), "SafeboxItemMove", true); Set(HEADER_CG_GUILD, sizeof(TPacketCGGuild), "Guild", true); Set(HEADER_CG_ANSWER_MAKE_GUILD, sizeof(TPacketCGAnswerMakeGuild), "AnswerMakeGuild", true); Set(HEADER_CG_FISHING, sizeof(TPacketCGFishing), "Fishing", true); Set(HEADER_CG_ITEM_GIVE, sizeof(TPacketCGGiveItem), "ItemGive", true); Set(HEADER_CG_HACK, sizeof(TPacketCGHack), "Hack", true); Set(HEADER_CG_MYSHOP, sizeof(TPacketCGMyShop), "MyShop", true); Set(HEADER_CG_REFINE, sizeof(TPacketCGRefine), "Refine", true); Set(HEADER_CG_CHANGE_NAME, sizeof(TPacketCGChangeName), "ChangeName", true); Set(HEADER_CG_CLIENT_VERSION, sizeof(TPacketCGClientVersion), "Version", true); Set(HEADER_CG_CLIENT_VERSION2, sizeof(TPacketCGClientVersion2), "Version", true); Set(HEADER_CG_PONG, sizeof(BYTE), "Pong", true); Set(HEADER_CG_MALL_CHECKOUT, sizeof(TPacketCGSafeboxCheckout), "MallCheckout", true); Set(HEADER_CG_SCRIPT_SELECT_ITEM, sizeof(TPacketCGScriptSelectItem), "ScriptSelectItem", true); Set(HEADER_CG_PASSPOD_ANSWER, sizeof(TPacketCGPasspod), "PasspodAnswer", true); Set(HEADER_CG_HS_ACK, sizeof(TPacketGCHSCheck), "HackShieldResponse", false); Set(HEADER_CG_XTRAP_ACK, sizeof(TPacketXTrapCSVerify), "XTrapResponse", false); Set(HEADER_CG_DRAGON_SOUL_REFINE, sizeof(TPacketCGDragonSoulRefine), "DragonSoulRefine", false); Set(HEADER_CG_STATE_CHECKER, sizeof(BYTE), "ServerStateCheck", false); }
Değiştir:
Kod:
CPacketInfoCG::CPacketInfoCG() { Set(HEADER_CG_TEXT, sizeof(TPacketCGText), "Text", false); Set(HEADER_CG_HANDSHAKE, sizeof(TPacketCGHandshake), "Handshake", false); Set(HEADER_CG_TIME_SYNC, sizeof(TPacketCGHandshake), "TimeSync", false); Set(HEADER_CG_MARK_LOGIN, sizeof(TPacketCGMarkLogin), "MarkLogin", false); Set(HEADER_CG_MARK_IDXLIST, sizeof(TPacketCGMarkIDXList), "MarkIdxList", false); Set(HEADER_CG_MARK_CRCLIST, sizeof(TPacketCGMarkCRCList), "MarkCrcList", false); Set(HEADER_CG_MARK_UPLOAD, sizeof(TPacketCGMarkUpload), "MarkUpload", false); #ifdef _IMPROVED_PACKET_ENCRYPTION_ Set(HEADER_CG_KEY_AGREEMENT, sizeof(TPacketKeyAgreement), "KeyAgreement", false); #endif Set(HEADER_CG_GUILD_SYMBOL_UPLOAD, sizeof(TPacketCGGuildSymbolUpload), "SymbolUpload", false); Set(HEADER_CG_SYMBOL_CRC, sizeof(TPacketCGSymbolCRC), "SymbolCRC", false); Set(HEADER_CG_LOGIN, sizeof(TPacketCGLogin), "Login", false); Set(HEADER_CG_LOGIN2, sizeof(TPacketCGLogin2), "Login2", false); Set(HEADER_CG_LOGIN3, sizeof(TPacketCGLogin3), "Login3", false); Set(HEADER_CG_LOGIN5_OPENID, sizeof(TPacketCGLogin5), "Login5", false); //OpenID Set(HEADER_CG_ATTACK, sizeof(TPacketCGAttack), "Attack", false); Set(HEADER_CG_CHAT, sizeof(TPacketCGChat), "Chat", false); Set(HEADER_CG_WHISPER, sizeof(TPacketCGWhisper), "Whisper", false); Set(HEADER_CG_CHARACTER_SELECT, sizeof(TPacketCGPlayerSelect), "Select", false); Set(HEADER_CG_CHARACTER_CREATE, sizeof(TPacketCGPlayerCreate), "Create", false); Set(HEADER_CG_CHARACTER_DELETE, sizeof(TPacketCGPlayerDelete), "Delete", false); Set(HEADER_CG_ENTERGAME, sizeof(TPacketCGEnterGame), "EnterGame", false); Set(HEADER_CG_ITEM_USE, sizeof(TPacketCGItemUse), "ItemUse", false); Set(HEADER_CG_ITEM_DROP, sizeof(TPacketCGItemDrop), "ItemDrop", false); Set(HEADER_CG_ITEM_DROP2, sizeof(TPacketCGItemDrop2), "ItemDrop2", false); Set(HEADER_CG_ITEM_MOVE, sizeof(TPacketCGItemMove), "ItemMove", false); Set(HEADER_CG_ITEM_PICKUP, sizeof(TPacketCGItemPickup), "ItemPickup", false); Set(HEADER_CG_QUICKSLOT_ADD, sizeof(TPacketCGQuickslotAdd), "QuickslotAdd", false); Set(HEADER_CG_QUICKSLOT_DEL, sizeof(TPacketCGQuickslotDel), "QuickslotDel", false); Set(HEADER_CG_QUICKSLOT_SWAP, sizeof(TPacketCGQuickslotSwap), "QuickslotSwap", false); Set(HEADER_CG_SHOP, sizeof(TPacketCGShop), "Shop", false); Set(HEADER_CG_ON_CLICK, sizeof(TPacketCGOnClick), "OnClick", false); Set(HEADER_CG_EXCHANGE, sizeof(TPacketCGExchange), "Exchange", false); Set(HEADER_CG_CHARACTER_POSITION, sizeof(TPacketCGPosition), "Position", false); Set(HEADER_CG_SCRIPT_ANSWER, sizeof(TPacketCGScriptAnswer), "ScriptAnswer", false); Set(HEADER_CG_SCRIPT_BUTTON, sizeof(TPacketCGScriptButton), "ScriptButton", false); Set(HEADER_CG_QUEST_INPUT_STRING, sizeof(TPacketCGQuestInputString), "QuestInputString", false); Set(HEADER_CG_QUEST_CONFIRM, sizeof(TPacketCGQuestConfirm), "QuestConfirm", false); Set(HEADER_CG_MOVE, sizeof(TPacketCGMove), "Move", false); Set(HEADER_CG_SYNC_POSITION, sizeof(TPacketCGSyncPosition), "SyncPosition", false); Set(HEADER_CG_FLY_TARGETING, sizeof(TPacketCGFlyTargeting), "FlyTarget", false); Set(HEADER_CG_ADD_FLY_TARGETING, sizeof(TPacketCGFlyTargeting), "AddFlyTarget", false); Set(HEADER_CG_SHOOT, sizeof(TPacketCGShoot), "Shoot", false); Set(HEADER_CG_USE_SKILL, sizeof(TPacketCGUseSkill), "UseSkill", false); Set(HEADER_CG_ITEM_USE_TO_ITEM, sizeof(TPacketCGItemUseToItem), "UseItemToItem", false); Set(HEADER_CG_TARGET, sizeof(TPacketCGTarget), "Target", false); Set(HEADER_CG_WARP, sizeof(TPacketCGWarp), "Warp", false); Set(HEADER_CG_MESSENGER, sizeof(TPacketCGMessenger), "Messenger", false); Set(HEADER_CG_PARTY_REMOVE, sizeof(TPacketCGPartyRemove), "PartyRemove", false); Set(HEADER_CG_PARTY_INVITE, sizeof(TPacketCGPartyInvite), "PartyInvite", false); Set(HEADER_CG_PARTY_INVITE_ANSWER, sizeof(TPacketCGPartyInviteAnswer), "PartyInviteAnswer", false); Set(HEADER_CG_PARTY_SET_STATE, sizeof(TPacketCGPartySetState), "PartySetState", false); Set(HEADER_CG_PARTY_USE_SKILL, sizeof(TPacketCGPartyUseSkill), "PartyUseSkill", false); Set(HEADER_CG_PARTY_PARAMETER, sizeof(TPacketCGPartyParameter), "PartyParam", false); Set(HEADER_CG_EMPIRE, sizeof(TPacketCGEmpire), "Empire", false); Set(HEADER_CG_SAFEBOX_CHECKOUT, sizeof(TPacketCGSafeboxCheckout), "SafeboxCheckout", false); Set(HEADER_CG_SAFEBOX_CHECKIN, sizeof(TPacketCGSafeboxCheckin), "SafeboxCheckin", false); Set(HEADER_CG_SAFEBOX_ITEM_MOVE, sizeof(TPacketCGItemMove), "SafeboxItemMove", false); Set(HEADER_CG_GUILD, sizeof(TPacketCGGuild), "Guild", false); Set(HEADER_CG_ANSWER_MAKE_GUILD, sizeof(TPacketCGAnswerMakeGuild), "AnswerMakeGuild", false); Set(HEADER_CG_FISHING, sizeof(TPacketCGFishing), "Fishing", false); Set(HEADER_CG_ITEM_GIVE, sizeof(TPacketCGGiveItem), "ItemGive", false); Set(HEADER_CG_HACK, sizeof(TPacketCGHack), "Hack", false); Set(HEADER_CG_MYSHOP, sizeof(TPacketCGMyShop), "MyShop", false); Set(HEADER_CG_REFINE, sizeof(TPacketCGRefine), "Refine", false); Set(HEADER_CG_CHANGE_NAME, sizeof(TPacketCGChangeName), "ChangeName", false); Set(HEADER_CG_CLIENT_VERSION, sizeof(TPacketCGClientVersion), "Version", false); Set(HEADER_CG_CLIENT_VERSION2, sizeof(TPacketCGClientVersion2), "Version", false); Set(HEADER_CG_PONG, sizeof(BYTE), "Pong", false); Set(HEADER_CG_MALL_CHECKOUT, sizeof(TPacketCGSafeboxCheckout), "MallCheckout", false); Set(HEADER_CG_SCRIPT_SELECT_ITEM, sizeof(TPacketCGScriptSelectItem), "ScriptSelectItem", false); Set(HEADER_CG_PASSPOD_ANSWER, sizeof(TPacketCGPasspod), "PasspodAnswer", false); Set(HEADER_CG_HS_ACK, sizeof(TPacketGCHSCheck), "HackShieldResponse", false); Set(HEADER_CG_XTRAP_ACK, sizeof(TPacketXTrapCSVerify), "XTrapResponse", false); Set(HEADER_CG_DRAGON_SOUL_REFINE, sizeof(TPacketCGDragonSoulRefine), "DragonSoulRefine", false); Set(HEADER_CG_STATE_CHECKER, sizeof(BYTE), "ServerStateCheck", false); }
*root/intrologin.py
Arat:
Kod:
if constInfo.SEQUENCE_PACKET_ENABLE: net.SetPacketSequenceMode()
Değiştir:
Kod:
#if constInfo.SEQUENCE_PACKET_ENABLE: # net.SetPacketSequenceMode()
Sequence'i Devre Dışı Bırakma
Metin2 özel sunucularında geliştirme yaparken bazı durumlarda sequence sistemini devre dışı bırakmak isteyebilirsiniz. Bu özellikle PvP sistemlerinde veya belirli C++ tabanlı modifikasyonlar yaparken önemli olabilir. Sequence sistemi, oyuncu hareketlerini ve eylemleri sıraya sokarak game server tarafında daha stabil çalışmayı sağlar ancak bazen bu sistemin kontrolü elinize almanız gerekir.
Sequence Nedir?
Sequence, Metin2 oyun motorunda client ve server arasındaki senkronizasyonu sağlayan bir özelliktir. Oyuncunun yaptığı her eylem, server tarafından bir sıra numarasıyla kontrol edilir. Bu sistem sayesinde hile yapma riski azaltılır ve eylemlerin doğru sırayla işlenmesi sağlanır. Ancak bazı gelişmiş source edit işlemleri sırasında bu sistemin engel teşkil etmesi mümkündür.
Neden Sequence Devre Dışı Bırakılır?[/BR][/BR]
Özellikle custom PvP sistem tasarımı yapılırken, sequence sisteminin bazı hareketleri engellemesi istenmeyen sonuçlar doğurabilir. Örneğin, hızlı saldırı kombinasyonları veya özel beceri dizileri sırasında gecikmeler oluşabilir. Bu gibi durumlarda sequence sistemini kapatmak, daha akıcı bir deneyim sunar. Ayrıca Python GUI ile entegre çalışan uiscript sistemlerinde, sequence kontrolü manuel olarak yapılmak istenebilir.
Sequence Nasıl Devre Dışı Bırakılır?[/BR][/BR]
Sequence sistemi genellikle game server tarafında kodlanmıştır. Bu işlem için C++ source code üzerinde değişiklik yapılması gerekir. Özellikle Martysama veya benzeri Metin2Dev araçları kullanılırken, sequence kontrolünün yapıldığı fonksiyonlar bulunur ve burada bypass işlemleri uygulanabilir. Bu değişiklikler, core seviyesinde yapıldığı için dikkatli olunmalıdır.
Teknik Uygulama[/BR][/BR]
Sequence sistemini devre dışı bırakmak için game/src dizinindeki packet_process.cpp dosyasında bulunan sequence kontrolünü atlamak üzere bir bypass fonksiyonu yazmak gerekir. Bu işlem sırasında auth server ile olan bağlantıda da sequence kontrolü varsa burada da düzenleme yapılmalıdır. Bu işlemler sırasında db core üzerinde de değişiklik gerekebilir.
Sonuç[/BR][/BR]
Sequence sistemini devre dışı bırakmak, Metin2 özel sunucularında daha özelleştirilmiş ve akıcı sistemler kurmanıza olanak tanır. Ancak bu işlem security ve stability açısından dikkatle yapılmalıdır. Metin2lobby kullanıcıları olarak, bu tür gelişmiş source edit konularında deneyim kazanmak için sürekli öğrenmeye ve test etmeye açığız.
Disabling Sequence
While developing on Metin2 private servers, there may be cases where you want to disable the sequence system. This can especially be important in PvP systems or during certain C++-based modifications. The sequence system ensures that player actions are queued and processed stably on the game server, but sometimes you may need to take control away from this system.
What Is Sequence?[/BR][/BR]
Sequence is a feature in the Metin2 game engine that ensures synchronization between the client and server. Each action taken by the player is controlled via a sequence number on the server side. This system reduces cheating risks and ensures actions are processed in correct order. However, during advanced source edit operations, this system might become an obstacle.
Why Disable Sequence?[/BR][/BR]
Especially when designing custom PvP systems, the sequence system might interfere with quick action sequences or combos. For instance, delays can occur during rapid skill combinations. In such cases, disabling sequence allows for a smoother gameplay experience. Additionally, in uiscript systems integrated with Python GUI, manual sequence handling might be preferred.
How to Disable Sequence?[/BR][/BR]
The sequence system is usually coded on the game server side. To modify it, changes must be made in C++ source code. When using tools like Martysama or other Metin2Dev utilities, functions controlling sequence can be found and bypassed. Since these changes occur at core level, they require careful attention.
Technical Implementation[/BR][/BR]
To disable sequence, locate the sequence check function inside the packet_process.cpp file under the game/src directory and implement a bypass mechanism. If sequence checks exist in the connection with the auth server, those must also be modified. Such modifications may also affect the db core.
Conclusion[/BR][/BR]
Disabling the sequence system allows for more customized and fluid gameplay systems in Metin2 private servers. However, this process requires careful attention to security and stability. As Metin2lobby users, we remain open to learning and testing in advanced source edit topics like these.
