summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--db/const.txt1
-rw-r--r--src/map/battle.c3
-rw-r--r--src/map/map.h4
-rw-r--r--src/map/pc.c4
-rw-r--r--src/map/pc.h1
-rw-r--r--src/map/skill.c36
-rw-r--r--src/map/status.c1
7 files changed, 24 insertions, 26 deletions
diff --git a/db/const.txt b/db/const.txt
index 6495ff737..09b1c64c7 100644
--- a/db/const.txt
+++ b/db/const.txt
@@ -587,6 +587,7 @@ bSkillVariableCast 2052
bFixedCastrate 2053
bVariableCastrate 2054
bSkillUseSP 2055
+bMagicAtkEle 2056
EQI_HEAD_TOP 1
EQI_ARMOR 2
diff --git a/src/map/battle.c b/src/map/battle.c
index 22a3ba948..b148305f5 100644
--- a/src/map/battle.c
+++ b/src/map/battle.c
@@ -440,10 +440,11 @@ int battle_calc_cardfix(int attack_type, struct block_list *src, struct block_li
cardfix=cardfix*(100+sd->magic_addele[tstatus->def_ele])/100;
cardfix=cardfix*(100+sd->magic_addsize[tstatus->size])/100;
cardfix=cardfix*(100+sd->magic_addrace[is_boss(target)?RC_BOSS:RC_NONBOSS])/100;
+ cardfix=cardfix*(100+sd->magic_atk_ele[s_ele])/100;
for(i=0; i< ARRAYLENGTH(sd->add_mdmg) && sd->add_mdmg[i].rate;i++) {
if(sd->add_mdmg[i].class_ == t_class) {
cardfix=cardfix*(100+sd->add_mdmg[i].rate)/100;
- continue;
+ break;
}
}
if (cardfix != 1000)
diff --git a/src/map/map.h b/src/map/map.h
index 89e52dea3..4f90b1f2f 100644
--- a/src/map/map.h
+++ b/src/map/map.h
@@ -405,8 +405,8 @@ enum _sp {
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_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, //2051-2055
- SP_SKILL_USE_SP //2056
+ SP_SKILL_COOLDOWN,SP_SKILL_FIXEDCAST, SP_SKILL_VARIABLECAST, SP_FIXCASTRATE, SP_VARCASTRATE, //2050-2054
+ SP_SKILL_USE_SP,SP_MAGIC_ATK_ELE //2055-2056
};
enum _look {
diff --git a/src/map/pc.c b/src/map/pc.c
index a4796e347..cf62c7dc8 100644
--- a/src/map/pc.c
+++ b/src/map/pc.c
@@ -2700,6 +2700,10 @@ int pc_bonus2(struct map_session_data *sd,int type,int type2,int val)
if(sd->state.lr_flag != 2)
sd->magic_addsize[type2]+=val;
break;
+ case SP_MAGIC_ATK_ELE:
+ if(sd->state.lr_flag != 2)
+ sd->magic_atk_ele[type2]+=val;
+ break;
case SP_ADD_DAMAGE_CLASS:
switch (sd->state.lr_flag) {
case 0: //Right hand
diff --git a/src/map/pc.h b/src/map/pc.h
index a4bcb7723..9b7a3b964 100644
--- a/src/map/pc.h
+++ b/src/map/pc.h
@@ -244,6 +244,7 @@ struct map_session_data {
int magic_addele[ELE_MAX];
int magic_addrace[RC_MAX];
int magic_addsize[3];
+ int magic_atk_ele[ELE_MAX];
int critaddrace[RC_MAX];
int expaddrace[RC_MAX];
int ignore_mdef[RC_MAX];
diff --git a/src/map/skill.c b/src/map/skill.c
index c2a92cb73..2079ffd85 100644
--- a/src/map/skill.c
+++ b/src/map/skill.c
@@ -2192,6 +2192,7 @@ int skill_attack (int attack_type, struct block_list* src, struct block_list *ds
struct status_change *sc;
struct map_session_data *sd, *tsd;
int type,damage,rdamage=0;
+ int8 rmdamage=0;//magic reflected
if(skillid > 0 && skilllv <= 0) return 0;
@@ -2249,6 +2250,7 @@ int skill_attack (int attack_type, struct block_list* src, struct block_list *ds
if( (dmg.damage || dmg.damage2) && (type = skill_magic_reflect(src, bl, src==dsrc)) )
{ //Magic reflection, switch caster/target
struct block_list *tbl = bl;
+ rmdamage = 1;
bl = src;
src = tbl;
sd = BL_CAST(BL_PC, src);
@@ -2271,6 +2273,7 @@ int skill_attack (int attack_type, struct block_list* src, struct block_list *ds
sc->data[SC_SPIRIT]->val4 = dsrc->id;
}
}
+
/**
* Official Magic Reflection Behavior : damage reflected depends on gears caster wears, not target
**/
@@ -2701,29 +2704,16 @@ int skill_attack (int attack_type, struct block_list* src, struct block_list *ds
(d_bl->type == BL_PC && ((TBL_PC*)d_bl)->devotion[sce->val2] == bl->id)
) && check_distance_bl(bl, d_bl, sce->val3) )
{
- /**
- * Check for devotion and change targetted dmg.
- * [d_bl = paladin; bl = player; src = source of dmg]
- **/
- bool devo_flag = false; /* false = paladin devoing; true = player */
- if ( src )
- {
- struct status_change *tsc;
- tsc = status_get_sc(src);
-
- /* Per official standards, following skills should reflect at the bl */
- if( (tsc->data[SC_KAITE] && attack_type == BF_MAGIC) ||
- (tsc->data[SC_REFLECTDAMAGE] && attack_type != BF_MAGIC)
- )
- devo_flag = true;
- }
-
- clif_damage(
- ( (devo_flag) ? bl:d_bl),
- ( (devo_flag) ? bl:d_bl), gettick(), 0, 0, damage, 0, 0, 0);
- status_fix_damage(
- ( (devo_flag) ? bl:NULL),
- ( (devo_flag) ? bl:d_bl), damage, 0);
+ if(!rmdamage){
+ clif_damage(d_bl,d_bl, gettick(), 0, 0, damage, 0, 0, 0);
+ status_fix_damage(NULL,d_bl, damage, 0);
+ }
+ else{//Reflected magics are done directly on the target not on paladin
+ //This check is only for magical skill.
+ //For BF_WEAPON skills types track var rdamage and function battle_calc_return_damage
+ clif_damage(bl,bl, gettick(), 0, 0, damage, 0, 0, 0);
+ status_fix_damage(bl,bl, damage, 0);
+ }
}
else {
status_change_end(bl, SC_DEVOTION, INVALID_TIMER);
diff --git a/src/map/status.c b/src/map/status.c
index f73bd237e..2e208567b 100644
--- a/src/map/status.c
+++ b/src/map/status.c
@@ -2347,6 +2347,7 @@ int status_calc_pc_(struct map_session_data* sd, bool first)
+ sizeof(sd->magic_addele)
+ sizeof(sd->magic_addrace)
+ sizeof(sd->magic_addsize)
+ + sizeof(sd->magic_atk_ele)
+ sizeof(sd->critaddrace)
+ sizeof(sd->expaddrace)
+ sizeof(sd->ignore_mdef)