Browse Source

* Fixed bug: http://rathena.org/board/tracker/issue-8345-specialeffect-target-self-doesnt-work
* Fixed bug: http://rathena.org/board/tracker/issue-8169-hiding
* Fixed bug: http://rathena.org/board/tracker/issue-8366-egg-type-monster-issue
* Fixed bug: http://rathena.org/board/tracker/issue-8406-item-bonus-not-working
* Added fix with mob_hp update when mob get healed (Hercules merge)

Lilith 11 năm trước cách đây
mục cha
commit
a053ccea3f
14 tập tin đã thay đổi với 96 bổ sung69 xóa
  1. 12 15
      db/const.txt
  2. 2 2
      db/pre-re/mob_db.txt
  3. 2 2
      db/re/mob_db.txt
  4. 0 2
      doc/item_bonus.txt
  5. 2 2
      sql-files/mob_db.sql
  6. 2 2
      sql-files/mob_db_re.sql
  7. 47 18
      src/map/battle.c
  8. 8 0
      src/map/clif.c
  9. 3 3
      src/map/map.h
  10. 15 1
      src/map/mob.c
  11. 0 20
      src/map/pc.c
  12. 1 1
      src/map/pc.h
  13. 0 1
      src/map/status.c
  14. 2 0
      src/map/status.h

+ 12 - 15
db/const.txt

@@ -559,8 +559,8 @@ bSPDrainValue	1080
 bWeaponAtk	1081
 bWeaponAtkRate	1082
 bDelayrate	1083
-bHPDrainRateRace	1084
-bSPDrainRateRace	1085
+bHpDrainValueRace	1084
+bSpDrainValueRace	1085
 bIgnoreMdefRaceRate	1086
 bIgnoreDefRaceRate	1087
 bSkillHeal2	1088
@@ -596,9 +596,9 @@ bHPLossRate	2023
 bAddRace2	2024
 bHPGainValue	2025
 bSubSize	2026
-bHPDrainValueRace	2027
+bHPDrainValueClass	2027
 bAddItemHealRate	2028
-bSPDrainValueRace	2029
+bSPDrainValueClass	2029
 bExpAddRace	2030
 bSPGainRace	2031
 bSubRace2	2032
@@ -640,9 +640,7 @@ bAddClass	2064
 bSubClass	2065
 bMagicAddClass	2066
 bWeaponComaClass	2067
-bHpDrainValueClass	2068
-bSpDrainValueClass	2069
-bIgnoreMdefClassRate	2070
+bIgnoreMdefClassRate	2068
 
 EQI_HEAD_TOP	1
 EQI_ARMOR	2
@@ -2655,14 +2653,13 @@ GUILD_AREA_WOS	20
 GUILD_NOBG	21
 DUEL	22
 DUEL_WOS	23
-CHAT_MAINCHAT	24
-SELF	25
-BG	26
-BG_WOS	27
-BG_SAMEMAP	28
-BG_SAMEMAP_WOS	29
-BG_AREA	30
-BG_AREA_WOS	31
+SELF	24
+BG	25
+BG_WOS	26
+BG_SAMEMAP	27
+BG_SAMEMAP_WOS	28
+BG_AREA	29
+BG_AREA_WOS	30
 
 ARCH_MERC_GUILD	0
 SPEAR_MERC_GUILD	1

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

@@ -748,7 +748,7 @@
 1718,NOVUS_,Novus,Novus,43,5830,0,1411,1100,1,314,414,24,28,1,60,43,39,119,43,10,12,0,9,20,0x3885,100,252,816,480,0,0,0,0,0,0,0,508,2000,7053,1035,0,0,1036,589,0,0,0,0,0,0,0,0,0,0,4382,1
 1719,DETALE,Detale,Detardeurus,90,960000,0,291850,123304,3,4560,5548,66,59,100,90,30,136,140,56,10,12,2,9,67,0x37B5,250,432,936,360,145925,617,5500,603,5000,732,2000,2649,1000,2648,1000,7444,5000,7451,3589,12080,1000,1417,100,5002,500,0,0,0,0,4386,1
 1720,HYDRO,Hydro,Hydrolancer,89,308230,0,83450,2480,3,2554,3910,52,62,1,96,110,86,94,32,10,12,2,9,47,0x37B5,160,140,672,432,0,0,0,0,0,0,0,7123,4000,1035,4000,7443,3880,5126,500,5127,500,12085,300,5124,500,0,0,0,0,4384,1
