Jump to content

Lineage 2 in Unity


Recommended Posts

  • 3 weeks later...
  • 5 weeks later...

I replied on your video on YT. I didn't think anyone else out there would have ever wanted to do this. I figured L2 had died. Like you, I had that nostalgic feeling one day and decided to see if it would be doable in Unity. I built the whole world based on how it was for H5. There's a ridiculous amount of learning required if you want to actually take this all the way. Blender skills are a must. As someone else mentioned in this thread, you can get a long way with just the static meshes, but the devs used BSP brushes for most of the interiors and large parts of the map. A lot of the shapes are not just simple cubes but are stamped out using the BSP brushes they had at the the time, which makes replicating them somewhat difficult.. But, it can be done. I was impressed you figured out the pitch, yaw, and roll conversions needed to orient the static meshes properly on the map. I would think that would be a big hurdle for anyone else trying to do this without knowing where to look to understand what unreal units are. 

 

Some of my thoughts on proceeding with this were:

  • Texture enhancement (this will only get you so far and can cause problems because instead of using single textures, the original devs used multiple textures per model which can cause artifacts when introducing normal maps). Talk about super inefficient too. I'm amazed the game ran relatively smoothly when it came out with all those draw calls.
  • Re-paint textures entirely by hand so that you can take advantage of PBR and get true metallic maps for a more modern look. The current painted-on lighting/shading looks terrible. Apparently they added some specular maps at some point but it's still pretty awful. 
  • Custom animation controller to allow for 8-direction movement (true WASD)
  • Potential animation re-work to include jumping animations and other modifications necessary to be able to blend animations to get a more WoW-like combat play style. Let's be honest, the animations were designed for click-to-move and that was a horrible design decision.  If you don't already have experience with animation, this is going to be a real pain point. 
  • Implementation of world streaming. Script to re-label all static meshes to support scene splitting and streaming. You can't build any sort of a prototype client without streaming. 
  • At some point, someone is going to have to manually create all the spell effects which is going to be a HUGE pain in the ass. I've redone some like certain buffs and healing spells but it's going to take a lot of time to go through the spell static meshes and figure out what was used for what. Some are obvious, others are not.
  • Above applies for skill effects as well.
  • Have to settle on an MMO engine. There are some in the unity asset store worth checking out, but likely it's not going to take you all the way and will require LOTS of tweaking to get things how you want them. Even once you settle on one you are going to have to spend time learning it as well and modifying it as necessary. 

 

Long story short, building the map is the easy part. Converting all the static meshes you need to import into unity is EXTREMELY time consuming. Same goes for creating the textures. It's possible if you got a team together I suppose. I guess I just love this game that much that I want to see it remade in a modern engine with some slight changes to the playstyle and with better mechanics for mobs and bosses. 

 

You've done a really great job from what I saw in your video. As I mentioned, I was going down this road too but it sure would be better to work on it as a team. If you might be interested in that, let me know. I can only handle working on it myself in bursts here and there. I'd be happy to share more of what I've done and the challenges/experiences I had as well.

 

Here's a screenshot of my work scene with a few areas populated with their static meshes. I have all the textures imported, but I haven't taken the time to remap all the materials as it wasn't important to me at the time since so many other things needed to be done. I didn't texture the terrains with the original splat maps cause I wanted to use different textures with normal maps. 

aden.jpg

Edited by cgrahamseven
  • Like 1
Link to comment
Share on other sites

2 hours ago, cgrahamseven said:

At some point, someone is going to have to manually create all the spell effects which is going to be a HUGE pain in the ass. I've redone some like certain buffs and healing spells but it's going to take a lot of time to go through the spell static meshes and figure out what was used for what. Some are obvious, others are not.

Above applies for skill effects as well.

That's the first thing I tought when i saw all those projects, like LU4, UE5 L2, etc. These people are gonna want to hang themselves when they get to skill effects 😂
Especially since the the particle system in UE2 is rudimentary AF

About finding out what you need to port to make a skill, you can figure it out by checking skillgrp.dat > checking the skill effect ID > decompiling LineageSkillEffect.u/Skill.usk (depending on the client) > checking the script for the skill you're looking for, to see what effects are used > decompile LineageEffect.u and check each of the skill's effects separately

you'll see scripts like this (this one is the smallest i could find, usually they're up to 5-50 times the size of this one):
 

