Jump to content

Recommended Posts

Posted (edited)

​In this guide, I'll explain you how to edit Interface.u

  • ​​0) Prerequisites

​Before going further, you need some basics about development, about variables, functions, and so on. If you don't have, learn before, then come back here after !
​You also will use a lot of Hexa, be ready with it.
​L2 uses UnrealTournament Renderer/Engine.
Any client modification could be bannable by server owners. Be careful about it. If you wanna try some mods freely, install a L2J server on your computer.

​​Also, you'll need some extra software (all free).
​First one, is L2encdec, in order to decryp L2 files. If you don't know it, then L2 editing/modding will be hard. I'll not provide any link about it, but it can be found in any FileEdit software.
​Second, you'll need 'UT Package Tool' (aka UTPT). Here : http://www.acordero.org/projects/unreal-tournament-package-tool/
​Then, any Hex Editor ( XVI32 is a good one, but you can prefer Hex Workshop, google them to find a link, prefer latest version).

​And finally, you'll need a documentation, about UT scripting : https://mega.nz/#!jph2yZrS!CJpX9zLAK5ibG3CDWsjfN97KTycsY5WGRVDZ8xzFDy0
Read it, especially from page 27 - Script Format. READ IT ! READ IT !

Ok, lets go :
 

  • 1) Decrypt L2 file

​Un-encrypt your interface.u :

Use CMD, l2encdec.exe -d interface.u
Write down (notepad) the "Header" version, in my case, Lineage2Ver111
A new file dec-interface.u will be created
 

  • 2) Find the script

Open UTPT, then open your interface.u
Go in the "Export Tree" tab, right click, full collapse.
Then, you'll have to choice what you wanna edit.
For this guide, I'll modify the "Rank Name" under the "Name" of a Target.
So, the script to edit will be in "TargetStatusWnd", in the "HandleTargetUpdate". Right click on it, then "Decompile". You'll see the current script. If you understand nothing about it, STOP, learn about development before !!
Save the full script in a txt file. (select all, copy, open notepad, paste, save)
Find the line you wanna change, in my case, it's "NameRank = GetUserRankString(Info.nUserRank);" . I wanna change it to something like : "NameRank = GetClassType(Info.nClassID);"
In order to find what functions are available to use, go to the "Name Table" tab. About vars or attributes (nClassID in my case), I didn't found any relevant list, but we will see after (in §4).
In the "Export Table" tab, in your current selected script ("HandleTargetUpdate" in my case), right click, then  "Analise Raw Object". A  Hex table (read only) will appear. Here is the magic <3
In the menu, "Format then Auto Format". The Hex table will be 'sorted' by script lines. Find the line you wanna modify, by hovering all 'bubbles' If the interface is messed up, "Auto Format" again.
When you found it, write down (notepad) the full Hex digits related to your line. In my case, it's "0F 00 65 0D 1C C8 0D 36 E4 0D 00 5F 02 16", which refers to "NameRank = GetUserRankString(Info.nUserRank);"

  • 3) Decode the Hex data

Here is the hardest part of this guide.
​You now have to decode this Hex values, according to the PDF doc. Did you read it before ?? :)

​In the last step, we ended with a Hex data : 0F 00 65 0D 1C C8 0D 36 E4 0D 00 5F 02 16
​In my case, 0F means EX_Let, so, the data after will be assigned to the right part.
​00 means EX_LocalVariable, so the next 2 bytes will be the left part of my expression. 6F0D is my local variable (NameRank in my case).
​1C means EX_FinalFunction, so the next 2 bytes will be the address of a function. C80D is my function (GetUserRankString in my case).
36 means EX_StructMember, so a member of an object. The following 2 bytes will be the member. E40D is the member (nUserRank in my case).
00 means EX_LocalVariable, and it will be also the object (as it follows a EX_StructMember without declared object). 5F02 is my object (Info in my case).
16 is EX_EndFunctionParms, so the end of my function ( a closing parenthesis sign )

In my case, C80D will be changed, and E40D. First one is my function, 2nd one is the member of the Info object.
 

  • 4) Replace

How to find the references to replace ?
You'll have to find other existing scripts where the functions and variable you wanna substitutes are present. Decompile scripts with UTPT where functions/variables can be found (according to the retail L2 interface).
For me, as it's related to classes, I thought that it could be present in the "DetailStatusWnd.UpdateInterface" script (as it's related to the "Character Status" (Alt + T) window)
So decompile it with UTPT, then, use the "Find" function. When you found a interesting line, Analise Raw Object, Auto Format, found the Hex values related to the line, and decode it (see point 3)
In my case, I found for the variable nSubClass the following Hex value : DC 0B, and for the function GetClassStr this Hex value : E5 0B
So, C80D should be replaced with E50B and E40D by DC0B.

 

