simple python library for reading WoW's DBC files
Project description
About
This repository contains code for a python3 library that is capable of editing various DBC files. The library was only tested with 3.3.5a DBCs and a TrinityCore server. If this library dose not fit your use case, please consider using pywowlib. Although pywowlib's README states that reading/writing DBCs is not possible, the features seem to be already implemented.
Instalation
pip install dbcpy
Records
dbcpy dose NOT use WoWDBDefs to parse the DBCs. DBC representations must be added manually, for a list of supported DBCs see records
Adding records
Adding a record is easy. Just pick a copy-paste the definition from here into a python dictionary and define a new dataclass. See this for a reference implementation.
Examples
Modifying an existing items' display_ids (will take ~1 second)
#!/usr/bin/env python3
from dbcpy.dbc_file import DBCFile
from dbcpy.records.item_record import ItemRecord
def change_display_ids(item_record):
# entry: new_display_id
new_display_ids = {
1501: 37388,
15534: 27083,
}
try:
item_record.display_id = new_display_ids[item_record.entry]
return item_record
except KeyError:
return item_record
if __name__ == '__main__':
with open('Item.dbc', 'r+b') as f:
dbc_file = DBCFile.from_file(f, ItemRecord)
some_item = dbc_file.records.find(873)
some_item.entry = 56807
some_item.display_id = 20300
with open('Item.dbc.new', 'w+b') as ff:
dbc_file.write_to_file(change_display_ids, ff)
with open('Item.dbc.new', 'r+b') as f:
dbc_file = DBCFile.from_file(f, ItemRecord)
print(dbc_file.records.find(1501).display_id)
print(dbc_file.records.find(15534).display_id)
Adding a Spell.dbc entry (will take >1 second):
#!/usr/bin/env python3
from dbcpy.dbc_file import DBCFile
from dbcpy.records.spell_record import SpellRecord
if __name__ == '__main__':
with open('Spell.dbc', 'r+b') as f:
dbc_file = DBCFile.from_file(f, SpellRecord)
some_spell = dbc_file.records.find(116)
some_spell.name.en_us = 'New spell name'
some_spell.entry = 80865
dbc_file.records.append(some_spell)
with open('Spell.dbc', 'r+b') as f:
dbc_file = DBCFile.from_file(f, SpellRecord)
the_spell = dbc_file.records.find(80865)
print(the_spell.name.en_us)
Modyfing an existing spells' names (will take ~30 seconds)
#!/usr/bin/env python3
from dbcpy.dbc_file import DBCFile
from dbcpy.records.spell_record import SpellRecord
def rename_spell(spell_record):
new_names = {
8716: 'i love',
37263: 'long',
37290: 'discussions',
}
try:
spell_record.name.en_us = new_names[spell_record.entry]
return spell_record
except KeyError:
return spell_record
if __name__ == '__main__':
with open('Spell.dbc', 'r+b') as f:
dbc_file = DBCFile.from_file(f, SpellRecord)
with open('Spell.dbc.new', 'w+b') as ff:
dbc_file.write_to_file(rename_spell, ff)
with open('Spell.dbc.new', 'r+b') as f:
dbc_file = DBCFile.from_file(f, SpellRecord)
print(dbc_file.records.find(8716).name.en_us)
print(dbc_file.records.find(37263).name.en_us)
print(dbc_file.records.find(37290).name.en_us)
Why dose modifying an existing record takes so long?
Well, not always. In order to modify an existing record, we must rewrite the whole DBC file, because of the string block. The SpellRecord is especially large and the RecordReader.read_record method is not suited for reading large records like that. It handles smaller records (like ItemRecord) well enough (~1 second). The simplest fix would be to implement a SpellRecord specific RecordReader.
How to contribute?
- Ensure that your commits have meaningful comments
- If your contribution is small (e.g it fixes a minor bug) increment revision (the last digit of version) in setup.py
- Provide test-cases
Legal Note
World of Warcraft is a registered trademark of Blizzard Entertainment and/or other respective owners. This software is not created by Blizzard Entertainment or its affiliates, and is for purely educational and research purposes. This software is not intended for the use and production of cheating (hacking) software or modifications that can disrupt World of Warcraft's gameplay. It is your sole responsibility to follow copyright law, game's ToS and EULA. The creators hold no responsibility for the consequences of use of this software.
The code is licensed under LGPL 3.0.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file dbcpy-1.0.9.tar.gz
.
File metadata
- Download URL: dbcpy-1.0.9.tar.gz
- Upload date:
- Size: 12.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.0.1.dev0+g94f810c.d20240510 CPython/3.12.4
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 860366474c74e6206725ba17da9643b0ab73f4998f8ca7d5253e6503458e375b |
|
MD5 | 8905b8e0dcd5d4f5517fdd8083d1c356 |
|
BLAKE2b-256 | e7b94e542e73a36ca05c2e05c358cce429a1888286a7a6c41534d9c8197b63f6 |
File details
Details for the file dbcpy-1.0.9-py3-none-any.whl
.
File metadata
- Download URL: dbcpy-1.0.9-py3-none-any.whl
- Upload date:
- Size: 15.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.0.1.dev0+g94f810c.d20240510 CPython/3.12.4
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 333138aedf948d7ee0569ec6772a9fb5add99fb68cb1e8c0795151dd7cccef5f |
|
MD5 | 009a7f900b58d7b4589d4fadacb41191 |
|
BLAKE2b-256 | b0b183d275a02cc8a15c82da1da652df45848adf921ede80831efb451c503a3a |