Class d_tersi_b  Extends Emitter;
DefaultProperties
{
    Begin Object Name=SpriteEmitter75 Class=SpriteEmitter
        Acceleration=(X=0,Y=0,Z=2)
        ColorScale(0)=(RelativeTime=0,Color=(B=128,G=128,R=255,A=255))
        ColorScale(1)=(RelativeTime=1,Color=(B=64,G=128,R=255,A=0))
        ColorMultiplierRange=(X=(Min=0,Max=0),Y=(Min=0.3,Max=0.5),Z=(Min=1,Max=1))
        Opacity=0.91
        FadeOutStartTime=0.3975
        FadeOut=true
        FadeInEndTime=0.2025
        FadeIn=true
        MaxParticles=12
        Name="Fire"
        StartLocationRange=(X=(Min=-0.75,Max=0.75),Y=(Min=-0.75,Max=0.75),Z=(Min=0,Max=0))
        RevolutionsPerSecondRange=(X=(Min=-0.3,Max=0.3),Y=(Min=-0.3,Max=0.3),Z=(Min=-0.3,Max=0.3))
        SpinParticles=true
        SpinsPerSecondRange=(X=(Min=0.05,Max=0.2),Y=(Min=0,Max=0),Z=(Min=0,Max=0))
        StartSpinRange=(X=(Min=0,Max=1),Y=(Min=0,Max=0),Z=(Min=0,Max=0))
        UseSizeScale=true
        UseRegularSizeScale=false
        UniformSize=true
        SizeScale(0)=(RelativeTime=0,RelativeSize=0.65)
        SizeScale(1)=(RelativeTime=1,RelativeSize=0.3)
        StartSizeRange=(X=(Min=9.75,Max=13.25),Y=(Min=9.75,Max=13.25),Z=(Min=9.75,Max=13.25))
        InitialParticlesPerSecond=6
        AutomaticInitialSpawning=false
        Texture=Texture'LineageEffectsTextures.Particles5.fx_m_t4072'
        TextureUSubdivisions=4
        TextureVSubdivisions=4
        BlendBetweenSubdivisions=true
        SubdivisionEnd=16
        LifetimeRange=(Min=2,Max=2)
        StartVelocityRange=(X=(Min=0,Max=0),Y=(Min=0,Max=0),Z=(Min=3,Max=5))
    End Object
    Emitters(0)=SpriteEmitter75
    SpawnSound(0)=Sound'SkillSound15.GD1.d_tersi_1'
    SoundRadius=20
    SoundVolume=250
    SoundLooping=true
    bLightChanged=true
    bNoDelete=false
    bSunAffect=true
    DrawScale=0.1
}


Doesn't make it less painful but at least you know where to look for each skill

Link to comment
Share on other sites

I went this way back on 2017...

But after seeing the amount of work it needed, I decided to create a client with free assets, stepping out of commercial IPs. The result was Epic Dragon World.

I really hopped for more people to join, as with L2J, but it never actually happened.

Most people where there to rather criticize and project their own ideas and preferences, than actually help.

 

You may consider using it, to make make your project multiplayer and more appealing.
The necessary code to connect a Java server with a C# Unity client is already done and it is quite simple.
Server: https://github.com/PantelisAndrianakis/JMMOS

Client: https://github.com/PantelisAndrianakis/EpicDragonWorld

The exact same networking is used by all projects at L2jMobius.
https://bitbucket.org/MobiusDev/l2j_mobius/src/master/L2J_Mobius_CT_0_Interlude

 

It is possible to connect L2J_Mobius_CT_0_Interlude with a Unity client.

 

Edited by Mobius
  • Like 2
Link to comment
Share on other sites

1 hour ago, 911reg said:

That's the first thing I tought when i saw all those projects, like LU4, UE5 L2, etc. These people are gonna want to hang themselves when they get to skill effects 😂
Especially since the the particle system in UE2 is rudimentary AF
 


It gives me anxiety just thinking about it 🙂 

When I was working on this more full time, it would just drain me mentally. Get one little thing done and then realize the mountain of other things that still needed to be done. There just isn’t enough time in the day for one person to do it alone unless they have no day job lol. But it’s still super fun to try! I’d probably go back to working on this project more if more people like Carow were interested in doing it as a team. Need several people with programming backgrounds and a knack for reverse engineering. I remember back in the day I used to live on PostPacific forums and all that got me obsessed with RE. Ahh the glory days. I miss that. 

Edited by cgrahamseven
Link to comment
Share on other sites

12 hours ago, cgrahamseven said:

It gives me anxiety just thinking about it 🙂 

When I was working on this more full time, it would just drain me mentally. Get one little thing done and then realize the mountain of other things that still needed to be done.

