Custom Items
Contents |
Structure
First, let's take a look at the item_db in the db folder, and its structure:
ID,DBName,ScreenName,Type,Price,Sell,Weight,ATK,DEF,Range,Slot,Job,Upper,Gender,Loc,wLV,eLV, Refineable,View,{Script},{OnEquip_Script},{OnUnequip_Script}
- ID: ID of the item.
- DB Name: This first name is the DB name. When you use @item and you know the name of the item, but not the ID, type this name instead. Try making the ScreenName the same as this so you wont get confused.
- ScreenName: This is the name the server shows.
- Type: Purpose of the item.
0 = Usable : healing 2 = Usable : other 3 = Misc 4 = Weapon 5 = Armor 6 = Card 7 = Pet Egg 8 = Pet Equipment 10 = Arrow/Ammunition 11 = Usable : delayed consumption (items with script "pet" or "itemskill")
- Price: Default NPC buying price in Zeny.
- Sell: NPC selling price in Zeny.
- Weight: Weight of the item * 10. Means, an item of 0.1 weight each, must be entered as 1.
- ATK: Base weapon attack, in case of a weapon.
- In RE enabled servers this field have a optional delimiter : to define this item's weaponMATK bonus, for example, 30:50 would mean the item gives 30 atk and 50 weaponMATK
- DEF: Base defense for armor-type items.
- Range: Maximum range in map cells a weapon allows to be the player apart from it's target.
- Slot: Amount of card slots in weapon/armor-type items.
- Job: Which jobs this item is available for. Values below can be combined to achieve availability for multiple job classes, i. e.
0x2|0x4 -> 0x6
(Swordman+Mage)
(S.) Novice (2^00): 0x00000001 Swordman (2^01): 0x00000002 Mage (2^02): 0x00000004 Archer (2^03): 0x00000008 Acolyte (2^04): 0x00000010 Merchant (2^05): 0x00000020 Thief (2^06): 0x00000040 Knight (2^07): 0x00000080 Priest (2^08): 0x00000100 Wizard (2^09): 0x00000200 Blacksmith (2^10): 0x00000400 Hunter (2^11): 0x00000800 Assassin (2^12): 0x00001000 Unused (2^13): 0x00002000 Crusader (2^14): 0x00004000 Monk (2^15): 0x00008000 Sage (2^16): 0x00010000 Rogue (2^17): 0x00020000 Alchemist (2^18): 0x00040000 Bard/Dancer (2^19): 0x00080000 Unused (2^20): 0x00100000 Taekwon (2^21): 0x00200000 StarGladiator (2^22): 0x00400000 Soul Linker (2^23): 0x00800000 Gunslinger (2^24): 0x01000000 Ninja (2^25): 0x02000000 All Classes : 0xFFFFFFFF Every Job Except Novice : 0xFFFFFFFE
- Upper: Specifies whether the item can be used by normal, baby or reborn classes. Values below can be combined, i. e.
1|4 -> 5
(Normal+Baby Classes)- Note: Setting
2
enables the item for Transcendant and 3rd classes. Use8
to enable the item for 3rd classes only.
- Note: Setting
1 = Normal 2 = Reborn Classes (High Wizards, Champions etc.) (includes 3rd classes) 4 = Baby Classes 8 = 3rd Classes
- Gender: Gender restriction for the item.
0 = Female 1 = Male 2 = No restriction (both)
- Loc: Equipment location of armor and arrow-type items. Values below can be combined, i. e. 136 would indicate both accessory slots (typical value for accessories).
(2^0) 1 = Lower headgear (2^1) 2 = Right hand (2^2) 4 = Mantle (2^3) 8 = Accessory 1 (2^4) 16 = Armor (2^5) 32 = Left hand (2^6) 64 = Shoes (2^7) 128 = Accessory 2 (2^8) 256 = Upper headgear (2^9) 512 = Middle headgear (2^10) 1024 = Styles Upper headgear (2^11) 2048 = Styles Middle headgear (2^12) 4096 = Styles Lower headgear (2^15) 32768 = Arrow (arrow-type items only)
- wLV: Weapon level of an item (1-4), other items 0.
- eLV: The minimum base level required for using/equipping the item.
- Refineable: Whether the item is available for refining (1) or not (0).
- View: Specifies the client-side look for the item.
- Weapon-type items:
- Daggers
- One-Handed Swords
- Two-Handed Swords
- One-Handed Spears
- Two-Handed Spears
- One-Handed Axes
- Two-Handed Axes
- Maces
- (not used)
- Wand/Staff
- Bows/Crossbows
- Knuckle Weapons
- Musical Instruments
- Whips
- Books
- Katars
- Revolvers
- Rifles
- Shotguns
- Gatling guns
- Grenade launchers
- Fuuma shuriken
- Shield-type items:
- Guard, Novice Guard
- Buckler
- Shield, Holy Guard, Evangelist
- Mirror Shield
- Ammunition-type items:
- Arrows
- Throw-able daggers
- Bullets
- Shells
- Grenades
- Shuriken
- Kunai
- Headgear-type items: Please see the View IDs section of this guide.
- Weapon-type items:
- {Script}: This is where you put your item bonus. Whether it's an usable item or an equip item, it will take effect according to the item type.
- {OnEquip_Script}: This is where the bonus you want to be applied upon equipping goes. It will only execute as soon as you equip the item.
- {OnUnequip_Script}: This is where the bonus you want to be applied upon unequipping goes. It will only execute as soon as you unequip the item.
In the doc folder look for a text file called "item_bonus", it shows all the scripts items can have and how they work.
Item Placement on Data Folder
After you make your item, put it in your item_db2.txt, so that you will not run into conflicts when updating the SVN later. Then go to your data folder and modify the following files, one after another.
For Older Clients
Applicable if your client date is <= 2012-04-10a for Renewal Clients or <= 2012-07-10a for Main Clients
idnum2itemdisplaynametable.txt
This file holds the item names, as displayed inside the client. Each item added as:
ItemID#ItemName#
ItemID is the number from your ID column inside the item db. If your item name contains spaces, replace those with _ (underscore).
idnum2itemdesctable.txt
This file contains the description of your item, when it is right-clicked. The syntax for an item is:
ItemID# Item Description Line 1 Item Description Line 2 #
You can use any amount of lines for the description. If your description contains a #, make sure it is followed by a space character.
idnum2itemresnametable.txt
This file sets the inventory and drop-sprite for an the item. Item is defined as follows:
ItemID#SpriteName#
The SpriteName is the name of the files in collection and item folders inside texture and the ones inside sprite folder. If you want to use the look of an another item, search for it's id and copy the sprite name from there.
itemslotcounttable.txt
In this file you set the amount of visible slots for the item. You do not need to add 0 slot items or items, which do not have slots at all (i. e. usable items). Syntax:
ItemID#NumberOfSlots#
NumberOfSlots should be a number from 1-4, larger values might have undesired effects.
Files for non-identified items
The following files specify the name, description and look for items, which have not yet been identified. Their syntax follows the same rules as for the files with idnum prefix. Normally the same text is entered for non-equipment and generic description (which can be copied from official items) is used for equipment of all sorts (weapons, armor, headgears).
- num2itemdesctable.txt
- num2itemdisplaynametable.txt
- num2itemresnametable.txt
For New Clients
If your client date is newer than specified above then you need to specify all the above item information in 1 file
System/ItemInfo.lub
Since ItemInfo.lub is compiled, you need to decompile it to lua , add your customs and recompile back to lub file (Some have said that renaming a decompiled file to lub also works) Syntax:
[<item id>] = { unidentifiedDisplayName = <item name to show when not magnified>, unidentifiedResourceName = <file name prefix used for all the images and drop sprite when not magnified>, unidentifiedDescriptionName = { <comma separated list of strings>,<to get multiple lines>,<in item description> }, identifiedDisplayName = <item name to show when magnified>, identifiedResourceName = <file name prefix used for all the images and drop sprite when magnified>, identifiedDescriptionName = { <same format as unidentifiedDescriptionName but for magnified items> }, slotCount = <number of slots>, ClassNum = <View ID - yes the same one that was there item_db> },
You can also put the different values in DescriptionName in separate lines.
Example: Lets say i want to add a weapon to item id 25000 - a One handed sword named Devastator with 3 slots & the image files & drop sprite files are all named Black_Sword.* . Also i want to display a Sword when not magnified.
[25000] = { unidentifiedDisplayName = "Sword", unidentifiedResourceName = "¼Òµå", unidentifiedDescriptionName = { "Unidentified item, can be identified with [Magnifier]." }, identifiedDisplayName = "Devastator", identifiedResourceName = "Black_Sword", identifiedDescriptionName = { "An Unholy Sword that was created with the sole purpose of destruction", "Class :^777777 Sword^000000", "Attack :^777777 325^000000", "Weight :^777777 80^000000", "Weapon Level :^777777 4^000000", "Required Level :^777777 100^000000", "Applicable Job :^777777 Novice, Swordsman Class, Merchant Class, Thief Class^000000" }, slotCount = 3, ClassNum = 2 },
Client Side
The custom item you have downloaded should have six files. Two .bmp files, two .spr files, and two .act files. The person who has released the sprite has hopefully properly labeled what is what, if they have not please see the next section, for now, in our example, we have:
Headgear.act Headgear.spr Headgear_collection.bmp Headgear_drop.act Headgear_drop.spr Headgear_item.bmp
Pretend "headgear" is your sprite's name, you will copy headgear.act and headgear.spr to C:\Program Files\Gravity\RO\data\sprite\¾Ç¼¼»ç¸®\¿©
, if you have 64-bit Windows, Program Files will be Program Files (x86). Once you have copied these files rename them, and add a ¿© to the beginning of the name. You will not be able to type this, instead copy and paste the symbol from either your address bar, or from this page. If you want to be more tidy you can also add a underscore. Now headgear.act and headgear.spr are ¿©headgear.act and ¿©headgear.spr (or if you were tidy, ¿©_headgear.spr and ¿©_headgear.act). Now, go back to the folder where the files are, copy them again but this time to C:\Program Files\Gravity\RO\data\sprite\¾Ç¼¼»ç¸®\³²
, and you will be putting a ³² at the beginning of the name instead of ¿©.
After you are done, copy the headgear_collection.bmp to C:\Program Files\Gravity\RO\data\texture\À¯ÀúÀÎÅÍÆäÀ̽º\collection
and rename it to just headgear.bmp, so it no longer has _collection. The reason you can not rename this before its copied is because there may be another file with that name already, so you cannot rename it. Now copy headgear_item.bmp to C:\Program Files\Gravity\RO\data\texture\À¯ÀúÀÎÅÍÆäÀ̽º\item
and also rename that so it no longer has _item in its name, and is just headgear.bmp. Now copy headgear_drop.act and .spr to C:\Program Files\Gravity\RO\data\sprite\¾ÆÀÌÅÛ
and remove _drop, so that its just headgear.act and .spr.
If you can not decipher what is the drop sprite and what is the equip sprite, download Spr Conview which is a simple sprite viewer. Now double click the sprite file, and find the program SPR Conview which will be wherever you downlaoded it to, and open the file with it. If its the drop sprite, it will only have one frame. Where is the frame? Its located at the bottom of the window in the program, look for "Sprite: 1/1". If it has more than one frame, its the equip sprite.
If this process confused you, here is an example folder, the sprite is done by drkangel. The folder is virus free.
View IDs, Having A Custom Item Without Xray
Look in your data folder and make sure there is a folder named "lua files", if there is not make it.Download the most recent lub package and extract it to your lua files folder in your data folder. Download the most recent accname.lua and accessoryid.lua, put it in your datainfo folder that is inside the lua files folder. Now download this lub compiling tool, and put it in the datainfo folder. Now, Open accessoryid.lua in the datainfo folder with notepad or a text editor of your choice, go all the way down until the names stop. Add your custom gears before the } symbol. You should use a high number just like with your custom item's database ID, or use unused IDs to be sure you won't have to redo them all in the future, or at least for a while. Example:
ACCESSORY_PINKBUNNY_HAIRBAND = 663, ACCESSORY_GREENBUNNY_HAIRBAND = 664, ACCESSORY_OLD_ELFEAR = 665, ACCESSORY_THA_MAERO_MASK = 666, ACCESSORY_THANATOS_MAI_MASK = 667, --668 free ACCESSORY_FISHPIN = 669, ACCESSORY_CUSTOM_HAT = 900, }
You must compile to lub if you leave space between IDs, if you don't plan on compiling to lub, make sure you do not skip any numbers.
Now open accname.lua, do basically the same thing but just in a different way, and for the sprite. Add your item to the bottom, have it look like the ones above it, except have your items name and the item's sprite name.
[ACCESSORY_IDs.ACCESSORY_PINKBUNNY_HAIRBAND] = "_ÇÎÅ©Åä³¢¸Ó¸®¶ì", [ACCESSORY_IDs.ACCESSORY_GREENBUNNY_HAIRBAND] = "_±×¸°Åä³¢¸Ó¸®¶ì", [ACCESSORY_IDs.ACCESSORY_OLD_ELFEAR] = "_°í´ë¿äÁ¤ÀDZÍ", [ACCESSORY_IDs.ACCESSORY_THA_MAERO_MASK] = "_Ÿ³ªÅ佺Àǽ½ÇÄ°¡¸é", [ACCESSORY_IDs.ACCESSORY_THANATOS_MAI_MASK] = "_Ÿ³ªÅ佺ÀÇÁõ¿À°¡¸é", [ACCESSORY_IDs.ACCESSORY_FISHPIN] = "_¹°°í±âÇÉ", [ACCESSORY_IDs.ACCESSORY_CUSTOM_HAT] = "_Sprite_Name_Here", }
Delete the accname.lub and accessoryid.lub. Now that you are done, make sure luac.exe is in your datainfo folder, right click the luac.exe, create a shortcut, right click the shortcut, and click properties, in the target area, add right after the quotes, with the quotes:
-o "accessoryid.lub" "accessoryid.lua"
So that it looks something like this:
"C:\Program Files (x86)\Gravity\RO\data\lua files\datainfo\luac5.0.2.exe" -o "accessoryid.lub" "accessoryid.lua"
Do this also to "accname.lub" except instead of accessoryid in the quotes, do accname. If there is any lua file leftover, you may want to move it somewhere else just for future changes, like My Documents. For future reference, this is also how you turn the other lub files to lua files.
Modifications
Sprite Replacement
To replace a headgear with your customized headgear, just delete one of the items you want, and replace your customised item ID with that id.
Lets say you have something like this:
15000,Angel_Wing,Angel Wing,4,,10,10,0,,1,0,0,3,0,0,0,0,0,{},{},{}
And there's an item you wont need, such as:
2220,Hat,Hat,5,1000,,200,,2,,0,10477567,2,256,,0,1,16,{},{},{}
Well, to replace it, just delete everything in the hat line but its ID, and paste there your custom item, all the line but the ID. Should be like this:
2220,Hat,Hat,5,1000,,200,,2,,0,10477567,2,256,,0,1,16,{},{},{} 15000,Angel_Wing,Angel Wing,4,,10,10,0,,1,0,0,3,0,0,0,0,0,{},{},{} 2220,Angel_Wing,Angel Wing,4,,10,10,0,,1,0,0,3,0,0,0,0,0,{},{},{}
All you need to do now is changing the View ID to the Hat, and change your file names to its name. You can find them on the idnum2resnametable.txt Search for 2220 and the gibberish besides it, w/o the # # is the file name, then rename it to your custom item name.
Remember to add the files to data\sprite\¾ÆÀÌÅÛ (Icon sprite) and both data\sprite\¾Ç¼¼»ç¸®\³² (Male Item Sprite) and data\sprite\¾Ç¼¼»ç¸®\¿© (Female Item Sprite). Remember, these 2 last item names, must have either a ³²_ for male or ¿©_ for female, at the beginning of the name, both .spr and .act. Also, don't forget to change the other files:
idnum2itemdisplaynametable.txt , idnum2itemdesctable.txt , idnum2itemdesctable.txt , num2itemdesctable.txt , num2itemdisplaynametable.txt , num2itemresnametable.txt and itemslotcounttable.txt
Use these files if you want to replace sprites, they will be useful.
- actOR: with the actor you modify the act file, which is the one who tells the client where does the weapon go and what does it have to do and at a certain moment.
- SPR Conview: you can use these to view which sprite is which, and also see sequence per sequence.
Item Restrictions
Look on your db folder for a file called item_trade.txt and open it
Now, the pattern for a flag is:
Item ID, TradeMask, GM-Level Override
- Item ID: the ID of your item.
- TradeMask: Testrictions the item will have, such as being dropped, stored or traded. These values can be combined to achieve multiple effects.
1:Item can't be dropped 2:Item can't be traded (nor vended) 4:Item can only be traded with wedded partner 8:Item can't be sold to NPCs 16:Item can't be placed in the cart 32:Item can't be placed in the storage 64:Item can't be placed in the guild storage
- GM-Level Override: This is the minimum GM level a player must have to avoid these restrictions.
Item Script
Okay, I'll update this as I go; otherwise, I wont have anything new to show. First with usable items.
Well, there are 3 types of usables:
1.- Healing items, they have in the type field a 0.
2.- Other uses items, such as fly wings and so, which doesn't heal, but does have an instant effect, they have in the type field a 2.
3.- Usable items, which are skills that requires a target selection, therefore they have a delayed use, and in newer SVNs the item wont be gone until the target is chosen and the cast has finished. Means, you wont lose the item if the skill hasn't been done. They have in the type field an 11.
Now, for an item skill, the pattern for a skill is:
itemskill <skill id>,<skill level>;
Without <> of course.
Now, we go to our db\skill_db.txt and search for the blessing ID, searching for AL_ or blessing, but first, the structure of a skill:
id,range,hit,inf,element,nk,splash,max,list_num,castcancel,cast_defence_rate,inf2,maxcount,skill_type,blow_count,name,description
Now, the AL_BLESSING or Blessing Skill:
34,9,6,16,0,0x1,0,10,1,yes,0,0,0,magic,0, AL_BLESSING,Blessing
We grab the ID and put it on our code:
itemskill 34,<skill lvl>;
Don't mind the actual level of the skill_db.txt for the skill level part. You can actually put the level you want here below 99, so lets pick 4:
itemskill 34,4;
And finally, insert it on the code.
,{ itemskill 34,4; },{},{}
There, we have a Lvl 4 Blessing item skill.
Remember, one space before and one after the script, NOT TAB!
And so on with other skills. Just remember these steps and they should be fine. And remember, itemskill is NOT the same as skill. itemskill will make you CAST that skill, while skill will GIVE you the skill. If you give an item, whether delayed use or normal usable two itemskill commands, only the latter will come into effect, as you cannot cast two skills at the same time.
Now, for Potions.
Instead of using itemskill, we will use itemheal:
,{ itemheal 100,0; },{},{}
The green is the HP, the blue is the SP. To add that random heal amount effect, just pick a set amount, let's say 120, then pick 1 or 2 numbers, up to you. Then, add the rand() command, like this:
,{ itemheal rand(120,9,49),0; },{},{}
Explanation: This item will heal about 49~120 hp and 0 SP. To heal SP you change the 0 to a number. Like this:
,{ itemheal rand(120,9,49),50; },{},{}
It will now heal 50 SP. Now, for skilleffect and sc_start.
Okay, let's see. Here's a example of an item casting a skill and simulating a skill.
,{ itemskill 34,10; skilleffect 29,0; sc_start 12,140000,5; },{},{}
skilleffect will display on your client a skill visual effect. The pattern is:
skilleffect <skill ID>,<number>;
- skill ID
- Self-explanatory.
- number
- Have you seen those skills that shows up numbers upon casting? Such as heal? Well, putting a number there will display it. But only works on skills with numbers floating.
sc_start has the following pattern:
sc_start <status id>,<duration>,<val1>[,<unit id>];
- status id
- Refer to const.txt in your db folder for all effects. Open it with a text editor then search by either clicking edit, then find, or press and hold the ctrl key, and while still holding it press the f key, then release, and search for "SC_ALL -1". Everything below this is an effect. The effects stop at "e_gasp 0" which are emoticons.
- duration
- Is the amount time in milliseconds (1000 msec = 1 sec) that the status will be active.
- val1
- Typically it's the level of the skill, associated with this status.
- unit id
- Allows to start the status on an other unit, than the attached player. For players this is account id. This parameter is optional, and can be omitted.
Now, for the item I said, it will show you the visual effect of Blessing and cast on you a lvl 5 Agi-Up! skill for 140 seconds.
For more item scripts see script_commands.txt in your doc folder, as well as item_bonus.txt in your doc folder.
Weapon Sprite Solution (temporary)
This will help some while I find what I can do so you can use the ID of your choice.
It looks like the weapons behaves like mobs. They have the item sprite ID hardcoded in the exe. But look at this:
1265,Bloody_Roar,Bloody Roar,4,,10,1000,120,,1,0,4096,7,2,34,4,75,1,16,{ bonus bIgnoreDefRace,RC_DemiHuman; bonus bFlee,-160; bonus bFlee2,-160; bonus bNoRegen,1; bonus bNoRegen,2; },{},{} 1266,Test,Test,4,4000,2000,10,165,,1,0,4096,7,2,34,3,33,1,16,{}
// 1-Handed Axes 1301,Axe,Axe,4,500,,800,38,,1,3,8803555,7,2,2,1,3,1,6,{}
The item 1266, a katar, does show the item sprite. So my theory is, if you make a custom item with the next ID of the type of weapon you want, it will take its sprite. The weapons would be:
- -, Daggers: does not have free IDs. I have to test this one
- -, Katars: Starts on ID 1250. Has 35 free IDs
- -, 1-Handed Sword: Starts on ID 1101. Only has 2 Free IDs (in svn 4025)
- -, 2-Handed Sword: Starts on ID 1151. Has 30 free IDs
- -, 1-Handed Axe: Starts on ID 1301. Has 43 free IDs
- -, 2-Handed Axe: Starts on ID 1351. Has 32 free IDs
- -, 1-Handed Spears: Starts on ID 1401. Has 34 free IDs
- -, 2-Handed Spears: Starts on ID 1451. Has no free IDs
- -, 2-Handed Staffs: same as before
- -, Maces: Starts on ID 1501. Has 19 free IDs
- -, Books: Starts on 1550. Has only 2 IDs.
- -, Staffs: Starts on ID 1601. Has 79 free IDs
- -, Bows: Starts on ID 1724. Has 26 free IDs
- -, Knuckles: Starts on ID 1801. Has 95 free IDs
- -, Instruments: Starts on ID 1901. Has 32 free IDs
- -, Whips: Starts on ID 1950. Has 130 free IDs