Generate OpenKore table files directly from your Ragnarok Online client — always in sync, never outdated.
Ragnarok Online servers constantly add new items, update names, and expand their item pool. Maintaining items.txt, itemsdescriptions.txt and other table files by hand is tedious and error-prone. koreExtractor automates this entirely: it reads data files straight from your RO client and generates ready-to-use OpenKore table files in seconds.
No more copy-pasting. No more "Unknown Item (12345)". Every update, just run one command.
| File | Description |
|---|---|
items.txt |
Item IDs and display names in OpenKore format |
itemsdescriptions.txt |
Full item descriptions, clean and color-code-free |
itemslotcounttable.txt |
Number of card slots per equippable item |
skillssp.txt |
SP cost per skill level |
- Python 3.10+
iteminfo.lubfrom your RO client's GRF orSystem/folderskillinfolist.lubfromdata/luafiles514/lua files/skillinfoz/inside the GRF
# Generate all item-related files at once
python main.py --items --descriptions --slots
# Generate skillssp.txt
python main.py --skillssp
# Generate everything
python main.py --items --descriptions --slots --skillssp
# Specify custom input paths
python main.py --items --descriptions --slots --iteminput "C:/Ragnarok/System/iteminfo.lub"
python main.py --skillssp --skillinput "C:/Ragnarok/data/luafiles514/lua files/skillinfoz/skillinfolist.lub"The generated files will appear in the same directory. Copy them to your OpenKore tables/<server>/ folder.
| Flag | Short | Description | Default |
|---|---|---|---|
--iteminput |
-i |
Path to iteminfo.lub |
C:/Ragnarok/System/iteminfo.lub |
--skillinput |
-si |
Path to skillinfolist.lub |
data/.../skillinfolist.lub |
--items |
-n |
Generate items.txt |
|
--descriptions |
-d |
Generate itemsdescriptions.txt |
|
--slots |
-s |
Generate itemslotcounttable.txt |
|
--skillssp |
-sp |
Generate skillssp.txt |
RO clients store item and skill data in Lua files inside the GRF or in the System/ folder. These files contain the exact data the client itself uses — meaning they're always accurate, always up to date, and always in the language your server runs.
koreExtractor parses these files, strips RO color codes (like ^0000FF and ^000000) from descriptions, and writes clean output files ready to drop into OpenKore.
iteminfo.lub → itemParser.py → writers.py → items.txt
→ itemsdescriptions.txt
→ itemslotcounttable.txt
skillinfolist.lub → skillParser.py → writers.py → skillssp.txt
Private servers often introduce new items before their client data is fully populated. When that happens, iteminfo.lub only has a generic placeholder like "Unidentified Weapon" or "Unidentified Armor" instead of the real name — which means OpenKore can't identify those items correctly.
fixUnidentified.py exists to bridge that gap. It compares your server's items.txt against a reference file from another server (such as iRO) and replaces every placeholder name with the proper one wherever a match is found. Items that are truly exclusive to your server and unknown to the reference are left untouched.
This is not a one-time task. As servers add new items weekly, running fixUnidentified.py after each main.py run is part of the regular maintenance workflow for keeping OpenKore tables accurate.
python fixUnidentified.py --source items_myserver.txt --reference items_iRO.txt --output items.txt| Flag | Description | Default |
|---|---|---|
--laro |
Your server's items.txt |
items_laRO.txt |
--iro |
Reference items.txt (e.g. iRO) |
items_iRO.txt |
--output |
Fixed output file | items.txt |
Some table files cannot be generated from Lua sources — their data is stored directly inside the client's GRF and can be extracted as-is, with no conversion needed. Use GRF Editor to open each .grf file and extract them.
Tip: Servers often ship multiple GRF files (e.g.
data.grf,patch.grf). Always check all of them — patch GRFs load afterdata.grfand override its contents, so they tend to have the most up-to-date and server-specific data. If a file exists in both, prefer the one from the patch GRF.
| OpenKore file | GRF path | Notes |
|---|---|---|
itemslots.txt |
data/itemslottable.txt |
Rename after extracting |
maps.txt |
data/mapnametable.txt |
Rename after extracting |
resnametable.txt |
data/resnametable.txt |
Merge from all GRFs if found in more than one |
All three files use the same value#value# format that OpenKore reads directly. Comments (lines starting with //) and blank lines are ignored automatically.
koreExtractor/
├── main.py # CLI entry point — run this
├── itemParser.py # Reads iteminfo.lub, returns Item dataclasses
├── skillParser.py # Reads skillinfolist.lub, returns skill SP data
├── writers.py # Writes all output table files
└── fixUnidentified.py # Weekly maintenance: patches items.txt using a reference server
Each file has a single responsibility and can be imported independently if you want to integrate the parsers into a larger project.
After each server update that adds new items:
- Extract the latest
iteminfo.lubfrom your client's GRF orSystem/folder - Run
python main.py --items --descriptions --slots --skillssp - Run
python fixUnidentified.py --source items_myserver.txt --reference items_iRO.txt --output items.txt - Copy the output files to
tables/<server>/in your OpenKore installation
Contributions are welcome! Some ideas if you want to help:
- Support for other servers — the parsers work with any server that uses the standard
iteminfo.lubandskillinfolist.lubformats. If yours uses a different structure, open an issue with a sample and we'll add support. - More table generators — the same approach applies to
monsterinfo.lub,accessoryid.lub, and others. - Output format options — some OpenKore forks use slightly different table formats.
- Tests — unit tests for the parsers and writers would be a great addition.
To contribute, fork the repo, make your changes, and open a pull request. Keep the code clean, single-responsibility, and consistent with the existing style.
MIT — do whatever you want with it.