From a862051cd36cad7e2fbb8bff4093b69afb32c120 Mon Sep 17 00:00:00 2001 From: Cydh Ramdh Date: Wed, 5 Feb 2014 23:39:22 +0700 Subject: [PATCH] * Follow up c1871e9,3181ff6. Moved vip base and job exp bonus calculation to the pc_calcexp with another exp bonus * Follow up 3441d4a Signed-off-by: Cydh Ramdh --- conf/battle/player.conf | 8 ++++---- db/re/item_db.txt | 4 ++-- sql-files/item_db_re.sql | 4 ++-- src/map/mob.c | 9 ++------- src/map/pc.c | 29 ++++++++++++++++++----------- 5 files changed, 28 insertions(+), 26 deletions(-) diff --git a/conf/battle/player.conf b/conf/battle/player.conf index 418834ab31..7024a80061 100644 --- a/conf/battle/player.conf +++ b/conf/battle/player.conf @@ -167,6 +167,10 @@ vip_storage_increase: 300 // Default: 50 vip_base_exp_increase: 50 +// Job experience rate increase. Setting to 0 will disable. (Note 2) +// Default: 50 +vip_job_exp_increase: 50 + // Experience penalty rate multiplier for non-VIP accounts. // Multiplies the 'death_penalty_base' and 'death_penalty_job' settings in 'conf/battle/exp.conf'. // Default: 3 (3*100 = 3% penalty) @@ -179,10 +183,6 @@ vip_exp_penalty_job_normal: 3 vip_exp_penalty_base: 1 vip_exp_penalty_job: 1 -// Job experience rate increase. Setting to 0 will disable. (Note 2) -// Default: 50 -vip_job_exp_increase: 50 - // Battle Manual experience increase. Setting to 0 will disable. // - Regular/Thick Battle Manual: 50+(50/X) = 75% // - HE Battle Manual: 100+(100/X) = 150% diff --git a/db/re/item_db.txt b/db/re/item_db.txt index e1a0079300..2d632a1fa5 100644 --- a/db/re/item_db.txt +++ b/db/re/item_db.txt @@ -8453,7 +8453,7 @@ 18506,Hattah_Black,Hattah Black,4,12000,,4000,,2,,1,0xFFFFFFFF,63,2,769,,1,1,676,{},{},{} 18507,Elven_Ears_,Elven Ears,4,20,,100,,0,,1,0xFFFFFFFE,63,2,512,,70,0,73,{},{},{} 18508,Garuda_Hat,Garuda Hat,4,20,,100,,4,,1,0xFFFFFFFE,63,2,256,,30,1,677,{ bonus bLuk,5; bonus bMdef,3; bonus2 bSubEle,Ele_Neutral,5; bonus2 bSubEle,Ele_Fire,5; bonus2 bSubEle,Ele_Water,5; bonus2 bSubEle,Ele_Wind,5; bonus2 bSubEle,Ele_Earth,5; bonus2 bSubEle,Ele_Dark,5; bonus2 bSubEle,Ele_Holy,5; bonus2 bSubEle,Ele_Ghost,5; bonus bHit,10; bonus bDelayRate,-5; if(getrefine()>=7) bonus2 bAddMonsterDropItem,522,100*(getrefine()-6); },{},{} -18509,RWC2010_Indonesia,RWC2010 Indonesia,4,20,,100,,6,,1,0xFFFFFFFE,63,2,256,,15,1,678,{ bonus bLuk,5; bonus bSubRace,RC_Player,10; bonus bSubRace,RC_DemiHuman,10; bonus2 bAddItemHealRate,501,100; bonus2 bAddItemHealRate,504,100; bonus bCritical,10; bonus bAspd,1; bonus2 bAddClass,Class_All,3; bonus bMatkRate,3; },{},{} +18509,RWC2010_Indonesia,RWC2010 Indonesia,4,20,,100,,6,,1,0xFFFFFFFE,63,2,256,,15,1,678,{ bonus bLuk,5; bonus2 bSubRace2,RC_Player,10; bonus2 bSubRace,RC_DemiHuman,10; bonus2 bAddItemHealRate,501,100; bonus2 bAddItemHealRate,504,100; bonus bCritical,10; bonus bAspd,1; bonus2 bAddClass,Class_All,3; bonus bMatkRate,3; },{},{} 18510,Blood_Angel_Hair_Band,Blood Angel Hair Band,4,0,,0,,1,,0,0xFFFFFFFF,63,2,256,,60,0,679,{},{},{} 18511,Blood_Angel_Wing_Ear,Blood Angel Wing Ear,4,0,,0,,1,,0,0xFFFFFFFF,63,2,512,,60,0,680,{},{},{} 18512,Juho_Necktie,Juho Necktie,4,0,,0,,1,,1,0xFFFFFFFF,63,2,256,,20,1,443,{},{},{} @@ -8517,7 +8517,7 @@ 18570,Ancient_Gold_Ornament,Ancient Gold Ornament,4,20,,400,,7,,1,0xFFFFFFFE,63,2,256,,100,1,739,{ if(BaseLevel >= 150) { bonus bAllStats,2; } if(BaseClass==Job_Swordman||BaseClass==Job_Merchant||BaseClass==Job_Thief){ bonus2 bAddClass,Class_All,8; } if(BaseClass==Job_Mage||BaseClass==Job_Acolyte){ bonus bMatk,8; } if(BaseClass==Job_Archer){ bonus bDex,3; bonus bLongAtkRate,10; } },{},{} 18571,Lucky_Hat,Lucky Hat,4,20,,1000,,0,,0,0xFFFFFFFF,63,2,256,,0,0,740,{ bonus2 bExpAddRace,RC_All,3; },{},{} 18572,Korean_Judge_Hat,Korean Judge Hat,4,20,,300,,2,,1,0xFFFFFFFF,63,2,256,,0,1,377,{ bonus bMdef,2; bonus bVariableCastrate,-6;bonus bAspdRate,6;if(getrefine()>6){bonus2 bSubRace,RC_DemiHuman,2;bonus2 bSubRace,RC_Player,2;}if(BaseClass==Job_Swordman || BaseClass==Job_Merchant || BaseClass==Job_Thief || Class==Job_Taekwon || Class==Job_Star_Gladiator || Class==Job_Star_Gladiator2 || Class==Job_Monk || Class==Job_Champion || Class==Job_Sura || Class==Job_Sura_T) bonus2 bAddClass,Class_All,(getrefine()/2);if(BaseClass==Job_Mage || BaseClass==Job_Acolyte || Class==Job_Ninja || Class==Job_Soul_Linker) bonus bMatkRate,(getrefine()/2);if(BaseClass==Job_Archer || Class==Job_Gunslinger) bonus bBaseAtk,getrefine(); },{},{} -18573,White_Feather,White Feather,4,20,,500,,2,,1,0xFFFFFFFF,63,2,256,,30,1,741,{ if(getrefine()<5){bonus bHit,20;bonus bMaxHPrate,-10;}elseif(getrefine()<7){bonus bHit,10;}elseif(getrefine()<9){bonus bHit,7;bonus bMaxHPrate,3;}else{bonus bHit,4;bonus bMaxHPrate,4;} },{},{} +18573,White_Feather,White Feather,4,20,,500,,2,,1,0xFFFFFFFF,63,2,256,,30,1,741,{ if(getrefine()<5){bonus bHit,20;bonus bMaxHPrate,-10;}else if(getrefine()<7){bonus bHit,10;}else if(getrefine()<9){bonus bHit,7;bonus bMaxHPrate,3;}else{bonus bHit,4;bonus bMaxHPrate,4;} },{},{} 18574,Lord_of_Death,Lord of Death,4,20,,1000,,10,,1,0xFFFFFFFF,63,2,256,,70,1,742,{ bonus bMdef,5; bonus2 bAddClass,Class_Normal,(10+((getrefine()>4)?getrefine()-4:0)); bonus2 bSubClass,Class_Normal,-5; },{},{} 18575,Wunderkammer,Wunderkammer,4,20,,500,,10,,1,0xFFFFFFFF,63,2,769,,20,0,743,{ bonus bMdef,10; },{},{} 18576,YinYang_Earring,YinYang Earring,4,20,,100,,0,,0,0xFFFFFFFF,63,2,512,,50,0,744,{ bonus2 bSkillAtk,272,10; bonus2 bSkillAtk,263,5; bonus2 bSkillAtk,273,5; bonus2 bSkillUseSP,272,1; bonus2 bSkillUseSP,273,1; },{},{} diff --git a/sql-files/item_db_re.sql b/sql-files/item_db_re.sql index a48b3813c9..dcddd82e7f 100644 --- a/sql-files/item_db_re.sql +++ b/sql-files/item_db_re.sql @@ -8484,7 +8484,7 @@ REPLACE INTO `item_db_re` VALUES (18505,'Umbala_Spirit','Umbala Spirit',4,0,NULL REPLACE INTO `item_db_re` VALUES (18506,'Hattah_Black','Hattah Black',4,12000,NULL,4000,NULL,2,NULL,1,0xFFFFFFFF,63,2,769,NULL,'1',1,676,NULL,NULL,NULL); REPLACE INTO `item_db_re` VALUES (18507,'Elven_Ears_','Elven Ears',4,20,NULL,100,NULL,0,NULL,1,0xFFFFFFFE,63,2,512,NULL,'70',0,73,NULL,NULL,NULL); REPLACE INTO `item_db_re` VALUES (18508,'Garuda_Hat','Garuda Hat',4,20,NULL,100,NULL,4,NULL,1,0xFFFFFFFE,63,2,256,NULL,'30',1,677,'bonus bLuk,5; bonus bMdef,3; bonus2 bSubEle,Ele_Neutral,5; bonus2 bSubEle,Ele_Fire,5; bonus2 bSubEle,Ele_Water,5; bonus2 bSubEle,Ele_Wind,5; bonus2 bSubEle,Ele_Earth,5; bonus2 bSubEle,Ele_Dark,5; bonus2 bSubEle,Ele_Holy,5; bonus2 bSubEle,Ele_Ghost,5; bonus bHit,10; bonus bDelayRate,-5; if(getrefine()>=7) bonus2 bAddMonsterDropItem,522,100*(getrefine()-6);',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (18509,'RWC2010_Indonesia','RWC2010 Indonesia',4,20,NULL,100,NULL,6,NULL,1,0xFFFFFFFE,63,2,256,NULL,'15',1,678,'bonus bLuk,5; bonus bSubRace,RC_Player,10; bonus bSubRace,RC_DemiHuman,10; bonus2 bAddItemHealRate,501,100; bonus2 bAddItemHealRate,504,100; bonus bCritical,10; bonus bAspd,1; bonus2 bAddClass,Class_All,3; bonus bMatkRate,3;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (18509,'RWC2010_Indonesia','RWC2010 Indonesia',4,20,NULL,100,NULL,6,NULL,1,0xFFFFFFFE,63,2,256,NULL,'15',1,678,'bonus bLuk,5; bonus2 bSubRace2,RC_Player,10; bonus2 bSubRace,RC_DemiHuman,10; bonus2 bAddItemHealRate,501,100; bonus2 bAddItemHealRate,504,100; bonus bCritical,10; bonus bAspd,1; bonus2 bAddClass,Class_All,3; bonus bMatkRate,3;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (18510,'Blood_Angel_Hair_Band','Blood Angel Hair Band',4,0,NULL,0,NULL,1,NULL,0,0xFFFFFFFF,63,2,256,NULL,'60',0,679,NULL,NULL,NULL); REPLACE INTO `item_db_re` VALUES (18511,'Blood_Angel_Wing_Ear','Blood Angel Wing Ear',4,0,NULL,0,NULL,1,NULL,0,0xFFFFFFFF,63,2,512,NULL,'60',0,680,NULL,NULL,NULL); REPLACE INTO `item_db_re` VALUES (18512,'Juho_Necktie','Juho Necktie',4,0,NULL,0,NULL,1,NULL,1,0xFFFFFFFF,63,2,256,NULL,'20',1,443,NULL,NULL,NULL); @@ -8548,7 +8548,7 @@ REPLACE INTO `item_db_re` VALUES (18569,'Soft_Sheep_Hat','Soft Sheep Hat',4,20,N REPLACE INTO `item_db_re` VALUES (18570,'Ancient_Gold_Ornament','Ancient Gold Ornament',4,20,NULL,400,NULL,7,NULL,1,0xFFFFFFFE,63,2,256,NULL,'100',1,739,'if(BaseLevel >= 150) { bonus bAllStats,2; } if(BaseClass==Job_Swordman||BaseClass==Job_Merchant||BaseClass==Job_Thief){ bonus2 bAddClass,Class_All,8; } if(BaseClass==Job_Mage||BaseClass==Job_Acolyte){ bonus bMatk,8; } if(BaseClass==Job_Archer){ bonus bDex,3; bonus bLongAtkRate,10; }',NULL,NULL); REPLACE INTO `item_db_re` VALUES (18571,'Lucky_Hat','Lucky Hat',4,20,NULL,1000,NULL,0,NULL,0,0xFFFFFFFF,63,2,256,NULL,'0',0,740,'bonus2 bExpAddRace,RC_All,3;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (18572,'Korean_Judge_Hat','Korean Judge Hat',4,20,NULL,300,NULL,2,NULL,1,0xFFFFFFFF,63,2,256,NULL,'0',1,377,'bonus bMdef,2; bonus bVariableCastrate,-6;bonus bAspdRate,6;if(getrefine()>6){bonus2 bSubRace,RC_DemiHuman,2;bonus2 bSubRace,RC_Player,2;}if(BaseClass==Job_Swordman || BaseClass==Job_Merchant || BaseClass==Job_Thief || Class==Job_Taekwon || Class==Job_Star_Gladiator || Class==Job_Star_Gladiator2 || Class==Job_Monk || Class==Job_Champion || Class==Job_Sura || Class==Job_Sura_T) bonus2 bAddClass,Class_All,(getrefine()/2);if(BaseClass==Job_Mage || BaseClass==Job_Acolyte || Class==Job_Ninja || Class==Job_Soul_Linker) bonus bMatkRate,(getrefine()/2);if(BaseClass==Job_Archer || Class==Job_Gunslinger) bonus bBaseAtk,getrefine();',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (18573,'White_Feather','White Feather',4,20,NULL,500,NULL,2,NULL,1,0xFFFFFFFF,63,2,256,NULL,'30',1,741,'if(getrefine()<5){bonus bHit,20;bonus bMaxHPrate,-10;}elseif(getrefine()<7){bonus bHit,10;}elseif(getrefine()<9){bonus bHit,7;bonus bMaxHPrate,3;}else{bonus bHit,4;bonus bMaxHPrate,4;}',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (18573,'White_Feather','White Feather',4,20,NULL,500,NULL,2,NULL,1,0xFFFFFFFF,63,2,256,NULL,'30',1,741,'if(getrefine()<5){bonus bHit,20;bonus bMaxHPrate,-10;}else if(getrefine()<7){bonus bHit,10;}else if(getrefine()<9){bonus bHit,7;bonus bMaxHPrate,3;}else{bonus bHit,4;bonus bMaxHPrate,4;}',NULL,NULL); REPLACE INTO `item_db_re` VALUES (18574,'Lord_of_Death','Lord of Death',4,20,NULL,1000,NULL,10,NULL,1,0xFFFFFFFF,63,2,256,NULL,'70',1,742,'bonus bMdef,5; bonus2 bAddClass,Class_Normal,(10+((getrefine()>4)?getrefine()-4:0)); bonus2 bSubClass,Class_Normal,-5;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (18575,'Wunderkammer','Wunderkammer',4,20,NULL,500,NULL,10,NULL,1,0xFFFFFFFF,63,2,769,NULL,'20',0,743,'bonus bMdef,10;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (18576,'YinYang_Earring','YinYang Earring',4,20,NULL,100,NULL,0,NULL,0,0xFFFFFFFF,63,2,512,NULL,'50',0,744,'bonus2 bSkillAtk,272,10; bonus2 bSkillAtk,263,5; bonus2 bSkillAtk,273,5; bonus2 bSkillUseSP,272,1; bonus2 bSkillUseSP,273,1;',NULL,NULL); diff --git a/src/map/mob.c b/src/map/mob.c index 9e6cd73732..b37cd768fc 100644 --- a/src/map/mob.c +++ b/src/map/mob.c @@ -2252,13 +2252,8 @@ int mob_dead(struct mob_data *md, struct block_list *src, int type) if (map[m].flag.nojobexp || !md->db->job_exp || md->dmglog[i].flag == MDLF_HOMUN) //Homun earned job-exp is always lost. job_exp = 0; - else { - int vip_bonus = 0; - // Increase job EXP rate for VIP. - if (battle_config.vip_job_exp_increase && (sd && pc_isvip(sd))) - vip_bonus += battle_config.vip_job_exp_increase; - job_exp = (unsigned int)cap_value(md->db->job_exp * per * (bonus+vip_bonus)/100. * map[m].adjust.jexp/100., 1, UINT_MAX); - } + else + job_exp = (unsigned int)cap_value(md->db->job_exp * per * bonus/100. * map[m].adjust.jexp/100., 1, UINT_MAX); if ( ( temp = tmpsd[i]->status.party_id)>0 ) { int j; diff --git a/src/map/pc.c b/src/map/pc.c index 0e7fb885ca..8238323152 100755 --- a/src/map/pc.c +++ b/src/map/pc.c @@ -5949,12 +5949,15 @@ int pc_checkjoblevelup(struct map_session_data *sd) return 1; } -/*========================================== - * Alters experienced based on self bonuses that do not get even shared to the party. - *------------------------------------------*/ +/** Alters experiences calculation based on self bonuses that do not get even shared to the party. +* @param sd Player +* @param base_exp Base EXP before peronal bonuses +* @param job_exp Job EXP before peronal bonuses +* @param src Block list that affecting the exp calculation +*/ static void pc_calcexp(struct map_session_data *sd, unsigned int *base_exp, unsigned int *job_exp, struct block_list *src) { - int bonus = 0; + int bonus = 0, vip_bonus_base = 0, vip_bonus_job = 0; struct status_data *status = status_get_status_data(src); if( sd->expaddrace[status->race] ) @@ -5976,12 +5979,20 @@ static void pc_calcexp(struct map_session_data *sd, unsigned int *base_exp, unsi bonus += ( sd->sc.data[SC_EXPBOOST]->val1 / battle_config.vip_bm_increase ); } - *base_exp = (unsigned int) cap_value(*base_exp + (double)*base_exp * bonus/100., 1, UINT_MAX); +#ifdef VIP_ENABLE + //EXP bonus for VIP player + if (src && src->type == BL_MOB && pc_isvip(sd)) { + vip_bonus_base = battle_config.vip_base_exp_increase; + vip_bonus_job = battle_config.vip_job_exp_increase; + } +#endif + *base_exp = (unsigned int) cap_value(*base_exp + (double)*base_exp * (bonus + vip_bonus_base)/100., 1, UINT_MAX); + if (sd->sc.data[SC_JEXPBOOST]) bonus += sd->sc.data[SC_JEXPBOOST]->val1; - *job_exp = (unsigned int) cap_value(*job_exp + (double)*job_exp * bonus/100., 1, UINT_MAX); + *job_exp = (unsigned int) cap_value(*job_exp + (double)*job_exp * (bonus + vip_bonus_job)/100., 1, UINT_MAX); return; } @@ -5999,11 +6010,7 @@ int pc_gainexp(struct map_session_data *sd, struct block_list *src, unsigned int if(!battle_config.pvp_exp && map[sd->bl.m].flag.pvp) // [MouseJstr] return 0; // no exp on pvp maps - - // Increase base EXP rate for VIP. - if (src && src->type&BL_MOB && (battle_config.vip_base_exp_increase && (sd && pc_isvip(sd)))) - base_exp = (unsigned int)cap_value(base_exp * (battle_config.vip_base_exp_increase)/100., 1, UINT_MAX); - + if(sd->status.guild_id>0) base_exp-=guild_payexp(sd,base_exp);