Jump to content

Recommended Posts

Posted
18 minutes ago, MasterToma said:

Ok, now it works

Fix of the select with one case in master.

 

18 minutes ago, MasterToma said:

1. (4*(talker.param2 % 10))

Modulo precedence fix in master.

 

19 minutes ago, MasterToma said:

2. ((Rand(3)+1)*4)

This only will be problem if multiplication in NASC compiler has the same precedence as addition.

 

18 minutes ago, MasterToma said:

if (a && c || d)

This only will be problem if OR has the same precedence as AND.

Posted (edited)
12 minutes ago, verbrannt said:

This only will be problem if multiplication in NASC compiler has the same precedence as addition.

This only will be problem if OR has the same precedence as AND.

I understand it. But some of cases might like like with modulo.

 

I wouldn't noticed difference in if (a && c || d) if NASC would generated same code.

 

Could you please also add bracers for all nested expressions?

 

According to leaked code, all nested expressions have (). I'm not sure about such thing as precedence in script-engine, I could show you their VM code, where arguments only taken from stack in such and order in which compiler pasted them.

 

And NASC pasted them in opposite order :) (as I wrote in recent post)

Edited by MasterToma
Posted (edited)
12 minutes ago, MasterToma said:

I understand it. But some of cases might like like with modulo.

With modulo was different case. Modulo has same precedence as multiplication and division.

 

12 minutes ago, MasterToma said:

I wouldn't noticed difference in if (a && c || d) if NASC would generated same code.

I've tested it:


        1 && 2 || 3;
        (1 && 2) || 3;

        1 || 2 && 3;
        1 || (2 && 3);
        1 && (2 || 3);

         (1 || 2) && 3;

 

First two lines compiles in absolutely identical stack machine code. Also line 3 == line 4.
 

12 minutes ago, MasterToma said:

According to leaked code, all nested expressions have ()

It's because the decompiler, that was used to produce that leaked code, has no checks of operator precedence. It just adds braces everywhere after each operands pop from stack.

Edited by verbrannt
Posted (edited)

I never used shitty NASC decompilers :D No, Scripts from C0 were leaked. Real one with comments, etc. You should know it.

 

Okay, I will find good example, where OBJ code differs. Or if you don't want to hear about bugs, just say it clearly ;) I'm comparing two obj's with diff, so code differs... And Im trying to find good example, like with modulo

Edited by MasterToma
Posted
6 minutes ago, MasterToma said:

Or if you don't want to hear about bugs, just say it clearly ;)

Idk what you're talking about :) I've fixed every bug from your feedback, even not bugs (like increment/decrement & select with one case).
When you'll find another different obj code of course if will fix that.

Posted (edited)

Okay then... so as I told, nested bracers change resulted ai.obj

 

