Преглед изворни кода

* Follow up 40f7014
* Item bonus 'bAddClassDropItem' renamed to 'bAddMonsterIdDropItem'
* Added 2 new item bonuses: bonus3 bAddClassDropItem,n,x,y; & bonus3 bAddClassDropItemGroup,n,x,y; ( see doc/item_bonus.txt )
* Fixed Bug: http://rathena.org/board/tracker/issue-8439-bonus3-baddmonsterdropitem-not-specified-on-one-item%EF%BC%81/

Lilith пре 11 година
родитељ
комит
32713b9526
11 измењених фајлова са 56 додато и 35 уклоњено
  1. 3 1
      db/const.txt
  2. 2 2
      db/pre-re/item_db.txt
  3. 5 5
      db/re/item_db.txt
  4. 11 1
      doc/item_bonus.txt
  5. 2 2
      sql-files/item_db.sql
  6. 5 5
      sql-files/item_db_re.sql
  7. 1 1
      src/map/battle.c
  8. 3 2
      src/map/map.h
  9. 2 2
      src/map/mob.c
  10. 20 12
      src/map/pc.c
  11. 2 2
      src/map/skill.c

+ 3 - 1
db/const.txt

@@ -614,7 +614,7 @@ bAddSkillBlow	2041
 bSPVanishRate	2042
 bMagicSPGainValue	2043
 bMagicHPGainValue	2044
-bAddClassDropItem	2045
+bAddMonsterIdDropItem	2045
 bMatk	2046
 bSPGainRaceAttack	2047
 bHPGainRaceAttack	2048
@@ -642,6 +642,8 @@ bMagicAddClass	2066
 bWeaponComaClass	2067
 bIgnoreMdefClassRate	2068
 bExpAddClass	2069
+bAddClassDropItem	2070
+bAddClassDropItemGroup	2071
 
 EQI_HEAD_TOP	1
 EQI_ARMOR	2

+ 2 - 2
db/pre-re/item_db.txt

@@ -1614,8 +1614,8 @@
 //2793,Ring_Of_Resonance_I,Ring of Resonance,4,0,,0,,2,,0,0x00CFFF80,2,2,136,,0,0,0,{ bonus bAgi,2; bonus bVit,1; bonus bMdef,2; bonus4 bAutoSpellWhenHit,"WZ_QUAGMIRE",1,50,0; bonus3 bAutoSpellWhenHit,"AS_SPLASHER",10,20; bonus3 bAutoSpellWhenHit,"AL_HEAL",10,30; bonus3 bAutoSpellWhenHit,"HP_ASSUMPTIO",3,20; bonus3 bAutoSpellWhenHit,"CG_TAROTCARD",5,20; },{},{}
 2794,Magic_Stone_Ring,Magic Stone Ring,4,0,,0,,0,,1,0x00004082,7,2,136,,99,0,0,{ bonus bStr,2; },{},{}
 2795,Green_Apple_Ring,Green Apple Ring,4,0,,0,,0,,0,0xFFFFFFFE,7,2,136,,99,0,0,{ bonus bAllStats,6; if(JobLevel <30) { bonus bAllStats,(JobLevel/5); } },{},{}
-2796,Magical_Stone,Rocks,4,0,,200,,0,,0,0x00810204,7,2,136,,99,0,0,{ bonus2 bAddDamageClass,2047,10; bonus2 bAddDefMonster,2048,-10; bonus3 bAddClassDropItem,6152,2047,70; },{},{}
-2797,Magical_Stone_,Rocks,4,0,,200,,0,,0,0x00810204,7,2,136,,99,0,0,{ bonus2 bAddDamageClass,2049,10; bonus2 bAddDefMonster,2050,-10; bonus3 bAddClassDropItem,6151,2049,70; },{},{}
+2796,Magical_Stone,Rocks,4,0,,200,,0,,0,0x00810204,7,2,136,,99,0,0,{ bonus2 bAddDamageClass,2047,10; bonus2 bAddDefMonster,2048,-10; bonus3 bAddMonsterIdDropItem,6152,2047,70; },{},{}
+2797,Magical_Stone_,Rocks,4,0,,200,,0,,0,0x00810204,7,2,136,,99,0,0,{ bonus2 bAddDamageClass,2049,10; bonus2 bAddDefMonster,2050,-10; bonus3 bAddMonsterIdDropItem,6151,2049,70; },{},{}
 2798,Will_Of_Exhausted_Angel,Will Of Exhausted Angel,4,0,,200,,0,,0,0x00008100,7,2,136,,99,0,0,{ if(strcharinfo(3)=="job3_arch02") { bonus2 bAddDefMonster,1761,50; bonus2 bAddDefMonster,1762,50; } },{},{}
 2799,Kuirpenring,Kuirpenring,4,0,,100,,0,,1,0xFFFFFFFF,7,2,136,,0,0,0,{ bonus bMdef,1; },{},{}
 2819,Swordman_Manual,Swordsman Manual,4,0,,100,,0,,0,0x00000001,7,2,136,,1,0,0,{ bonus bMaxSP,100; skill "SM_BASH",1; skill "SM_PROVOKE",1; skill "SM_MAGNUM",1; },{},{}