-1721,DRAGON_EGG,Dragon Egg,Dragon Egg,43,18322,0,6740,0,0,1,2,78,60,1,1,56,67,1,63,10,12,1,9,40,0x0,1000,24,0,0,0,0,0,0,0,0,0,985,5,7032,100,731,10,732,5,718,10,720,10,728,10,0,0,0,0,4385,1
+1721,DRAGON_EGG,Dragon Egg,Dragon Egg,43,18322,0,6740,0,0,1,2,78,60,1,1,56,67,1,63,10,12,1,9,40,0x0,1000,24,1,1,0,0,0,0,0,0,0,985,5,7032,100,731,10,732,5,718,10,720,10,728,10,0,0,0,0,4385,1
 1722,EVENT_JAKK,Jakk,Jakk,99,10310,0,103,100,1,115,182,5,11,1,28,18,13,35,45,10,12,1,0,43,0x81,240,1180,480,648,0,0,0,0,0,0,0,7225,1000,1062,1000,535,1000,0,0,0,0,0,0,0,0,0,0,0,0,5134,10000
 1723,A_SHECIL,Shecil Damon,Cecil Damon,82,30000,0,0,0,14,600,900,25,15,1,145,27,32,134,80,10,12,1,7,64,0x3695,180,1008,384,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
 1724,A_POTON_CANON,Photon Cannon,Photon Cannon,66,8000,0,0,0,9,1000,1300,10,30,1,40,25,20,80,80,10,12,1,0,40,0x84,300,1536,960,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
@@ -1067,7 +1067,7 @@
 //2012,E_ZOMBIE,Zombie,Zombie,15,99999,0,50,33,1,335,395,100,10,1,8,7,0,60,0,10,12,1,1,29,0x120,150,2612,912,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
 // Another World (13.2)
 2013,DRACO,Draco,Draco,82,18300,0,6100,4100,1,410,710,10,5,1,23,30,34,62,2,10,12,1,9,22,0x1089,250,576,960,504,0,0,0,0,0,0,0,6073,3000,7123,100,1035,100,1037,1000,1036,1000,518,500,0,0,0,0,0,0,4444,1
-2014,DRACO_EGG,Draco Egg,Draco Egg,67,9822,0,1200,1600,0,1,2,56,40,1,1,56,34,1,63,10,12,1,9,82,0x0,1000,24,0,0,0,0,0,0,0,0,0,7032,5000,5015,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+2014,DRACO_EGG,Draco Egg,Draco Egg,67,9822,0,1200,1600,0,1,2,56,40,1,1,56,34,1,63,10,12,1,9,82,0x0,1000,24,1,1,0,0,0,0,0,0,0,7032,5000,5015,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
 2015,PINGUICULA_D,Dark Pinguicula,Dark Pinguicula,83,8780,0,7740,5200,1,600,1450,15,5,1,23,22,12,89,2,10,12,1,3,45,0x308D,290,1426,600,360,0,0,0,0,0,0,0,7100,5000,7198,2000,7188,3000,972,10,6086,1000,0,0,0,0,0,0,0,0,0,0
 2016,AQUA_ELEMENTAL,Aqua Elemental,Aqua Elemental,83,33220,0,5430,15300,1,400,1600,8,12,1,23,19,87,77,2,10,12,2,0,81,0x3095,230,504,960,576,0,0,0,0,0,0,0,6075,1000,7326,5000,12353,100,0,0,0,0,0,0,0,0,0,0,0,0,4443,1
 2017,RATA,Rata,Rata,107,216600,0,70012,34000,1,8000,15000,32,52,1,51,22,132,99,15,10,12,1,7,62,0x3295,150,792,540,420,0,0,0,0,0,0,0,12346,5000,1026,5000,6089,500,1548,100,0,0,0,0,0,0,0,0,0,0,0,0

+ 2 - 2
db/re/mob_db.txt

@@ -774,7 +774,7 @@
 1718,NOVUS_,Novus,Novus,84,5028,1,1080,1215,1,266,314,88,28,53,43,43,55,90,58,10,12,0,9,20,0x3885,100,252,816,480,0,0,0,0,0,0,0,508,2000,7053,1035,0,0,1036,589,0,0,0,0,0,0,0,0,0,0,4382,1
 1719,DETALE,Detale,Detardeurus,135,6005000,1,4320000,3420000,3,4072,6734,364,166,165,153,171,136,185,72,10,12,2,9,67,0x37B5,250,432,936,360,2160000,617,5500,603,5000,732,2000,2649,1000,2648,1000,7444,5000,7451,3589,12080,1000,1417,100,5002,500,0,0,0,0,4386,1
 1720,HYDRO,Hydro,Hydrolancer,121,41500,0,6285,4463,3,760,910,92,58,120,72,67,66,88,58,10,12,2,9,47,0x37B5,160,140,672,432,0,0,0,0,0,0,0,7123,4000,1035,4000,7443,3880,5126,500,5127,500,12085,300,5124,500,0,0,0,0,4384,1