Try this one (output https://pastebin.com/6Su1S470)

	EventHandler TALK_SELECTED(talker) 
	{
		if ( HaveMemo(talker, @trial_of_scholar)==1 &&    
OwnItemCount(talker, @dieters_diary) >= 1 || OwnItemCount(talker, @scripture_chapter_1) >= 1 || OwnItemCount(talker, @strong_liquor) >= 1) 
		{
			AddChoice(0,"Mention what Raut said");
		}
	}

and with additional bracers

	EventHandler TALK_SELECTED(talker) 
	{
		if ( HaveMemo(talker, @trial_of_scholar)==1 &&    
(OwnItemCount(talker, @dieters_diary) >= 1 || OwnItemCount(talker, @scripture_chapter_1) >= 1 || OwnItemCount(talker, @strong_liquor) >= 1)) 
		{
			AddChoice(0,"Mention what Raut said");
		}
	}

https://pastebin.com/JL3sWgyz (output)

 

Scroll to the end in pastebin, to see the difference

 

The same in complex cases with + and *

 

Take into account, that NASC is actually simple stream translator, so it doesn't have (almost) context like AST. It translates line by line (with special handling of loops and if/else)

Edited by MasterToma
Posted (edited)
17 minutes ago, MasterToma said:

so as I told, nested bracers change resulted ai.obj

 

Yes, of course. I know this.

I've tried compile-decompile-recompile this code

class guard_babenco {
handler:
    EventHandler TALK_SELECTED(talker) {
        if (1 && 2 || 3 || 4) {
            Say("Hello");
        }

        if (1 && (2 || 3 || 4)) {
            Say("Hello");
        }
    }
}

And nothing changed. I've got same obj file as before decompilation.

But if you have any unfixed example of broken nesting of logical operators, provide an obj.

 

Of course if in OBJ we have something like 1 && (2 || 3 || 4) but after decompilation got 1 && 2 || 3 || 4 - it's a bug, and I need example.

But if we have (1 && 2) || 3 || 4 in OBJ and after decompilation got 1 && 2 || 3 || 4 - it's not a bug.

Edited by verbrannt
Posted (edited)
Quote

But if you have any unfixed example of broken nesting of logical operators, provide an obj.

I sent you ai.obj from C1. Being decompiled (bracers are missed) and compiled back, ai.obj with mixed and/or is produced. I pasted in my recent posts.

 

I have about 35 classes with such case. You can check drunkard_treaf for instance

Edited by MasterToma
Posted (edited)
1 hour ago, MasterToma said:

You can check drunkard_treaf for instance

Ok here I see difference. Looks like not logical operators bug, but IF statement bug. Also if c1 ai.obj was compiled with another compiler than you have, this differences can occur. Anyway original OBJ and recompiled OBJ produces same decompiled code.

Do you have leaked (original) source of this class?

 

UPD original code that produces identical to your ai.obj result:
 

(HaveMemo(talker, @trial_of_scholar) == 1 && (OwnItemCount(talker, @dieters_diary) >= 1 && OwnItemCount(talker, @scripture_chapter_1) >= 1 && OwnItemCount(talker, @strong_liquor) >= 1))


So there's useless braces in the original ai.obj.

 

Edited by verbrannt
Posted (edited)

Looks like we lost and talking about different things. I really understand, that if there are only &&, no point in extra bracers... belive me, because I've decompiled most of L2, and it works (including NASC itself). But this info about extra scope () is present in ai.obj. I posted examples, where you can see the difference. I posted the difference in pastebin. NASC generates DIFFERENT code for (a && (b && c)) and for (a && b && c). But decompiler restores them in SAME way - no bracers. I don't know how to be more clear. 

 

I have two concerns about it. First - messed diff. I can't compare original and recompiled objs due to much more trash. Second - there is might be some weird context, which might lead to bug.

 

OK, never-mind, you did great job anyway.

 

I have at least two more bugs apart this:

1. some jump is just missed. Have no idea, but in original class's obj there is just 1 more jump instruction. I can't say nothing concrete, because diff produces too much mismatches due to my previous point. Could you just add those bracers? Or point me the function and I'll fix it by my own maybe :)

 

2. in some classes (e.g. pet_manager_martin)

	push_event	//  i5
	push_const 212
	add

instead of

push_reg_sp
fetch_i

 

Edited by MasterToma
Posted

Original OBJ + Decompiled source + Recompiled OBJ: https://mega.nz/#!SSJ0FQ7L!EPXTDOTcGmy4QGJPIgZ7jMY7-AVQ9pcq_xfEHilwJzQ

Almost no differences. Only missed jump, as you mentioned.

Replaces made on both OBJs:
L\d+ -> L0
S\d+ -> L0
\r\nL0\r\n -> \r\n

Hope you would like the "((((((((((((((((((((((((((((((((((((((((" in decompiled source :D.

Posted (edited)

Well I think it's not so hard to do proper (), if this info present in ai.obj. But I understand your sarcasm.

Why should I replace labels If I ignore them during diff?

 

I have 35 files with differences (labels are ignored, and few more filters are ignored), but you don't want to hear :) And it's not "only jump" Okay I will fix it manually, not a big deal.

 

Tnx for your work, this decompiler at least somehow usefull

Edited by MasterToma
Posted (edited)
47 minutes ago, MasterToma said:

And it's not "only jump"

I've shared compiled OBJs right before your post. There's only 19 differences, and all is missing jump.

Those missing jumps might be a breaks inside if inside select. I have an old issue for it.
Idk, may be we're using different decompilers or something :)

Anyway, smiles mode now enabled by default in branch c1-support.
And you have only 35 files of 2200, I think it's not so bad.

Edited by verbrannt

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.




  • Posts

    • I wouldn't expect something less, since you work with Psadek (or I maybe mistake you with NightW0lf from itopz, in that case soz) Let's throw rocks at Java Golds and elevate "original L2OFF Golds", no?
    • We are delighted to announce our partnership with the leading resource, Active Anticheat, specializing in protection against bot programs, clickers, and additional modules for the game client that enhance the experience for both you and the players!   When you purchase Active Anticheat for our product, you will also receive a $50 discount.   Here's a brief overview of the features of Active Anticheat: Best protection against bots, including private and premium versions. Window limitation. HWID spoofing protection. Virtual machine protection. File hash protection for client files, preventing players from modifying them (e.g., interface files). Encryption of any game files. Integration with Discord to attract new players! Additional plugins: - Window with saved player logins/passwords. Players no longer need to enter them every time! - HWID sending to the game server. - Game window optimizer for quick switching. - Background FPS adjustment. - Window name customization in the format "%character_name% - %server_name%". - Ctrl+C/V permission. - Login and password saving (for Interlude -> High Five). - Launching the browser via server packets. - Launching interface events via server packets. - Interlude: fixing a known game bug (History: UpdateAnimation <- AActor::Tick <- TickAllActors <- ULevel::Tick <- (NetMode=0) <- TickLevel <- UGameEngine::Tick <- UpdateWorld <- MainLoop). - Interlude: debuff feature. 9) All of this is available without modifying the game server code (some plugins may require minor changes). Take note of newest plugin, which is highly useful: Guides section
    • The Lucera2 Multiprotocol is an advanced server branch for Lineage 2 that enables seamless support for multiple client versions on a single server instance. This allows players to connect and play using either the legacy (old) client or the newer Classic client simultaneously, without any compatibility issues or loss of functionality. Key Benefits Dual Client Support: Both the old Interlude client and Classic: Secret of Empire 2.6 client can run concurrently on the same server. All features from the Classic client (e.g., enhanced UI, new mechanics) remain fully available, while the old client retains its alternative features (e.g., simplified interfaces for lower-end hardware). Expanded Player Base: Ideal for regions with limited access to modern gaming setups, as it accommodates a wider range of devices and preferences, merging Legacy and Classic communities into one forum section for unified discussions. No Functionality Gaps: Extensive testing ensures zero disruptions—players on either client experience complete game integrity, including quests, PvP, raids, and custom Lucera2 subsystems. You can fully test and explore all aspects of Multiprotocol on the dedicated Test Server. Supported Protocols C6 (Old Client): Protocol versions 740–770. Classic Client (Secret of Empire 2.6): Protocol versions 166–192.
    • Connect to the server you need to >>>download<<< game client launch from /system_en/. Login server setup on auto registration, admin rights in game by default . Or you can use a patch specifying the l2.ini Connect to address classic.lucera2.com if you already have a game client Download updated patch All major/minor subsystems operate in a proper view. Absolutely ready to combat the server.
  • Topics

×
×
  • Create New...

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