+ 5 - 5
db/re/item_db.txt

@@ -1838,8 +1838,8 @@
 2793,Ring_Of_Resonance_I,Ring of Resonance,4,0,,0,,2,,0,0x00CFFF80,18,2,136,,0,0,0,{ bonus bAgi,2; bonus bVit,1; bonus bMdef,2; bonus4 bAutoSpellWhenHit,"WZ_QUAGMIRE",1,50,0; bonus3 bAutoSpellWhenHit,"AS_SPLASHER",10,20; bonus3 bAutoSpellWhenHit,"AL_HEAL",10,30; bonus3 bAutoSpellWhenHit,"HP_ASSUMPTIO",3,20; bonus3 bAutoSpellWhenHit,"CG_TAROTCARD",5,20; },{},{}
 2794,Magic_Stone_Ring,Magic Stone Ring,4,0,,0,,0,,1,0x00000080,63,2,136,,99,0,0,{ bonus bStr,2; },{},{}
 2795,Green_Apple_Ring,Green Apple Ring,4,0,,0,,0,,0,0xFFFFFFFE,63,2,136,,99,0,0,{ if(JobLevel<30) { bonus bAllStats,6-(JobLevel/5); } },{},{}
-2796,Magical_Stone,Rocks,4,0,,200,,0,,0,0x00810204,63,2,136,,99,0,0,{ bonus2 bAddDamageClass,2047,10; bonus2 bAddDefMonster,2048,-10; bonus3 bAddClassDropItem,6152,2047,70; },{},{}
-2797,Magical_Stone_,Rocks,4,0,,200,,0,,0,0x00810204,63,2,136,,99,0,0,{ bonus2 bAddDamageClass,2049,10; bonus2 bAddDefMonster,2050,-10; bonus3 bAddClassDropItem,6151,2049,70; },{},{}
+2796,Magical_Stone,Rocks,4,0,,200,,0,,0,0x00810204,63,2,136,,99,0,0,{ bonus2 bAddDamageClass,2047,10; bonus2 bAddDefMonster,2048,-10; bonus3 bAddMonsterIdDropItem,6152,2047,70; },{},{}
+2797,Magical_Stone_,Rocks,4,0,,200,,0,,0,0x00810204,63,2,136,,99,0,0,{ bonus2 bAddDamageClass,2049,10; bonus2 bAddDefMonster,2050,-10; bonus3 bAddMonsterIdDropItem,6151,2049,70; },{},{}
 2798,Will_Of_Exhausted_Angel,Will Of Exhausted Angel,4,0,,200,,0,,0,0x00008100,63,2,136,,99,0,0,{ if(strcharinfo(3)=="job3_arch02") { bonus2 bAddDefMonster,1761,50; bonus2 bAddDefMonster,1762,50; } },{},{}
 2799,Kuirpenring,Kuirpenring,4,0,,100,,0,,1,0xFFFFFFFF,63,2,136,,0,0,0,{ bonus bMdef,1; },{},{}
 2800,Accelerator,Accelerator,4,100000,,100,,0,,1,0x00000400,56,2,136,,99,0,0,{ bonus bAgi,2; },{},{}
@@ -1858,9 +1858,9 @@
 2813,Freyja_SBracelet60,Freyja's Spirit Bracelet,4,20,,200,,1,,0,0xFFFFFFFF,63,2,136,,20,0,0,{ bonus bAllStats,1; },{},{}
 2814,Freyja_SBracelet90,Freyja's Spirit Bracelet,4,20,,200,,1,,0,0xFFFFFFFF,63,2,136,,20,0,0,{ bonus bAllStats,1; },{},{}
 2815,Th_Ring_Of_Water,Ring Of Water,4,20,,10,,0,,0,0xFFFFFFFF,63,2,136,,0,0,0,{ bonus bAllStats,1; bonus bMdef,2; },{},{}