-1721,DRAGON_EGG,Dragon Egg,Dragon Egg,119,20990,1,2862,2147,0,503,653,172,85,84,59,85,40,118,65,10,12,1,9,40,0x0,1000,24,0,0,0,0,0,0,0,0,0,985,5,7032,100,731,10,732,5,718,10,720,10,728,10,0,0,0,0,4385,1
+1721,DRAGON_EGG,Dragon Egg,Dragon Egg,119,20990,1,2862,2147,0,503,653,172,85,84,59,85,40,118,65,10,12,1,9,40,0x0,1000,24,1,1,0,0,0,0,0,0,0,985,5,7032,100,731,10,732,5,718,10,720,10,728,10,0,0,0,0,4385,1
 1722,EVENT_JAKK,Jakk,Jakk,99,10310,0,93,90,1,115,182,8,11,1,28,18,13,35,45,10,12,1,0,43,0x81,240,1180,480,648,0,0,0,0,0,0,0,7225,1000,1062,1000,535,1000,0,0,0,0,0,0,0,0,0,0,0,0,5134,10000
 1723,A_SHECIL,Shecil Damon,Cecil Damon,82,30000,0,0,0,14,600,900,40,15,1,145,27,32,134,80,10,12,1,7,64,0x3695,180,1008,384,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
 1724,A_POTON_CANON,Photon Cannon,Photon Cannon,66,8000,0,0,0,9,1000,1300,16,30,1,40,25,20,80,80,10,12,1,0,40,0x84,300,1536,960,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
@@ -1112,7 +1112,7 @@
 
 // Enter The Unknown (13.2)
 2013,DRACO,Draco,Draco,114,20099,1,1995,1205,1,556,666,56,3,21,58,47,34,71,66,10,12,1,9,22,0x1089,250,576,960,504,0,0,0,0,0,0,0,6073,3000,7123,100,1035,100,1037,1000,1036,1000,518,500,2399,10,0,0,0,0,4444,1
-2014,DRACO_EGG,Draco Egg,Draco Egg,101,100000,1,2000,1500,0,1,2,384,30,1,1,135,92,1,98,10,12,1,9,82,0x0,1000,24,0,0,0,0,0,0,0,0,0,7032,5000,5015,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4471,1
+2014,DRACO_EGG,Draco Egg,Draco Egg,101,100000,1,2000,1500,0,1,2,384,30,1,1,135,92,1,98,10,12,1,9,82,0x0,1000,24,1,1,0,0,0,0,0,0,0,7032,5000,5015,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4471,1
 2015,PINGUICULA_D,Dark Pinguicula,Dark Pinguicula,113,17002,1,2101,2419,1,251,640,59,35,89,55,55,95,66,12,10,12,1,3,45,0x308D,290,1426,600,360,0,0,0,0,0,0,0,7100,5000,7198,2000,7188,3000,972,10,6086,1000,7939,1500,2148,10,0,0,0,0,4468,1
 2016,AQUA_ELEMENTAL,Aqua Elemental,Aqua Elemental,121,33209,1,4155,4155,1,616,1066,23,8,95,61,25,25,86,40,10,12,2,0,81,0x3095,230,504,960,576,0,0,0,0,0,0,0,6075,1000,7326,5000,12353,100,0,0,2787,10,0,0,0,0,0,0,0,0,4443,1
 2017,RATA,Rata,Rata,131,58299,1,7787,6119,1,720,931,81,46,101,74,71,51,98,56,10,12,1,7,62,0x3295,150,792,540,420,0,0,0,0,0,0,0,12346,5000,1026,5000,6089,500,1548,100,6224,10,0,0,0,0,0,0,0,0,4459,1

+ 0 - 2
doc/item_bonus.txt

@@ -365,8 +365,6 @@ bonus2 bWeaponAtk,x,n;			Adds n ATK when weapon of type x is equipped.
 bonus2 bWeaponAtkRate,x,n;		Adds n% damage to normal attacks when weapon of type x is equipped.
 					x:	see doc/item_db.txt -> view -> weapons for possible values
 bonus bDelayrate,n;			Increases skill delay by n%.
-bonus3 bHPDrainRateRace,r,n,x;		Adds a n/10% chance to receive x% of damage dealt as HP from a monster of race r with normal attack.
-bonus3 bSPDrainRateRace,r,n,x;		Adds a n/10% chance to receive x% of damage dealt as SP from a monster of race r with normal attack.
 bonus3 bAddEffOnSkill,s,x,n;		Adds a n/100% chance to cause status change x on enemy when using skill s (supports skill names)
 bonus4 bAddEffOnSkill,s,x,n,t;		Adds a n/100% chance to cause status change x when using skill s (supports skill names)
 					t:	ATF_SELF   = causes status change to oneself

+ 2 - 2
sql-files/mob_db.sql