Yep, i honestly wouldn't even try to do that, it's fucking nightmarish to even think about, porting each little thing by hand... But honestly i think Carow has the best approach to it; by trying to automatize everything. Honestly, since almost everything in UE2 can be turned into plain text, you can probably find out a way to create a script to automatically adapt everything into whatever format Unity or any other modern engine uses. Same for maps, staticmeshes, BSP brushes, etc.

Plus a big advantage of L2 is that it's made in a pretty old engine, so there are plenty of custom tools to extract any data necessary, and there is a lot of extensive documentation (both official and user-made)

 

12 hours ago, Mobius said:

I went this way back on 2017...

But after seeing the amount of work it needed, I decided to create a client with free assets, stepping out of commercial IPs. The result was Epic Dragon World.

I really hopped for more people to join, as with L2J, but it never actually happened.

Most people where there to rather criticize and project their own ideas and preferences, than actually help.

People from L2 tend to be especially retarded when you try to do something new, they'd rather keep playing the same thing they've been playing for 25 years and keep it that way, so it's probably not the best target audience for things like that 😂
tho i guess it's expected, since most people on this community are 30-50 year old kids

Link to comment
Share on other sites

1 hour ago, 911reg said:

Yep, i honestly wouldn't even try to do that, it's fucking nightmarish to even think about, porting each little thing by hand... But honestly i think Carow has the best approach to it; by trying to automatize everything. Honestly, since almost everything in UE2 can be turned into plain text, you can probably find out a way to create a script to automatically adapt everything into whatever format Unity or any other modern engine uses. Same for maps, staticmeshes, BSP brushes, etc.


I did everything just like he did for the most part. Started with L2SMR or whatever the Java app was that read static mesh coords. I exported them per map and then wrote a blender script in python to instantiate the meshes at the correct coordinates for Unity and then just exported the whole tile as an FBX and placed it at its world coordinates on top of the terrain. I agree that scripting is the best approach for sure to save time, but there are inevitably things you will run into that you can’t script your way out of. One of the things I meant to go back to was looking at how L2SMR parsed the .unr map files so I could extract the audio and BSP pieces. I don’t think L2SMR pulls the audio source coordinates but I’m sure you could figure out by looking at unreal engine docs. 

Link to comment
Share on other sites

1 hour ago, cgrahamseven said:


I did everything just like he did for the most part. Started with L2SMR or whatever the Java app was that read static mesh coords. I exported them per map and then wrote a blender script in python to instantiate the meshes at the correct coordinates for Unity and then just exported the whole tile as an FBX and placed it at its world coordinates on top of the terrain. I agree that scripting is the best approach for sure to save time, but there are inevitably things you will run into that you can’t script your way out of. One of the things I meant to go back to was looking at how L2SMR parsed the .unr map files so I could extract the audio and BSP pieces. I don’t think L2SMR pulls the audio source coordinates but I’m sure you could figure out by looking at unreal engine docs. 

You can extract everything in text format, in separate .t3d files for every map, and get something like this:
image.png

From there, you can literally see the whole map as plain .txt files, for example, here's a bsp brush:
 

