Jelajahi Sumber

Improved pet command and fixed Green Maiden (#8826)

Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
Daegaladh 5 bulan lalu
induk
melakukan
76f9dfbe91

+ 55 - 55
db/pre-re/item_db_usable.yml

@@ -1231,7 +1231,7 @@ Body:
     NoUse:
       Sitting: true
     Script: |
-      pet 1002;
+      pet;
   - Id: 620
     AegisName: Orange_Juice
     Name: Orange Juice
@@ -1243,7 +1243,7 @@ Body:
     NoUse:
       Sitting: true
     Script: |
-      pet 1113;
+      pet;
   - Id: 621
     AegisName: Bitter_Herb
     Name: Bitter Herb
@@ -1255,7 +1255,7 @@ Body:
     NoUse:
       Sitting: true
     Script: |
-      pet 1031;
+      pet;
   - Id: 622
     AegisName: Rainbow_Carrot
     Name: Rainbow Carrot
@@ -1267,7 +1267,7 @@ Body:
     NoUse:
       Sitting: true
     Script: |
-      pet 1063;
+      pet;
   - Id: 623
     AegisName: Earthworm_The_Dude
     Name: Earthworm the Dude
@@ -1279,7 +1279,7 @@ Body:
     NoUse:
       Sitting: true
     Script: |
-      pet 1049;
+      pet;
   - Id: 624
     AegisName: Rotten_Fish
     Name: Rotten Fish
@@ -1291,7 +1291,7 @@ Body:
     NoUse:
       Sitting: true
     Script: |
-      pet 1011;
+      pet;
   - Id: 625
     AegisName: Lusty_Iron
     Name: Rusty Iron
@@ -1303,7 +1303,7 @@ Body:
     NoUse:
       Sitting: true
     Script: |
-      pet 1042;
+      pet;
   - Id: 626
     AegisName: Monster_Juice
     Name: Monster Juice
@@ -1315,7 +1315,7 @@ Body:
     NoUse:
       Sitting: true
     Script: |
-      pet 1035;
+      pet;
   - Id: 627
     AegisName: Sweet_Milk
     Name: Sweet Milk
@@ -1327,7 +1327,7 @@ Body:
     NoUse:
       Sitting: true
     Script: |
-      pet 1167;
+      pet;
   - Id: 628
     AegisName: Well_Dried_Bone
     Name: Well-Dried Bone
@@ -1339,7 +1339,7 @@ Body:
     NoUse:
       Sitting: true
     Script: |
-      pet 1107;
+      pet;
   - Id: 629
     AegisName: Singing_Flower
     Name: Singing Flower
@@ -1351,7 +1351,7 @@ Body:
     NoUse:
       Sitting: true
     Script: |
-      pet 1052;
+      pet;
   - Id: 630
     AegisName: Dew_Laden_Moss
     Name: Dew Laden Moss
@@ -1363,7 +1363,7 @@ Body:
     NoUse:
       Sitting: true
     Script: |
-      pet 1014;
+      pet;
   - Id: 631
     AegisName: Deadly_Noxious_Herb
     Name: Deadly Noxious Herb
@@ -1375,7 +1375,7 @@ Body:
     NoUse:
       Sitting: true
     Script: |
-      pet 1077;
+      pet;
   - Id: 632
     AegisName: Fatty_Chubby_Earthworm
     Name: Fatty Chubby Earthworm
@@ -1387,7 +1387,7 @@ Body:
     NoUse:
       Sitting: true
     Script: |
-      pet 1019;
+      pet;
   - Id: 633
     AegisName: Baked_Yam
     Name: Sweet Potato
@@ -1399,7 +1399,7 @@ Body:
     NoUse:
       Sitting: true
     Script: |
-      pet 1056;
+      pet;
   - Id: 634
     AegisName: Tropical_Banana
     Name: Tropical Banana
@@ -1411,7 +1411,7 @@ Body:
     NoUse:
       Sitting: true
     Script: |
-      pet 1057;
+      pet;
   - Id: 635
     AegisName: Horror_Of_Tribe
     Name: Orc Trophy
@@ -1423,7 +1423,7 @@ Body:
     NoUse:
       Sitting: true
     Script: |
-      pet 1023;
+      pet;
   - Id: 636
     AegisName: No_Recipient
     Name: No Recipient
@@ -1435,7 +1435,7 @@ Body:
     NoUse:
       Sitting: true
     Script: |
-      pet 1026;
+      pet;
   - Id: 637
     AegisName: Old_Broom
     Name: Old Broom
@@ -1447,7 +1447,7 @@ Body:
     NoUse:
       Sitting: true
     Script: |
-      pet 1110;
+      pet;
   - Id: 638
     AegisName: Silver_Knife_Of_Chaste
     Name: Silver Knife of Chastity
@@ -1459,7 +1459,7 @@ Body:
     NoUse:
       Sitting: true
     Script: |
-      pet 1170;
+      pet;
   - Id: 639
     AegisName: Armlet_Of_Obedience
     Name: Armlet of Obedience
@@ -1471,7 +1471,7 @@ Body:
     NoUse:
       Sitting: true
     Script: |
-      pet 1029;
+      pet;
   - Id: 640
     AegisName: Shining_Stone
     Name: Shining Stone
@@ -1483,7 +1483,7 @@ Body:
     NoUse:
       Sitting: true
     Script: |
-      pet 1155;
+      pet;
   - Id: 641
     AegisName: Contracts_In_Shadow
     Name: Contract in Shadow
@@ -1495,7 +1495,7 @@ Body:
     NoUse:
       Sitting: true
     Script: |
-      pet 1109;
+      pet;
   - Id: 642
     AegisName: Book_Of_Devil
     Name: Book of the Devil
@@ -1507,7 +1507,7 @@ Body:
     NoUse:
       Sitting: true
     Script: |
-      pet 1101;
+      pet;
   - Id: 643
     AegisName: Pet_Incubator
     Name: Pet Incubator
@@ -1619,7 +1619,7 @@ Body:
     NoUse:
       Sitting: true
     Script: |
-      pet 1188;
+      pet;
   - Id: 660
     AegisName: Prohibition_Red_Candle
     Name: Forbidden Red Candle
@@ -1631,7 +1631,7 @@ Body:
     NoUse:
       Sitting: true
     Script: |
-      pet 1200;
+      pet;
   - Id: 661
     AegisName: Sway_Apron
     Name: Soft Apron
@@ -1643,7 +1643,7 @@ Body:
     NoUse:
       Sitting: true
     Script: |
-      pet 1275;
+      pet;
   - Id: 662
     AegisName: Inspector_Certificate
     Name: Authoritative Badge
@@ -5017,7 +5017,7 @@ Body:
     NoUse:
       Sitting: true
     Script: |
-      pet 1245;
+      pet;
   - Id: 12226
     AegisName: Examination1
     Name: Examination 1
@@ -6401,7 +6401,7 @@ Body:
       NoMail: true
       NoAuction: true
     Script: |
-      pet 1815;
+      pet;
   - Id: 12341
     AegisName: Special_Alloy_Trap_Box
     Name: Special Alloy Trap Box
@@ -6642,7 +6642,7 @@ Body:
     Buy: 20
     Weight: 50
     Script: |
-      pet 1630;
+      pet;
   - Id: 12358
     AegisName: Fan_Of_Wind
     Name: Fan Of Wind
@@ -6654,7 +6654,7 @@ Body:
     NoUse:
       Sitting: true
     Script: |
-      pet 1513;
+      pet;
   - Id: 12359
     AegisName: Very_Soft_Plant
     Name: Very Soft Plant
@@ -6666,7 +6666,7 @@ Body:
     NoUse:
       Sitting: true
     Script: |
-      pet 1586;
+      pet;
   - Id: 12360
     AegisName: Very_Red_Juice
     Name: Very Red Juice
@@ -6678,7 +6678,7 @@ Body:
     NoUse:
       Sitting: true
     Script: |
-      pet 1505;
+      pet;
   - Id: 12361
     AegisName: Delicious_Shaved_Ice
     Name: Delicious Shaved Ice
@@ -6695,7 +6695,7 @@ Body:
       NoMail: true
       NoAuction: true
     Script: |
-      pet 1143;
+      pet;
   - Id: 12362
     AegisName: Kuloren
     Name: Kuloren
@@ -6707,7 +6707,7 @@ Body:
     NoUse:
       Sitting: true
     Script: |
-      pet 1401;
+      pet;
   - Id: 12363
     AegisName: Fit_Pipe
     Name: Fit Pipe
@@ -6724,7 +6724,7 @@ Body:
       NoMail: true
       NoAuction: true
     Script: |
-      pet 1179;
+      pet;
   - Id: 12364
     AegisName: Staff_Of_Leader
     Name: Staff Of Leader
@@ -6736,7 +6736,7 @@ Body:
     NoUse:
       Sitting: true
     Script: |
-      pet 1299;
+      pet;
   - Id: 12365
     AegisName: Charming_Lotus
     Name: Charming Lotus
@@ -6748,7 +6748,7 @@ Body:
     NoUse:
       Sitting: true
     Script: |
-      pet 1416;
+      pet;
   - Id: 12366
     AegisName: Gril_Doll
     Name: Girl's Doll
@@ -6760,7 +6760,7 @@ Body:
     NoUse:
       Sitting: true
     Script: |
-      pet 1404;
+      pet;
   - Id: 12367
     AegisName: Luxury_Whisky_Bottle
     Name: Luxury Whisky Bottle
@@ -6772,7 +6772,7 @@ Body:
     NoUse:
       Sitting: true
     Script: |
-      pet 1504;
+      pet;
   - Id: 12368
     AegisName: Splendid_Mirror
     Name: Splendid Mirror
@@ -6784,7 +6784,7 @@ Body:
     NoUse:
       Sitting: true
     Script: |
-      pet 1148;
+      pet;
   - Id: 12369
     AegisName: Oilpalm_Coconut
     Name: Oilpalm Coconut
@@ -6796,7 +6796,7 @@ Body:
     NoUse:
       Sitting: true
     Script: |
-      pet 1495;
+      pet;
   - Id: 12370
     AegisName: Gril's_Naivety
     Name: Girl's Naivety
@@ -6813,7 +6813,7 @@ Body:
       NoMail: true
       NoAuction: true
     Script: |
-      pet 1374;
+      pet;
   - Id: 12371
     AegisName: Magical_Lithography
     Name: Magical Lithography
@@ -6825,7 +6825,7 @@ Body:
     NoUse:
       Sitting: true
     Script: |
-      pet 1040;
+      pet;
   - Id: 12372
     AegisName: Hell_Contract
     Name: Hell Contract
@@ -6837,7 +6837,7 @@ Body:
     NoUse:
       Sitting: true
     Script: |
-      pet 1379;
+      pet;
   - Id: 12373
     AegisName: Boy's_Naivety
     Name: Boy's Pure Heart
@@ -6849,7 +6849,7 @@ Body:
     NoUse:
       Sitting: true
     Script: |
-      pet 1370;
+      pet;
   - Id: 12374
     AegisName: Flaming_Ice
     Name: Ice Fireworks
@@ -6861,7 +6861,7 @@ Body:
     NoUse:
       Sitting: true
     Script: |
-      pet 1837;
+      pet;
   - Id: 12375
     AegisName: Acaraje
     Name: Akaraje
@@ -7140,7 +7140,7 @@ Body:
     Flags:
       BuyingStore: true
     Script: |
-      pet 1519;
+      pet;
   - Id: 12396
     AegisName: Fools_Day_Box
     Name: Gift Box?
@@ -7300,7 +7300,7 @@ Body:
     Name: Leaf Cat Ball
     Type: Usable
     Script: |
-      pet 2081;
+      pet;
   - Id: 12409
     AegisName: Pork_Belly_H
     Name: 1st Class Pork Belly
@@ -21307,7 +21307,7 @@ Body:
       NoMail: true
       NoAuction: true
     Script: |
-      pet 1122;
+      pet;
   - Id: 14570
     AegisName: Flail_Goblin_Ring
     Name: Flail Goblin Ring
@@ -21322,7 +21322,7 @@ Body:
       NoMail: true
       NoAuction: true
     Script: |
-      pet 1123;
+      pet;
   - Id: 14571
     AegisName: Hammer_Goblin_Ring
     Name: Hammer Goblin Ring
@@ -21337,7 +21337,7 @@ Body:
       NoMail: true
       NoAuction: true
     Script: |
-      pet 1125;
+      pet;
   - Id: 14572
     AegisName: Holy_Marble
     Name: Holy Marble
@@ -21352,7 +21352,7 @@ Body:
       NoMail: true
       NoAuction: true
     Script: |
-      pet 1385;
+      pet;
   - Id: 14573
     AegisName: Red_Burning_Stone
     Name: Red Burning Stone
@@ -21367,7 +21367,7 @@ Body:
       NoMail: true
       NoAuction: true
     Script: |
-      pet 1382;
+      pet;
   - Id: 14574
     AegisName: Skull_Of_Vagabond
     Name: Vagabond's Skull
@@ -21382,7 +21382,7 @@ Body:
       NoMail: true
       NoAuction: true
     Script: |
-      pet 1208;
+      pet;
   - Id: 14575
     AegisName: Str_Dish05_
     Name: Lutie Lady's Pancake

+ 66 - 48
db/pre-re/pet_db.yml

@@ -65,7 +65,7 @@ Body:
     CaptureRate: 2000
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if( .@i >= PET_INTIMATE_LOYAL ){
         bonus bLuk,2;
         bonus bCritical,1;
@@ -80,7 +80,7 @@ Body:
     CaptureRate: 1500
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if( .@i >= PET_INTIMATE_LOYAL ){
         bonus bHit,3;
         bonus bAtk,3;
@@ -95,7 +95,7 @@ Body:
     CaptureRate: 1000
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if( .@i >= PET_INTIMATE_LOYAL ){
         bonus bLuk,2;
         bonus2 bSubEle,Ele_Poison,10;
@@ -111,7 +111,7 @@ Body:
     SpecialPerformance: false
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if( .@i >= PET_INTIMATE_LOYAL ){
         bonus bCritical,2;
         bonus bAtk,2;
@@ -126,7 +126,7 @@ Body:
     CaptureRate: 2000
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if( .@i >= PET_INTIMATE_LOYAL ){
         bonus bStr,1;
         bonus bAtk,5;
@@ -141,7 +141,7 @@ Body:
     CaptureRate: 1500
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if( .@i >= PET_INTIMATE_LOYAL ){
         bonus bAgi,1;
         bonus bFlee,2;
@@ -156,7 +156,7 @@ Body:
     CaptureRate: 1000
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if( .@i >= PET_INTIMATE_LOYAL ){
         bonus bFlee,6;
         bonus bAgi,-1;
@@ -171,7 +171,7 @@ Body:
     CaptureRate: 500
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if( .@i >= PET_INTIMATE_LOYAL ){
         bonus bFlee,-5;
         bonus bFlee2,2;
@@ -187,7 +187,7 @@ Body:
     SpecialPerformance: false
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if( .@i >= PET_INTIMATE_LOYAL ){
         bonus bVit,1;
         bonus bMaxHP,50;
@@ -203,7 +203,7 @@ Body:
     SpecialPerformance: false
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if( .@i >= PET_INTIMATE_LOYAL ){
         bonus bInt,1;
         bonus bMaxSP,50;
@@ -219,7 +219,7 @@ Body:
     SpecialPerformance: false
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if( .@i >= PET_INTIMATE_LOYAL ){
         bonus bHPrecovRate,5;
         bonus bMaxHP,25;
@@ -235,7 +235,7 @@ Body:
     SpecialPerformance: false
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if( .@i >= PET_INTIMATE_LOYAL ){
         bonus bHit,5;
         bonus bAtk,-2;
@@ -251,7 +251,7 @@ Body:
     SpecialPerformance: false
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if( .@i >= PET_INTIMATE_LOYAL ){
         bonus bStr,1;
         bonus bInt,1;
@@ -266,7 +266,7 @@ Body:
     CaptureRate: 1000
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if( .@i >= PET_INTIMATE_LOYAL ){
         bonus bMaxHP,150;
         bonus bMaxSP,-10;
@@ -281,7 +281,7 @@ Body:
     CaptureRate: 1000
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if( .@i >= PET_INTIMATE_LOYAL ){
         bonus bAgi,1;
         bonus bFlee2,1;
@@ -296,7 +296,7 @@ Body:
     CaptureRate: 1000
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if( .@i >= PET_INTIMATE_LOYAL ){
         bonus bCritical,3;
         bonus bLuk,-1;
@@ -311,7 +311,7 @@ Body:
     CaptureRate: 500
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if( .@i >= PET_INTIMATE_LOYAL ){
         bonus bAtk,10;
         bonus bDef,-3;
@@ -327,7 +327,7 @@ Body:
     SpecialPerformance: false
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if( .@i >= PET_INTIMATE_LOYAL ){
         bonus bInt,1;
         bonus bDef,1;
@@ -343,7 +343,7 @@ Body:
     SpecialPerformance: false
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if( .@i >= PET_INTIMATE_LOYAL ){
         bonus bMatkRate,1;
         bonus bAtkRate,-1;
@@ -359,7 +359,7 @@ Body:
     SpecialPerformance: false
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if( .@i >= PET_INTIMATE_LOYAL ){
         bonus bStr,1;
         bonus bDex,1;
@@ -375,7 +375,7 @@ Body:
     SpecialPerformance: false
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if( .@i >= PET_INTIMATE_LOYAL ){
         bonus bMatkRate,-1;
         bonus bAtkRate,1;
@@ -391,7 +391,7 @@ Body:
     SpecialPerformance: false
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if( .@i >= PET_INTIMATE_LOYAL ){
         bonus bDef,-2;
         bonus bMdef,-2;
@@ -408,7 +408,7 @@ Body:
     SpecialPerformance: false
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if( .@i >= PET_INTIMATE_LOYAL ){
         bonus bMatkRate,1;
         bonus bAtkRate,1;
@@ -426,7 +426,7 @@ Body:
     SpecialPerformance: false
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if( .@i >= PET_INTIMATE_LOYAL ){
         bonus bDef,1;
         bonus bMdef,1;
@@ -442,7 +442,7 @@ Body:
     CaptureRate: 500
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if( .@i >= PET_INTIMATE_LOYAL ){
         bonus bVit,1;
         bonus2 bResEff,Eff_Stun,100;
@@ -457,7 +457,7 @@ Body:
     SpecialPerformance: false
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if( .@i >= PET_INTIMATE_LOYAL ){
         bonus2 bAddRace,RC_Demihuman,2;
         bonus2 bMagicAddRace,RC_DemiHuman,2;
@@ -474,7 +474,7 @@ Body:
     SpecialPerformance: false
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if( .@i >= PET_INTIMATE_LOYAL ){
         bonus bMdef,1;
         bonus2 bSubRace,RC_DemiHuman,1;
@@ -488,7 +488,7 @@ Body:
     CaptureRate: 2000
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if( .@i >= PET_INTIMATE_LOYAL ){
         bonus2 bSubEle,Ele_Neutral,1;
         bonus bMaxHPrate,-1;
@@ -503,7 +503,7 @@ Body:
     SpecialPerformance: false
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if( .@i >= PET_INTIMATE_LOYAL ){
         bonus bMaxHP,30;
         bonus2 bSubEle,Ele_Water,1;
@@ -518,12 +518,30 @@ Body:
     SpecialPerformance: false
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if( .@i >= PET_INTIMATE_LOYAL ){
         bonus bDef,1;
         bonus2 bSubRace,RC_DemiHuman,1;
         bonus2 bSubRace,RC_Player_Human,1;
       }
+# On official pre-renewal servers, only CHUNG_E (1519) was tameable.
+# Uncomment the following lines to enable CHUNG_E_ (1631) too.
+#  - Mob: CHUNG_E_
+#    TameItem: Tantanmen
+#    EggItem: Chung_E_Egg
+#    FoodItem: Bun_
+#    Fullness: 3
+#    IntimacyFed: 50
+#    CaptureRate: 2000
+#    SpecialPerformance: false
+#    Script: >
+#      .@i = getpetinfo(PETINFO_INTIMATE);
+#
+#      if( .@i >= PET_INTIMATE_LOYAL ){
+#        bonus bDef,1;
+#        bonus2 bSubRace,RC_DemiHuman,1;
+#        bonus2 bSubRace,RC_Player_Human,1;
+#      }
   - Mob: ECLIPSE_P
     EggItem: Spring_Rabbit_Egg
     FoodItem: Bok_Choy
@@ -581,7 +599,7 @@ Body:
     SpecialPerformance: false
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if( .@i >= PET_INTIMATE_LOYAL ){
         bonus bAgi,3;
         bonus bDex,1;
@@ -604,7 +622,7 @@ Body:
     SpecialPerformance: false
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if( .@i >= PET_INTIMATE_LOYAL ){
         bonus bMaxHP,100;
         bonus bFlee,-5;
@@ -620,7 +638,7 @@ Body:
     SpecialPerformance: false
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if( .@i >= PET_INTIMATE_LOYAL ){
         bonus bSPrecovRate,3;
       }
@@ -635,7 +653,7 @@ Body:
     SpecialPerformance: false
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if( .@i >= PET_INTIMATE_LOYAL ){
         bonus bVit,1;
         bonus2 bResEff,Eff_Stone,500;
@@ -651,7 +669,7 @@ Body:
     SpecialPerformance: false
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if( .@i >= PET_INTIMATE_LOYAL ){
         bonus bFlee,7;
         bonus bDef,-3;
@@ -667,7 +685,7 @@ Body:
     SpecialPerformance: false
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if( .@i >= PET_INTIMATE_LOYAL ){
         bonus2 bAddRace,RC_DemiHuman,3;
         bonus2 bAddRace,RC_Player_Human,3;
@@ -683,7 +701,7 @@ Body:
     SpecialPerformance: false
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if( .@i >= PET_INTIMATE_LOYAL ){
         bonus2 bHpDrainRate,50,5;
       }
@@ -698,7 +716,7 @@ Body:
     SpecialPerformance: false
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if( .@i >= PET_INTIMATE_LOYAL ){
         bonus bMaxSPRate,3;
       }
@@ -713,7 +731,7 @@ Body:
     SpecialPerformance: false
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if( .@i >= PET_INTIMATE_LOYAL ){
         bonus2 bResEff,Eff_Sleep,10000;
       }
@@ -728,7 +746,7 @@ Body:
     SpecialPerformance: false
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if( .@i >= PET_INTIMATE_LOYAL ){
         bonus bAgi,2;
       }
@@ -743,7 +761,7 @@ Body:
     SpecialPerformance: false
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if( .@i >= PET_INTIMATE_LOYAL ){
         bonus bInt,1;
         bonus bCastrate,-3;
@@ -759,7 +777,7 @@ Body:
     SpecialPerformance: false
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if( .@i >= PET_INTIMATE_LOYAL ){
         bonus bMaxSP,30;
         bonus bSPrecovRate,5;
@@ -775,7 +793,7 @@ Body:
     SpecialPerformance: false
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if( .@i >= PET_INTIMATE_LOYAL ){
         bonus2 bSubEle,Ele_Fire,3;
       }
@@ -790,7 +808,7 @@ Body:
     SpecialPerformance: false
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if( .@i >= PET_INTIMATE_LOYAL ){
         bonus bCritAtkRate,5;
       }
@@ -805,7 +823,7 @@ Body:
     SpecialPerformance: false
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if( .@i >= PET_INTIMATE_LOYAL ){
         bonus bMaxHPRate,3;
         bonus3 bAutoSpellWhenHit,"AL_HEAL",1,10;
@@ -821,7 +839,7 @@ Body:
     SpecialPerformance: false
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if( .@i >= PET_INTIMATE_LOYAL ){
         bonus bMaxSP,10;
       }
@@ -836,7 +854,7 @@ Body:
     SpecialPerformance: false
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if( .@i >= PET_INTIMATE_LOYAL ){
         bonus2 bSubRace,RC_Brute,3;
         bonus2 bSubRace,RC_Player_Doram,3;
@@ -861,7 +879,7 @@ Body:
     SpecialPerformance: false
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if( .@i >= PET_INTIMATE_LOYAL ){
         bonus2 bSubEle,Ele_Fire,2;
         bonus2 bAddEle,Ele_Fire,2;

+ 66 - 66
db/re/item_db_usable.yml

@@ -1276,7 +1276,7 @@ Body:
     NoUse:
       Sitting: true
     Script: |
-      pet 1002;
+      pet;
   - Id: 620
     AegisName: Orange_Juice
     Name: Orange Juice
@@ -1288,7 +1288,7 @@ Body:
     NoUse:
       Sitting: true
     Script: |
-      pet 1113;
+      pet;
   - Id: 621
     AegisName: Bitter_Herb
     Name: Bitter Herb
@@ -1300,7 +1300,7 @@ Body:
     NoUse:
       Sitting: true
     Script: |
-      pet 1031;
+      pet;
   - Id: 622
     AegisName: Rainbow_Carrot
     Name: Rainbow Carrot
@@ -1312,7 +1312,7 @@ Body:
     NoUse:
       Sitting: true
     Script: |
-      pet 1063;
+      pet;
   - Id: 623
     AegisName: Earthworm_The_Dude
     Name: Earthworm the Dude
@@ -1324,7 +1324,7 @@ Body:
     NoUse:
       Sitting: true
     Script: |
-      pet 1049;
+      pet;
   - Id: 624
     AegisName: Rotten_Fish
     Name: Rotten Fish
@@ -1336,7 +1336,7 @@ Body:
     NoUse:
       Sitting: true
     Script: |
-      pet 1011;
+      pet;
   - Id: 625
     AegisName: Lusty_Iron
     Name: Rusty Iron
@@ -1348,7 +1348,7 @@ Body:
     NoUse:
       Sitting: true
     Script: |
-      pet 1042;
+      pet;
   - Id: 626
     AegisName: Monster_Juice
     Name: Monster Juice
@@ -1360,7 +1360,7 @@ Body:
     NoUse:
       Sitting: true
     Script: |
-      pet 1035;
+      pet;
   - Id: 627
     AegisName: Sweet_Milk
     Name: Sweet Milk
@@ -1372,7 +1372,7 @@ Body:
     NoUse:
       Sitting: true
     Script: |
-      pet 1167;
+      pet;
   - Id: 628
     AegisName: Well_Dried_Bone
     Name: Well-Dried Bone
@@ -1384,7 +1384,7 @@ Body:
     NoUse:
       Sitting: true
     Script: |
-      pet 1107;
+      pet;
   - Id: 629
     AegisName: Singing_Flower
     Name: Singing Flower
@@ -1396,7 +1396,7 @@ Body:
     NoUse:
       Sitting: true
     Script: |
-      pet 1052;
+      pet;
   - Id: 630
     AegisName: Dew_Laden_Moss
     Name: Dew Laden Moss
@@ -1408,7 +1408,7 @@ Body:
     NoUse:
       Sitting: true
     Script: |
-      pet 1014;
+      pet;
   - Id: 631
     AegisName: Deadly_Noxious_Herb
     Name: Deadly Noxious Herb
@@ -1420,7 +1420,7 @@ Body:
     NoUse:
       Sitting: true
     Script: |
-      pet 1077;
+      pet;
   - Id: 632
     AegisName: Fatty_Chubby_Earthworm
     Name: Fatty Chubby Earthworm
@@ -1432,7 +1432,7 @@ Body:
     NoUse:
       Sitting: true
     Script: |
-      pet 1019;
+      pet;
   - Id: 633
     AegisName: Baked_Yam
     Name: Sweet Potato
@@ -1444,7 +1444,7 @@ Body:
     NoUse:
       Sitting: true
     Script: |
-      pet 1056;
+      pet;
   - Id: 634
     AegisName: Tropical_Banana
     Name: Tropical Banana
@@ -1456,7 +1456,7 @@ Body:
     NoUse:
       Sitting: true
     Script: |
-      pet 1057;
+      pet;
   - Id: 635
     AegisName: Horror_Of_Tribe
     Name: Orc Trophy
@@ -1468,7 +1468,7 @@ Body:
     NoUse:
       Sitting: true
     Script: |
-      pet 1023;
+      pet;
   - Id: 636
     AegisName: No_Recipient
     Name: No Recipient
@@ -1480,7 +1480,7 @@ Body:
     NoUse:
       Sitting: true
     Script: |
-      pet 1026;
+      pet;
   - Id: 637
     AegisName: Old_Broom
     Name: Old Broom
@@ -1492,7 +1492,7 @@ Body:
     NoUse:
       Sitting: true
     Script: |
-      pet 1110;
+      pet;
   - Id: 638
     AegisName: Silver_Knife_Of_Chaste
     Name: Silver Knife of Chastity
@@ -1504,7 +1504,7 @@ Body:
     NoUse:
       Sitting: true
     Script: |
-      pet 1170;
+      pet;
   - Id: 639
     AegisName: Armlet_Of_Obedience
     Name: Armlet of Obedience
@@ -1516,7 +1516,7 @@ Body:
     NoUse:
       Sitting: true
     Script: |
-      pet 1029;
+      pet;
   - Id: 640
     AegisName: Shining_Stone
     Name: Shining Stone
@@ -1528,7 +1528,7 @@ Body:
     NoUse:
       Sitting: true
     Script: |
-      pet 1155;
+      pet;
   - Id: 641
     AegisName: Contracts_In_Shadow
     Name: Contract in Shadow
@@ -1540,7 +1540,7 @@ Body:
     NoUse:
       Sitting: true
     Script: |
-      pet 1109;
+      pet;
   - Id: 642
     AegisName: Book_Of_Devil
     Name: Book of the Devil
@@ -1552,7 +1552,7 @@ Body:
     NoUse:
       Sitting: true
     Script: |
-      pet 1101;
+      pet;
   - Id: 643
     AegisName: Pet_Incubator
     Name: Pet Incubator
@@ -1668,7 +1668,7 @@ Body:
     NoUse:
       Sitting: true
     Script: |
-      pet 1188;
+      pet;
   - Id: 660
     AegisName: Prohibition_Red_Candle
     Name: Forbidden Red Candle
@@ -1680,7 +1680,7 @@ Body:
     NoUse:
       Sitting: true
     Script: |
-      pet 1200;
+      pet;
   - Id: 661
     AegisName: Sway_Apron
     Name: Soft Apron
@@ -1692,7 +1692,7 @@ Body:
     NoUse:
       Sitting: true
     Script: |
-      pet 1275;
+      pet;
   - Id: 662
     AegisName: Inspector_Certificate
     Name: Authoritative Badge
@@ -2429,7 +2429,7 @@ Body:
     Type: Usable
     Weight: 10
     Script: |
-      pet 21089;
+      pet;
   - Id: 9908
     AegisName: DF_Mental_Potion
     Name: "[Scroll] Mental Potion"
@@ -7177,7 +7177,7 @@ Body:
     NoUse:
       Sitting: true
     Script: |
-      pet 1245;
+      pet;
   - Id: 12226
     AegisName: Examination1
     Name: Examination 1
@@ -8630,7 +8630,7 @@ Body:
       NoMail: true
       NoAuction: true
     Script: |
-      pet 1815;
+      pet;
   - Id: 12341
     AegisName: Special_Alloy_Trap_Box
     Name: Special Alloy Trap Box
@@ -8801,7 +8801,7 @@ Body:
     Buy: 20
     Weight: 50
     Script: |
-      pet 1630;
+      pet;
   - Id: 12358
     AegisName: Fan_Of_Wind
     Name: Fan Of Wind
@@ -8813,7 +8813,7 @@ Body:
     NoUse:
       Sitting: true
     Script: |
-      pet 1513;
+      pet;
   - Id: 12359
     AegisName: Very_Soft_Plant
     Name: Very Soft Plant
@@ -8825,7 +8825,7 @@ Body:
     NoUse:
       Sitting: true
     Script: |
-      pet 1586;
+      pet;
   - Id: 12360
     AegisName: Very_Red_Juice
     Name: Very Red Juice
@@ -8837,7 +8837,7 @@ Body:
     NoUse:
       Sitting: true
     Script: |
-      pet 1505;
+      pet;
   - Id: 12361
     AegisName: Delicious_Shaved_Ice
     Name: Delicious Shaved Ice
@@ -8853,7 +8853,7 @@ Body:
       NoMail: true
       NoAuction: true
     Script: |
-      pet 1143;
+      pet;
   - Id: 12362
     AegisName: Kuloren
     Name: Kuloren
@@ -8865,7 +8865,7 @@ Body:
     NoUse:
       Sitting: true
     Script: |
-      pet 1401;
+      pet;
   - Id: 12363
     AegisName: Fit_Pipe
     Name: Fit Pipe
@@ -8881,7 +8881,7 @@ Body:
       NoMail: true
       NoAuction: true
     Script: |
-      pet 1179;
+      pet;
   - Id: 12364
     AegisName: Staff_Of_Leader
     Name: Staff Of Leader
@@ -8893,7 +8893,7 @@ Body:
     NoUse:
       Sitting: true
     Script: |
-      pet 1299;
+      pet;
   - Id: 12365
     AegisName: Charming_Lotus
     Name: Charming Lotus
@@ -8905,7 +8905,7 @@ Body:
     NoUse:
       Sitting: true
     Script: |
-      pet 1416;
+      pet;
   - Id: 12366
     AegisName: Gril_Doll
     Name: Girl's Doll
@@ -8917,7 +8917,7 @@ Body:
     NoUse:
       Sitting: true
     Script: |
-      pet 1404;
+      pet;
   - Id: 12367
     AegisName: Luxury_Whisky_Bottle
     Name: Luxury Whisky Bottle
@@ -8929,7 +8929,7 @@ Body:
     NoUse:
       Sitting: true
     Script: |
-      pet 1504;
+      pet;
   - Id: 12368
     AegisName: Splendid_Mirror
     Name: Splendid Mirror
@@ -8941,7 +8941,7 @@ Body:
     NoUse:
       Sitting: true
     Script: |
-      pet 1148;
+      pet;
   - Id: 12369
     AegisName: Oilpalm_Coconut
     Name: Oilpalm Coconut
@@ -8953,7 +8953,7 @@ Body:
     NoUse:
       Sitting: true
     Script: |
-      pet 1495;
+      pet;
   - Id: 12370
     AegisName: Gril's_Naivety
     Name: Girl's Naivety
@@ -8969,7 +8969,7 @@ Body:
       NoMail: true
       NoAuction: true
     Script: |
-      pet 1374;
+      pet;
   - Id: 12371
     AegisName: Magical_Lithography
     Name: Magical Lithography
@@ -8981,7 +8981,7 @@ Body:
     NoUse:
       Sitting: true
     Script: |
-      pet 1040;
+      pet;
   - Id: 12372
     AegisName: Hell_Contract
     Name: Hell Contract
@@ -8993,7 +8993,7 @@ Body:
     NoUse:
       Sitting: true
     Script: |
-      pet 1379;
+      pet;
   - Id: 12373
     AegisName: Boy's_Naivety
     Name: Boy's Pure Heart
@@ -9005,7 +9005,7 @@ Body:
     NoUse:
       Sitting: true
     Script: |
-      pet 1370;
+      pet;
   - Id: 12374
     AegisName: Flaming_Ice
     Name: Ice Fireworks
@@ -9017,7 +9017,7 @@ Body:
     NoUse:
       Sitting: true
     Script: |
-      pet 1837;
+      pet;
   - Id: 12375
     AegisName: Acaraje
     Name: Akaraje
@@ -9314,7 +9314,7 @@ Body:
     Flags:
       BuyingStore: true
     Script: |
-      pet 1631;
+      pet;
   - Id: 12396
     AegisName: Fools_Day_Box
     Name: Gift Box?
@@ -9498,7 +9498,7 @@ Body:
     Name: Hydra Ball
     Type: Usable
     Script: |
-      pet 2081;
+      pet;
   - Id: 12409
     AegisName: Pork_Belly_H
     Name: 1st Class Pork Belly
@@ -12820,7 +12820,7 @@ Body:
     Flags:
       BuyingStore: true
     Script: |
-      pet 2313;
+      pet;
   - Id: 12700
     AegisName: Insideout_Shirt
     Name: Inside-out Shirt
@@ -14403,7 +14403,7 @@ Body:
     Buy: 10
     Weight: 50
     Script: |
-      pet 2398;
+      pet;
   - Id: 12847
     AegisName: Old_Equipment_Box
     Name: Old Equipment Box
@@ -35290,7 +35290,7 @@ Body:
       NoMail: true
       NoAuction: true
     Script: |
-      pet 1122;
+      pet;
   - Id: 14570
     AegisName: Flail_Goblin_Ring
     Name: Flail Goblin Ring
@@ -35305,7 +35305,7 @@ Body:
       NoMail: true
       NoAuction: true
     Script: |
-      pet 1123;
+      pet;
   - Id: 14571
     AegisName: Hammer_Goblin_Ring
     Name: Hammer Goblin Ring
@@ -35320,7 +35320,7 @@ Body:
       NoMail: true
       NoAuction: true
     Script: |
-      pet 1125;
+      pet;
   - Id: 14572
     AegisName: Holy_Marble
     Name: Holy Marble
@@ -35335,7 +35335,7 @@ Body:
       NoMail: true
       NoAuction: true
     Script: |
-      pet 1385;
+      pet;
   - Id: 14573
     AegisName: Red_Burning_Stone
     Name: Red Burning Stone
@@ -35350,7 +35350,7 @@ Body:
       NoMail: true
       NoAuction: true
     Script: |
-      pet 1382;
+      pet;
   - Id: 14574
     AegisName: Skull_Of_Vagabond
     Name: Vagabond's Skull
@@ -35359,7 +35359,7 @@ Body:
     Trade:
       NoDrop: true
     Script: |
-      pet 1208;
+      pet;
   - Id: 14575
     AegisName: Str_Dish05_
     Name: Lutie Lady's Pancake
@@ -61651,21 +61651,21 @@ Body:
     Type: Usable
     Buy: 10
     Script: |
-      pet 1180;
+      pet;
   - Id: 23188
     AegisName: Airship_Part
     Name: Unprocessed Parts
     Type: Usable
     Buy: 10
     Script: |
-      pet 1632;
+      pet;
   - Id: 23189
     AegisName: Little_Dall_Needle
     Name: Small Needle Kit
     Type: Usable
     Buy: 10
     Script: |
-      pet 1622;
+      pet;
   - Id: 23191
     AegisName: Varetyr_5_Scroll
     Name: Level 5 Varetyr Spear
@@ -62346,7 +62346,7 @@ Body:
     Type: Usable
     Buy: 10
     Script: |
-      pet 1041;
+      pet;
   - Id: 23257
     AegisName: Dew_Of_Old_Tree
     Name: Old Tree's Dew
@@ -70415,7 +70415,7 @@ Body:
     Flags:
       BuyingStore: true
     Script: |
-      pet 1198;
+      pet;
   - Id: 100810
     AegisName: BroadcastBox_
     Name: Broadcast Box
@@ -73677,7 +73677,7 @@ Body:
       BuyingStore: true
     Script: |
       /* TODO : pet 21632; */
-      pet 1005;
+      pet;
   - Id: 101336
     AegisName: aegis_101336
     Name: "[Scroll] DEX Biscuit Stick"
@@ -76803,7 +76803,7 @@ Body:
       NoMail: true
       NoAuction: true
     Script: |
-      pet 21965;
+      pet;
   - Id: 102213
     AegisName: Hero_Weapon_Up_S_Box
     Name: Hero's Weapon Mod Selection Box    # !todo check english name
@@ -78386,7 +78386,7 @@ Body:
       NoMail: true
       NoAuction: true
     Script: |
-      pet 22318;
+      pet;
   - Id: 102881
     AegisName: Gaebolg_A_Hammer_1
     Name: +9 Gaebolg Equipment Refine Hammer

+ 123 - 102
db/re/pet_db.yml

@@ -65,7 +65,7 @@ Body:
     CaptureRate: 2000
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if (.@i >= PET_INTIMATE_LOYAL) {
          bonus bCritical,1;
          bonus bLuk,3;
@@ -91,7 +91,7 @@ Body:
     CaptureRate: 1500
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if (.@i >= PET_INTIMATE_LOYAL) {
          bonus bBaseAtk,5;
          bonus bHit,5;
@@ -131,7 +131,7 @@ Body:
     CaptureRate: 1000
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if (.@i >= PET_INTIMATE_LOYAL) {
          bonus2 bSubEle,Ele_Poison,15;
          bonus bLuk,3;
@@ -151,7 +151,7 @@ Body:
     SpecialPerformance: false
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if (.@i >= PET_INTIMATE_LOYAL) {
          bonus bCritical,3;
          bonus bBaseAtk,3;
@@ -181,7 +181,7 @@ Body:
     CaptureRate: 2000
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if (.@i >= PET_INTIMATE_LOYAL) {
          bonus bBaseAtk,8;
          bonus bStr,2;
@@ -200,7 +200,7 @@ Body:
     CaptureRate: 1500
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if (.@i >= PET_INTIMATE_LOYAL) {
          bonus bAgi,2;
          bonus bFlee,3;
@@ -219,7 +219,7 @@ Body:
     CaptureRate: 1000
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if (.@i >= PET_INTIMATE_LOYAL) {
          bonus bFlee,9;
       }
@@ -236,7 +236,7 @@ Body:
     CaptureRate: 500
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if (.@i >= PET_INTIMATE_LOYAL) {
          bonus bFlee2,2;
          bonus bHit,1;
@@ -255,7 +255,7 @@ Body:
     SpecialPerformance: false
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if (.@i >= PET_INTIMATE_LOYAL) {
          bonus bVit,2;
          bonus bMaxHP,75;
@@ -286,7 +286,7 @@ Body:
     SpecialPerformance: false
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if (.@i >= PET_INTIMATE_LOYAL) {
          bonus bInt,2;
          bonus bMaxSP,75;
@@ -317,7 +317,7 @@ Body:
     SpecialPerformance: false
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if (.@i >= PET_INTIMATE_LOYAL) {
          bonus bHPrecovRate,8;
          bonus bMaxHP,38;
@@ -348,7 +348,7 @@ Body:
     SpecialPerformance: false
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if (.@i >= PET_INTIMATE_LOYAL) {
          bonus bHit,8;
       }
@@ -366,7 +366,7 @@ Body:
     SpecialPerformance: false
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if (.@i >= PET_INTIMATE_LOYAL) {
          bonus bStr,2;
          bonus bInt,2;
@@ -385,7 +385,7 @@ Body:
     CaptureRate: 1000
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if (.@i >= PET_INTIMATE_LOYAL) {
          bonus bMaxHP,200;
       }
@@ -415,7 +415,7 @@ Body:
     CaptureRate: 1000
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if (.@i >= PET_INTIMATE_LOYAL) {
          bonus bFlee2,1;
          bonus bAgi,2;
@@ -434,7 +434,7 @@ Body:
     CaptureRate: 1000
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if (.@i >= PET_INTIMATE_LOYAL) {
          bonus bCritical,5;
       }
@@ -462,7 +462,7 @@ Body:
     CaptureRate: 500
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if (.@i >= PET_INTIMATE_LOYAL) {
          bonus bBaseAtk,15;
       }
@@ -493,7 +493,7 @@ Body:
     SpecialPerformance: false
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if (.@i >= PET_INTIMATE_LOYAL) {
          bonus bDef,2;
          bonus bInt,2;
@@ -513,7 +513,7 @@ Body:
     SpecialPerformance: false
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if (.@i >= PET_INTIMATE_LOYAL) {
          bonus bMatkRate,2;
       }
@@ -542,7 +542,7 @@ Body:
     SpecialPerformance: false
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if (.@i >= PET_INTIMATE_LOYAL) {
          bonus bStr,2;
          bonus bDex,2;
@@ -562,7 +562,7 @@ Body:
     SpecialPerformance: false
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if (.@i >= PET_INTIMATE_LOYAL) {
          bonus2 bAddClass,Class_All,2;
       }
@@ -591,7 +591,7 @@ Body:
     SpecialPerformance: false
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if (.@i >= PET_INTIMATE_LOYAL) {
          bonus bAspdRate,1;
          bonus bAgi,1;
@@ -621,7 +621,7 @@ Body:
     SpecialPerformance: false
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if (.@i >= PET_INTIMATE_LOYAL) {
          bonus2 bAddClass,Class_All,1;
          bonus bMatkRate,1;
@@ -654,7 +654,7 @@ Body:
     SpecialPerformance: false
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if (.@i >= PET_INTIMATE_LOYAL) {
          bonus2 bResEff,Eff_Stun,200;
          bonus bMdef,2;
@@ -686,7 +686,7 @@ Body:
     CaptureRate: 500
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if (.@i >= PET_INTIMATE_LOYAL) {
          bonus2 bResEff,Eff_Stun,200;
          bonus bVit,2;
@@ -716,7 +716,7 @@ Body:
     SpecialPerformance: false
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if (.@i >= PET_INTIMATE_LOYAL) {
          bonus2 bAddRace,RC_DemiHuman,3;
          bonus2 bMagicAddRace,RC_DemiHuman,3;
@@ -739,7 +739,7 @@ Body:
     SpecialPerformance: false
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if (.@i >= PET_INTIMATE_LOYAL) {
          bonus2 bSubRace,RC_DemiHuman,2;
          bonus2 bSubRace,RC_Player_Human,2;
@@ -769,7 +769,7 @@ Body:
     CaptureRate: 2000
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if (.@i >= PET_INTIMATE_LOYAL) {
          bonus2 bSubEle,Ele_Neutral,2;
       }
@@ -786,7 +786,7 @@ Body:
     SpecialPerformance: false
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if (.@i >= PET_INTIMATE_LOYAL) {
          bonus2 bSubEle,Ele_Water,2;
          bonus bMaxHP,45;
@@ -795,6 +795,27 @@ Body:
          bonus2 bSubEle,Ele_Water,1;
          bonus bMaxHP,30;
       }
+  - Mob: CHUNG_E
+    TameItem: Tantanmen
+    EggItem: Chung_E_Egg
+    FoodItem: Bun_
+    Fullness: 3
+    IntimacyFed: 50
+    CaptureRate: 2000
+    SpecialPerformance: false
+    Script: >
+      .@i = getpetinfo(PETINFO_INTIMATE);
+
+      if (.@i >= PET_INTIMATE_LOYAL) {
+         bonus2 bSubRace,RC_DemiHuman,2;
+         bonus2 bSubRace,RC_Player_Human,2;
+         bonus bDef,2;
+      }
+      else if (.@i >= PET_INTIMATE_CORDIAL) {
+         bonus2 bSubRace,RC_DemiHuman,1;
+         bonus2 bSubRace,RC_Player_Human,1;
+         bonus bDef,1;
+      }
   - Mob: CHUNG_E_
     TameItem: Tantanmen
     EggItem: Chung_E_Egg
@@ -805,7 +826,7 @@ Body:
     SpecialPerformance: false
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if (.@i >= PET_INTIMATE_LOYAL) {
          bonus2 bSubRace,RC_DemiHuman,2;
          bonus2 bSubRace,RC_Player_Human,2;
@@ -873,7 +894,7 @@ Body:
     SpecialPerformance: false
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if (.@i >= PET_INTIMATE_LOYAL) {
          bonus bAgi,4;
       }
@@ -909,7 +930,7 @@ Body:
     SpecialPerformance: false
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if (.@i >= PET_INTIMATE_LOYAL) {
          bonus bMaxHP,150;
       }
@@ -955,7 +976,7 @@ Body:
     SpecialPerformance: false
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if (.@i >= PET_INTIMATE_LOYAL) {
          bonus2 bResEff,Eff_Stone,800;
          bonus bVit,2;
@@ -993,7 +1014,7 @@ Body:
     SpecialPerformance: false
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if (.@i >= PET_INTIMATE_LOYAL) {
          bonus2 bAddRace,RC_DemiHuman,5;
          bonus2 bAddRace,RC_Player_Human,5;
@@ -1013,7 +1034,7 @@ Body:
     SpecialPerformance: false
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if (.@i >= PET_INTIMATE_LOYAL) {
          bonus2 bHPDrainRate,30,5;
          bonus bMaxHPrate,1;
@@ -1050,7 +1071,7 @@ Body:
     SpecialPerformance: false
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if (.@i >= PET_INTIMATE_LOYAL) {
          bonus bInt,1;
       }
@@ -1079,7 +1100,7 @@ Body:
     SpecialPerformance: false
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if (.@i >= PET_INTIMATE_LOYAL) {
          bonus bAgi,3;
       }
@@ -1097,7 +1118,7 @@ Body:
     SpecialPerformance: false
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if (.@i >= PET_INTIMATE_LOYAL) {
          bonus bVariableCastrate,-5;
          bonus bInt,2;
@@ -1117,7 +1138,7 @@ Body:
     SpecialPerformance: false
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if (.@i >= PET_INTIMATE_LOYAL) {
          bonus bSPrecovRate,8;
          bonus bMaxSP,45;
@@ -1148,7 +1169,7 @@ Body:
     SpecialPerformance: false
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if (.@i >= PET_INTIMATE_LOYAL) {
          bonus2 bSubEle,Ele_Fire,5;
       }
@@ -1166,7 +1187,7 @@ Body:
     SpecialPerformance: false
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if (.@i >= PET_INTIMATE_LOYAL) {
          bonus bCritAtkRate,8;
       }
@@ -1184,7 +1205,7 @@ Body:
     SpecialPerformance: false
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if (.@i >= PET_INTIMATE_LOYAL) {
          bonus3 bAutoSpellWhenHit,"AL_HEAL",2,10;
          bonus bMaxHPrate,3;
@@ -1215,7 +1236,7 @@ Body:
     SpecialPerformance: false
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if (.@i >= PET_INTIMATE_LOYAL) {
          bonus bMaxSP,15;
       }
@@ -1233,7 +1254,7 @@ Body:
     SpecialPerformance: false
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if (.@i >= PET_INTIMATE_LOYAL) {
          bonus2 bSubRace,RC_Brute,5;
          bonus2 bSubRace,RC_Player_Doram,5;
@@ -1273,7 +1294,7 @@ Body:
     SpecialPerformance: false
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if (.@i >= PET_INTIMATE_LOYAL) {
          bonus2 bAddEle,Ele_Fire,2;
          bonus2 bSubEle,Ele_Fire,3;
@@ -1376,7 +1397,7 @@ Body:
     SpecialPerformance: false
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if (.@i >= PET_INTIMATE_LOYAL) {
          bonus bHPrecovRate,75;
       }
@@ -1392,7 +1413,7 @@ Body:
     CaptureRate: 2000
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if (.@i >= PET_INTIMATE_LOYAL) {
          bonus bCritical,3;
          bonus bHit,3;
@@ -1421,7 +1442,7 @@ Body:
     CaptureRate: 2000
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if (.@i >= PET_INTIMATE_LOYAL) {
          bonus bHit,1;
          bonus bDex,2;
@@ -1450,7 +1471,7 @@ Body:
     CaptureRate: 2000
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if (.@i >= PET_INTIMATE_LOYAL) {
          bonus bHit,5;
       }
@@ -1477,7 +1498,7 @@ Body:
     CaptureRate: 2000
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if (.@i >= PET_INTIMATE_LOYAL) {
          bonus bMaxSP,100;
       }
@@ -1526,7 +1547,7 @@ Body:
     AllowAutoFeed: true
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if (.@i >= PET_INTIMATE_LOYAL) {
          bonus bCritical,3;
          bonus bLuk,3;
@@ -1565,7 +1586,7 @@ Body:
     AllowAutoFeed: true
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if (.@i >= PET_INTIMATE_LOYAL) {
          bonus2 bAddRace,RC_Plant,6;
          bonus2 bMagicAddRace,RC_Plant,6;
@@ -1597,7 +1618,7 @@ Body:
     AllowAutoFeed: true
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if (.@i >= PET_INTIMATE_LOYAL) {
          bonus bMaxHPrate,2;
          bonus bHealPower,8;
@@ -1653,7 +1674,7 @@ Body:
     AllowAutoFeed: true
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if (.@i >= PET_INTIMATE_LOYAL) {
          bonus bVit,2;
          bonus bMaxHP,200;
@@ -1681,7 +1702,7 @@ Body:
     AllowAutoFeed: true
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if (.@i >= PET_INTIMATE_LOYAL) {
          bonus bBaseAtk,25;
       }
@@ -1716,7 +1737,7 @@ Body:
     AllowAutoFeed: true
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if (.@i >= PET_INTIMATE_LOYAL) {
          bonus bLongAtkRate,3;
          bonus bCritical,9;
@@ -1743,7 +1764,7 @@ Body:
     AllowAutoFeed: true
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if (.@i >= PET_INTIMATE_LOYAL) {
          bonus2 bAddRace,RC_Dragon,6;
          bonus2 bMagicAddRace,RC_Dragon,6;
@@ -1771,7 +1792,7 @@ Body:
     AllowAutoFeed: true
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if (.@i >= PET_INTIMATE_LOYAL) {
          bonus bMatkRate,4;
       }
@@ -1833,7 +1854,7 @@ Body:
     AllowAutoFeed: true
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if (.@i >= PET_INTIMATE_LOYAL) {
          bonus bMaxHP,400;
       }
@@ -1884,7 +1905,7 @@ Body:
     AllowAutoFeed: true
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if (.@i >= PET_INTIMATE_LOYAL) {
          bonus bCritAtkRate,9;
          bonus bHit,2;
@@ -1948,7 +1969,7 @@ Body:
     AllowAutoFeed: true
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if (.@i >= PET_INTIMATE_LOYAL) {
          bonus bBaseAtk,9;
          bonus bHit,9;
@@ -1976,7 +1997,7 @@ Body:
     AllowAutoFeed: true
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if (.@i >= PET_INTIMATE_LOYAL) {
          bonus2 bAddRace,RC_Formless,6;
          bonus2 bMagicAddRace,RC_Formless,6;
@@ -2008,7 +2029,7 @@ Body:
     AllowAutoFeed: true
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if (.@i >= PET_INTIMATE_LOYAL) {
          bonus2 bAddClass,Class_All,4;
       }
@@ -2066,7 +2087,7 @@ Body:
     AllowAutoFeed: true
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if (.@i >= PET_INTIMATE_LOYAL) {
          bonus bAspdRate,3;
          bonus bAgi,3;
@@ -2108,7 +2129,7 @@ Body:
     AllowAutoFeed: true
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if (.@i >= PET_INTIMATE_LOYAL) {
          bonus2 bResEff,Eff_Sleep,10000;
          bonus bMaxSPrate,3;
@@ -2136,7 +2157,7 @@ Body:
     AllowAutoFeed: true
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if (.@i >= PET_INTIMATE_LOYAL) {
          bonus bCritAtkRate,7;
          bonus bCritical,3;
@@ -2165,7 +2186,7 @@ Body:
     AllowAutoFeed: true
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if (.@i >= PET_INTIMATE_LOYAL) {
          bonus bAspdRate,5;
          bonus bHit,12;
@@ -2203,7 +2224,7 @@ Body:
     AllowAutoFeed: true
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if (.@i >= PET_INTIMATE_LOYAL) {
          bonus2 bMagicAtkEle,Ele_Neutral,5;
          bonus bVariableCastrate,-5;
@@ -2229,7 +2250,7 @@ Body:
     AllowAutoFeed: true
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if (.@i >= PET_INTIMATE_LOYAL) {
          bonus bMdef,7;
          bonus bHealPower,6;
@@ -2255,7 +2276,7 @@ Body:
 #    AllowAutoFeed: true
 #    Script: >
 #      .@i = getpetinfo(PETINFO_INTIMATE);
-#      
+#
 #      if (.@i >= PET_INTIMATE_LOYAL) {
 #         bonus bDelayrate,-3;
 #         bonus bMaxSPrate,5;
@@ -2283,7 +2304,7 @@ Body:
 #    AllowAutoFeed: true
 #    Script: >
 #      .@i = getpetinfo(PETINFO_INTIMATE);
-#      
+#
 #      if (.@i >= PET_INTIMATE_LOYAL) {
 #         bonus bCritAtkRate,3;
 #         bonus bAtkRate,7;
@@ -2310,7 +2331,7 @@ Body:
 #    AllowAutoFeed: true
 #    Script: >
 #      .@i = getpetinfo(PETINFO_INTIMATE);
-#      
+#
 #      if (.@i >= PET_INTIMATE_LOYAL) {
 #         bonus bHit,18;
 #         bonus bPerfectHitRate,15;
@@ -2413,7 +2434,7 @@ Body:
     SpecialPerformance: false   # unknown
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if (.@i >= PET_INTIMATE_LOYAL) {
          bonus bInt,3;
       }
@@ -2430,7 +2451,7 @@ Body:
     SpecialPerformance: false   # unknown
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if (.@i >= PET_INTIMATE_LOYAL) {
          bonus2 bMagicAtkEle,Ele_Wind,3;
       }
@@ -2464,7 +2485,7 @@ Body:
 #    AllowAutoFeed: true
 #    Script: >
 #      .@i = getpetinfo(PETINFO_INTIMATE);
-#      
+#
 #      if (.@i >= PET_INTIMATE_LOYAL) {
 #         bonus2 bMagicAtkEle,Ele_Fire,7;
 #         bonus2 bMagicAtkEle,Ele_Ghost,7;
@@ -2494,7 +2515,7 @@ Body:
 #    SpecialPerformance: false   # unknown
 #    Script: >
 #      .@i = getpetinfo(PETINFO_INTIMATE);
-#      
+#
 #      if (.@i >= PET_INTIMATE_LOYAL) {
 #         bonus bPerfectHitRate,10;
 #      }
@@ -2513,7 +2534,7 @@ Body:
 #    AllowAutoFeed: true
 #    Script: >
 #      .@i = getpetinfo(PETINFO_INTIMATE);
-#      
+#
 #      if (.@i >= PET_INTIMATE_LOYAL) {
 #         bonus bShortAtkRate,5;
 #         bonus bAspdRate,7;
@@ -2544,7 +2565,7 @@ Body:
     SpecialPerformance: false   # unknown
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if (.@i >= PET_INTIMATE_LOYAL) {
          bonus2 bMagicAddEle,Ele_Holy,5;
          bonus bInt,2;
@@ -2575,7 +2596,7 @@ Body:
     AllowAutoFeed: true
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if (.@i >= PET_INTIMATE_LOYAL) {
          bonus2 bMagicAtkEle,Ele_Earth,5;
          bonus bInt,4;
@@ -2605,7 +2626,7 @@ Body:
 #    AllowAutoFeed: true
 #    Script: >
 #      .@i = getpetinfo(PETINFO_INTIMATE);
-#      
+#
 #      if (.@i >= PET_INTIMATE_LOYAL) {
 #         bonus bMaxSPrate,3;
 #         bonus bFlee,15;
@@ -2642,7 +2663,7 @@ Body:
     AllowAutoFeed: true
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if (.@i >= PET_INTIMATE_LOYAL) {
          bonus2 bMagicAtkEle,Ele_Fire,5;
          bonus bMaxHP,500;
@@ -2668,7 +2689,7 @@ Body:
 #    AllowAutoFeed: true
 #    Script: >
 #      .@i = getpetinfo(PETINFO_INTIMATE);
-#      
+#
 #      if (.@i >= PET_INTIMATE_LOYAL) {
 #         bonus2 bAddClass,Class_Boss,5;
 #         bonus bPAtk,2;
@@ -2696,7 +2717,7 @@ Body:
 #    SpecialPerformance: false   # unknown
 #    Script: >
 #      .@i = getpetinfo(PETINFO_INTIMATE);
-#      
+#
 #      if (.@i >= PET_INTIMATE_LOYAL) {
 #         bonus bMatkRate,2;
 #         bonus bAtkRate,2;
@@ -2738,7 +2759,7 @@ Body:
 #    AllowAutoFeed: true
 #    Script: >
 #      .@i = getpetinfo(PETINFO_INTIMATE);
-#      
+#
 #      if (.@i >= PET_INTIMATE_LOYAL) {
 #         bonus2 bMagicAddClass,Class_Boss,5;
 #         bonus bSMatk,2;
@@ -2767,7 +2788,7 @@ Body:
 #    AllowAutoFeed: true
 #    Script: >
 #      .@i = getpetinfo(PETINFO_INTIMATE);
-#      
+#
 #      if (.@i >= PET_INTIMATE_LOYAL) {
 #         bonus bLongAtkRate,5;
 #         bonus bMaxSPrate,7;
@@ -2799,7 +2820,7 @@ Body:
     SpecialPerformance: false   # unknown
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if (.@i >= PET_INTIMATE_LOYAL) {
          bonus2 bResEff,Eff_Curse,2000;
          bonus bInt,5;
@@ -2819,7 +2840,7 @@ Body:
 #    AllowAutoFeed: true
 #    Script: >
 #      .@i = getpetinfo(PETINFO_INTIMATE);
-#      
+#
 #      if (.@i >= PET_INTIMATE_LOYAL) {
 #         bonus2 bMagicAtkEle,Ele_Dark,5;
 #         bonus bVariableCastrate,-5;
@@ -2857,7 +2878,7 @@ Body:
 #    AllowAutoFeed: true
 #    Script: >
 #      .@i = getpetinfo(PETINFO_INTIMATE);
-#      
+#
 #      if (.@i >= PET_INTIMATE_LOYAL) {
 #         bonus bMaxHPrate,5;
 #         bonus bVit,4;
@@ -2886,7 +2907,7 @@ Body:
 #    AllowAutoFeed: true
 #    Script: >
 #      .@i = getpetinfo(PETINFO_INTIMATE);
-#      
+#
 #      if (.@i >= PET_INTIMATE_LOYAL) {
 #         bonus bAspdRate,5;
 #         bonus bCritical,7;
@@ -2924,7 +2945,7 @@ Body:
 #    AllowAutoFeed: true
 #    Script: >
 #      .@i = getpetinfo(PETINFO_INTIMATE);
-#      
+#
 #      if (.@i >= PET_INTIMATE_LOYAL) {
 #         bonus bCRate,3;
 #         bonus bCritical,8;
@@ -2950,7 +2971,7 @@ Body:
 #    SpecialPerformance: false   # unknown
 #    Script: >
 #      .@i = getpetinfo(PETINFO_INTIMATE);
-#      
+#
 #      if (.@i >= PET_INTIMATE_LOYAL) {
 #         bonus bCritical,5;
 #         bonus bHit,10;
@@ -2971,7 +2992,7 @@ Body:
 #    SpecialPerformance: false   # unknown
 #    Script: >
 #      .@i = getpetinfo(PETINFO_INTIMATE);
-#      
+#
 #      if (.@i >= PET_INTIMATE_LOYAL) {
 #         bonus bMatkRate,2;
 #         bonus bAtkRate,2;
@@ -3013,7 +3034,7 @@ Body:
 #    AllowAutoFeed: true
 #    Script: >
 #      .@i = getpetinfo(PETINFO_INTIMATE);
-#      
+#
 #      if (.@i >= PET_INTIMATE_LOYAL) {
 #         bonus bAtkRate,3;
 #         bonus bPow,2;
@@ -3040,7 +3061,7 @@ Body:
 #    AllowAutoFeed: true
 #    Script: >
 #      .@i = getpetinfo(PETINFO_INTIMATE);
-#      
+#
 #      if (.@i >= PET_INTIMATE_LOYAL) {
 #         bonus bMatkRate,3;
 #         bonus bSpl,2;
@@ -3067,7 +3088,7 @@ Body:
 #    AllowAutoFeed: true
 #    Script: >
 #      .@i = getpetinfo(PETINFO_INTIMATE);
-#      
+#
 #      if (.@i >= PET_INTIMATE_LOYAL) {
 #         bonus2 bMagicAtkEle,Ele_Dark,7;
 #         bonus bSpeedRate,25;
@@ -3092,7 +3113,7 @@ Body:
 #    SpecialPerformance: false   # unknown
 #    Script: >
 #      .@i = getpetinfo(PETINFO_INTIMATE);
-#      
+#
 #      if (.@i >= PET_INTIMATE_LOYAL) {
 #         bonus bMaxHP,300;
 #         bonus bMaxSP,30;
@@ -3113,7 +3134,7 @@ Body:
 #    SpecialPerformance: false   # unknown
 #    Script: >
 #      .@i = getpetinfo(PETINFO_INTIMATE);
-#      
+#
 #      if (.@i >= PET_INTIMATE_LOYAL) {
 #         bonus bMRes,10;
 #         bonus bRes,10;
@@ -3133,7 +3154,7 @@ Body:
     SpecialPerformance: false   # unknown
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
-      
+
       if (.@i >= PET_INTIMATE_LOYAL) {
          bonus2 bMagicAtkEle,Ele_Wind,2;
          bonus bVariableCastrate,-2;
@@ -3165,7 +3186,7 @@ Body:
 #    SpecialPerformance: false   # unknown
 #    Script: >
 #      .@i = getpetinfo(PETINFO_INTIMATE);
-#      
+#
 #      if (.@i >= PET_INTIMATE_LOYAL) {
 #         bonus bBaseAtk,25;
 #         bonus bLuk,3;
@@ -3185,7 +3206,7 @@ Body:
 #    SpecialPerformance: false   # unknown
 #    Script: >
 #      .@i = getpetinfo(PETINFO_INTIMATE);
-#      
+#
 #      if (.@i >= PET_INTIMATE_LOYAL) {
 #         bonus bMatk,25;
 #         bonus bInt,3;
@@ -3206,7 +3227,7 @@ Body:
 #    AllowAutoFeed: true
 #    Script: >
 #      .@i = getpetinfo(PETINFO_INTIMATE);
-#      
+#
 #      if (.@i >= PET_INTIMATE_LOYAL) {
 #         bonus2 bMagicAtkEle,Ele_Wind,5;
 #         bonus bVariableCastrate,-5;
@@ -3244,7 +3265,7 @@ Body:
 #    AllowAutoFeed: true
 #    Script: >
 #      .@i = getpetinfo(PETINFO_INTIMATE);
-#      
+#
 #      if (.@i >= PET_INTIMATE_LOYAL) {
 #         bonus2 bAddClass,Class_Normal,7;
 #         bonus bNoSizeFix;

+ 19 - 13
doc/script_commands.txt

@@ -1,4 +1,4 @@
-//===== rAthena Documentation================================
+//===== rAthena Documentation================================
 //= rAthena Script Commands
 //===== By:==================================================
 //= rAthena Dev Team
@@ -10429,19 +10429,25 @@ This is still usable outside item scripts.
 
 ---------------------------------------
 
-*pet <pet id>;
-*catchpet <pet id>;
+*pet {<item_id>{,flag}};
+*catchpet {<item_id>{,flag}};
+
+This command is used in all the item scripts for taming items.
+Running this command will make the pet catching cursor appear on the client of the invoking character
+and the player can then attempt to catch a monster.
+
+If the item ID is not specified, the command will use the item ID from the invoking item script.
+It will also work outside of an item script, if the item ID is provided.
+
+The following constants can be used as <flag> parameter:
+
+	PET_CATCH_NORMAL:				Will attempt to catch the targeted monster as long as it is in the pet database and
+									the taming item corresponds with the required taming item in the pet database.
+									This is the default if <flag> is not specified.
+	PET_CATCH_UNIVERSAL_NO_BOSS:	Will attempt to catch the targeted monster as long as it is in the pet database and
+									does not have the MD_STATUS_IMMUNE monster mode.
+	PET_CATCH_UNIVERSAL_ALL:		Will attempt to catch the targeted monster as long as it is in the pet database.
 
-This command is used in all the item scripts for taming items. Running this
-command will make the pet catching cursor appear on the client connected to the
-invoking character, usable on the monsters with the specified pet ID number. It
-will still work outside an item script.
-If the <pet id> is PET_CATCH_UNIVERSAL the item will attempt to catch the targeted
-monster as long as it is in the pet database and does not have the MD_STATUS_IMMUNE
-monster mode.
-If the <pet id> is PET_CATCH_UNIVERSAL_ITEM the item will attempt to catch the targeted
-monster as long as it is in the pet database and the targeted monster requires the lure
-item used.
 See 'doc/mob_db_mode_list.txt' for more information about monster modes.
 
 A full list of pet IDs can be found inside 'db/(pre-)re/pet_db.yml'.

+ 0 - 1
src/map/atcommand.cpp

@@ -3170,7 +3170,6 @@ ACMD_FUNC(makeegg) {
 	if (pet != nullptr) {
 		std::shared_ptr<s_mob_db> mdb = mob_db.find(pet->class_);
 		if(mdb){
-			sd->catch_target_class = pet->class_;
 			if(intif_create_pet(sd->status.account_id, sd->status.char_id, pet->class_, mdb->lv, pet->EggID, 0, pet->intimate, 100, 0, 1, mdb->jname.c_str())){
 				res = 0;
 			} else {

+ 1 - 1
src/map/clif.cpp

@@ -14583,7 +14583,7 @@ void clif_parse_PetMenu(int32 fd, map_session_data *sd){
 /// Attempt to tame a monster (CZ_TRYCAPTURE_MONSTER).
 /// 019f <id>.L
 void clif_parse_CatchPet(int32 fd, map_session_data *sd){
-	pet_catch_process2(sd,RFIFOL(fd,packet_db[RFIFOW(fd,0)].pos[0]));
+	pet_catch_process_end(*sd,RFIFOL(fd,packet_db[RFIFOW(fd,0)].pos[0]));
 }
 
 

+ 0 - 5
src/map/pc.cpp

@@ -2225,8 +2225,6 @@ bool pc_authok(map_session_data *sd, uint32 login_id2, time_t expiration_time, i
 	sd->hatEffects = {};
 #endif
 
-	sd->catch_target_class = PET_CATCH_FAIL;
-
 	// Check EXP overflow, since in previous revision EXP on Max Level can be more than 'official' Max EXP
 	if (pc_is_maxbaselv(sd) && sd->status.base_exp > MAX_LEVEL_BASE_EXP) {
 		sd->status.base_exp = MAX_LEVEL_BASE_EXP;
@@ -6399,9 +6397,6 @@ int32 pc_useitem(map_session_data *sd,int32 n)
 
 	sd->itemid = item.nameid;
 	sd->itemindex = n;
-	if(sd->catch_target_class != PET_CATCH_FAIL) //Abort pet catching.
-		sd->catch_target_class = PET_CATCH_FAIL;
-
 	amount = item.amount;
 	script = id->script;
 	//Check if the item is to be consumed immediately [Skotlex]

+ 0 - 2
src/map/pc.hpp

@@ -693,8 +693,6 @@ public:
 	t_itemid itemid;
 	short itemindex;	//Used item's index in sd->inventory [Skotlex]
 
-	uint16 catch_target_class; // pet catching, stores a pet class to catch [zzo]
-
 	int8 spiritball, spiritball_old;
 	int32 spirit_timer[MAX_SPIRITBALL];
 	short spiritcharm; //No. of spirit

+ 92 - 65
src/map/pet.cpp

@@ -30,6 +30,13 @@
 
 using namespace rathena;
 
+struct s_pet_catch_process{
+	uint32 char_id;
+	t_itemid taming_item;
+	e_pet_catch_flag flag;
+};
+
+std::unordered_map<uint32, std::shared_ptr<s_pet_catch_process>> pet_catchprocesses;
 std::unordered_map<std::string, std::shared_ptr<s_pet_autobonus_wrapper>> pet_autobonuses;
 const t_tick MIN_PETTHINKTIME = 100;
 
@@ -674,7 +681,6 @@ bool pet_create_egg(map_session_data *sd, t_itemid item_id)
 	if (!pc_inventoryblank(sd))
 		return false; // Inventory full
 
-	sd->catch_target_class = pet->class_;
 	intif_create_pet(sd->status.account_id, sd->status.char_id, pet->class_, mdb->lv, pet->EggID, 0, pet->intimate, 100, 0, 1, mdb->jname.c_str());
 
 	return true;
@@ -1212,104 +1218,125 @@ int32 pet_select_egg(map_session_data *sd,short egg_index)
 /**
  * Display the success/failure roulette wheel when trying to catch monster.
  * @param sd : player requesting
- * @param target_class : monster ID of pet to catch
- * @return 0
+ * @param item_id : item ID of the taming item used
  */
-int32 pet_catch_process1(map_session_data *sd,int32 target_class)
-{
-	nullpo_ret(sd);
+void pet_catch_process_start( map_session_data& sd, t_itemid item_id, e_pet_catch_flag flag ){
+	if (map_getmapflag(sd.bl.m, MF_NOPETCAPTURE)) {
+		clif_displaymessage(sd.fd, msg_txt(&sd, 669)); // You can't catch any pet on this map.
+		return;
+	}
 
-	if (map_getmapflag(sd->bl.m, MF_NOPETCAPTURE)) {
-		clif_displaymessage(sd->fd, msg_txt(sd, 669)); // You can't catch any pet on this map.
-		return 0;
+	std::shared_ptr<s_pet_catch_process> process = util::umap_find( pet_catchprocesses, sd.status.char_id );
+
+	if( process == nullptr ){
+		process = std::make_shared<s_pet_catch_process>();
+		pet_catchprocesses[sd.status.char_id] = process;
+	}else{
+		// Reuse previously allocated memory and restart the process
 	}
 
-	sd->catch_target_class = target_class;
-	clif_catch_process( *sd );
+	process->char_id = sd.status.char_id;
+	process->taming_item = item_id;
+	process->flag = flag;
 
-	return 0;
+	clif_catch_process(sd);
 }
 
 /**
  * Begin the actual catching process of a monster.
  * @param sd : player requesting
  * @param target_id : monster ID of pet to catch
- * @return 0:success, 1:failure
  */
-int32 pet_catch_process2(map_session_data* sd, int32 target_id)
-{
-	struct mob_data* md;
-	int32 pet_catch_rate = 0;
+void pet_catch_process_end( map_session_data& sd, int32 target_id ){
+	std::shared_ptr<s_pet_catch_process> process = util::umap_find( pet_catchprocesses, sd.status.char_id );
 
-	nullpo_retr(1, sd);
+	if( process == nullptr ){
+		clif_pet_roulette(sd, false);
 
-	md = (struct mob_data*)map_id2bl(target_id);
+		return;
+	}
 
-	if(!md || md->bl.type != BL_MOB || md->bl.prev == nullptr) { // Invalid inputs/state, abort capture.
-		clif_pet_roulette( *sd, false );
-		sd->catch_target_class = PET_CATCH_FAIL;
-		sd->itemid = 0;
-		sd->itemindex = -1;
-		return 1;
+	mob_data* md = map_id2md( target_id );
+
+	if(md == nullptr || md->bl.prev == nullptr) { // Invalid inputs/state, abort capture.
+		clif_pet_roulette( sd, false );
+		pet_catchprocesses.erase( sd.status.char_id );
+
+		return;
 	}
 
-	if (map_getmapflag(sd->bl.m, MF_NOPETCAPTURE)) {
-		clif_pet_roulette( *sd, false );
-		sd->catch_target_class = PET_CATCH_FAIL;
-		sd->itemid = 0;
-		sd->itemindex = -1;
-		clif_displaymessage(sd->fd, msg_txt(sd, 669)); // You can't catch any pet on this map.
-		return 1;
+	if (map_getmapflag(sd.bl.m, MF_NOPETCAPTURE)) {
+		clif_pet_roulette( sd, false );
+		pet_catchprocesses.erase( sd.status.char_id );
+		clif_displaymessage(sd.fd, msg_txt(&sd, 669)); // You can't catch any pet on this map.
+
+		return;
 	}
 
 	//FIXME: delete taming item here, if this was an item-invoked capture and the item was flagged as delay-consume [ultramage]
 
 	std::shared_ptr<s_pet_db> pet = pet_db.find(md->mob_id);
 
-	// If the target is a valid pet, we have a few exceptions
-	if( pet ){
-		//catch_target_class == PET_CATCH_UNIVERSAL is used for universal lures (except bosses for now). [Skotlex]
-		if (sd->catch_target_class == PET_CATCH_UNIVERSAL && !status_has_mode(&md->status,MD_STATUSIMMUNE)){
-			sd->catch_target_class = md->mob_id;
-		//catch_target_class == PET_CATCH_UNIVERSAL_ITEM is used for catching any monster required the lure item used
-		}else if (sd->catch_target_class == PET_CATCH_UNIVERSAL_ITEM && sd->itemid == pet->itemID){
-			sd->catch_target_class = md->mob_id;
-		}
+	if (pet == nullptr) {
+		clif_pet_roulette(sd, false);
+		pet_catchprocesses.erase( sd.status.char_id );
+
+		return;
 	}
 
-	if(sd->catch_target_class != md->mob_id || !pet) {
-		clif_pet_roulette( *sd, false );
-		sd->catch_target_class = PET_CATCH_FAIL;
+	switch( process->flag ){
+		case PET_CATCH_NORMAL:
+			// If the taming item used is different from the taming item according to the pet database
+			if( process->taming_item != pet->itemID ){
+				clif_pet_roulette( sd, false );
+				pet_catchprocesses.erase( sd.status.char_id );
 
-		return 1;
+				return;
+			}
+			break;
+
+		case PET_CATCH_UNIVERSAL_NO_BOSS:
+			// PET_CATCH_UNIVERSAL_NO_BOSS is used for universal lures (except bosses for now).
+			if( status_has_mode( &md->status, MD_STATUSIMMUNE ) ){
+				clif_pet_roulette( sd, false );
+				pet_catchprocesses.erase( sd.status.char_id );
+
+				return;
+			}
+			break;
+
+		case PET_CATCH_UNIVERSAL_ALL:
+			// No checks, catch anything.
+			break;
 	}
 
-	if( battle_config.pet_distance_check && distance_bl( &sd->bl, &md->bl ) > battle_config.pet_distance_check ){
-		clif_pet_roulette( *sd, false );
-		sd->catch_target_class = PET_CATCH_FAIL;
+	if( battle_config.pet_distance_check && distance_bl( &sd.bl, &md->bl ) > battle_config.pet_distance_check ){
+		clif_pet_roulette(sd, false);
+		pet_catchprocesses.erase( sd.status.char_id );
 
-		return 1;
+		return;
 	}
 
-	if (!pc_inventoryblank(sd)) {
-		clif_pet_roulette(*sd, false);
-		sd->catch_target_class = PET_CATCH_FAIL;
-		clif_msg_color(sd, MSI_CANT_GET_ITEM_BECAUSE_COUNT, color_table[COLOR_RED]);
+	if (!pc_inventoryblank(&sd)) {
+		clif_pet_roulette(sd, false);
+		pet_catchprocesses.erase( sd.status.char_id );
+		clif_msg_color(&sd, MSI_CANT_GET_ITEM_BECAUSE_COUNT, color_table[COLOR_RED]);
 
-		return 1;
+		return;
 	}
 
 	status_change* tsc = status_get_sc( &md->bl );
 
 	if( battle_config.pet_hide_check && tsc && ( tsc->getSCE(SC_HIDING) || tsc->getSCE(SC_CLOAKING) || tsc->getSCE(SC_CAMOUFLAGE) || tsc->getSCE(SC_NEWMOON) || tsc->getSCE(SC_CLOAKINGEXCEED) ) ){
-		clif_pet_roulette( *sd, false );
-		sd->catch_target_class = PET_CATCH_FAIL;
+		clif_pet_roulette( sd, false );
+		pet_catchprocesses.erase( sd.status.char_id );
 
-		return 1;
+		return;
 	}
 
+	int32 pet_catch_rate = 0;
 	if( battle_config.pet_legacy_formula ){
-		pet_catch_rate = ( pet->capture + ( sd->status.base_level - md->level ) * 30 + sd->battle_status.luk * 20 ) * ( 200 - get_percentage( md->status.hp, md->status.max_hp ) ) / 100;
+		pet_catch_rate = ( pet->capture + ( sd.status.base_level - md->level ) * 30 + sd.battle_status.luk * 20 ) * ( 200 - get_percentage( md->status.hp, md->status.max_hp ) ) / 100;
 	}else{
 		pet_catch_rate = pet->capture + ( ( 100 - get_percentage( md->status.hp, md->status.max_hp ) ) * pet->capture ) / 100;
 	}
@@ -1321,20 +1348,21 @@ int32 pet_catch_process2(map_session_data* sd, int32 target_id)
 		pet_catch_rate = (pet_catch_rate*battle_config.pet_catch_rate)/100;
 
 	if(rnd_chance(pet_catch_rate, 10000)) {
-		achievement_update_objective(sd, AG_TAMING, 1, md->mob_id);
+		achievement_update_objective(&sd, AG_TAMING, 1, md->mob_id);
 		unit_remove_map(&md->bl,CLR_OUTSIGHT);
 		status_kill(&md->bl);
-		clif_pet_roulette( *sd, true );
+		clif_pet_roulette( sd, true );
 
 		std::shared_ptr<s_mob_db> mdb = mob_db.find(pet->class_);
 
-		intif_create_pet(sd->status.account_id, sd->status.char_id, pet->class_, mdb->lv, pet->EggID, 0, pet->intimate, 100, 0, 1, mdb->jname.c_str());
+		intif_create_pet(sd.status.account_id, sd.status.char_id, pet->class_, mdb->lv, pet->EggID, 0, pet->intimate, 100, 0, 1, mdb->jname.c_str());
 	} else {
-		clif_pet_roulette( *sd, false );
-		sd->catch_target_class = PET_CATCH_FAIL;
+		clif_pet_roulette( sd, false );
 	}
 
-	return 0;
+	pet_catchprocesses.erase( sd.status.char_id );
+
+	return;
 }
 
 /**
@@ -1365,7 +1393,6 @@ bool pet_get_egg(uint32 account_id, short pet_class, int32 pet_id ) {
 	// period of time it wasn't possible to know which kind of egg was being requested after
 	// the first request. [Panikon]
 	std::shared_ptr<s_pet_db> pet = pet_db.find(pet_class);
-	sd->catch_target_class = PET_CATCH_FAIL;
 
 	if(!pet) {
 		intif_delete_petdata(pet_id);

+ 7 - 6
src/map/pet.hpp

@@ -65,10 +65,11 @@ struct s_pet_db {
 
 enum e_pet_itemtype : uint8 { PET_CATCH,PET_EGG,PET_EQUIP,PET_FOOD };
 
-enum e_pet_catch : uint16 {
-	PET_CATCH_FAIL = 0, ///< A catch attempt failed
-	PET_CATCH_UNIVERSAL = 1, ///< The catch attempt is universal (ignoring MD_STATUS_IMMUNE/Boss)
-	PET_CATCH_UNIVERSAL_ITEM = 2,
+enum e_pet_catch_flag : uint8 {
+	PET_CATCH_NORMAL = 0,
+	PET_CATCH_UNIVERSAL_NO_BOSS, // The catch attempt is universal (ignoring MD_STATUS_IMMUNE/Boss)
+	PET_CATCH_UNIVERSAL_ALL,
+	PET_CATCH_MAX
 };
 
 enum e_pet_intimate_level : uint16 {
@@ -236,8 +237,8 @@ bool pet_return_egg( map_session_data *sd, struct pet_data *pd );
 int32 pet_birth_process(map_session_data *sd, struct s_pet *pet);
 int32 pet_recv_petdata(uint32 account_id,struct s_pet *p,int32 flag);
 int32 pet_select_egg(map_session_data *sd,short egg_index);
-int32 pet_catch_process1(map_session_data *sd,int32 target_class);
-int32 pet_catch_process2(map_session_data *sd,int32 target_id);
+void pet_catch_process_start( map_session_data& sd, t_itemid item_id, e_pet_catch_flag flag );
+void pet_catch_process_end( map_session_data& sd, int32 target_id );
 bool pet_get_egg(uint32 account_id, short pet_class, int32 pet_id);
 int32 pet_menu(map_session_data *sd,int32 menunum);
 int32 pet_change_name(map_session_data *sd,char *name);

+ 41 - 11
src/map/script.cpp

@@ -11003,8 +11003,6 @@ BUILDIN_FUNC(makepet)
 		return SCRIPT_CMD_FAILURE;
 	}
 
-	sd->catch_target_class = mob_id;
-
 	std::shared_ptr<s_mob_db> mdb = mob_db.find(pet->class_);
 
 	intif_create_pet( sd->status.account_id, sd->status.char_id, pet->class_, mdb->lv, pet->EggID, 0, pet->intimate, 100, 0, 1, mdb->jname.c_str() );
@@ -12526,19 +12524,51 @@ BUILDIN_FUNC( errormes ){
 	return SCRIPT_CMD_SUCCESS;
 }
 
-/*==========================================
- *------------------------------------------*/
+/**
+ * Attempts to catch a pet with the lure item.
+ * pet {<item_id>{,flag}}
+ * catchpet {<item_id>{,flag}}
+*/
 BUILDIN_FUNC(catchpet)
 {
-	int32 pet_id;
-	TBL_PC *sd;
+	const char* command = script_getfuncname(st);
+	map_session_data* sd;
 
 	if( !script_rid2sd(sd) )
-		return SCRIPT_CMD_SUCCESS;
+		return SCRIPT_CMD_FAILURE;
+
+	t_itemid lure_id;
+	if( script_hasdata( st, 2 ) ){
+		lure_id = script_getnum( st, 2 );
+
+		std::shared_ptr<item_data> id = item_db.find( lure_id );
+
+		if (id == nullptr) {
+			ShowError( "buildin_%s: Invalid lure item ID %d.\n", command, lure_id );
+			return SCRIPT_CMD_FAILURE;
+		}
+	}else{
+		if( sd->itemid == 0 ){
+			ShowError( "buildin_%s: Called outside of an item script without item id.\n", command );
+			return SCRIPT_CMD_FAILURE;
+		}
+
+		lure_id = sd->itemid;
+	}
+
+	e_pet_catch_flag flag = PET_CATCH_NORMAL;
+
+	if( script_hasdata( st, 3 ) ){
+		int32 val = script_getnum( st, 3 );
 
-	pet_id= script_getnum(st,2);
+		if( val < PET_CATCH_NORMAL || val >= PET_CATCH_MAX ){
+			ShowError( "buildin_%s: Invalid value '%d' for flag.\n", command, val );
+		}
+
+		flag = static_cast<e_pet_catch_flag>( val );
+	}
 
-	pet_catch_process1(sd,pet_id);
+	pet_catch_process_start( *sd, lure_id, flag );
 	return SCRIPT_CMD_SUCCESS;
 }
 
@@ -27691,9 +27721,9 @@ struct script_function buildin_func[] = {
 	BUILDIN_DEF(getscrate,"ii?"),
 	BUILDIN_DEF(debugmes,"s"),
 	BUILDIN_DEF(errormes,"s"),
-	BUILDIN_DEF2(catchpet,"pet","i"),
+	BUILDIN_DEF2(catchpet,"pet","??"),
 	BUILDIN_DEF2(birthpet,"bpet",""),
-	BUILDIN_DEF(catchpet,"i"),
+	BUILDIN_DEF(catchpet,"??"),
 	BUILDIN_DEF(birthpet,""),
 	BUILDIN_DEF(resetlvl,"i?"),
 	BUILDIN_DEF(resetstatus,"?"),

+ 5 - 2
src/map/script_constants.hpp

@@ -9732,8 +9732,11 @@
 	export_constant(HAT_EF_AURA_OF_GHOST_S);
 
 	/* pet catch */
-	export_constant(PET_CATCH_UNIVERSAL);
-	export_constant(PET_CATCH_UNIVERSAL_ITEM);
+	export_constant(PET_CATCH_UNIVERSAL_NO_BOSS);
+	export_constant(PET_CATCH_UNIVERSAL_ALL);
+
+	export_deprecated_constant3("PET_CATCH_UNIVERSAL", PET_CATCH_UNIVERSAL_NO_BOSS, "PET_CATCH_UNIVERSAL_NO_BOSS");
+	export_deprecated_constant3("PET_CATCH_UNIVERSAL_ITEM", PET_CATCH_UNIVERSAL_ALL, "PET_CATCH_UNIVERSAL_ALL");
 
 	/* pet intimacy levels */
 	export_constant(PET_INTIMATE_NONE);

+ 2 - 2
src/map/skill.cpp

@@ -7671,8 +7671,8 @@ int32 skill_castend_nodamage_id (struct block_list *src, struct block_list *bl,
 		break;
 	case SA_TAMINGMONSTER:
 		clif_skill_nodamage(src,*bl,skill_id,skill_lv);
-		if (sd && dstmd && pet_db.find(dstmd->mob_id)) {
-			pet_catch_process1(sd, dstmd->mob_id);
+		if (sd != nullptr && dstmd != nullptr) {
+			pet_catch_process_start( *sd, 0, PET_CATCH_UNIVERSAL_ALL );
 		}
 		break;