Jump to content
  • 0

Question

Posted (edited)

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

Recommended Posts

  • 0
Posted

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

 

 

  • 0
Posted (edited)
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
  • 0
Posted (edited)

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
  • 0
Posted

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

  • 0
Posted (edited)
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
  • 0
Posted

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

  • 0
Posted

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

  • 0
Posted (edited)

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
  • 0
Posted (edited)
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
  • 0
Posted (edited)

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
  • 0
Posted (edited)

@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
  • 0
Posted
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

  • 0
Posted (edited)

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

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

    • ⚡ Fast order delivery is active 24/7! Upgrade your personal Gmail to Gemini Pro with full 2TB storage and premium Google One features today.
    • Update M54: Global HP/MP/CP consumable handling expanded beyond combat-only usage. Offensive mage idle recovery with learned skill Battle Heal. Spellhowler/Storm Screamer prioritizes Hurricane, using Vampiric Claw mostly below 90% HP. Major structural refactor initialized: Added category/class organization such as Archer, Dagger, Tank, Mage, Healer, Support and Specialized class files. Further structural cleanup. Extracted combat memory/state and more class-policy logic from the main controller. Added global stuck/inactivity watchdog for bots blocked by terrain/geodata. Added unreachable dropped ground-item timeout/temporary blacklist. Reworked Necromancer/Soultaker PvP: Dominator level 78+ maintains learned Arcane Power toggle on. Overlord/Dominator level 44+ maintains learned Soul Guard toggle automatically. Stability/scalability update: Bot controller ticks staggered instead of all starting in the same phase: Same 350 ms update rate retained Reduces simultaneous AI workload bursts. Removed the old manual aggressive-monster EVT_AGGRESSION bridge. Phantoms now use native Lucera setActive() behavior so monsters aggro them naturally. Reduced unnecessary NPC scans and native AI event pressure. Added saved-bot equipment overrides using a separate database table:         lucera_autobots_items Existing lucera_autobots remains the main saved-bot identity/state table. Equipment rows are linked to saved bots through bot_id. Added optional convenience view to show bot name together with equipment overrides:         lucera_autobots_items_view Added editable equipment slots in columns: Weapon Shield Helmet Chest Legs Gloves Boots Necklace Left/Right Earrings Left/Right Rings Equipment override values: 0 = use normal class/level profile item -1 = force slot empty >0 = equip that Item ID Custom equipment works only for saved database bots. Default class/level equipment profiles remain unchanged. Supports custom equipment from No Grade to S Grade, regardless of the bot's current level. Added validation for invalid item IDs and incompatible equipment slots. Added handling for: Two-handed weapons vs shields Full-body armor vs separate leggings Added all-grade Soulshots and Spiritshots to bot inventory/replenishment so custom lower-grade weapons still use the correct shots. Mage profiles that already use Blessed Spiritshots keep that behavior with all relevant grades available. First save the bot normally so it exists in table:         lucera_autobots Then open:         lucera_autobots_items Find the row with the same bot_id and edit only the equipment slots you want. Example: weapon_id = 6608 shield_id = -1 helmet_id = 0 chest_id = 0 legs_id = 0 gloves_id = 0 boots_id = 0 This means: weapon_id 6608 → custom weapon shield_id -1 → no shield all 0 values → keep normal default profile equipment After editing the DB, despawn and respawn the saved bot so M54 reloads its equipment overrides. Do not edit bot_id. Use it only to identify which saved bot the equipment row belongs to.   DOWNLOAD
    • It will be multi client so it will detect the client from the files and adapt the packets and asset loading. I am aiming for C4 and H5 after IL
    • this is just to simplify your life, time, and can be done for free by yourself just watch some tutorials, in case you don't wanna waste time check it out!   https://l2getwork.art   https://l2getwork.art/showcase.html  
    • Good job! Any chance for it to be downgradeable or at least compatible with older chronicles?
  • 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..