@@ -814,7 +814,7 @@ REPLACE INTO `mob_db` VALUES (1717,'FERUS_','Ferus','Ferus',69,21182,0,6750,2230
 REPLACE INTO `mob_db` VALUES (1718,'NOVUS_','Novus','Novus',43,5830,0,1411,1100,1,314,414,24,28,1,60,43,39,119,43,10,12,0,9,20,0x3885,100,252,816,480,0,0,0,0,0,0,0,508,2000,7053,1035,0,0,1036,589,0,0,0,0,0,0,0,0,0,0,4382,1);
 REPLACE INTO `mob_db` VALUES (1719,'DETALE','Detale','Detardeurus',90,960000,0,291850,123304,3,4560,5548,66,59,100,90,30,136,140,56,10,12,2,9,67,0x37B5,250,432,936,360,145925,617,5500,603,5000,732,2000,2649,1000,2648,1000,7444,5000,7451,3589,12080,1000,1417,100,5002,500,0,0,0,0,4386,1);
 REPLACE INTO `mob_db` VALUES (1720,'HYDRO','Hydro','Hydrolancer',89,308230,0,83450,2480,3,2554,3910,52,62,1,96,110,86,94,32,10,12,2,9,47,0x37B5,160,140,672,432,0,0,0,0,0,0,0,7123,4000,1035,4000,7443,3880,5126,500,5127,500,12085,300,5124,500,0,0,0,0,4384,1);
-REPLACE INTO `mob_db` VALUES (1721,'DRAGON_EGG','Dragon Egg','Dragon Egg',43,18322,0,6740,0,0,1,2,78,60,1,1,56,67,1,63,10,12,1,9,40,0x0,1000,24,0,0,0,0,0,0,0,0,0,985,5,7032,100,731,10,732,5,718,10,720,10,728,10,0,0,0,0,4385,1);
+REPLACE INTO `mob_db` VALUES (1721,'DRAGON_EGG','Dragon Egg','Dragon Egg',43,18322,0,6740,0,0,1,2,78,60,1,1,56,67,1,63,10,12,1,9,40,0x0,1000,24,1,1,0,0,0,0,0,0,0,985,5,7032,100,731,10,732,5,718,10,720,10,728,10,0,0,0,0,4385,1);
 REPLACE INTO `mob_db` VALUES (1722,'EVENT_JAKK','Jakk','Jakk',99,10310,0,103,100,1,115,182,5,11,1,28,18,13,35,45,10,12,1,0,43,0x81,240,1180,480,648,0,0,0,0,0,0,0,7225,1000,1062,1000,535,1000,0,0,0,0,0,0,0,0,0,0,0,0,5134,10000);
 REPLACE INTO `mob_db` VALUES (1723,'A_SHECIL','Shecil Damon','Cecil Damon',82,30000,0,0,0,14,600,900,25,15,1,145,27,32,134,80,10,12,1,7,64,0x3695,180,1008,384,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
 REPLACE INTO `mob_db` VALUES (1724,'A_POTON_CANON','Photon Cannon','Photon Cannon',66,8000,0,0,0,9,1000,1300,10,30,1,40,25,20,80,80,10,12,1,0,40,0x84,300,1536,960,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
@@ -1133,7 +1133,7 @@ REPLACE INTO `mob_db` VALUES (2010,'G_MAJORUROS','Ox','Ox',66,500000,0,10,10,1,1
 #REPLACE INTO `mob_db` VALUES (2012,'E_ZOMBIE','Zombie','Zombie',15,99999,0,50,33,1,335,395,100,10,1,8,7,0,60,0,10,12,1,1,29,0x120,150,2612,912,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
 # Another World (13.2)
 REPLACE INTO `mob_db` VALUES (2013,'DRACO','Draco','Draco',82,18300,0,6100,4100,1,410,710,10,5,1,23,30,34,62,2,10,12,1,9,22,0x1089,250,576,960,504,0,0,0,0,0,0,0,6073,3000,7123,100,1035,100,1037,1000,1036,1000,518,500,0,0,0,0,0,0,4444,1);
-REPLACE INTO `mob_db` VALUES (2014,'DRACO_EGG','Draco Egg','Draco Egg',67,9822,0,1200,1600,0,1,2,56,40,1,1,56,34,1,63,10,12,1,9,82,0x0,1000,24,0,0,0,0,0,0,0,0,0,7032,5000,5015,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+REPLACE INTO `mob_db` VALUES (2014,'DRACO_EGG','Draco Egg','Draco Egg',67,9822,0,1200,1600,0,1,2,56,40,1,1,56,34,1,63,10,12,1,9,82,0x0,1000,24,1,1,0,0,0,0,0,0,0,7032,5000,5015,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
 REPLACE INTO `mob_db` VALUES (2015,'PINGUICULA_D','Dark Pinguicula','Dark Pinguicula',83,8780,0,7740,5200,1,600,1450,15,5,1,23,22,12,89,2,10,12,1,3,45,0x308D,290,1426,600,360,0,0,0,0,0,0,0,7100,5000,7198,2000,7188,3000,972,10,6086,1000,0,0,0,0,0,0,0,0,0,0);
 REPLACE INTO `mob_db` VALUES (2016,'AQUA_ELEMENTAL','Aqua Elemental','Aqua Elemental',83,33220,0,5430,15300,1,400,1600,8,12,1,23,19,87,77,2,10,12,2,0,81,0x3095,230,504,960,576,0,0,0,0,0,0,0,6075,1000,7326,5000,12353,100,0,0,0,0,0,0,0,0,0,0,0,0,4443,1);
 REPLACE INTO `mob_db` VALUES (2017,'RATA','Rata','Rata',107,216600,0,70012,34000,1,8000,15000,32,52,1,51,22,132,99,15,10,12,1,7,62,0x3295,150,792,540,420,0,0,0,0,0,0,0,12346,5000,1026,5000,6089,500,1548,100,0,0,0,0,0,0,0,0,0,0,0,0);

+ 2 - 2
sql-files/mob_db_re.sql

@@ -840,7 +840,7 @@ REPLACE INTO `mob_db_re` VALUES (1717,'FERUS_','Ferus','Ferus',126,39054,1,4185,
 REPLACE INTO `mob_db_re` VALUES (1718,'NOVUS_','Novus','Novus',84,5028,1,1080,1215,1,266,314,88,28,53,43,43,55,90,58,10,12,0,9,20,0x3885,100,252,816,480,0,0,0,0,0,0,0,508,2000,7053,1035,0,0,1036,589,0,0,0,0,0,0,0,0,0,0,4382,1);
 REPLACE INTO `mob_db_re` VALUES (1719,'DETALE','Detale','Detardeurus',135,6005000,1,4320000,3420000,3,4072,6734,364,166,165,153,171,136,185,72,10,12,2,9,67,0x37B5,250,432,936,360,2160000,617,5500,603,5000,732,2000,2649,1000,2648,1000,7444,5000,7451,3589,12080,1000,1417,100,5002,500,0,0,0,0,4386,1);
 REPLACE INTO `mob_db_re` VALUES (1720,'HYDRO','Hydro','Hydrolancer',121,41500,0,6285,4463,3,760,910,92,58,120,72,67,66,88,58,10,12,2,9,47,0x37B5,160,140,672,432,0,0,0,0,0,0,0,7123,4000,1035,4000,7443,3880,5126,500,5127,500,12085,300,5124,500,0,0,0,0,4384,1);
-REPLACE INTO `mob_db_re` VALUES (1721,'DRAGON_EGG','Dragon Egg','Dragon Egg',119,20990,1,2862,2147,0,503,653,172,85,84,59,85,40,118,65,10,12,1,9,40,0x0,1000,24,0,0,0,0,0,0,0,0,0,985,5,7032,100,731,10,732,5,718,10,720,10,728,10,0,0,0,0,4385,1);
+REPLACE INTO `mob_db_re` VALUES (1721,'DRAGON_EGG','Dragon Egg','Dragon Egg',119,20990,1,2862,2147,0,503,653,172,85,84,59,85,40,118,65,10,12,1,9,40,0x0,1000,24,1,1,0,0,0,0,0,0,0,985,5,7032,100,731,10,732,5,718,10,720,10,728,10,0,0,0,0,4385,1);
 REPLACE INTO `mob_db_re` VALUES (1722,'EVENT_JAKK','Jakk','Jakk',99,10310,0,93,90,1,115,182,8,11,1,28,18,13,35,45,10,12,1,0,43,0x81,240,1180,480,648,0,0,0,0,0,0,0,7225,1000,1062,1000,535,1000,0,0,0,0,0,0,0,0,0,0,0,0,5134,10000);
 REPLACE INTO `mob_db_re` VALUES (1723,'A_SHECIL','Shecil Damon','Cecil Damon',82,30000,0,0,0,14,600,900,40,15,1,145,27,32,134,80,10,12,1,7,64,0x3695,180,1008,384,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
 REPLACE INTO `mob_db_re` VALUES (1724,'A_POTON_CANON','Photon Cannon','Photon Cannon',66,8000,0,0,0,9,1000,1300,16,30,1,40,25,20,80,80,10,12,1,0,40,0x84,300,1536,960,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
@@ -1178,7 +1178,7 @@ REPLACE INTO `mob_db_re` VALUES (2010,'G_MAJORUROS','Ox','Ox',66,500000,0,9,9,1,
 
 # Enter The Unknown (13.2)
 REPLACE INTO `mob_db_re` VALUES (2013,'DRACO','Draco','Draco',114,20099,1,1995,1205,1,556,666,56,3,21,58,47,34,71,66,10,12,1,9,22,0x1089,250,576,960,504,0,0,0,0,0,0,0,6073,3000,7123,100,1035,100,1037,1000,1036,1000,518,500,2399,10,0,0,0,0,4444,1);
-REPLACE INTO `mob_db_re` VALUES (2014,'DRACO_EGG','Draco Egg','Draco Egg',101,100000,1,2000,1500,0,1,2,384,30,1,1,135,92,1,98,10,12,1,9,82,0x0,1000,24,0,0,0,0,0,0,0,0,0,7032,5000,5015,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4471,1);
+REPLACE INTO `mob_db_re` VALUES (2014,'DRACO_EGG','Draco Egg','Draco Egg',101,100000,1,2000,1500,0,1,2,384,30,1,1,135,92,1,98,10,12,1,9,82,0x0,1000,24,1,1,0,0,0,0,0,0,0,7032,5000,5015,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4471,1);
 REPLACE INTO `mob_db_re` VALUES (2015,'PINGUICULA_D','Dark Pinguicula','Dark Pinguicula',113,17002,1,2101,2419,1,251,640,59,35,89,55,55,95,66,12,10,12,1,3,45,0x308D,290,1426,600,360,0,0,0,0,0,0,0,7100,5000,7198,2000,7188,3000,972,10,6086,1000,7939,1500,2148,10,0,0,0,0,4468,1);
 REPLACE INTO `mob_db_re` VALUES (2016,'AQUA_ELEMENTAL','Aqua Elemental','Aqua Elemental',121,33209,1,4155,4155,1,616,1066,23,8,95,61,25,25,86,40,10,12,2,0,81,0x3095,230,504,960,576,0,0,0,0,0,0,0,6075,1000,7326,5000,12353,100,0,0,2787,10,0,0,0,0,0,0,0,0,4443,1);
 REPLACE INTO `mob_db_re` VALUES (2017,'RATA','Rata','Rata',131,58299,1,7787,6119,1,720,931,81,46,101,74,71,51,98,56,10,12,1,7,62,0x3295,150,792,540,420,0,0,0,0,0,0,0,12346,5000,1026,5000,6089,500,1548,100,6224,10,0,0,0,0,0,0,0,0,4459,1);

+ 47 - 18
src/map/battle.c

@@ -5976,40 +5976,65 @@ void battle_drain(TBL_PC *sd, struct block_list *tbl, int64 rdamage, int64 ldama
 		if (i < 2) { wd = &sd->right_weapon; damage = &rdamage; }
 		else { wd = &sd->left_weapon; damage = &ldamage; }
 		if (*damage <= 0) continue;
-		//First and Third iterations: race, other two boss/normal state
-		if( i == 1 || i == 3 )
-		{
-			hp = wd->hp_drain_class[class_].value;
+		if( i == 1 || i == 3 ) {
+			hp = wd->hp_drain_class[class_].value + wd->hp_drain_class[CLASS_ALL].value;
 			if (wd->hp_drain_class[class_].rate)
 				hp += battle_calc_drain(*damage, wd->hp_drain_class[class_].rate, wd->hp_drain_class[class_].per);
+			if (wd->hp_drain_class[CLASS_ALL].rate)
+				hp += battle_calc_drain(*damage, wd->hp_drain_class[CLASS_ALL].rate, wd->hp_drain_class[CLASS_ALL].per);
 
-			sp = wd->sp_drain_class[class_].value;
+			sp = wd->sp_drain_class[class_].value + wd->sp_drain_class[CLASS_ALL].value;
 			if (wd->sp_drain_class[class_].rate)
 				sp += battle_calc_drain(*damage, wd->sp_drain_class[class_].rate, wd->sp_drain_class[class_].per);
+			if (wd->sp_drain_class[CLASS_ALL].rate)
+				sp += battle_calc_drain(*damage, wd->sp_drain_class[CLASS_ALL].rate, wd->sp_drain_class[CLASS_ALL].per);
+
+			if( hp ) {
+				if( wd->hp_drain_class[class_].type )
+					rhp += hp;
+				if( wd->hp_drain_class[CLASS_ALL].type )
+					rhp += hp;
+				thp += hp;
+			}
 
-			if( hp && wd->hp_drain_class[class_].type )
-				rhp += hp;
-			if( sp && wd->sp_drain_class[class_].type )
-				rsp += sp;
+			if( sp ) {
+				if( wd->sp_drain_class[class_].type )
+					rsp += sp;
+				if( wd->sp_drain_class[CLASS_ALL].type )
+					rsp += sp;
+				tsp += sp;
+			}
 		} else {
-			hp = wd->hp_drain_race[race].value;
+			hp = wd->hp_drain_race[race].value + wd->hp_drain_race[RC_ALL].value;
 			if (wd->hp_drain_race[race].rate)
 				hp += battle_calc_drain(*damage, wd->hp_drain_race[race].rate, wd->hp_drain_race[race].per);
+			if (wd->hp_drain_race[RC_ALL].rate)
+				hp += battle_calc_drain(*damage, wd->hp_drain_race[RC_ALL].rate, wd->hp_drain_race[RC_ALL].per);
 
-			sp = wd->sp_drain_race[race].value;
+			sp = wd->sp_drain_race[race].value + wd->sp_drain_race[RC_ALL].value;
 			if (wd->sp_drain_race[race].rate)
 				sp += battle_calc_drain(*damage, wd->sp_drain_race[race].rate, wd->sp_drain_race[race].per);
+			if (wd->sp_drain_race[RC_ALL].rate)
+				sp += battle_calc_drain(*damage, wd->sp_drain_race[RC_ALL].rate, wd->sp_drain_race[RC_ALL].per);
+
+			if( hp ) {
+				if( wd->hp_drain_race[race].type )
+					rhp += hp;
+				if( wd->hp_drain_race[RC_ALL].type )
+					rhp += hp;
+				thp += hp;
+			}
 
-			if( hp && wd->hp_drain_race[race].type )
-				rhp += hp;
-			if( sp && wd->sp_drain_race[race].type)
-				rsp += sp;
+			if( sp ) {
+				if( wd->sp_drain_race[race].type )
+					rsp += sp;
+				if( wd->sp_drain_race[RC_ALL].type )
+					rsp += sp;
+				tsp += sp;
+			}
 		}
 	}
 
-	thp += hp;
-	tsp += sp;
-
 	if (sd->bonus.sp_vanish_rate && rnd()%1000 < sd->bonus.sp_vanish_rate)
 		status_percent_damage(&sd->bl, tbl, 0, (unsigned char)sd->bonus.sp_vanish_per, false);
 
@@ -6019,8 +6044,12 @@ void battle_drain(TBL_PC *sd, struct block_list *tbl, int64 rdamage, int64 ldama
 
 	if( sd->sp_gain_race_attack[race] )
 		tsp += sd->sp_gain_race_attack[race];
+	if( sd->sp_gain_race_attack[RC_ALL] )
+		tsp += sd->sp_gain_race_attack[RC_ALL];
 	if( sd->hp_gain_race_attack[race] )
 		thp += sd->hp_gain_race_attack[race];
+	if( sd->hp_gain_race_attack[RC_ALL] )
+		thp += sd->hp_gain_race_attack[RC_ALL];
 
 	if (!thp && !tsp) return;
 

+ 8 - 0
src/map/clif.c

@@ -1345,6 +1345,10 @@ int clif_spawn(struct block_list *bl)
 				if( sd->talisman[i] > 0 )
 					clif_talisman(sd, i);
 			}
+			for( i = SC_SPHERE_1; i <= SC_SPHERE_5; i++ ) {
+				if( sd->sc.data[i] )
+					clif_status_change(bl,StatusIconChangeTable[i],1,0,sd->sc.data[i]->val1,sd->sc.data[i]->val2,0);
+			}
 		#ifdef NEW_CARTS
 			if( sd->sc.data[SC_PUSH_CART] )
 				clif_status_load_notick(&sd->bl, SI_ON_PUSH_CART, 2, sd->sc.data[SC_PUSH_CART]->val1, 0, 0);
@@ -4152,6 +4156,10 @@ static void clif_getareachar_pc(struct map_session_data* sd,struct map_session_d
 		if( dstsd->talisman[i] > 0 )
 			clif_talisman_single(sd->fd, dstsd, i);
 	}
+	for( i = SC_SPHERE_1; i <= SC_SPHERE_5; i++ ) {
+		if( dstsd->sc.data[i] )
+			clif_status_load_single(sd->fd,dstsd->bl.id,StatusIconChangeTable[i],1,dstsd->sc.data[i]->val1,dstsd->sc.data[i]->val2,0);
+	}
 	if( dstsd->sc.option&OPTION_MOUNTING ) {
 		//New Mounts are not complaint to the original method, so we gotta tell this guy that I'm mounting.
 		clif_status_load_single(sd->fd,dstsd->bl.id,SI_ALL_RIDING,2,1,0,0);

+ 3 - 3
src/map/map.h

@@ -431,7 +431,7 @@ enum _sp {
 	SP_NO_KNOCKBACK,SP_CLASSCHANGE, // 1077-1078
 	SP_HP_DRAIN_VALUE,SP_SP_DRAIN_VALUE, // 1079-1080
 	SP_WEAPON_ATK,SP_WEAPON_ATK_RATE, // 1081-1082
-	SP_DELAYRATE,SP_HP_DRAIN_RATE_RACE,SP_SP_DRAIN_RATE_RACE, // 1083-1085
+	SP_DELAYRATE,SP_HP_DRAIN_VALUE_RACE, SP_SP_DRAIN_VALUE_RACE, // 1083-1085
 	SP_IGNORE_MDEF_RACE_RATE,SP_IGNORE_DEF_RACE_RATE,SP_SKILL_HEAL2,SP_ADDEFF_ONSKILL, //1086-1089
 	SP_ADD_HEAL_RATE,SP_ADD_HEAL2_RATE, SP_EQUIP_ATK, //1090-1092
 
@@ -442,7 +442,7 @@ enum _sp {
 	SP_CRIT_ATK_RATE, SP_CRITICAL_ADDRACE, SP_NO_REGEN, SP_ADDEFF_WHENHIT, SP_AUTOSPELL_WHENHIT, // 2013-2017
 	SP_SKILL_ATK, SP_UNSTRIPABLE, SP_AUTOSPELL_ONSKILL, // 2018-2020
 	SP_SP_GAIN_VALUE, SP_HP_REGEN_RATE, SP_HP_LOSS_RATE, SP_ADDRACE2, SP_HP_GAIN_VALUE, // 2021-2025
-	SP_SUBSIZE, SP_HP_DRAIN_VALUE_RACE, SP_ADD_ITEM_HEAL_RATE, SP_SP_DRAIN_VALUE_RACE, SP_EXP_ADDRACE,	// 2026-2030
+	SP_SUBSIZE, SP_HP_DRAIN_VALUE_CLASS, SP_ADD_ITEM_HEAL_RATE, SP_SP_DRAIN_VALUE_CLASS, SP_EXP_ADDRACE,	// 2026-2030
 	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
@@ -453,7 +453,7 @@ enum _sp {
 	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_HP_DRAIN_VALUE_CLASS, SP_SP_DRAIN_VALUE_CLASS, SP_IGNORE_MDEF_CLASS_RATE //2067-2070
+	SP_WEAPON_COMA_CLASS, SP_IGNORE_MDEF_CLASS_RATE //2067-2068
 };
 
 enum _look {

+ 15 - 1
src/map/mob.c

@@ -1641,7 +1641,10 @@ static bool mob_ai_sub_hard(struct mob_data *md, unsigned int tick)
 
 		if(tbl->type == BL_PC)
 			mob_log_damage(md, tbl, 0); //Log interaction (counts as 'attacker' for the exp bonus)
-		unit_attack(&md->bl,tbl->id,1);
+		if( !(md->sc.option&OPTION_HIDE) )
+			unit_attack(&md->bl,tbl->id,1);
+		else
+			mobskill_use(md, tick, -1);
 		return true;
 	}
 
@@ -2828,6 +2831,17 @@ void mob_heal(struct mob_data *md,unsigned int heal)
 {
 	if (battle_config.show_mob_info&3)
 		clif_charnameack (0, &md->bl);
+#if PACKETVER >= 20120404
+	if( !(md->status.mode&MD_BOSS) ){
+		int i;
+		for(i = 0; i < DAMAGELOG_SIZE; i++)// must show hp bar to all char who already hit the mob.
+			if( md->dmglog[i].id ) {
+				struct map_session_data *sd = map_charid2sd(md->dmglog[i].id);
+				if( sd && check_distance_bl(&md->bl, &sd->bl, AREA_SIZE) ) // check if in range
+					clif_monster_hp_bar(md, sd->fd);
+			}
+	}
+#endif
 }
 
 /*==========================================

+ 0 - 20
src/map/pc.c

@@ -3422,26 +3422,6 @@ int pc_bonus3(struct map_session_data *sd,int type,int type2,int type3,int val)
 			sd->left_weapon.sp_drain_class[CLASS_BOSS].type = val;
 		}
 		break;
-	case SP_HP_DRAIN_RATE_RACE:
-		if(!sd->state.lr_flag) {
-			sd->right_weapon.hp_drain_race[type2].rate += type3;
-			sd->right_weapon.hp_drain_race[type2].per += val;
-		}
-		else if(sd->state.lr_flag == 1) {
-			sd->left_weapon.hp_drain_race[type2].rate += type3;
-			sd->left_weapon.hp_drain_race[type2].per += val;
-		}
-		break;
-	case SP_SP_DRAIN_RATE_RACE:
-		if(!sd->state.lr_flag) {
-			sd->right_weapon.sp_drain_race[type2].rate += type3;
-			sd->right_weapon.sp_drain_race[type2].per += val;
-		}
-		else if(sd->state.lr_flag == 1) {
-			sd->left_weapon.sp_drain_race[type2].rate += type3;
-			sd->left_weapon.sp_drain_race[type2].per += 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);

+ 1 - 1
src/map/pc.h

@@ -83,7 +83,7 @@ struct weapon_data {
 		short per;
 		short value;
 		unsigned type:1;
-	} hp_drain_race[RC_ALL], sp_drain_race[RC_ALL], hp_drain_class[CLASS_ALL], sp_drain_class[CLASS_ALL];
+	} hp_drain_race[RC_MAX], sp_drain_race[RC_MAX], hp_drain_class[CLASS_MAX], sp_drain_class[CLASS_MAX];
 
 	struct {
 		short class_, rate;

+ 0 - 1
src/map/status.c

@@ -65,7 +65,6 @@ int current_equip_card_id; /// To prevent card-stacking (from jA) [Skotlex]
 // We need it for new cards 15 Feb 2005, to check if the combo cards are insrerted into the CURRENT weapon only to avoid cards exploits
 
 static sc_type SkillStatusChangeTable[MAX_SKILL];  /// skill  -> status
-static int StatusIconChangeTable[SC_MAX];          /// status -> "icon" (icon is a bit of a misnomer, since there exist values with no icon associated)
 static unsigned int StatusChangeFlagTable[SC_MAX]; /// status -> flags
 static int StatusSkillChangeTable[SC_MAX];         /// status -> skill
 static int StatusRelevantBLTypes[SI_MAX];          /// "icon" -> enum bl_type (for clif_status_change to identify for which bl types to send packets)

+ 2 - 0
src/map/status.h

@@ -1826,6 +1826,8 @@ int status_sc2skill(sc_type sc);
 unsigned int status_sc2scb_flag(sc_type sc);
 int status_type2relevant_bl_types(int type);
 
+int StatusIconChangeTable[SC_MAX];          /// status -> "icon" (icon is a bit of a misnomer, since there exist values with no icon associated)
+
 int status_damage(struct block_list *src,struct block_list *target,int64 dhp,int64 dsp, int walkdelay, int flag);
 //Define for standard HP damage attacks.
 #define status_fix_damage(src, target, hp, walkdelay) status_damage(src, target, hp, 0, walkdelay, 0)