Haru 290 Posted October 19, 2015 (edited) Mob DB file structure overhaul Hello~! Just like the Item DB, the Mob DB has a less than optimal (read: terrible) format, that doesn't play well with Git or any other Version Control System. For example, this is a snippet from the current file: 1012,RODA_FROG,Roda Frog,Roda Frog,5,133,0,6,5,1,11,14,0,5,1,5,5,5,10,5,10,12,1,5,21,0x81,200,2016,816,288,0,0,0,0,0,0,0,918,9000,908,500,511,300,721,7,713,2000,0,0,0,0,0,0,0,0,4014,11013,WOLF,Wolf,Wolf,25,919,0,329,199,1,37,46,0,0,1,20,28,15,32,20,10,12,1,2,22,0x1089,200,1054,504,432,0,0,0,0,0,0,0,1011,20,920,9000,2308,10,517,650,528,1050,919,5500,578,600,0,0,0,0,4029,1 1014,SPORE,Spore,Spore,16,510,0,66,108,1,24,48,0,5,1,12,12,5,19,8,10,12,1,3,21,0x81,200,1872,672,288,0,0,0,0,0,0,0,921,9000,507,800,510,50,743,10,2220,40,7033,5,578,600,0,0,0,0,4022,11015,ZOMBIE,Zombie,Zombie,15,534,0,50,33,1,67,79,0,10,1,8,7,0,15,0,10,12,1,1,29,0x3885,400,2612,912,288,0,0,0,0,0,0,0,957,9000,724,5,938,1000,958,50,727,70,0,0,0,0,0,0,0,0,4038,1 Can you tell, at a glance, if any of these mobs drops a Strawberry? You certainly can't (unless you already know). Now, after locating the Strawberry drop, what happens if we want to remove it? 1012,RODA_FROG,Roda Frog,Roda Frog,5,133,0,6,5,1,11,14,0,5,1,5,5,5,10,5,10,12,1,5,21,0x81,200,2016,816,288,0,0,0,0,0,0,0,918,9000,908,500,511,300,721,7,713,2000,0,0,0,0,0,0,0,0,4014,11013,WOLF,Wolf,Wolf,25,919,0,329,199,1,37,46,0,0,1,20,28,15,32,20,10,12,1,2,22,0x1089,200,1054,504,432,0,0,0,0,0,0,0,1011,20,920,9000,2308,10,517,650,528,1050,919,5500,0,0,0,0,0,0,4029,1 1014,SPORE,Spore,Spore,16,510,0,66,108,1,24,48,0,5,1,12,12,5,19,8,10,12,1,3,21,0x81,200,1872,672,288,0,0,0,0,0,0,0,921,9000,507,800,510,50,743,10,2220,40,7033,5,0,0,0,0,0,4022,11015,ZOMBIE,Zombie,Zombie,15,534,0,50,33,1,67,79,0,10,1,8,7,0,15,0,10,12,1,1,29,0x3885,400,2612,912,288,0,0,0,0,0,0,0,957,9000,724,5,938,1000,958,50,727,70,0,0,0,0,0,0,0,0,4038,1 How many Strawberry entries did I remove and from which lines? Can you tell at a glance? Certainly not. What happens if we try to diff it? (this is the output of 'git diff' with the modified file) @@ -16,8 +16,8 @@ 1010,WILOW,Willow,Willow,4,95,0,5,4,1,9,12,5,15,1,4,8,30,9,10,10,12,1,3,22,0x81,200,1672,672,432,0,0,0,0,0,0,0,902,9000,1019,100,907,1500,516,700,1068,3500,1067,2000,1066,1000,0,0,0,0,4010,1 1011,CHONCHON,Chonchon,Chonchon,4,67,0,5,4,1,10,13,10,0,1,10,4,5,12,2,10,12,0,4,24,0x181,200,1076,576,480,0,0,0,0,0,0,0,998,50,935,6500,909,1500,1205,55,601,100,742,5,1002,150,0,0,0,0,4009,1 1012,RODA_FROG,Roda Frog,Roda Frog,5,133,0,6,5,1,11,14,0,5,1,5,5,5,10,5,10,12,1,5,21,0x81,200,2016,816,288,0,0,0,0,0,0,0,918,9000,908,500,511,300,721,7,713,2000,0,0,0,0,0,0,0,0,4014,1 -1013,WOLF,Wolf,Wolf,25,919,0,329,199,1,37,46,0,0,1,20,28,15,32,20,10,12,1,2,22,0x1089,200,1054,504,432,0,0,0,0,0,0,0,1011,20,920,9000,2308,10,517,650,528,1050,919,5500,578,600,0,0,0,0,4029,1 -1014,SPORE,Spore,Spore,16,510,0,66,108,1,24,48,0,5,1,12,12,5,19,8,10,12,1,3,21,0x81,200,1872,672,288,0,0,0,0,0,0,0,921,9000,507,800,510,50,743,10,2220,40,7033,5,578,600,0,0,0,0,4022,1 +1013,WOLF,Wolf,Wolf,25,919,0,329,199,1,37,46,0,0,1,20,28,15,32,20,10,12,1,2,22,0x1089,200,1054,504,432,0,0,0,0,0,0,0,1011,20,920,9000,2308,10,517,650,528,1050,919,5500,0,0,0,0,0,0,4029,1 +1014,SPORE,Spore,Spore,16,510,0,66,108,1,24,48,0,5,1,12,12,5,19,8,10,12,1,3,21,0x81,200,1872,672,288,0,0,0,0,0,0,0,921,9000,507,800,510,50,743,10,2220,40,7033,5,0,0,0,0,0,4022,1 1015,ZOMBIE,Zombie,Zombie,15,534,0,50,33,1,67,79,0,10,1,8,7,0,15,0,10,12,1,1,29,0x3885,400,2612,912,288,0,0,0,0,0,0,0,957,9000,724,5,938,1000,958,50,727,70,0,0,0,0,0,0,0,0,4038,1 1016,ARCHER_SKELETON,Archer Skeleton,Archer Skeleton,31,3040,0,483,283,9,128,153,0,0,1,8,14,5,90,5,10,12,1,1,29,0x2085,300,2864,864,576,0,0,0,0,0,0,0,932,4500,756,70,2285,3,1708,35,1752,1000,507,1800,1701,150,0,0,0,0,4094,1 //1017,THIEF_BUG_FEMALE,Thief Bug Female,Thief Bug Female,10,170,0,35,18,1,33,40,5,5,1,15,10,5,23,5,10,12,1,4,27,0x651,200,988,288,768,0,0,0,0,0,0,0,955,3500,910,250,1108,15,928,200,507,400,716,50,1002,400,0,0,0,0,4026,1 Oh, so two lines were modified. Now, to locate the entry that was changed. By the way, you didn't notice that I purposely introduced a syntax error, did you? (hint: count the commas in the SPORE line: there's one less entry!) Now what happens if someone else changes the file (on a nearby, but unrelated line), and you pull the change? <<<<<<< HEAD 1012,RODA_FROG,Roda Frog,Roda Frog,5,133,0,6,5,1,11,14,0,5,1,5,5,5,10,5,10,12,1,5,21,0x81,200,2016,816,288,0,0,0,0,0,0,0,918,9000,908,500,511,300,721,7,713,2000,0,0,0,0,0,0,0,0,4014,1 1013,WOLF,Wolf,Wolf,25,919,0,329,199,1,37,46,0,0,1,20,28,15,32,20,10,12,1,2,22,0x1089,200,1054,504,432,0,0,0,0,0,0,0,1011,20,920,9000,2308,10,517,650,528,1050,919,5500,0,0,0,0,0,0,4029,1 1014,SPORE,Spore,Spore,16,510,0,66,108,1,24,48,0,5,1,12,12,5,19,8,10,12,1,3,21,0x81,200,1872,672,288,0,0,0,0,0,0,0,921,9000,507,800,510,50,743,10,2220,40,7033,5,0,0,0,0,0,4022,1 =======1012,RODA_FROG,Roda Frog,Roda Frog,5,133,0,6,5,1,11,14,0,5,1,5,5,5,10,5,10,12,1,5,21,0x81,200,2016,816,288,0,0,0,0,0,0,0,918,9000,908,500,511,300,721,7,713,2000,578,600,0,0,0,0,0,0,4014,1 1013,WOLF,Wolf,Wolf,25,919,0,329,199,1,37,46,0,0,1,20,28,15,32,20,10,12,1,2,22,0x1089,200,1054,504,432,0,0,0,0,0,0,0,1011,20,920,9000,2308,10,517,650,528,1050,919,5500,578,600,0,0,0,0,4029,1 1014,SPORE,Spore,Spore,16,510,0,66,106,1,24,48,0,5,1,12,12,5,19,8,10,12,1,3,21,0x81,200,1872,672,288,0,0,0,0,0,0,0,0,921,9000,507,800,510,50,743,10,2220,40,7033,5,578,600,0,0,0,0,4022,1 >>>>>>> upstream change Well, have fun figuring out how to merge it! (hint: a Strawberry drop was added to RODA_FROG -- could you tell? And now, are you sure nothing else was changed? Doublecheck? Would you believe it if I said that SPORE's Job EXP was also decreased by two? Anything else? I'll leave that as homework.) How do we fix it? Once again, we're switching to a different file format. Just like last time, it'll be libconfig. We're aware there are plenty of other suitable file formats out there (who said yaml?), but unfortunately this is not the time and place to change what was already started, and we'll have to stick with libconfig for the time being. (we'll see about writing some tools that leverage the Hercules libconfig parser to lessen everyone's pain). Some highlights: There is no need for those annoying sequences of zeros. If a mob drops less than 10 items, only the needed entries will be there. The mob_db2 entries can be left incomplete and set to inherit the original mob_db entry. If you want your SPORE to have higher Attack, , you can just write that in your mob_db2, and let it read the other values from the mob_db, so that if we update them, you get the update automatically We can finally add more fields (to support new features) to the file at any time, easily and without having to edit all the lines (or force you to edit all the lines of your custom mob_db2)! What does it look like? Each entry follows this structure: { // =================== Mandatory fields =============================== Id: ID (int) SpriteName: "SPRITE_NAME" (string) Name: "Mob name" (string) // =================== Optional fields ================================ Lv: level (int, defaults to 1) Hp: health (int, defaults to 1) Sp: mana (int, defaults to 0) Exp: basic experience (int, defaults to 0) JExp: job experience (int, defaults to 0) AttackRange: attack range (int, defaults to 1) Attack: [attack1, attack2] (int, defaults to 0) Def: defence (int, defaults to 0) Mdef: magic defence (int, defaults to 0) Stats: { Str: strength (int, defaults to 0) Agi: agility (int, defaults to 0) Vit: vitality (int, defaults to 0) Int: intelligence (int, defaults to 0) Dex: dexterity (int, defaults to 0) Luk: luck (int, defaults to 0) } ViewRange: view range (int, defaults to 1) ChaseRange: chase range (int, defaults to 1) Size: size (int, defaults to 1) Race: race (int, defaults to 0) Element: (type, level) Mode: { CanMove: true/false (bool) Looter: true/false (bool) Aggressive: true/false (bool) Assist: true/false (bool) CastSensorIdle:true/false (bool) Boss: true/false (bool) Plant: true/false (bool) CanAttack: true/false (bool) Detector: true/false (bool) CastSensorChase: true/false (bool) ChangeChase: true/false (bool) Angry: true/false (bool) ChangeTargetMelee: true/false (bool) ChangeTargetChase: true/false (bool) TargetWeak: true/false (bool) } MoveSpeed: move speed (int, defaults to 0) AttackDelay: attack delay (int, defaults to 4000) AttackMotion: attack motion (int, defaults to 2000) DamageMotion: damage motion (int, defaults to 0) MvpExp: mvp experience (int, defaults to 0) MvpDrops: { AegisName: chance (string: int) ... } Drops: { AegisName: chance (string: int) ... } } Here's a PORING in the old format: 1002,PORING,Poring,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,0x83,400,1872,672,480,0,0,0,0,0,0,0,909,7000,1202,100,938,400,512,1000,713,1500,512,150,619,20,0,0,0,0,4001,1 And here's the same PORING in the new format: { Id: 1002 SpriteName: "PORING" Name: "Poring" Lv: 1 Hp: 50 Sp: 0 Exp: 2 JExp: 1 AttackRange: 1 Attack: [7, 10] Def: 0 Mdef: 5 Stats: { Str: 1 Agi: 1 Vit: 1 Int: 0 Dex: 6 Luk: 30 } ViewRange: 10 ChaseRange: 12 Size: 1 Race: 3 Element: (1, 1) Mode: { CanMove: true Looter: true CanAttack: true } MoveSpeed: 400 AttackDelay: 1872 AttackMotion: 672 DamageMotion: 480 MvpExp: 0 Drops: { Jellopy: 7000 Knife_: 100 Sticky_Mucus: 400 Apple: 1000 Empty_Bottle: 1500 Apple: 150 Unripe_Apple: 20 Poring_Card: 1 } }, Not convinced yet it's better? Do you like Strawberries? Irrelevant? Not really: { Id: 1012 SpriteName: "RODA_FROG" Name: "Roda Frog" Lv: 5 Hp: 133 Sp: 0 Exp: 6 JExp: 5 AttackRange: 1 Attack: [11, 14] Def: 0 Mdef: 5 Stats: { Str: 1 Agi: 5 Vit: 5 Int: 5 Dex: 10 Luk: 5 } ViewRange: 10 ChaseRange: 12 Size: 1 Race: 5 Element: (1, 1) Mode: { CanMove: true CanAttack: true } MoveSpeed: 200 AttackDelay: 2016 AttackMotion: 816 DamageMotion: 288 MvpExp: 0 Drops: { Sticky_Webfoot: 9000 Spawn: 500 Green_Herb: 300 Azure_Jewel: 7 Empty_Bottle: 2000 Roda_Frog_Card: 1 } }, { Id: 1013 SpriteName: "WOLF" Name: "Wolf" Lv: 25 Hp: 919 Sp: 0 Exp: 329 JExp: 199 AttackRange: 1 Attack: [37, 46] Def: 0 Mdef: 0 Stats: { Str: 1 Agi: 20 Vit: 28 Int: 15 Dex: 32 Luk: 20 } ViewRange: 10 ChaseRange: 12 Size: 1 Race: 2 Element: (2, 1) Mode: { CanMove: true Assist: true CanAttack: true ChangeTargetMelee: true } MoveSpeed: 200 AttackDelay: 1054 AttackMotion: 504 DamageMotion: 432 MvpExp: 0 Drops: { Emveretarcon: 20 Claw_Of_Wolves: 9000 Mantle_: 10 Meat: 650 Monster's_Feed: 1050 Animal's_Skin: 5500 Strawberry: 600 Wolf_Card: 1 } }, { Id: 1014 SpriteName: "SPORE" Name: "Spore" Lv: 16 Hp: 510 Sp: 0 Exp: 66 JExp: 108 AttackRange: 1 Attack: [24, 48] Def: 0 Mdef: 5 Stats: { Str: 1 Agi: 12 Vit: 12 Int: 5 Dex: 19 Luk: 8 } ViewRange: 10 ChaseRange: 12 Size: 1 Race: 3 Element: (1, 1) Mode: { CanMove: true CanAttack: true } MoveSpeed: 200 AttackDelay: 1872 AttackMotion: 672 DamageMotion: 288 MvpExp: 0 Drops: { Mushroom_Spore: 9000 Red_Herb: 800 Blue_Herb: 50 Spore_Doll: 10 Hat: 40 Poison_Spore: 5 Strawberry: 600 Spore_Card: 1 } }, { Id: 1015 SpriteName: "ZOMBIE" Name: "Zombie" Lv: 15 Hp: 534 Sp: 0 Exp: 50 JExp: 33 AttackRange: 1 Attack: [67, 79] Def: 0 Mdef: 10 Stats: { Str: 1 Agi: 8 Vit: 7 Int: 0 Dex: 15 Luk: 0 } ViewRange: 10 ChaseRange: 12 Size: 1 Race: 1 Element: (9, 1) Mode: { CanMove: true Aggressive: true CanAttack: true Angry: true ChangeTargetMelee: true ChangeTargetChase: true } MoveSpeed: 400 AttackDelay: 2612 AttackMotion: 912 DamageMotion: 288 MvpExp: 0 Drops: { Decayed_Nail: 9000 Cardinal_Jewel_: 5 Sticky_Mucus: 1000 Horrendous_Mouth: 50 White_Jewel: 70 Zombie_Card: 1 } }, Is it easier to spot all the Strawberry there? I bet. { Id: 1012 SpriteName: "RODA_FROG" Name: "Roda Frog" Lv: 5 Hp: 133 Sp: 0 Exp: 6 JExp: 5 AttackRange: 1 Attack: [11, 14] Def: 0 Mdef: 5 Stats: { Str: 1 Agi: 5 Vit: 5 Int: 5 Dex: 10 Luk: 5 } ViewRange: 10 ChaseRange: 12 Size: 1 Race: 5 Element: (1, 1) Mode: { CanMove: true CanAttack: true } MoveSpeed: 200 AttackDelay: 2016 AttackMotion: 816 DamageMotion: 288 MvpExp: 0 Drops: { Sticky_Webfoot: 9000 Spawn: 500 Green_Herb: 300 Azure_Jewel: 7 Empty_Bottle: 2000 Roda_Frog_Card: 1 } }, { Id: 1013 SpriteName: "WOLF" Name: "Wolf" Lv: 25 Hp: 919 Sp: 0 Exp: 329 JExp: 199 AttackRange: 1 Attack: [37, 46] Def: 0 Mdef: 0 Stats: { Str: 1 Agi: 20 Vit: 28 Int: 15 Dex: 32 Luk: 20 } ViewRange: 10 ChaseRange: 12 Size: 1 Race: 2 Element: (2, 1) Mode: { CanMove: true Assist: true CanAttack: true ChangeTargetMelee: true } MoveSpeed: 200 AttackDelay: 1054 AttackMotion: 504 DamageMotion: 432 MvpExp: 0 Drops: { Emveretarcon: 20 Claw_Of_Wolves: 9000 Mantle_: 10 Meat: 650 Monster's_Feed: 1050 Animal's_Skin: 5500 Wolf_Card: 1 } }, { Id: 1014 SpriteName: "SPORE" Name: "Spore" Lv: 16 Hp: 510 Sp: 0 Exp: 66 JExp: 108 AttackRange: 1 Attack: [24, 48] Def: 0 Mdef: 5 Stats: { Str: 1 Agi: 12 Vit: 12 Int: 5 Dex: 19 Luk: 8 } ViewRange: 10 ChaseRange: 12 Size: 1 Race: 3 Element: (1, 1) Mode: { CanMove: true CanAttack: true } MoveSpeed: 200 AttackDelay: 1872 AttackMotion: 672 DamageMotion: 288 MvpExp: 0 Drops: { Mushroom_Spore: 9000 Red_Herb: 800 Blue_Herb: 50 Spore_Doll: 10 Hat: 40 Poison_Spore: 5 Spore_Card: 1 } }, { Id: 1015 SpriteName: "ZOMBIE" Name: "Zombie" Lv: 15 Hp: 534 Sp: 0 Exp: 50 JExp: 33 AttackRange: 1 Attack: [67, 79] Def: 0 Mdef: 10 Stats: { Str: 1 Agi: 8 Vit: 7 Int: 0 Dex: 15 Luk: 0 } ViewRange: 10 ChaseRange: 12 Size: 1 Race: 1 Element: (9, 1) Mode: { CanMove: true Aggressive: true CanAttack: true Angry: true ChangeTargetMelee: true ChangeTargetChase: true } MoveSpeed: 400 AttackDelay: 2612 AttackMotion: 912 DamageMotion: 288 MvpExp: 0 Drops: { Decayed_Nail: 9000 Cardinal_Jewel_: 5 Sticky_Mucus: 1000 Horrendous_Mouth: 50 White_Jewel: 70 Zombie_Card: 1 } }, Removed them all? Yup. Want to see a diff? sure: diff --git a/db/pre-re/mob_db.conf b/db/pre-re/mob_db.confindex 0ac34d7..ff4f0bd 100644--- a/db/pre-re/mob_db.conf+++ b/db/pre-re/mob_db.conf @@ -588,7 +588,6 @@ mob_db: ( Meat: 650 Monster's_Feed: 1050 Animal's_Skin: 5500- Strawberry: 600 Wolf_Card: 1 } }, @@ -634,7 +633,6 @@ mob_db: ( Spore_Doll: 10 Hat: 40 Poison_Spore: 5- Strawberry: 600 Spore_Card: 1 } }, Looks pretty? Very much so. What happens if we pull a commit like the one before? { Id: 1012 SpriteName: "RODA_FROG" Name: "Roda Frog" Lv: 5 Hp: 133 Sp: 0 Exp: 6 JExp: 5 AttackRange: 1 Attack: [11, 14] Def: 0 Mdef: 5 Stats: { Str: 1 Agi: 5 Vit: 5 Int: 5 Dex: 10 Luk: 5 } ViewRange: 10 ChaseRange: 12 Size: 1 Race: 5 Element: (1, 1) Mode: { CanMove: true CanAttack: true } MoveSpeed: 200 AttackDelay: 2016 AttackMotion: 816 DamageMotion: 288 MvpExp: 0 Drops: { Sticky_Webfoot: 9000 Spawn: 500 Green_Herb: 300 Azure_Jewel: 7 Empty_Bottle: 2000 Strawberry: 600 Roda_Frog_Card: 1 } }, { Id: 1013 SpriteName: "WOLF" Name: "Wolf" Lv: 25 Hp: 919 Sp: 0 Exp: 329 JExp: 199 AttackRange: 1 Attack: [37, 46] Def: 0 Mdef: 0 Stats: { Str: 1 Agi: 20 Vit: 28 Int: 15 Dex: 32 Luk: 20 } ViewRange: 10 ChaseRange: 12 Size: 1 Race: 2 Element: (2, 1) Mode: { CanMove: true Assist: true CanAttack: true ChangeTargetMelee: true } MoveSpeed: 200 AttackDelay: 1054 AttackMotion: 504 DamageMotion: 432 MvpExp: 0 Drops: { Emveretarcon: 20 Claw_Of_Wolves: 9000 Mantle_: 10 Meat: 650 Monster's_Feed: 1050 Animal's_Skin: 5500 Wolf_Card: 1 } }, { Id: 1014 SpriteName: "SPORE" Name: "Spore" Lv: 16 Hp: 510 Sp: 0 Exp: 66 JExp: 106 AttackRange: 1 Attack: [24, 48] Def: 0 Mdef: 5 Stats: { Str: 1 Agi: 12 Vit: 12 Int: 5 Dex: 19 Luk: 8 } ViewRange: 10 ChaseRange: 12 Size: 1 Race: 3 Element: (1, 1) Mode: { CanMove: true CanAttack: true } MoveSpeed: 200 AttackDelay: 1872 AttackMotion: 672 DamageMotion: 288 MvpExp: 0 Drops: { Mushroom_Spore: 9000 Red_Herb: 800 Blue_Herb: 50 Spore_Doll: 10 Hat: 40 Poison_Spore: 5 Spore_Card: 1 } }, { Id: 1015 SpriteName: "ZOMBIE" Name: "Zombie" Lv: 15 Hp: 534 Sp: 0 Exp: 50 JExp: 33 AttackRange: 1 Attack: [67, 79] Def: 0 Mdef: 10 Stats: { Str: 1 Agi: 8 Vit: 7 Int: 0 Dex: 15 Luk: 0 } ViewRange: 10 ChaseRange: 12 Size: 1 Race: 1 Element: (9, 1) Mode: { CanMove: true Aggressive: true CanAttack: true Angry: true ChangeTargetMelee: true ChangeTargetChase: true } MoveSpeed: 400 AttackDelay: 2612 AttackMotion: 912 DamageMotion: 288 MvpExp: 0 Drops: { Decayed_Nail: 9000 Cardinal_Jewel_: 5 Sticky_Mucus: 1000 Horrendous_Mouth: 50 White_Jewel: 70 Zombie_Card: 1 } }, What do you expect? No conflicts. What's changed? Here: diff --git a/db/pre-re/mob_db.conf b/db/pre-re/mob_db.confindex 0ac34d7..59a53b6 100644--- a/db/pre-re/mob_db.conf+++ b/db/pre-re/mob_db.conf @@ -541,6 +541,7 @@ mob_db: ( Green_Herb: 300 Azure_Jewel: 7 Empty_Bottle: 2000 + Strawberry: 600 Roda_Frog_Card: 1 } }, @@ -588,7 +589,6 @@ mob_db: ( Meat: 650 Monster's_Feed: 1050 Animal's_Skin: 5500 - Strawberry: 600 Wolf_Card: 1 } }, @@ -600,7 +600,7 @@ mob_db: ( Hp: 510 Sp: 0 Exp: 66 - JExp: 108 + JExp: 106 AttackRange: 1 Attack: [24, 48] Def: 0 @@ -634,7 +634,6 @@ mob_db: ( Spore_Doll: 10 Hat: 40 Poison_Spore: 5 - Strawberry: 600 Spore_Card: 1 } }, But... I have several custom mobs, do I have to manually convert all of them...? It's true that you need to convert your item database to the new format, but we can do it for you! Go to http://haru.ws/hercules/mobdbconverter/ and paste (or upload) your mob_db2.txt (or even your mob_db.txt if you have custom entries there), pick between renewal or pre-renewal (or upload your item_db if it's customized), press the Convert button, wait a few seconds and you're done! It's already converted for you. Easy, isn't it? Don't trust us? No, no, we don't need your custom mobs, you can sleep safe... But if you still don't want to paste anything on a website... well, we have provided the source code of the converter script! It's in the 'tools' folder of the Hercules repository. All you need is a Python interpreter, version 2.6 or newer (and if you're running Linux or Mac OS, on either your server or your own computer, it's almost certain that you already have that). All you have to do is run it (example: python tools/mobdbconverter.py pre-re . < db/mob_db2.txt > db/mob_db2.conf), and your item database will be converted in a split second! What if I was using SQL mob databases? Well, you're out of luck. It was deprecated long ago and it's being removed. It'll stay available for website/control panel purposes though. An automated converter (much like the db2sql plugin for the item db) will be available soon, and even executed automatically whenever we update the mob db, to keep the sql counterpart in sync! I have this event mob entry that came with an old script I downloaded... No worries, you can get it converted. Use the same script (or the provided web page) you'd use to convert an entire mob database, it'll work just fine even for a mob or two! Special thanks To Ind, for bringing up the idea, a long time ago. To Andrei Karas for actually doing it, after picking up this project from the bottom of our forgotten items box. To me, for putting this at the bottom of the forgotten items box, and burying it with several other things so that it'd stay there until now (sigh) Links Merged pull request. Web-based converter. Edited February 7, 2017 by Ridley 11 JulioCF, Kong, Doch and 8 others reacted to this Quote Share this post Link to post Share on other sites
Tranquility 12 Posted October 19, 2015 Thanks for the update, new toys to play with now Quote Share this post Link to post Share on other sites
Jezu 25 Posted October 20, 2015 (edited) How about the card drops? I didn't see it on the Drop List.. Edit: nvm Edited October 20, 2015 by Jezu Quote Share this post Link to post Share on other sites
Dastgir 1246 Posted October 20, 2015 Card drops are on Drops: list We don't need custom Card field Quote Share this post Link to post Share on other sites
Aeromesi 180 Posted October 20, 2015 This is amazing! Looks a lot cleaner, more structured and overall better. Going to make adding mobs alot more fun now ^^ Thank you @@Haru and @@4144 for this contribution to Hercules, love you guys *codes more NPC scripts* Quote Share this post Link to post Share on other sites
kyeme 71 Posted October 20, 2015 Yehey! Thank you Quote Share this post Link to post Share on other sites
Litro 45 Posted October 20, 2015 a sight for sore eyes , in the contrary it will need have more step in creating db for custom monster , anyway its better than before, thx a loot Quote Share this post Link to post Share on other sites
cJei 4 Posted October 20, 2015 Awesome! Hercules is getting neater and neater. Thank you! Quote Share this post Link to post Share on other sites
Yommy 265 Posted October 20, 2015 <3 1 evilpuncker reacted to this Quote Share this post Link to post Share on other sites
sbk_ 30 Posted October 20, 2015 Thank you, very good. Quote Share this post Link to post Share on other sites
JulioCF 105 Posted October 20, 2015 Very Nice! Thanks!! Quote Share this post Link to post Share on other sites
evilpuncker 504 Posted October 20, 2015 nice now we need an overhaul in the localization thing Quote Share this post Link to post Share on other sites
Jedzkie 58 Posted October 21, 2015 Suggestion: How about we merge the mob_skill_db? Example. { Id: 1012 SpriteName: "RODA_FROG" Name: "Roda Frog" Lv: 5 Hp: 133 Sp: 0 Exp: 6 JExp: 5 AttackRange: 1 Attack: [11, 14] Def: 0 Mdef: 5 Stats: { Str: 1 Agi: 5 Vit: 5 Int: 5 Dex: 10 Luk: 5 } ViewRange: 10 ChaseRange: 12 Size: 1 Race: 5 Element: (1, 1) Mode: { CanMove: true CanAttack: true } MoveSpeed: 200 AttackDelay: 2016 AttackMotion: 816 DamageMotion: 288 MvpExp: 0 Drops: { Sticky_Webfoot: 9000 Spawn: 500 Green_Herb: 300 Azure_Jewel: 7 Empty_Bottle: 2000 Roda_Frog_Card: 1 } Skill: { NPC_WATERATTACK: { SkillLv: 1 State: attack Rate: 2000 CastTime: 0 Delay: 5000 Cancelable: yes Target: target Condition Type: always Condition Value: 0 (Other Example: Condition Value: [3,1522] // Osiris) Emotion: 0 Chat: 0 } } }, Quote Share this post Link to post Share on other sites
Garr 117 Posted October 21, 2015 ^ +1 Then probably should also add in mob_avail inside Quote Share this post Link to post Share on other sites
Haru 290 Posted October 21, 2015 Yes, this is something we're looking into. I would also love to have it streamlined in a similar fashion. We decided not to merge it right away because of some concerns about the file size, but it is not excluded that it'll be merged in the near future. Quote Share this post Link to post Share on other sites
Host32 1 Posted October 21, 2015 Wow, so fast! (at least for me) I was questioning this recently with a friend Thank you Quote Share this post Link to post Share on other sites
Legend 43 Posted October 21, 2015 wow! absolutely amazing~great job! Quote Share this post Link to post Share on other sites
Happy 28 Posted October 22, 2015 Makes it a lot easier!! Thank you very much!!!! Quote Share this post Link to post Share on other sites
kyeme 71 Posted October 25, 2015 @@Haru @@4144 How to remove Orc_Load_Card using mob_db2.conf? { Id: 1190 Inherit: true SpriteName: "ORC_LORD" Drops: { Orc_Load_Card: false or 0 (is not working) } }, Its not supported? (I hate touching mob_db.conf ) Quote Share this post Link to post Share on other sites
Jedzkie 58 Posted October 25, 2015 (edited) @@Haru @@4144 How to remove Orc_Load_Card using mob_db2.conf? { Id: 1190 Inherit: true SpriteName: "ORC_LORD" Drops: { Orc_Load_Card: false or 0 (is not working) } }, Its not supported? (I hate touching mob_db.conf ) @@kyeme, Instead of adding only the Orc_Load_Card in the monster information in mod_db2.conf, Why you don't insert all of its drop and don't add the Orc_Load_Card? @EDIT: I tried it and it's working. Edited October 25, 2015 by Frost Quote Share this post Link to post Share on other sites
kyeme 71 Posted October 25, 2015 @@Frost Yes I did and its working. It is nice if we have a settings like "0" to remove the specific item, so its not hard to see what changes you made { Id: 1190 Inherit: true SpriteName: "ORC_LORD" Drops: { Brood_Axe: 0 Orc_Load_Card: 0 }, { Id: 1288 Inherit: true SpriteName: "EMPELIUM" Hp: 342150 }, { Id: 1191 Inherit: true SpriteName: "MIMIC" Drops: { Emperium: 0 Rosary_: 0 Elunium_Stone: 0 Mimic_Card: 0 } }, Quote Share this post Link to post Share on other sites
Jedzkie 58 Posted October 25, 2015 @@Frost Yes I did and its working. It is nice if we have a settings like "0" to remove the specific item, so its not hard to see what changes you made { Id: 1190 Inherit: true SpriteName: "ORC_LORD" Drops: { Brood_Axe: 0 Orc_Load_Card: 0 }, { Id: 1288 Inherit: true SpriteName: "EMPELIUM" Hp: 342150 }, { Id: 1191 Inherit: true SpriteName: "MIMIC" Drops: { Emperium: 0 Rosary_: 0 Elunium_Stone: 0 Mimic_Card: 0 } }, Yeah, you have a point on that @@Haru, @@4144 is it possible to increase the item slot of MVP Drops and Drops? Quote Share this post Link to post Share on other sites
Haru 290 Posted October 25, 2015 The problem with that approach is that you're assuming that no monsters have the same drop listed twice (while it's a valid situation). This is the mob_db entry for PORING: // Mob DB entry for PORING{ Id: 1002 // ... Drops: { Jellopy: 7000 Knife_: 100 Sticky_Mucus: 400 Apple: 1000 Empty_Bottle: 1500 Apple: 150 Unripe_Apple: 20 Poring_Card: 1 }},If you added this in the mob_db2:{ Id: 1002 Override: true Drops: { Apple: 0 // Which apple am I removing? The first? The last? Both? }},What would happen? Also if you added: { Id: 1002 Override: true Drops: { Jellopy: 5000 // Am I replacing the existing Jellopy? Or adding a new drop? Red_Potion: 1000 // What does this do? Replaces an existing entry? Adds a new drop? }},it wouldn't be clear what the result would be. To remove all existing entries and add a completely different drops list, what would you do? If it was able to override, you'd need a reasonable way to specify that you want to empty the list. About increasing the amount of drops and mvp drops, it's possible but it requires several source modifications (and possibly a very radical change in how they're represented in the SQL DB). I'm for the change, but I expect a lot of people to complain if we do, and their control panel breaks. Quote Share this post Link to post Share on other sites
kyeme 71 Posted October 25, 2015 @@Haru You have a good point sir, how about adding Drops_Add and Drops_Remove // Mob DB entry for PORING{ Id: 1002 // ... Drops: { Jellopy: 7000 Knife_: 100 Sticky_Mucus: 400 Apple: 1000 Empty_Bottle: 1500 Apple: 150 Unripe_Apple: 20 Poring_Card: 1 }},//In mob_db2.conf{ Id: 1002 Inherit: true Drops: { Jellopy: 5000 // Replace the current Jellopy Sticky_Mucus: 1000 // Replace the current Sticky_Mucus } Drops_Add: { Mjolnir: 1000 // Poring will now drop mjolnir } Drops_Remove: { Apple: 1000 // Remove the existing Apple with 1000 rate Apple: 150 // Remove the existing Apple with 150 rate }}, Quote Share this post Link to post Share on other sites
RodRich 6 Posted October 29, 2015 Just a note: the mob_db converter engine doesn't convert the mobs that are //commented Quote Share this post Link to post Share on other sites