Quote
Begin Actor Class=Brush Name=Brush26
    CsgOper=CSG_Add
    MainScale=(Scale=(X=1.000000,Y=1.000000,Z=1.000000),SheerRate=0.000000,SheerAxis=SHEER_ZX)
    PostScale=(Scale=(X=1.000000,Y=1.000000,Z=1.000000),SheerRate=0.000000,SheerAxis=SHEER_ZX)
    Level=LevelInfo'myLevel.LevelInfo0'
    Region=(Zone=ZoneInfo'myLevel.ZoneInfo3',iLeaf=549,ZoneNumber=1)
    Tag="Brush"
    Group="None,G_ch"
    PhysicsVolume=PhysicsVolume'myLevel.PhysicsVolume2'
    Location=(X=85153.000000,Y=149899.000000,Z=-3418.000000)
    Begin Brush Name=Model26
        Begin PolyList
            Begin Polygon Texture=Giran_Village_T.Giran_floor01 Link=0
                Origin   -85280.000000,-149613.000000,+03202.000000
                Normal   -00001.000000,+00000.000000,+00000.000000
                TextureU +00000.000000,+00002.000000,+00000.000000
                TextureV +00000.000000,+00000.000000,-00002.000000
                Vertex   -00128.000000,-00128.000000,-00229.000000
                Vertex   -00128.000000,-00128.000000,-00217.000000
                Vertex   -00128.000000,+00285.000000,-00217.000000
                Vertex   -00128.000000,+00285.000000,-00229.000000
            End Polygon
            Begin Polygon Texture=Giran_Village_T.Giran_floor01 Link=1
                Origin   -85280.000000,-149613.000000,+03202.000000
                Normal   +00000.000000,+00001.000000,+00000.000000
                TextureU +00002.000000,+00000.000000,+00000.000000
                TextureV +00000.000000,+00000.000000,-00002.000000
                Vertex   -00128.000000,+00285.000000,-00229.000000
                Vertex   -00128.000000,+00285.000000,-00217.000000
                Vertex   +01176.000000,+00285.000000,-00217.000000
                Vertex   +01176.000000,+00285.000000,-00229.000000
            End Polygon
            Begin Polygon Texture=Giran_Village_T.Giran_floor01 Link=2
                Origin   -85280.000000,-149613.000000,+03202.000000
                Normal   +00001.000000,+00000.000000,+00000.000000
                TextureU +00000.000000,-00002.000000,+00000.000000
                TextureV +00000.000000,+00000.000000,-00002.000000
                Vertex   +01176.000000,+00285.000000,-00229.000000
                Vertex   +01176.000000,+00285.000000,-00217.000000
                Vertex   +01176.000000,-00128.000000,-00217.000000
                Vertex   +01176.000000,-00128.000000,-00229.000000
            End Polygon
            Begin Polygon Texture=Giran_Village_T.Giran_floor01 Link=3
                Origin   -85280.000000,-149613.000000,+03202.000000
                Normal   +00000.000000,-00001.000000,+00000.000000
                TextureU -00002.000000,+00000.000000,+00000.000000
                TextureV +00000.000000,+00000.000000,-00002.000000
                Vertex   +01176.000000,-00128.000000,-00229.000000
                Vertex   +01176.000000,-00128.000000,-00217.000000
                Vertex   -00128.000000,-00128.000000,-00217.000000
                Vertex   -00128.000000,-00128.000000,-00229.000000
            End Polygon
            Begin Polygon Texture=interior_A_ch_t.Skins.interior_A_ch02-4 Link=4
                Origin   -85280.000000,-149613.000000,+03202.000000
                Normal   +00000.000000,+00000.000000,+00001.000000
                TextureU -00002.000000,+00000.000000,+00000.000000
                TextureV +00000.000000,-00002.000000,+00000.000000
                Vertex   -00128.000000,+00285.000000,-00217.000000
                Vertex   -00128.000000,-00128.000000,-00217.000000
                Vertex   +01176.000000,-00128.000000,-00217.000000
                Vertex   +01176.000000,+00285.000000,-00217.000000
            End Polygon
            Begin Polygon Texture=Giran_Village_T.Giran_floor01 Link=5
                Origin   -85280.000000,-149613.000000,+03202.000000
                Normal   +00000.000000,+00000.000000,-00001.000000
                TextureU +00002.000000,+00000.000000,+00000.000000
                TextureV +00000.000000,-00002.000000,+00000.000000
                Vertex   -00128.000000,-00128.000000,-00229.000000
                Vertex   -00128.000000,+00285.000000,-00229.000000
                Vertex   +01176.000000,+00285.000000,-00229.000000
                Vertex   +01176.000000,-00128.000000,-00229.000000
            End Polygon
        End PolyList
    End Brush
    Brush=Model'myLevel.Model26'
    PrePivot=(X=-127.000000,Y=286.000000,Z=-216.000000)
    TexModifyInfo=(bUseModify=false,bTwoSide=false,bAlphaBlend=false,bDummy=false,Color=(B=255,G=255,R=255,A=255),AlphaOp=1,ColorOp=1)
End Actor

 

So it's annoying, but it's possible to port everything with scripts (even map sounds, map effects, map ambience sounds/lighting, etc)

 

 

Link to comment
Share on other sites

3 hours ago, 911reg said:

You can extract everything in text format, in separate .t3d files for every map, and get something like this:
image.png

From there, you can literally see the whole map as plain .txt files, for example, here's a bsp brush:
 

So it's annoying, but it's possible to port everything with scripts (even map sounds, map effects, map ambience sounds/lighting, etc)

 

 

 

Oh cool yea that's super useful. 

Link to comment
Share on other sites

if you have such skills and making an obsolete game instead of creating a new one, (my oppinion?) stupid. i mean its up to you and all but lineage?

:pepe-hmmm:so many games out there

Link to comment
Share on other sites

7 hours ago, Nightw0lf said:

if you have such skills and making an obsolete game instead of creating a new one, (my oppinion?) stupid. i mean its up to you and all but lineage?

:pepe-hmmm:so many games out there

 