​You can use this archive https://mega.nz/#!e4AVkQKJ!d2Q7n0pFfh_mumUG7NLV193BJXlwSXhSIiS-6EZSh8U containing all H5 scripts from .u files, to see what functions/variables are existing.

  • 5) Hex editor and Crypt

Open your Hex editor. Find the initial Hex full value, and replace the Hex values according to point 4.
Save. Encrypt with l2encdec, replace the <version> in the following CMD command by the version you wrote down on point 1 (111 in my case)
l2encdec.exe -h <version> dec-interface.u
(in my case, it will be : l2encdec.exe -h 111 dec-interface.u)
A new enc-dec-interface.u will be created.
 

  • 6) Verify and Test

Open the new file (enc-dec-interface.u) with UTPT, open the target script, Decompile it, and verify that it's OK. (copy all the script text, save on txt file, check with WinMerge against the same script, but from the initial file (point 1) could be a good solution)
In your L2 client folder, delete the initial interface.u file, copy the new one (enc-dec-interface.u), rename it to interface.u
Open your L2 client, and check :)

 

 

 

Hope It will help ppl.

Any comment in this topic will be helpful to improve it !

I'll maybe add some pics later. Let me know if pics are important to understand.

Edited by Etuldan
Posted

​Hmm ?

​I wrote this guide from scratch.

​From what 'original' guide are you talking ?

​I didn't steal any content, from another website or other.

Do you have any proof about this original guide ? I guess no.

Posted

Should you send some screens with your modifications ? iam only searching for some cool and usefull modifications for IL, but its looks like i must make my own interface, so if you can up some screens it will be so cool.

BTW: if you have any interfaces can you send me in message link or screen ? :) Thx a lot :)

Posted (edited)

​@Stajirek :

​ATM, I'm only testing some things (as I'm new about interface.u editing, and I wrote this guide as soon as I understood the main part). I'm still not yet an expert in heavy modification.

​The example used for the guide was H5, but it should be equivalent for any Chronicle.

​Also, an xDat editing will be mostly required along an interface.u editing ( .u file : script, xdat : layout)

6wZS4NAu0cXu.png

​(yes, the target is a fighter, as GM I changed his class to check the modification in the TergetWnd)

Edited by Etuldan
Posted

Iam interested About interlude. I Just saw interface from nephoreon and i really like How he remake that Adena and place in iventory etc. I have no idea How to make that things but im Just going learn How to work with that by your guide and then i will try make something "like him" :D

  • 2 weeks later...
  • 2 weeks later...
  • 3 months later...
Posted

