Jump to content
  • 0

L2Homage; Making L2 Modding Accessible


Bumble

Question

Hi,

 

I'm making this post to test the waters. If what I'm about to show you doesn't interest you, I'll take it as a sign to stop spending time on it. I've been hoping that the old adage "If you build it, they will come" holds true, but I think it's time to straight up ask for feedback. I've contacted a few people for possible collaboration, but none have shown much interest (which is completely fair).

 

I've been working on L2Homage in my spare time. It's not a quick project, and it will take a long time to complete. It will be done modularly, so it will be usable in stages. The first one is already functional, but I'm still doing tests.

 

What is L2Homage?

L2Homage is a modding tool meant to make modding L2 OFF files easier. It doesn't do anything you can't do on your own, by editing a handful files.

L2H is an extensive editing tool for both client and server files for Lineage 2 Epilogue. While still in development, the intention of this project is to provide users with a tool that’s capable of repurposing most of existing ingame content. This will allow users to rethink and reshape the world of Lineage 2, providing the hordes of burnt out players with new, exciting content, without having to spend hours learning how to manipulate the data structure. The hope is to see a bunch of unique, new game worlds appear, instead of relaunches of the same L2 experience we’ve all been through too many times to count.

 

How much will it cost?

L2H will be free, and eventually completely open source. This is not a project created for monetary gain, it’s solely meant to revitalize the stagnating server scene.

 

Which L2 version does it use and why?

L2H is meant to be free, so the server files should be as well. The most complete, freely available L2OFF files are the Gracia Final/epilogues files, and with Eressea’s extender, it feels nearly bug free. It’s a very strong, free base to build this project on. This tool would likely follow Eressea's extender. If she decides to upgrade L2 version, L2H would most likely follow.

 

When will it be done?

This is a side project with a single developer attached. It won’t be completed fast, but each milestone will be made available to the public, once tested and functional. The development will be modular, with each version providing new options. If you're interested in helping out, let me know.

 

Why are you making this post now?

L2H is meant to help users customize the world of Lineage 2. Every user has a different vision, and as such it’s valuable to gather not only critique, but feature requests and suggestions from anyone interested in the project. The development direction is not set in stone, and is open to change. It's also a test to see if such a tool is even desired. If people tell me this is a waste of time, I'll throw in the towel. There's no reason to continue working on something unwanted.

 

Which language is L2H developed in?

C#

 

How do I use L2H?

Install the L2OFF gracia epilogue server files and Eressea’s extender, then open L2H. There are 3 folders in the L2H directory; client, server and data. Copy the required server script files into the server folder and the decrypted client .txt files into the client folder. There is a .txt file in each folder, informing you of what goes where. Don’t touch the data folder, as it only keeps track of the work you’ve done so far. When you’ve placed the data files in the correct folders, open the application and go to the load/save tab. Click “Load All” and wait. When done, the other tabs have been populated with data, which you can edit freely. When you’re done editing, click “Save All”. If you don’t click save, your data isn’t exported. Now copy the modified files back where they came from. Client files need to be encrypted with an encryption tool again.

 

What does it look like?

Here are a few screenshots of the application in action. It’s still very barebone, but that will change in the future. Loading functionality:

image.png.9e37d5f9f0732ac8bc2b89cbfc2828dd.png

 

Weapons editing:

image.thumb.png.a025f82977580ce24ee8191200177e1e.png

 

Armors editing:

image.thumb.png.1d1696d8cd76299ba08461de62588782.png

 

Etc editing:

image.thumb.png.a7eeb22c4552cd53f320169fdb2019c4.png

 

Sets editing:

image.thumb.png.b940972f62ef82e891d9512546dc4a88.png

 

How does L2H work?

Decrypted Lineage 2 client files and server script files are structured in a very specific way, one that can be parsed and edited. When developers add or remove content to the L2OFF platform, they do this by hand. This often requires editing more files to add a single item. For instance, if you were to add a single weapon, you would have to edit weapongrp (client), itemname-e(client), itemdata(server) and item_pch(server). L2H does this for you with one input. There are a LOT of variables for items, most of which aren't relevant to the modder, and it's easy to mess it up. One wrong space, and your server won't run, or your item won't work. Instead of adding new items from scratch, modders choose a weapon to use as a template. L2H copies all relevant information, and exposes variables that are interesting to edit in an easily accessible grid view. When you're done editing, click export all to get the correctly formatted files. You can copy those directly into the server and client (client files need to be encrypted again).

 