-2816,Radar_Ring1,Radar Ring,4,0,,0,,0,,0,0xFFFFFFFF,63,2,136,,0,0,0,{ bonus3 bAddClassDropItem,6206,1002,400; bonus3 bAddClassDropItem,6207,1161,400; bonus3 bAddClassDropItem,6208,1153,400; },{},{}
-2817,Radar_Ring2,Radar Ring,4,0,,0,,0,,0,0xFFFFFFFF,63,2,136,,0,0,0,{ bonus3 bAddClassDropItem,6206,1026,400; bonus3 bAddClassDropItem,6207,1197,400; bonus3 bAddClassDropItem,6208,1504,400; },{},{}
-2818,Radar_Ring3,Radar Ring,4,0,,0,,0,,0,0xFFFFFFFF,63,2,136,,0,0,0,{ bonus3 bAddClassDropItem,6206,1508,400; bonus3 bAddClassDropItem,6207,1098,400; bonus3 bAddClassDropItem,6208,1315,400; },{},{}
+2816,Radar_Ring1,Radar Ring,4,0,,0,,0,,0,0xFFFFFFFF,63,2,136,,0,0,0,{ bonus3 bAddMonsterIdDropItem,6206,1002,400; bonus3 bAddMonsterIdDropItem,6207,1161,400; bonus3 bAddMonsterIdDropItem,6208,1153,400; },{},{}
+2817,Radar_Ring2,Radar Ring,4,0,,0,,0,,0,0xFFFFFFFF,63,2,136,,0,0,0,{ bonus3 bAddMonsterIdDropItem,6206,1026,400; bonus3 bAddMonsterIdDropItem,6207,1197,400; bonus3 bAddMonsterIdDropItem,6208,1504,400; },{},{}
+2818,Radar_Ring3,Radar Ring,4,0,,0,,0,,0,0xFFFFFFFF,63,2,136,,0,0,0,{ bonus3 bAddMonsterIdDropItem,6206,1508,400; bonus3 bAddMonsterIdDropItem,6207,1098,400; bonus3 bAddMonsterIdDropItem,6208,1315,400; },{},{}
 2819,Swordman_Manual,Swordsman Manual,4,0,,100,,0,,0,0x00000001,63,2,136,,1,0,0,{ bonus bMaxSP,100; skill "SM_BASH",1; skill "SM_PROVOKE",1; skill "SM_MAGNUM",1; },{},{}
 2820,Thief_Manual,Thief Manual,4,0,,100,,0,,0,0x00000001,63,2,136,,1,0,0,{ bonus bMaxSP,100; skill "TF_DOUBLE",3; bonus bDoubleRate,15; skill "TF_STEAL",1; skill "TF_HIDING",1; skill "TF_POISON",1; },{},{}
 2821,Acolyte_Manual,Acolyte Manual,4,0,,100,,0,,0,0x00000001,63,2,136,,1,0,0,{ bonus bMaxSP,100; skill "AL_HEAL",1; skill "AL_INCAGI",1; skill "AL_BLESSING",1; },{},{}

+ 11 - 1
doc/item_bonus.txt

@@ -377,7 +377,7 @@ bonus2 bSPDrainValueRace,r,n;		Heals +n SP when attacking a monster of race r wi
 bonus bMagicSPGainValue,n;		Heals +n SP when killing an enemy with magic attack.
 bonus bMagicHPGainValue,n;		Heals +n HP when killing an enemy with magic attack.
 
-bonus3 bAddClassDropItem,s,x,n;		Adds an n/100% chance of dropping item s when killing monster class x.
+bonus3 bAddMonsterIdDropItem,s,x,n;		Adds an n/100% chance of dropping item s when killing monster id x.
 
 bonus2 bHPGainRaceAttack,x,n;		Heals n HP when attacking x Race on every hit
 bonus2 bSPGainRaceAttack,x,n;		Heals n SP when attacking x Race on every hit
@@ -420,3 +420,13 @@ bonus2 bIgnoreMdefClassRate,n,x;	Disregard x% of the target's MDEF if the target
 										n: 	Class_Normal, Class_Boss, Class_Guardian, Class_All
 bonus2 bExpAddClass,n,x;			Increase exp gained by x% vs. enemies of class n
 										n: 	Class_Normal, Class_Boss, Class_Guardian, Class_All
+
+bonus3 bAddClassDropItem,n,x,y;	Adds a y/100% chance for item n to be dropped, when killing any monster of class x.
+						x: Class_Normal, Class_Boss, Class_Guardian, Class_All
+					If 'y' is negative value, then it's a part of formula
+						chance = -y*(killed_mob_level/10)+1
+
+bonus3 bAddClassDropItemGroup,n,x,y;	Adds a y/100% chance to get an item of group type n when you kill a monster of class x (Check db/item_group_db.txt)
+						x: Class_Normal, Class_Boss, Class_Guardian, Class_All
+					If 'y' is negative value, then it's a part of formula
+						chance = -y*(killed_mob_level/10)+1

+ 2 - 2
sql-files/item_db.sql