One question, if for example I want to remove a bit of hex code will it work? (im testing things out since it's the first itme i try it and i try to replace NameRank = GetUserRankString(Info.nUserRank); with NameRank = Info.Name;

  • 1 month later...

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Posts

    • I have browsed this forum for months, witnessing the infinite and endless debate over which datapack is better, whether one is leaked or another is stolen. I constantly see developers from different projects throwing mud at each other for their own convenience. For a novice 27-year-old developer with a dream, all of this is disheartening. Opening a Lineage 2 server in 2026 seems like a titanic goal when looking for stability and scalability. The thought of depositing my only savings into one of these datapacks, praying to God that everything goes well, is terrifying. This is not a destructive critique of any forum member or developer. It is simply a call for reflection: What are we doing for the original essence of Lineage 2? Have we forgotten those memories from when we were young, going to a cybercafé to play for 12 hours straight just to grind a few levels? It seems that instead of providing a quality server to the community—a place where our inner child can enjoy the game—this has become a race where the only prize is money, at the cost of progressively destroying the game's community. Is there actually anyone or any project thinking about this? I know that invested time requires financial return; obviously, we all need to survive and eat. But friends... that isn't everything. Currently, in Argentina, 100% of the servers are garbage and last approximately one month. Corrupt admins, illegal item sales for quick profit, and endless toxic practices. Since I couldn't find the answers I needed, I tasked a generic AI (Google Gemini) with creating an extensive report on datapacks, history, competition, and current objectives. I am leaving it here for anyone who wants to read it. Comprehensive Research Report: The State of the Lineage 2 Java (L2J) Emulation Ecosystem 2020-2026 1. Executive Summary and Strategic Scope The landscape of Java-based Lineage 2 (L2J) server emulation has undergone a radical metamorphosis between 2020 and 2026. What began in the early 2000s as a scattered community effort to reverse-engineer a Korean MMORPG has consolidated by 2026 into a highly sophisticated software development sector. This report aims to provide the definitive guide and the most comprehensive technical analysis available in the market regarding the selection, architecture, and viability of L2J datapacks. A clear bifurcation in development philosophy has been identified: on one side, massive, chronicle-agnostic open-source projects, indisputably led by L2JMobius (and its strategic transition to the MIT license in 2025); and on the other, highly specialized niche projects like aCis (for Interlude) and L2JEternity (for High Five), which prioritize architectural purity and extreme performance through the early adoption of JDK 25. This document not only evaluates "completeness" in terms of game content but also dissects technical debt, legal security, and long-term sustainability. 1.1 Evaluation Methodology To determine the "best" datapack, we applied a multidimensional evaluation matrix: Architectural Integrity: Analysis of code quality, thread management, and modern design patterns. Lifecycle Maturity: Update frequency and leadership stability. Tool Ecosystem: Availability of client editors, geodata generators, and compatible anti-bot systems. Commercial Viability: Ability to sustain a stable economy and support high concurrency loads (500+ simultaneous players). 2. The Technological Revolution: From Java 8 to Java 25 (2020-2026) One of the most critical findings is the quantum leap in the underlying infrastructure. The 2023-2026 period has witnessed a technological arms race. 2.1 The Impact of JDK 25 on Emulation Vanguard projects like L2JEternity and the main branches of L2JMobius completed the migration to JDK 25. Garbage Collection (GC): The implementation of ZGC and Shenandoah has solved the historic problem of "GC pauses" (lag due to memory cleaning). With JDK 25, these pauses are sub-millisecond, allowing for fluid massive combat (Sieges). Virtual Threads (Project Loom): This allows handling thousands of simultaneous connections and AI tasks without the excessive cost of traditional OS threads. 2.2 Network Layer Modernization (Netty) The old MMOcore-based architecture has been replaced or heavily refactored using Netty, optimizing the packet pipeline and improving security against application-layer DDoS attacks. 2.3 Tech Stack Comparison | Project | Java Version (2025/26) | Database | Status | | :--- | :--- | :--- | :--- | | L2JMobius | JDK 21 / 25 | MySQL / MariaDB | Active (MIT) | | L2JEternity| JDK 25 | MySQL | Active (Private) | | aCis | JDK 11 / 17 | MySQL | Active (Private) | | L2JFrozen/Brasil | JDK 7 / 8 | MySQL | Obsolete / Risk | 3. L2JMobius: The Open Source Hegemon L2JMobius emerges as the definitive answer for the vast majority of use cases in 2026, based on three pillars: universality, legality, and tools. Universality: It maintains a unified architecture (monorepo) supporting everything from C1 to the most recent Essence versions. Core fixes propagate to all versions. MIT License (June 2025): A historic milestone allowing servers to modify code extensively and keep changes private without violating the license, legitimizing commercial use. Vertical Integration (L2ClientDat): The team actively maintains client editing tools, ensuring perfect compatibility with the latest protocols (e.g., Protocol 507). 4. The Battle for Interlude: Purism vs. Modernity Interlude (C6) remains the most demanded version. aCis (The Gold Standard): Obsessed with code quality and "Retail" fidelity. Ideal for Low Rate servers (x1-x10). The free version is often stale; the paid version is the professional choice. L2JMobius Interlude: The practical "batteries included" alternative. Includes popular mods out of the box and benefits from the modern core. Ideal for Mid/High Rate PvP servers. Warning: L2JFrozen and L2JBrasil are considered obsolete and dangerous in 2026 due to security vulnerabilities and unmaintainable code. 5. The High Five Sector: Commercialization and Risks L2J Sunrise: Positions itself as a "turnkey" solution, but its closed code creates total vendor dependence. Risky for long-term projects. L2JEternity: The technical gem for advanced admins. Pioneer in JDK 25 and offers native support for protections like Strix and SmartGuard. 6. Essence and the Modern Era For Essence, L2JMobius has no real competition in the free Java space, reacting to NCSoft updates with supernatural speed. Russian commercial alternatives (L2-Scripts) exist but come with high costs. 7. Ecosystem and Auxiliary Tools Geodata: Essential to avoid movement errors. 2026 hybrid engines reduce "wall-shooting." Vote Reward: Middleware systems like VDSystem or iTopZ are mandatory, and modern datapacks already include the necessary hooks. 8. Conclusions and Definitive Recommendations After analyzing repositories and trends up to January 2026: Overall Winner: L2JMobius. Best ratio of features/modernity/support. Purist's Choice (Interlude): aCis. Unbeatable mechanical fidelity. Performance Option (High Five): L2JEternity. Extreme optimization. Final Warning: Strictly avoid L2JFrozen, L2JBrasil, and black-box projects like Sunrise for critical infrastructures.
    • I’ve seen tools like Find Person Name by Photo come in handy for creators who want to understand their audience better or spot fake accounts trying to piggyback on their growth. Pairing something like that with a solid SMM panel can make your workflow feel way smoother, especially if you're trying to grow without getting tangled in guesswork.
    • Join our discord: https://www.lineage2.cz/discord  
    • You should buy it then I’ll make a discount  
  • Topics

×
×
  • Create New...

Important Information

This community uses essential cookies to function properly. Non-essential cookies and third-party services are used only with your consent. Read our Privacy Policy and 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..

AdBlock Extension Detected!

Our website is made possible by displaying online advertisements to our members.

Please disable AdBlock browser extension first, to be able to use our community.

I've Disabled AdBlock