Can I add custom models and animations?

If you want to add custom models, you will have to do that the old fashioned way. There is a lot more to adding new models to the game, compared to repurposing it. Completely new content like that, however cool it may be, is not the goal of L2H. That being said, once you’ve added the new content, you can use L2H to edit or copy it.

 

Why are you not planning to develop X?

If you have a feature request or suggestion, feel free to message me or comment in this post. The planned features are those that are absolutely possible to deliver. The limits of L2H is well known, and there won’t be an attempt to include features beyond those. If your suggestion falls within the possibilities of L2H, it will most likely get added to the list.

 

When will the next version be available?

When it’s ready. This is an ongoing project, and while updates may be far apart, it’ll be finished one day. The project uses no copyrighted info. It's all relying on reverse engineering the data structure. It only reads the data you feed it. Development will continue until all values available for change have been exposed. If I'm doing anything I shouldn't, please let me know. I have no intention of breaking the law.

 

Will you be running a server?

No. That's not my motivation.

 

Will it work for other versions of Lineage 2?

That’s not the focus of this project, so that’s not a compatibility that will be added. It will work with any version of Lineage 2 that uses the exact same data structure as Epilogue. Should a newer version of L2OFF be made available, there’s a slim chance L2H will be updated to fit that data structure.

 

Will it mess up my files?

Remember to keep backups. There can be bugs.

 

Can I delete items?

You can only delete items you’ve created yourself. If you start removing data from the client and the server, you’ll most likely run into issues. If you delete an item that exists in the game world, you might run into issues as well. It’s better to disable these from being acquired, and then remove them from players’ inventories.

 

 

What's in the current version?

Check the roadmap and version description below.

 

Version 1.0 - Items - Done

Adding, modifying or deleting weapons

Adding, modifying or deleting armors

Adding, modifying or deleting etc items

Adding, modifying or deleting sets

 

Version 2.0 - NPCs

Adding, modifying or deleting NPCs

Adding, modifying, deleting or assigning spawn points

Adding, modifying, deleting or assigning drop lists

Adding, modifying, deleting or assigning multisell shop lists

Adding, modifying, deleting or assigning specific AI

 

Version 3.0 - Items Continued

Adding, modifying or deleting recipes

Modifying item enchant success rate

Cell input options lists, to see which options you have per cell

Adding, modifying or deleting tattoos

 

Version 4.0 - World

Adding, modifying or deleting hunting zones (Won’t appear on map)

Adding, modifying or deleting zone names (Won’t appear on map)

 

Version 5.0 - Quests

Adding, modifying or deleting quests

Adding, modifying or deleting rewards

 

Version 6.0 - Raids

Adding, modifying or deleting Raid Bosses

Creating custom NPC behavior through interface

 

Version 7.0 - Core

Modifying the base attributes, hp, mp, regen etc of each class and race per level

Modifying the XP requirement per level

Modifying race and occupation description

Adding, modifying or deleting loading help tips

Adding, modifying or deleting system messages (“You carefully nock an arrow”)

Modifying server name

 

Version 8.0 - Pets

Modifying pet stats and attributes

 

Version 9.0 - Skills

Adding, modifying or deleting Skills

Modifying when and if classes learn different skills

 

Version 10.0 - Ingame Systems

Adding, modifying or deleting manor items

Adding, modifying or deleting fishing items

 

 

Let me know what you think,

 

-B

 

Edit: I'll leave this up for a few weeks and gauge the interest before deciding the future of the project. Thanks for your interest.

 

Edit2: It seems people are interested, so I'll continue developing this. I started a Discord for anyone interested: https://discord.gg/97yAsCA

 

Edited by Bumble
  • Like 2
  • Thanks 2
  • Upvote 8
Link to comment
Share on other sites

Recommended Posts

  • 0

Progress update:

Spawn areas are parsing and loading correctly now.

 

I'm working on the different variables for each npc spawn. I'm curious what information is stored for NPCs on the database, and I was hoping someone in here could help me out.

Here's an example:

npc_ex_begin	[raid_boss_von_helman]	pos={{59331;-42403;-3003;0;20%};{59709;-42310;-3003;0;20%};{59717;-41974;-3003;0;20%};{59333;-41858;-3003;0;20%};{59047;-42165;-3003;0;20%}}	total=1	respawn=3hour	respawn_rand=1hour	dbname=[raid_boss_von_helman]	boss_respawn_set=yes	npc_ex_end

'raid_boss_von_helman' is the ID.

Then comes the position, following pos={.

But why does this one suddenly have a percentage in his coordinates? What does the 20% mean?

 

after that comes the total number of spawns alive at any time, which is obviously set to 1.

 

Then respawn time, self-explanatory.

 

Then comes respawn_rand. Is that amount of time it can deviate from respawn time? So this guy can spawn every 2-4 hours?

 

Next is dbname, referencing an entry in the database. What exactly is stored for this guy in the database? Or any other NPC with a reference to the database? Is the entry created when the server is installed, or is it created when the npc is loaded?

 

boss_respawn_set is just if the npc is a boss I assume.

 

 

Regarding the structure; it changes a bit depending on the npc. Some have a lot of variables, others have a few. Unlike all the other script files I've parsed, there is no empty space between the variables when one is skipped. It's just not there. Can I assume that npcpos.txt is imported different, only reading which variables are actually applied? So if a variable isn't mentioned, I don't have to account for it?

 

Thanks,

 

-B

 

 

  • Like 1
Link to comment
Share on other sites

  • 0
1 hour ago, Bumble said:

Progress update:

Spawn areas are parsing and loading correctly now.

 

I'm working on the different variables for each npc spawn. I'm curious what information is stored for NPCs on the database, and I was hoping someone in here could help me out.

Here's an example:


npc_ex_begin	[raid_boss_von_helman]	pos={{59331;-42403;-3003;0;20%};{59709;-42310;-3003;0;20%};{59717;-41974;-3003;0;20%};{59333;-41858;-3003;0;20%};{59047;-42165;-3003;0;20%}}	total=1	respawn=3hour	respawn_rand=1hour	dbname=[raid_boss_von_helman]	boss_respawn_set=yes	npc_ex_end

'raid_boss_von_helman' is the ID.

Then comes the position, following pos={.

But why does this one suddenly have a percentage in his coordinates? What does the 20% mean?

 

after that comes the total number of spawns alive at any time, which is obviously set to 1.

 

Then respawn time, self-explanatory.

 

Then comes respawn_rand. Is that amount of time it can deviate from respawn time? So this guy can spawn every 2-4 hours?

 

Next is dbname, referencing an entry in the database. What exactly is stored for this guy in the database? Or any other NPC with a reference to the database? Is the entry created when the server is installed, or is it created when the npc is loaded?

 

boss_respawn_set is just if the npc is a boss I assume.

 

 

Regarding the structure; it changes a bit depending on the npc. Some have a lot of variables, others have a few. Unlike all the other script files I've parsed, there is no empty space between the variables when one is skipped. It's just not there. Can I assume that npcpos.txt is imported different, only reading which variables are actually applied? So if a variable isn't mentioned, I don't have to account for it?

 

Thanks,

 

-B

 

 

I think % value there is a chance that an NPC will spawn on each of the specified pos={. It has 5 values, 20% each, 100% spawn rate total. Other NPCs that have this % value, also have a total sum of 100% depending on the number of coordinates.

 

E.g. Uruka:

 

npc_ex_begin    [uruka]    pos={{3075;-10966;-3650;0;30%};{5202;-11331;-3650;0;30%};{5225;-8439;-3550;0;40%}}

 

3 values with 100% total.

 

About respawn_rand, I found this topic on L2Shrine with replies from @eresseahttps://forum.l2shrine.com/topic/1622-respawn-of-world-bosses/, where she describes it in more detail and with a formula! :) There are also other options mentioned there, and I saw a couple of other ways it may work on different servers; but I think it can also depend on whether it is java or off platform.

 

Now, dbname=[ , not so sure... Looks like some specific NPC ID, bosses and NPCs such as siege units have it mostly; monsters spawning on a certain territory don't usually have that. So a bit hard for me to say for sure to what and where it references to.

 

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

  • 0

Also, found one utility, not sure if it is available somewhere here on MC, called NpcPosMaker. It has several features plus a radar which helps with the visualisation/finding the value for the direction NPCs are facing. 

 

If it would be of any help, I can share it here.

Edited by Weedy
Link to comment
Share on other sites

  • 0

Weedy, that's exactly what I was looking for. Good find!

 

I'm still looking for some info on the different database values (dbname, dbsaving), but the info you posted takes me a long way.

 

Thanks!

-B

Link to comment
Share on other sites

  • 0
1 hour ago, Weedy said:

Also, found one utility, not sure if it is available somewhere here on MC, called NpcPosMaker. It has several features plus a radar which helps with the visualisation/finding the value for the direction NPCs are facing. 

 

If it would be of any help, I can share it here.

 

yeah share it if u can

 

1 hour ago, Bumble said:

Weedy, that's exactly what I was looking for. Good find!

 

I'm still looking for some info on the different database values (dbname, dbsaving), but the info you posted takes me a long way.

 

Thanks!

-B

 

RBs/(CH)Siege NPCs time of death gets written in the db, probably because of a different way to calculate respawns between the normal npcmaker and npcmaker_ex and the need to reestablish a RB/(CH)siege after a server crash and continue where it was left at.

 

dbname should be about what value to put in the id column of the db table responsible for keeping that kind of info and the dbsaving should be about what data to save about that npc, the ones I've seen are time of death, position and a generic parameters thing which I don't have a live server running atm to check what is about (PC name that killed that NPC could be one param, HP/MP values of the NPC another, etc),

Edited by sepultribe
Link to comment
Share on other sites

  • 0

Thanks sepultribe, that makes a lot of sense. That was the last info I needed to parse the npcpos file completely.

 

I'll start implementing the info into L2h, then I'll start editing and exporting functionality.

 

-B

Link to comment
Share on other sites

  • 0

Progress update:

World blocks are loading in correctly, and selecting a block loads the correct radar map.

Selecting a spawn area draws a polygon on the radar map, showing the location or area of the spawn.

Some edge cases are not loaded correctly yet, I'm working on that.

There are some scaling issues with the polygons for now, but full screen mode seems to work. I'll have to revisit my calculations.

 

Here's an example of all the spawn areas in Execution Grounds:

GqiDDg6.jpg

 

It's getting there, but still very buggy.

When I'm happy with how the polygons behave, and when I'm sure all the correct areas are loaded in, I'll move on to loading in NPCs.

 

I'm off for today,

 

-B

  • Upvote 1
Link to comment
Share on other sites

  • 0

Update:

 

-World maps are loading in correctly

-Spawn territories are loading in correctly

-Layers are working and selectable, switching to correct image upon button press

-polygons are shown precisely and correctly

-All NPCs in selected spawn territory is loaded into NPCs list correctly

 

I'm currently evaluating my next steps. The properties per npc varies, so the original idea with just a small section for properties on the right, is not going to work. The user needs access to more variables. I'll have to come up with another design.

 

Also, the NPC makers all depend on specific AI. The default ones are nice and easy to work with, but some of them are very specific. Example: If the user starts adding NPCs to a spawn area with ai 'royal_req_next_maker', it might not show up ingame as intended. I need a way for the different AIs to be visible and understandable. I'm considering limiting spawn system to default AI maker; which is the most commonly used one anyway.

 

I can expand on the spawn system later, when I start tackling AI. Without all the special AI cases, L2H still allows modders to spawn whatever they want wherever. It just doesn't support events or boss phases etc.... yet.

 

Maybe down the line, I'll allow users to create zones themselves. It should be relatively simple, since I already have the whole coordinate system algorithm in place.

 

I'm going to reconsider the design for now, let me know if you have any ideas. I need it to contain more editable fields, and support buttons for eventual terrain drawing on the map.

 

-B

Edited by Bumble
  • Upvote 1
Link to comment
Share on other sites

  • 0
On 1/25/2019 at 5:25 AM, Bumble said:

Progress update:

World blocks are loading in correctly, and selecting a block loads the correct radar map.

Selecting a spawn area draws a polygon on the radar map, showing the location or area of the spawn.

Some edge cases are not loaded correctly yet, I'm working on that.

There are some scaling issues with the polygons for now, but full screen mode seems to work. I'll have to revisit my calculations.

 

Here's an example of all the spawn areas in Execution Grounds:

GqiDDg6.jpg

 

It's getting there, but still very buggy.

When I'm happy with how the polygons behave, and when I'm sure all the correct areas are loaded in, I'll move on to loading in NPCs.

 

I'm off for today,

 

-B

Thanks, Bumble! So cool :) I have also a question, if am I understanding it correctly, that those spawn areas are the ones specified as;

 

territory_begin

npcmaker_begin

npc_begin

npcmaker_end

 

So, if we are looking at EG, as on the screenshot above, let's take mandragoras, for example:

 

territory_begin    [dion02_2122_19]    {{41756;149052;-3894;-3094};{41136;151006;-3894;-3094};{40160;151658;-3894;-3094};{38625;151563;-3894;-3094};{36644;150004;-3894;-3094};{36000;148753;-3894;-3094};{40615;148333;-3894;-3094}}    territory_end        
npcmaker_begin    [dion02_2122_19]    initial_spawn=all    maximum_npc=6        
npc_begin    [mandragora_sprout]    pos=anywhere    total=2    respawn=35sec    npc_end
npc_begin    [manadragora]    pos=anywhere    total=4    respawn=35sec    npc_end
npcmaker_end    

 

Meaning that the spawn consists of 6 npcs max with 35 sec respawn time, 4 of which are standards and 2 are sprouts; and then the spawn area is identified by coordinates as the corners between which the spawning happens?

 

And when you mention allowing users to create zones themselves, do you mean creating these spawn areas, as above?

Edited by Weedy
Link to comment
Share on other sites

  • 0

u have the territory which is a 3d space defined by multiple x/y/z(min&max) coordinates, at least 3 are needed.

 

and yeah I guess with this tool you will be able to add coordinates inside the brackets of the territory field

Edited by sepultribe
Link to comment
Share on other sites

  • 0

@Weedy

That is correct. The NPC spawns in the boxed zone, defined by the coordinates you see in the npcpos file.

I haven't followed the development of L2j closely, but that was a huge difference for a long time; L2j would use static spawn points (npcs always spawning on same locations). It felt so weird, you could just circle the same 3-4 spawnpoints to maximize your grind, and the NPCs looked so static, as if the world wasn't "alive".

 

@sepultribe

Yes, that's correct. Although it wouldn't be creating from scratch. As with weapons/armors/npcs/droplists, it makes a lot more sense to clone existing ones. The main issue with server-side spawn areas, is that there are no indicators for layers. We can't know if a spawn area is on the 2nd or 3rd floor of cruma tower for instance. I guess, if you went through and compared the different depths for each layer, you could find the threshold points, but that's a massive amount of work for very little gain. If someone actually has the data for this, or wants to go through the trouble of looking through all the geodata files to write down the minZ/maxZ values, I can implement it. But it would take days to get right, I imagine.

 

Instead, I'm suggesting that you grab a spawn area that you know is on the correct layer. With this tool, you'll be able to clone it, then move it to where you want the spawnzone to be. That way, we know it'll be on the right layer, you're only adjusting the name of the spawn area, and the XY positions of the polygon.

 

I'm currently trying to figure out the exact difference between npc_begin and npc_ex_begin. @eressea, do you know why there are these two distinct npc makers? A lot of places, they seem to spawn the same types of NPCs, and I don't really understand why one is chosen instead of the other.

Edited by Bumble
Link to comment
Share on other sites

  • 0
1 hour ago, Bumble said:

I'm currently trying to figure out the exact difference between npc_begin and npc_ex_begin. @eressea, do you know why there are these two distinct npc makers? A lot of places, they seem to spawn the same types of NPCs, and I don't really understand why one is chosen instead of the other.

 

There are two classes in L2NPC - NpcMaker and NpcMakerEx (which is derived from NpcMaker) so NpcMakerEx is maker with some extended functionality

  • Thanks 1
Link to comment
Share on other sites

  • 0

Thanks Eressea.

 

I'll use the npcMakerEx for now then, to make sure it works for future changes.

 

Real life is going to be busy for a while now, but I'll get back to this project when I have spare time. It's progressing nicely. I'll share once spawn system is functional.

Edited by Bumble
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.

Guest
Answer this question...

×   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...