SHOW:
|
|
- or go back to the newest paste.
| 1 | -- By Laurea of EmuDevs.com | |
| 2 | -- creates a new populated items.dbc in you server folder | |
| 3 | -- containing all ingame entries plus all custom item entries | |
| 4 | -- all credits to Laurea for this | |
| 5 | -- http://emudevs.com/showthread.php/2620-custom-item-entry-patch-file-creator | |
| 6 | local Command = "#patchit"; | |
| 7 | local RequiredRank = 3 -- 3 is default admin rank on TC | |
| 8 | ||
| 9 | --template function | |
| 10 | --encodes 'val' to a string of length 'size' | |
| 11 | --if rev is true, uses big-endian format. otherwise uses little-endian | |
| 12 | --returns string if successful, nil otherwise | |
| 13 | local function format(val, size, rev) | |
| 14 | val = tonumber(val); | |
| 15 | size = tonumber(size) or 4; | |
| 16 | if (not val or size < 1 or size > 4) then return; end | |
| 17 | ||
| 18 | local f = {};
| |
| 19 | for i = 0, size-1 do | |
| 20 | table.insert(f, rev and 1 or #f+1, string.char(bit32.extract(val, i*8, 8))); | |
| 21 | end | |
| 22 | return table.concat(f); | |
| 23 | end | |
| 24 | ||
| 25 | local function main(event, player, msg) | |
| 26 | if (player:GetGMRank() == RequiredRank and msg:lower() == Command:lower()) then | |
| 27 | local query = WorldDBQuery("SELECT `entry`, `class`, `subclass`, `SoundOverrideSubclass`, `displayid`, `InventoryType`, `Material`, `sheath` FROM item_template")
| |
| 28 | if (query)then -- and query:GetRowCount() > 0) | |
| 29 | local startTime = os.clock(); | |
| 30 | local file = assert(io.open("item.dbc", "w+b"), "Couldn't create new item.dbc in server directory!");
| |
| 31 | file:setvbuf("no");
| |
| 32 | ||
| 33 | local rowCount = query:GetRowCount(); | |
| 34 | --No, the last two concatinations aren't needed. it's just easier to see the individual bytes that way | |
| 35 | file:write("WDBC" .. format(rowCount) .. "\8\0\0\0" .. "\32\0\0\0" .."\1\0\0\0");
| |
| 36 | ||
| 37 | for i = 1, rowCount do | |
| 38 | local entry = query:GetUInt32(0); | |
| 39 | local class = query:GetUInt8(1); | |
| 40 | local subclass = query:GetUInt8(2); | |
| 41 | local sound = query:GetInt8(3); | |
| 42 | local material = query:GetInt8(6); | |
| 43 | local display = query:GetUInt32(4); | |
| 44 | local invtype = query:GetUInt8(5); | |
| 45 | local sheath = query:GetUInt8(7); | |
| 46 | ||
| 47 | local row = {format(entry), format(class), format(subclass), format(sound), format(material), format(display), format(invtype), format(sheath)};
| |
| 48 | file:write(table.concat(row)); | |
| 49 | ||
| 50 | query:NextRow(); | |
| 51 | end | |
| 52 | ||
| 53 | file:write("\0");
| |
| 54 | file:flush(); | |
| 55 | file:close(); | |
| 56 | ||
| 57 | player:SendBroadcastMessage(string.format("Recreated item.dbc with %u rows. Time taken: %0.02f seconds.", rowCount, os.clock() - startTime));
| |
| 58 | end | |
| 59 | end | |
| 60 | end | |
| 61 | ||
| 62 | if (RegisterPlayerEvent) then | |
| 63 | RegisterPlayerEvent(18, main); | |
| 64 | else | |
| 65 | RegisterServerHook(18, main); | |
| 66 | end |