@@ -1645,8 +1645,8 @@ REPLACE INTO `item_db` VALUES (2791,'Just_Got_Fish','Fresh Fish',4,20,NULL,500,N
 #REPLACE INTO `item_db` VALUES (2793,'Ring_Of_Resonance_I','Ring of Resonance',4,0,NULL,0,NULL,2,NULL,0,0x00CFFF80,2,2,136,NULL,0,0,0,'bonus bAgi,2; bonus bVit,1; bonus bMdef,2; bonus4 bAutoSpellWhenHit,"WZ_QUAGMIRE",1,50,0; bonus3 bAutoSpellWhenHit,"AS_SPLASHER",10,20; bonus3 bAutoSpellWhenHit,"AL_HEAL",10,30; bonus3 bAutoSpellWhenHit,"HP_ASSUMPTIO",3,20; bonus3 bAutoSpellWhenHit,"CG_TAROTCARD",5,20;',NULL,NULL);
 REPLACE INTO `item_db` VALUES (2794,'Magic_Stone_Ring','Magic Stone Ring',4,0,NULL,0,NULL,0,NULL,1,0x00004082,7,2,136,NULL,99,0,0,'bonus bStr,2;',NULL,NULL);
 REPLACE INTO `item_db` VALUES (2795,'Green_Apple_Ring','Green Apple Ring',4,0,NULL,0,NULL,0,NULL,0,0xFFFFFFFE,7,2,136,NULL,99,0,0,'bonus bAllStats,6; if(JobLevel <30) { bonus bAllStats,(JobLevel/5); }',NULL,NULL);
-REPLACE INTO `item_db` VALUES (2796,'Magical_Stone','Rocks',4,0,NULL,200,NULL,0,NULL,0,0x00810204,7,2,136,NULL,99,0,0,'bonus2 bAddDamageClass,2047,10; bonus2 bAddDefMonster,2048,-10; bonus3 bAddClassDropItem,6152,2047,70;',NULL,NULL);
-REPLACE INTO `item_db` VALUES (2797,'Magical_Stone_','Rocks',4,0,NULL,200,NULL,0,NULL,0,0x00810204,7,2,136,NULL,99,0,0,'bonus2 bAddDamageClass,2049,10; bonus2 bAddDefMonster,2050,-10; bonus3 bAddClassDropItem,6151,2049,70;',NULL,NULL);
+REPLACE INTO `item_db` VALUES (2796,'Magical_Stone','Rocks',4,0,NULL,200,NULL,0,NULL,0,0x00810204,7,2,136,NULL,99,0,0,'bonus2 bAddDamageClass,2047,10; bonus2 bAddDefMonster,2048,-10; bonus3 bAddMonsterIdDropItem,6152,2047,70;',NULL,NULL);
+REPLACE INTO `item_db` VALUES (2797,'Magical_Stone_','Rocks',4,0,NULL,200,NULL,0,NULL,0,0x00810204,7,2,136,NULL,99,0,0,'bonus2 bAddDamageClass,2049,10; bonus2 bAddDefMonster,2050,-10; bonus3 bAddMonsterIdDropItem,6151,2049,70;',NULL,NULL);
 REPLACE INTO `item_db` VALUES (2798,'Will_Of_Exhausted_Angel','Will Of Exhausted Angel',4,0,NULL,200,NULL,0,NULL,0,0x00008100,7,2,136,NULL,99,0,0,'if(strcharinfo(3)=="job3_arch02") { bonus2 bAddDefMonster,1761,50; bonus2 bAddDefMonster,1762,50; }',NULL,NULL);
 REPLACE INTO `item_db` VALUES (2799,'Kuirpenring','Kuirpenring',4,0,NULL,100,NULL,0,NULL,1,0xFFFFFFFF,7,2,136,NULL,0,0,0,'bonus bMdef,1;',NULL,NULL);
 REPLACE INTO `item_db` VALUES (2819,'Swordman_Manual','Swordsman Manual',4,0,NULL,100,NULL,0,NULL,0,0x00000001,7,2,136,NULL,1,0,0,'bonus bMaxSP,100; skill "SM_BASH",1; skill "SM_PROVOKE",1; skill "SM_MAGNUM",1;',NULL,NULL);

+ 5 - 5
sql-files/item_db_re.sql

@@ -1869,8 +1869,8 @@ REPLACE INTO `item_db_re` VALUES (2792,'Ring_Of_Flame_Lord_I','Ring of Flame Lor
 REPLACE INTO `item_db_re` VALUES (2793,'Ring_Of_Resonance_I','Ring of Resonance',4,0,NULL,0,NULL,2,NULL,0,0x00CFFF80,18,2,136,NULL,'0',0,0,'bonus bAgi,2; bonus bVit,1; bonus bMdef,2; bonus4 bAutoSpellWhenHit,"WZ_QUAGMIRE",1,50,0; bonus3 bAutoSpellWhenHit,"AS_SPLASHER",10,20; bonus3 bAutoSpellWhenHit,"AL_HEAL",10,30; bonus3 bAutoSpellWhenHit,"HP_ASSUMPTIO",3,20; bonus3 bAutoSpellWhenHit,"CG_TAROTCARD",5,20;',NULL,NULL);
 REPLACE INTO `item_db_re` VALUES (2794,'Magic_Stone_Ring','Magic Stone Ring',4,0,NULL,0,NULL,0,NULL,1,0x00000080,63,2,136,NULL,'99',0,0,'bonus bStr,2;',NULL,NULL);
 REPLACE INTO `item_db_re` VALUES (2795,'Green_Apple_Ring','Green Apple Ring',4,0,NULL,0,NULL,0,NULL,0,0xFFFFFFFE,63,2,136,NULL,'99',0,0,'if(JobLevel<30) { bonus bAllStats,6-(JobLevel/5); }',NULL,NULL);
-REPLACE INTO `item_db_re` VALUES (2796,'Magical_Stone','Rocks',4,0,NULL,200,NULL,0,NULL,0,0x00810204,63,2,136,NULL,'99',0,0,'bonus2 bAddDamageClass,2047,10; bonus2 bAddDefMonster,2048,-10; bonus3 bAddClassDropItem,6152,2047,70;',NULL,NULL);
-REPLACE INTO `item_db_re` VALUES (2797,'Magical_Stone_','Rocks',4,0,NULL,200,NULL,0,NULL,0,0x00810204,63,2,136,NULL,'99',0,0,'bonus2 bAddDamageClass,2049,10; bonus2 bAddDefMonster,2050,-10; bonus3 bAddClassDropItem,6151,2049,70;',NULL,NULL);
+REPLACE INTO `item_db_re` VALUES (2796,'Magical_Stone','Rocks',4,0,NULL,200,NULL,0,NULL,0,0x00810204,63,2,136,NULL,'99',0,0,'bonus2 bAddDamageClass,2047,10; bonus2 bAddDefMonster,2048,-10; bonus3 bAddMonsterIdDropItem,6152,2047,70;',NULL,NULL);
+REPLACE INTO `item_db_re` VALUES (2797,'Magical_Stone_','Rocks',4,0,NULL,200,NULL,0,NULL,0,0x00810204,63,2,136,NULL,'99',0,0,'bonus2 bAddDamageClass,2049,10; bonus2 bAddDefMonster,2050,-10; bonus3 bAddMonsterIdDropItem,6151,2049,70;',NULL,NULL);
 REPLACE INTO `item_db_re` VALUES (2798,'Will_Of_Exhausted_Angel','Will Of Exhausted Angel',4,0,NULL,200,NULL,0,NULL,0,0x00008100,63,2,136,NULL,'99',0,0,'if(strcharinfo(3)=="job3_arch02") { bonus2 bAddDefMonster,1761,50; bonus2 bAddDefMonster,1762,50; }',NULL,NULL);
 REPLACE INTO `item_db_re` VALUES (2799,'Kuirpenring','Kuirpenring',4,0,NULL,100,NULL,0,NULL,1,0xFFFFFFFF,63,2,136,NULL,'0',0,0,'bonus bMdef,1;',NULL,NULL);
 REPLACE INTO `item_db_re` VALUES (2800,'Accelerator','Accelerator',4,100000,NULL,100,NULL,0,NULL,1,0x00000400,56,2,136,NULL,'99',0,0,'bonus bAgi,2;',NULL,NULL);
@@ -1889,9 +1889,9 @@ REPLACE INTO `item_db_re` VALUES (2812,'Freyja_SBracelet30','Freyja\'s Spirit Br
 REPLACE INTO `item_db_re` VALUES (2813,'Freyja_SBracelet60','Freyja\'s Spirit Bracelet',4,20,NULL,200,NULL,1,NULL,0,0xFFFFFFFF,63,2,136,NULL,'20',0,0,'bonus bAllStats,1;',NULL,NULL);
 REPLACE INTO `item_db_re` VALUES (2814,'Freyja_SBracelet90','Freyja\'s Spirit Bracelet',4,20,NULL,200,NULL,1,NULL,0,0xFFFFFFFF,63,2,136,NULL,'20',0,0,'bonus bAllStats,1;',NULL,NULL);
 REPLACE INTO `item_db_re` VALUES (2815,'Th_Ring_Of_Water','Ring Of Water',4,20,NULL,10,NULL,0,NULL,0,0xFFFFFFFF,63,2,136,NULL,'0',0,0,'bonus bAllStats,1; bonus bMdef,2;',NULL,NULL);
-REPLACE INTO `item_db_re` VALUES (2816,'Radar_Ring1','Radar Ring',4,0,NULL,0,NULL,0,NULL,0,0xFFFFFFFF,63,2,136,NULL,'0',0,0,'bonus3 bAddClassDropItem,6206,1002,400; bonus3 bAddClassDropItem,6207,1161,400; bonus3 bAddClassDropItem,6208,1153,400;',NULL,NULL);
-REPLACE INTO `item_db_re` VALUES (2817,'Radar_Ring2','Radar Ring',4,0,NULL,0,NULL,0,NULL,0,0xFFFFFFFF,63,2,136,NULL,'0',0,0,'bonus3 bAddClassDropItem,6206,1026,400; bonus3 bAddClassDropItem,6207,1197,400; bonus3 bAddClassDropItem,6208,1504,400;',NULL,NULL);
-REPLACE INTO `item_db_re` VALUES (2818,'Radar_Ring3','Radar Ring',4,0,NULL,0,NULL,0,NULL,0,0xFFFFFFFF,63,2,136,NULL,'0',0,0,'bonus3 bAddClassDropItem,6206,1508,400; bonus3 bAddClassDropItem,6207,1098,400; bonus3 bAddClassDropItem,6208,1315,400;',NULL,NULL);
+REPLACE INTO `item_db_re` VALUES (2816,'Radar_Ring1','Radar Ring',4,0,NULL,0,NULL,0,NULL,0,0xFFFFFFFF,63,2,136,NULL,'0',0,0,'bonus3 bAddMonsterIdDropItem,6206,1002,400; bonus3 bAddMonsterIdDropItem,6207,1161,400; bonus3 bAddMonsterIdDropItem,6208,1153,400;',NULL,NULL);
+REPLACE INTO `item_db_re` VALUES (2817,'Radar_Ring2','Radar Ring',4,0,NULL,0,NULL,0,NULL,0,0xFFFFFFFF,63,2,136,NULL,'0',0,0,'bonus3 bAddMonsterIdDropItem,6206,1026,400; bonus3 bAddMonsterIdDropItem,6207,1197,400; bonus3 bAddMonsterIdDropItem,6208,1504,400;',NULL,NULL);
+REPLACE INTO `item_db_re` VALUES (2818,'Radar_Ring3','Radar Ring',4,0,NULL,0,NULL,0,NULL,0,0xFFFFFFFF,63,2,136,NULL,'0',0,0,'bonus3 bAddMonsterIdDropItem,6206,1508,400; bonus3 bAddMonsterIdDropItem,6207,1098,400; bonus3 bAddMonsterIdDropItem,6208,1315,400;',NULL,NULL);
 REPLACE INTO `item_db_re` VALUES (2819,'Swordman_Manual','Swordsman Manual',4,0,NULL,100,NULL,0,NULL,0,0x00000001,63,2,136,NULL,'1',0,0,'bonus bMaxSP,100; skill "SM_BASH",1; skill "SM_PROVOKE",1; skill "SM_MAGNUM",1;',NULL,NULL);
 REPLACE INTO `item_db_re` VALUES (2820,'Thief_Manual','Thief Manual',4,0,NULL,100,NULL,0,NULL,0,0x00000001,63,2,136,NULL,'1',0,0,'bonus bMaxSP,100; skill "TF_DOUBLE",3; bonus bDoubleRate,15; skill "TF_STEAL",1; skill "TF_HIDING",1; skill "TF_POISON",1;',NULL,NULL);
 REPLACE INTO `item_db_re` VALUES (2821,'Acolyte_Manual','Acolyte Manual',4,0,NULL,100,NULL,0,NULL,0,0x00000001,63,2,136,NULL,'1',0,0,'bonus bMaxSP,100; skill "AL_HEAL",1; skill "AL_INCAGI",1; skill "AL_BLESSING",1;',NULL,NULL);

+ 1 - 1
src/map/battle.c

@@ -3128,7 +3128,7 @@ static int battle_calc_attack_skill_ratio(struct Damage wd, struct block_list *s
 			break;
 		case GS_BULLSEYE:
 			//Only works well against brute/demihumans non bosses.
-			if((tstatus->race == RC_BRUTE || tstatus->race == RC_DEMIHUMAN)
+			if((tstatus->race == RC_BRUTE || tstatus->race == RC_DEMIHUMAN || tstatus->race == RC_PLAYER)
 				&& !(tstatus->mode&MD_BOSS))
 				skillratio += 400;
 			break;

+ 3 - 2
src/map/map.h

@@ -450,14 +450,15 @@ enum _sp {
 	SP_SP_GAIN_RACE, SP_SUBRACE2, SP_UNBREAKABLE_SHOES,	// 2031-2033
 	SP_UNSTRIPABLE_WEAPON,SP_UNSTRIPABLE_ARMOR,SP_UNSTRIPABLE_HELM,SP_UNSTRIPABLE_SHIELD,  // 2034-2037
 	SP_INTRAVISION, SP_ADD_MONSTER_DROP_ITEMGROUP, SP_SP_LOSS_RATE, // 2038-2040
-	SP_ADD_SKILL_BLOW, SP_SP_VANISH_RATE, SP_MAGIC_SP_GAIN_VALUE, SP_MAGIC_HP_GAIN_VALUE, SP_ADD_CLASS_DROP_ITEM, //2041-2045
+	SP_ADD_SKILL_BLOW, SP_SP_VANISH_RATE, SP_MAGIC_SP_GAIN_VALUE, SP_MAGIC_HP_GAIN_VALUE, SP_ADD_MONSTER_ID_DROP_ITEM, //2041-2045
 	SP_EMATK, SP_SP_GAIN_RACE_ATTACK, SP_HP_GAIN_RACE_ATTACK, SP_SKILL_USE_SP_RATE, //2046-2049
 	SP_SKILL_COOLDOWN,SP_SKILL_FIXEDCAST, SP_SKILL_VARIABLECAST, SP_FIXCASTRATE, SP_VARCASTRATE, //2050-2054
 	SP_SKILL_USE_SP,SP_MAGIC_ATK_ELE, SP_ADD_FIXEDCAST, SP_ADD_VARIABLECAST,  //2055-2058
 	SP_DEF_SET,SP_MDEF_SET,SP_HP_VANISH_RATE,  //2059-2061
 
 	SP_IGNORE_DEF_CLASS, SP_DEF_RATIO_ATK_CLASS, SP_ADDCLASS, SP_SUBCLASS, SP_MAGIC_ADDCLASS, //2062-2066
-	SP_WEAPON_COMA_CLASS, SP_IGNORE_MDEF_CLASS_RATE, SP_EXP_ADDCLASS //2067-2069
+	SP_WEAPON_COMA_CLASS, SP_IGNORE_MDEF_CLASS_RATE, SP_EXP_ADDCLASS, SP_ADD_CLASS_DROP_ITEM, //2067-2070
+	SP_ADD_CLASS_DROP_ITEMGROUP // 2071
 };
 
 enum _look {

+ 2 - 2
src/map/mob.c

@@ -2439,8 +2439,8 @@ int mob_dead(struct mob_data *md, struct block_list *src, int type)
 			int itemid = 0;
 			for (i = 0; i < ARRAYLENGTH(sd->add_drop) && (sd->add_drop[i].id || sd->add_drop[i].group); i++) {
 				if ( sd->add_drop[i].race == -md->mob_id 
-					|| (sd->add_drop[i].race && (sd->add_drop[i].race)&(1<<status->race))
-					|| (sd->add_drop[i].class_ && (sd->add_drop[i].class_)&(1<<status->class_))
+					|| (sd->add_drop[i].race && sd->add_drop[i].race&(1<<status->race|1<<RC_ALL))
+					|| (sd->add_drop[i].class_ && sd->add_drop[i].class_&(1<<status->class_|1<<CLASS_ALL))
 				) {
 					//check if the bonus item drop rate should be multiplied with mob level/10 [Lupus]
 					if(sd->add_drop[i].rate < 0) {

+ 20 - 12
src/map/pc.c

@@ -1913,12 +1913,13 @@ static int pc_bonus_item_drop(struct s_add_drop *drop, const short max, short id
 	}
 	for(i = 0; i < max && (drop[i].id || drop[i].group); i++) {
 		if(
-			((id && drop[i].id == id) ||
-			(group && drop[i].group == group))
-			&& ((race>RC_NONE_ && race<RC_MAX) || (class_>CLASS_NONE && class_<CLASS_MAX))
+			((id && drop[i].id == id) || (group && drop[i].group == group)) &&
+			((race > RC_NONE_ && race < RC_MAX) || (class_ > CLASS_NONE && class_ < CLASS_MAX))
 		) {
-			if(race>RC_NONE_ && race<RC_MAX) drop[i].race |= 1<<race;
-			if(class_>CLASS_NONE && class_<CLASS_MAX) drop[i].class_ |= 1<<class_;
+			if(race > RC_NONE_ && race < RC_MAX)
+				drop[i].race |= 1<<race;
+			if(class_ > CLASS_NONE && class_ < CLASS_MAX)
+				drop[i].class_ |= 1<<class_;
 			if(drop[i].rate > 0 && rate > 0)
 			{	//Both are absolute rates.
 				if (drop[i].rate < rate)
@@ -1939,8 +1940,7 @@ static int pc_bonus_item_drop(struct s_add_drop *drop, const short max, short id
 	}
 	drop[i].id = id;
 	drop[i].group = group;
-	if(race>RC_NONE_ && race<RC_MAX) drop[i].race |= 1<<race;
-	if(class_>CLASS_NONE && class_<CLASS_MAX) drop[i].class_ |= 1<<class_;
+	drop[i].race |= race;
 	drop[i].rate = rate;
 	return 1;
 }
@@ -3203,11 +3203,11 @@ int pc_bonus2(struct map_session_data *sd,int type,int type2,int val)
 		break;
 	case SP_ADD_MONSTER_DROP_ITEM:
 		if (sd->state.lr_flag != 2)
-			pc_bonus_item_drop(sd->add_drop, ARRAYLENGTH(sd->add_drop), type2, 0, (1<<CLASS_NORMAL)|(1<<CLASS_BOSS), 0, val);
+			pc_bonus_item_drop(sd->add_drop, ARRAYLENGTH(sd->add_drop), type2, 0, CLASS_ALL, RC_NONE_, val);
 		break;
 	case SP_ADD_MONSTER_DROP_ITEMGROUP:
 		if (sd->state.lr_flag != 2)
-			pc_bonus_item_drop(sd->add_drop, ARRAYLENGTH(sd->add_drop), 0, type2, (1<<CLASS_NORMAL)|(1<<CLASS_BOSS), 0, val);
+			pc_bonus_item_drop(sd->add_drop, ARRAYLENGTH(sd->add_drop), 0, type2, CLASS_ALL, RC_NONE_, val);
 		break;
 	case SP_SP_LOSS_RATE:
 		if(sd->state.lr_flag != 2) {
@@ -3383,11 +3383,15 @@ int pc_bonus3(struct map_session_data *sd,int type,int type2,int type3,int val)
 	switch(type){
 	case SP_ADD_MONSTER_DROP_ITEM:
 		if(sd->state.lr_flag != 2)
-			pc_bonus_item_drop(sd->add_drop, ARRAYLENGTH(sd->add_drop), type2, 0, -1, 1<<type3, val);
+			pc_bonus_item_drop(sd->add_drop, ARRAYLENGTH(sd->add_drop), type2, 0, CLASS_NONE, type3, val);
+		break;
+	case SP_ADD_MONSTER_ID_DROP_ITEM:
+		if(sd->state.lr_flag != 2)
+			pc_bonus_item_drop(sd->add_drop, ARRAYLENGTH(sd->add_drop), type2, 0, CLASS_NONE, -type3, val);
 		break;
 	case SP_ADD_CLASS_DROP_ITEM:
 		if(sd->state.lr_flag != 2)
-			pc_bonus_item_drop(sd->add_drop, ARRAYLENGTH(sd->add_drop), type2, 0, -1, -type3, val);
+			pc_bonus_item_drop(sd->add_drop, ARRAYLENGTH(sd->add_drop), type2, 0, type3, RC_NONE_, val);
 		break;
 	case SP_AUTOSPELL:
 		if(sd->state.lr_flag != 2)
@@ -3428,7 +3432,11 @@ int pc_bonus3(struct map_session_data *sd,int type,int type2,int type3,int val)
 		break;
 	case SP_ADD_MONSTER_DROP_ITEMGROUP:
 		if (sd->state.lr_flag != 2)
-			pc_bonus_item_drop(sd->add_drop, ARRAYLENGTH(sd->add_drop), 0, type2, -1, 1<<type3, val);
+			pc_bonus_item_drop(sd->add_drop, ARRAYLENGTH(sd->add_drop), 0, type2, CLASS_NONE, type3, val);
+		break;
+	case SP_ADD_CLASS_DROP_ITEMGROUP:
+		if (sd->state.lr_flag != 2)
+			pc_bonus_item_drop(sd->add_drop, ARRAYLENGTH(sd->add_drop), 0, type2, type3, RC_NONE_, val);
 		break;
 
 	case SP_ADDEFF:

+ 2 - 2
src/map/skill.c

@@ -1225,7 +1225,7 @@ int skill_additional_effect (struct block_list* src, struct block_list *bl, uint
 			sc_start(src,bl,SC_STUN,70,skill_lv,skill_get_time2(skill_id,skill_lv));
 		break;
 	case GS_BULLSEYE: //0.1% coma rate.
-		if(tstatus->race == RC_BRUTE || tstatus->race == RC_DEMIHUMAN)
+		if(tstatus->race == RC_BRUTE || tstatus->race == RC_DEMIHUMAN || tstatus->race == RC_PLAYER)
 			status_change_start(src,bl,SC_COMA,10,skill_lv,0,src->id,0,0,0);
 		break;
 	case GS_PIERCINGSHOT:
@@ -6298,7 +6298,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
 		if( dstmd )
 		{
 			if( status_get_lv(src) > status_get_lv(bl)
-			&&  (tstatus->race == RC_DEMON || tstatus->race == RC_DEMIHUMAN || tstatus->race == RC_ANGEL)
+			&&  (tstatus->race == RC_DEMON || tstatus->race == RC_DEMIHUMAN || tstatus->race == RC_PLAYER || tstatus->race == RC_ANGEL)
 			&&  !(tstatus->mode&MD_BOSS) )
 				clif_skill_nodamage(src,bl,skill_id,skill_lv, sc_start2(src,bl,type,70,skill_lv,src->id,skill_get_time(skill_id,skill_lv)));
 			else