It's the nostalgia of Lineage 2. I can't speak for Carow, but for myself, L2 was my first MMO and I always dreamed of what Lineage 2 could have been if a few things had been done differently. Things like getting rid of click-to-move and having true WASD movement requiring players to manage distance to themselves rather than the server moving them to the target to attack. Re-working mob and boss mechanics so that there are more challenges for players. Lineage 2 always seemed to be about just putting players in a box somewhere and having them kill zergs of mobs. What about real dungeon experiences where you need multiple players using class-specific skills to help clear rooms and CC so your tank/healers don't get overwhelmed? What if you gave mobs more skills and the intelligence to use them? Why was progression in L2 all about just grinding XP? Why couldn't it have been quest-based which provided more experience than grinding mobs? That way everyone could reach max level within an acceptable time frame (not years) and start on dungeon content to obtain/craft the best gear. There are plenty of things you can do once someone reaches max level to keep them engaged. 

 

Those are just a few of the things that come to mind. Of course there is always the update to a modern engine that would be so refreshing. I have no idea why NCSoft never switched to a later version of UE. They could have really changed the game aesthetically, but they never did. I guess after they realized they had lost to Blizzard and World of Warcraft, they just gave up on development expenses and decided to milk whatever was left of the L2 population.

 

It's interesting, I played Lineage 2M when it released and after all these years, NCSoft learned nothing from the mistakes of the past. Instead they just repeat the same model of L2 in L2M. Yes, there are more quests, but it's still just "kill x number of mobs", rinse, repeat. Then grind grind grind where it takes you months to reach a new level. That's just plain shit gameplay. I guess that's how Korea likes it, but for a western market, that's not how we like to play games. 

 

But you know, the one thing I will give L2 credit for was the music. Musically, L2 beat any other game hands down. How is it that even 20 years later, people can still get chills from Dion Village's theme song? Bill Brown really created some incredibly timeless masterpieces for them. Totally worth watching btw: Shepard's Flute (Dion Town Theme)

Edited by cgrahamseven
  • Like 1
  • Upvote 2
Link to comment
Share on other sites

2 hours ago, cgrahamseven said:

 

But you know, the one thing I will give L2 credit for was the music. Musically, L2 beat any other game hands down. How is it that even 20 years later, people can still get chills from Dion Village's theme song? Bill Brown really created some incredibly timeless masterpieces for them. Totally worth watching btw: Shepard's Flute (Dion Town Theme)

 

L2 music was way ahead of its time and still is after so many years, just like how LOTR trilogy destroys most of modern movies after decades. I regurarly listen to L2 music while at work, something very eerie / relaxing about it.

 

 

Quote

Re-working mob and boss mechanics so that there are more challenges for players. Lineage 2 always seemed to be about just putting players in a box somewhere and having them kill zergs of mobs. What about real dungeon experiences where you need multiple players using class-specific skills to help clear rooms and CC so your tank/healers don't get overwhelmed? What if you gave mobs more skills and the intelligence to use them? Why was progression in L2 all about just grinding XP? Why couldn't it have been quest-based which provided more experience than grinding mobs? That way everyone could reach max level within an acceptable time frame (not years) and start on dungeon content to obtain/craft the best gear.

 

This was always also my desire to do, to create some instances / dungeons where players actually use their heads to progress, while at the same time keeping normal RBs, sieges and other retail mechanics intact for the PVP interaction. L2 imho offers a very good base (client wise and L2OFF server wise) for such project but the effort required is just too much. I had made an attempt to create a "safely escort an npc" type of mission, even tried to use stock effects to compliment the result (like explosions) but never actually got to finish ti due to the time required (both AI work and client matching choices with what I wanted to depict). One of the videos is this: 

 

 

Link to comment
Share on other sites

37 minutes ago, Blitzkrieg said:

This was always also my desire to do, to create some instances / dungeons where players actually use their heads to progress, while at the same time keeping normal RBs, sieges and other retail mechanics intact for the PVP interaction. L2 imho offers a very good base (client wise and L2OFF server wise) for such project but the effort required is just too much. I had made an attempt to create a "safely escort an npc" type of mission, even tried to use stock effects to compliment the result (like explosions) but never actually got to finish ti due to the time required (both AI work and client matching choices with what I wanted to depict). One of the videos is this: 

 

 

I love it! You must fondly remember the WoW escort quests where you end up screaming at your NPC to "stop moving so slow!!!!" while they just get beat on by mobs before you can kill them all. Yea, see those types of quests are engaging and fun for players. I agree too with keeping sieges and other retail mechanics intact to encourage world pvp for sure. I always thought one of the best features of L2 was castle sieges. That really was something different back in the day.

 

Link to comment
Share on other sites

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.




×
×
  • Create New...