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

    • Since technical talk offends people, I believe I should return back to writting my Lineage 2 lore stories. Here's the next one:   Once upon a time, there was a boy and a small adorable wolf.    The boy really loved the wolf but as the wolf grow older and bigger, it became agressive and would bite the boy. One day the boy and the wolf decided to go to the city to buy potions. The road was long and hilly so the boy moved all his adena to the wolf bags to help his legs and reach the city easier.   When they reached the city, the boy tried to take the adena out of the wolf's bags. But the wolf would not ! He bit the boy and said "You will not get this adena back, this is my adena". The boy got angry. He decided to go to the pet master and ask for help.    "Pet master, pet master ! My wolf is big, bad and angry and it won't obey me. I want my adena back and it bites me. "   The pet master looked at the big angry wolf, then looked at the boy and said. "I have a solution for your problem young one. I have magic. Dark magic. I can turn your big bad elder wolf into a younger puppy for free, all you have to do is spell the magic chants. Nothing more, no wolf modifying wands, just your say".   The boy thought about it for a bit, and decided that he indeed wanted to turn things back. But when he was about to spell the magic words, guards arrived at the pet master.    The city guard captain said "Is this the big bad angry wolf that bites people and doesn't give back his adena ? We will kill this wolf !"    For a moment the boy hesitated but he said "This wolf is big bad and angry, but I love this wolf and I dont want it to die ! Please don't kill the big bad angry wolf." But the boy was not fast enough. The guards jumped the wolf and started slashing on him with their swords. The boy didn't know what to do, so in it its final moments right as the wolf was about to die, it spelled the magic words. "Pet master, make my wolf young and adorable again !"   But he was not fast enough. The wolf got slashed and killed by the guards just one moment before the boy could finish his last word.    But as the words came out of his mouth, with the wolf's dead body on the floor, a younger wolf manifested out of thin air. The magic was real. The guards got scared and run away. Now the boy was left with a dead old bad angry wolf and next to him an alive younger version.    The boys joy was even bigger when it opened the new wolfs bags and his adena was finally there. He took the adena and went back to buy potions in the city.   Twenty four hours later, the boy couldn't believe how his fortune would change ...   (No AI was used to write this story)
    • This is like 2017 MaxCheaters. i love it.
    • NEW SEASON GRAND OPENING FROM - 30 OCTOBER 2026, FRIDAY, 20:00 +2 GMT !
    • My bug report was a proper submission. I shouldn't have shown the exploit, I will accept that. Let's end it here. 
    • To Finish this, because it's need a explanation   1. “I come to your forum” — It's the L2JMobius forum, not mine. I'm a contributor, not the owner or the maintainer responsible for deciding which fixes get committed.   2. “Which is why I left” — That's not an accurate account of what happened. You may have left voluntarily once, but you were also banned from the Discord server three times after repeatedly returning and causing the same disruptions. Those are not the same thing.   3. “You personally reply and reject that it works” — I asked how a negative withdrawal could be performed and later requested a demonstration of the claimed exploit. At no point did I reject the patch or claim the vulnerability was impossible. Asking for evidence is not the same as rejecting someone's work.   4. “You leave it unpatched for days” — I don't make that decision. Whether and when a patch gets committed is entirely up to the project maintainer, not me.   5. “You challenge me to post a video” — Yes, I asked you to demonstrate the exploit. You interpreted that as a rejection of your work, which it wasn't. Requesting proof of a claimed exploit is a perfectly reasonable part of technical discussion.   6. “Asshole-ness is a mutually contracted disease” — You're responsible for your own behavior, just as I'm responsible for mine. Disagreeing with you or questioning your claims doesn't justify personal insults. If you believe I've treated you unfairly, address what I actually said rather than making my behavior an excuse for yours.   And one question remains unanswered: why did you publicly disclose the exploitationmethod before the fix was released, after previously saying you wanted to avoid harming the project?   The vulnerability was real, the fix was accepted, and the commit was published. I have no problem acknowledging any of that.   My disagreement has never been about whether the bug deserved to be fixed. It's about how you've handled the discussion and repeatedly misrepresented my role in it.     I have nothing against you personally. My issue is with the way you conduct yourself in these discussions.   And no, you're not obligated to prove anything to me. However, when you make a technical claim, the burden of proof is on you. You cannot reasonably expect others to accept your claims without sufficient evidence.   Questioning a claim is not the same as rejecting it, nor is it a personal attack.   This isn’t about fanaticism; it’s about pushing back against the completely senseless attacks constantly leveled at the project as a whole.   It’s always the same thing: they badmouth it, claiming the project is worthless—yet the very same people criticizing it are the first in line to download a leaked version.   Enough is enough. This discussion has dragged on far too long over something that ought to be straightforward; if you’re going to submit a bug report, you should at least do it properly.
  • 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..