|
@@ -2453,7 +2453,7 @@ static int skill_magic_reflect(struct block_list* src, struct block_list* bl, in
|
|
* @return true: Skill is a combo, false: otherwise
|
|
* @return true: Skill is a combo, false: otherwise
|
|
* @author Panikon
|
|
* @author Panikon
|
|
**/
|
|
**/
|
|
-bool skill_is_combo(int skill_id) {
|
|
|
|
|
|
+bool skill_is_combo(uint16 skill_id) {
|
|
switch(skill_id) {
|
|
switch(skill_id) {
|
|
case MO_CHAINCOMBO:
|
|
case MO_CHAINCOMBO:
|
|
case MO_COMBOFINISH:
|
|
case MO_COMBOFINISH:
|
|
@@ -2807,7 +2807,8 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list *
|
|
{ //Consume one Fragment per hit of the casted skill? [Skotlex]
|
|
{ //Consume one Fragment per hit of the casted skill? [Skotlex]
|
|
type = tsd?pc_search_inventory (tsd, ITEMID_FRAGMENT_OF_CRYSTAL):0;
|
|
type = tsd?pc_search_inventory (tsd, ITEMID_FRAGMENT_OF_CRYSTAL):0;
|
|
if (type >= 0) {
|
|
if (type >= 0) {
|
|
- if ( tsd ) pc_delitem(tsd, type, 1, 0, 1, LOG_TYPE_CONSUME);
|
|
|
|
|
|
+ if ( tsd )
|
|
|
|
+ pc_delitem(tsd, type, 1, 0, 1, LOG_TYPE_CONSUME);
|
|
dmg.damage = dmg.damage2 = 0;
|
|
dmg.damage = dmg.damage2 = 0;
|
|
dmg.dmg_lv = ATK_MISS;
|
|
dmg.dmg_lv = ATK_MISS;
|
|
tsc->data[SC_SPIRIT]->val3 = skill_id;
|
|
tsc->data[SC_SPIRIT]->val3 = skill_id;
|
|
@@ -2819,7 +2820,7 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list *
|
|
/**
|
|
/**
|
|
* Official Magic Reflection Behavior : damage reflected depends on gears caster wears, not target
|
|
* Official Magic Reflection Behavior : damage reflected depends on gears caster wears, not target
|
|
**/
|
|
**/
|
|
- #if MAGIC_REFLECTION_TYPE
|
|
|
|
|
|
+#if MAGIC_REFLECTION_TYPE
|
|
#ifdef RENEWAL
|
|
#ifdef RENEWAL
|
|
if( dmg.dmg_lv != ATK_MISS ) { //Wiz SL cancelled and consumed fragment
|
|
if( dmg.dmg_lv != ATK_MISS ) { //Wiz SL cancelled and consumed fragment
|
|
#else
|
|
#else
|
|
@@ -2849,8 +2850,9 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list *
|
|
dmg.damage -= dmg.damage * (6 * (1+per)) / 100;
|
|
dmg.damage -= dmg.damage * (6 * (1+per)) / 100;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
- #endif
|
|
|
|
|
|
+#endif
|
|
}
|
|
}
|
|
|
|
+
|
|
if(tsc && tsc->data[SC_MAGICROD] && src == dsrc) {
|
|
if(tsc && tsc->data[SC_MAGICROD] && src == dsrc) {
|
|
int sp = skill_get_sp(skill_id,skill_lv);
|
|
int sp = skill_get_sp(skill_id,skill_lv);
|
|
dmg.damage = dmg.damage2 = 0;
|
|
dmg.damage = dmg.damage2 = 0;
|
|
@@ -2883,47 +2885,51 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list *
|
|
}
|
|
}
|
|
|
|
|
|
//Skill hit type
|
|
//Skill hit type
|
|
- type=(skill_id==0)?5:skill_get_hit(skill_id);
|
|
|
|
|
|
+ type = (skill_id == 0) ? 5 : skill_get_hit(skill_id);
|
|
|
|
|
|
- switch(skill_id){
|
|
|
|
- case SC_TRIANGLESHOT:
|
|
|
|
- if(rnd()%100 > (1 + skill_lv) ) dmg.blewcount = 0;
|
|
|
|
- break;
|
|
|
|
- default:
|
|
|
|
- if(damage < dmg.div_ && skill_id != CH_PALMSTRIKE)
|
|
|
|
- dmg.blewcount = 0; //only pushback when it hit for other
|
|
|
|
- break;
|
|
|
|
|
|
+ switch( skill_id ) {
|
|
|
|
+ case SC_TRIANGLESHOT:
|
|
|
|
+ if( rnd()%100 > (1 + skill_lv) )
|
|
|
|
+ dmg.blewcount = 0;
|
|
|
|
+ break;
|
|
|
|
+ default:
|
|
|
|
+ if (damage < dmg.div_ && skill_id != CH_PALMSTRIKE)
|
|
|
|
+ dmg.blewcount = 0; //only pushback when it hit for other
|
|
|
|
+ break;
|
|
}
|
|
}
|
|
|
|
|
|
- switch(skill_id){
|
|
|
|
- case CR_GRANDCROSS:
|
|
|
|
- case NPC_GRANDDARKNESS:
|
|
|
|
- if(battle_config.gx_disptype) dsrc = src;
|
|
|
|
- if(src == bl) type = 4;
|
|
|
|
- else flag|=SD_ANIMATION;
|
|
|
|
- break;
|
|
|
|
- case NJ_TATAMIGAESHI: //For correct knockback.
|
|
|
|
- dsrc = src;
|
|
|
|
- flag|=SD_ANIMATION;
|
|
|
|
- break;
|
|
|
|
- case TK_COUNTER: { //bonus from SG_FRIEND [Komurka]
|
|
|
|
- int level;
|
|
|
|
- if(sd->status.party_id>0 && (level = pc_checkskill(sd,SG_FRIEND)))
|
|
|
|
- party_skill_check(sd, sd->status.party_id, TK_COUNTER,level);
|
|
|
|
- }
|
|
|
|
- break;
|
|
|
|
- case SL_STIN:
|
|
|
|
- case SL_STUN:
|
|
|
|
- if (skill_lv >= 7){
|
|
|
|
- struct status_change *sc = status_get_sc(src);
|
|
|
|
- if(sc && !sc->data[SC_SMA])
|
|
|
|
- sc_start(src,src,SC_SMA,100,skill_lv,skill_get_time(SL_SMA, skill_lv));
|
|
|
|
- }
|
|
|
|
- break;
|
|
|
|
- case GS_FULLBUSTER:
|
|
|
|
- if(sd) //Can't attack nor use items until skill's delay expires. [Skotlex]
|
|
|
|
- sd->ud.attackabletime = sd->canuseitem_tick = sd->ud.canact_tick;
|
|
|
|
- break;
|
|
|
|
|
|
+ switch( skill_id ) {
|
|
|
|
+ case CR_GRANDCROSS:
|
|
|
|
+ case NPC_GRANDDARKNESS:
|
|
|
|
+ if( battle_config.gx_disptype)
|
|
|
|
+ dsrc = src;
|
|
|
|
+ if( src == bl)
|
|
|
|
+ type = 4;
|
|
|
|
+ else
|
|
|
|
+ flag|= SD_ANIMATION;
|
|
|
|
+ break;
|
|
|
|
+ case NJ_TATAMIGAESHI: //For correct knockback.
|
|
|
|
+ dsrc = src;
|
|
|
|
+ flag|= SD_ANIMATION;
|
|
|
|
+ break;
|
|
|
|
+ case TK_COUNTER: { //bonus from SG_FRIEND [Komurka]
|
|
|
|
+ int level;
|
|
|
|
+ if( sd->status.party_id>0 && (level = pc_checkskill(sd,SG_FRIEND)) )
|
|
|
|
+ party_skill_check(sd, sd->status.party_id, TK_COUNTER,level);
|
|
|
|
+ }
|
|
|
|
+ break;
|
|
|
|
+ case SL_STIN:
|
|
|
|
+ case SL_STUN:
|
|
|
|
+ if (skill_lv >= 7) {
|
|
|
|
+ struct status_change *sc = status_get_sc(src);
|
|
|
|
+ if (sc && !sc->data[SC_SMA])
|
|
|
|
+ sc_start(src,src,SC_SMA,100,skill_lv,skill_get_time(SL_SMA, skill_lv));
|
|
|
|
+ }
|
|
|
|
+ break;
|
|
|
|
+ case GS_FULLBUSTER:
|
|
|
|
+ if (sd) //Can't attack nor use items until skill's delay expires. [Skotlex]
|
|
|
|
+ sd->ud.attackabletime = sd->canuseitem_tick = sd->ud.canact_tick;
|
|
|
|
+ break;
|
|
}
|
|
}
|
|
|
|
|
|
//combo handling
|
|
//combo handling
|
|
@@ -2931,114 +2937,114 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list *
|
|
|
|
|
|
//Display damage.
|
|
//Display damage.
|
|
switch( skill_id ) {
|
|
switch( skill_id ) {
|
|
- case PA_GOSPEL: //Should look like Holy Cross [Skotlex]
|
|
|
|
- dmg.dmotion = clif_skill_damage(dsrc,bl,tick,dmg.amotion,dmg.dmotion, damage, dmg.div_, CR_HOLYCROSS, -1, 5);
|
|
|
|
- break;
|
|
|
|
- //Skills that need be passed as a normal attack for the client to display correctly.
|
|
|
|
- case HVAN_EXPLOSION:
|
|
|
|
- case NPC_SELFDESTRUCTION:
|
|
|
|
- if(src->type == BL_PC)
|
|
|
|
- dmg.blewcount = 10;
|
|
|
|
- dmg.amotion = 0; //Disable delay or attack will do no damage since source is dead by the time it takes effect. [Skotlex]
|
|
|
|
- // fall through
|
|
|
|
- case KN_AUTOCOUNTER:
|
|
|
|
- case NPC_CRITICALSLASH:
|
|
|
|
- case TF_DOUBLE:
|
|
|
|
- case GS_CHAINACTION:
|
|
|
|
- dmg.dmotion = clif_damage(src,bl,tick,dmg.amotion,dmg.dmotion,damage,dmg.div_,(enum e_damage_type)dmg.type,dmg.damage2);
|
|
|
|
- break;
|
|
|
|
-
|
|
|
|
- case AS_SPLASHER:
|
|
|
|
- if( flag&SD_ANIMATION ) // the surrounding targets
|
|
|
|
- dmg.dmotion = clif_skill_damage(dsrc,bl,tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, skill_id, -1, 5); // needs -1 as skill level
|
|
|
|
- else // the central target doesn't display an animation
|
|
|
|
- dmg.dmotion = clif_skill_damage(dsrc,bl,tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, skill_id, -2, 5); // needs -2(!) as skill level
|
|
|
|
- break;
|
|
|
|
- case WL_HELLINFERNO:
|
|
|
|
- case SR_EARTHSHAKER:
|
|
|
|
- dmg.dmotion = clif_skill_damage(src,bl,tick,dmg.amotion,dmg.dmotion,damage,1,skill_id,-2,6);
|
|
|
|
- break;
|
|
|
|
- case WL_SOULEXPANSION:
|
|
|
|
- case WL_COMET:
|
|
|
|
- case KO_MUCHANAGE:
|
|
|
|
- case NJ_HUUMA:
|
|
|
|
- dmg.dmotion = clif_skill_damage(src,bl,tick,dmg.amotion,dmg.dmotion,damage,dmg.div_,skill_id,skill_lv,8);
|
|
|
|
- break;
|
|
|
|
- case WL_CHAINLIGHTNING_ATK:
|
|
|
|
- dmg.dmotion = clif_skill_damage(src,bl,tick,dmg.amotion,dmg.dmotion,damage,1,WL_CHAINLIGHTNING,-2,6);
|
|
|
|
- break;
|
|
|
|
- case LG_OVERBRAND:
|
|
|
|
- case LG_OVERBRAND_BRANDISH:
|
|
|
|
- dmg.amotion = status_get_amotion(src) * 2;
|
|
|
|
- case LG_OVERBRAND_PLUSATK:
|
|
|
|
- dmg.dmotion = clif_skill_damage(dsrc,bl,tick,status_get_amotion(src),dmg.dmotion,damage,dmg.div_,skill_id,-1,5);
|
|
|
|
- break;
|
|
|
|
- case EL_FIRE_BOMB:
|
|
|
|
- case EL_FIRE_BOMB_ATK:
|
|
|
|
- case EL_FIRE_WAVE:
|
|
|
|
- case EL_FIRE_WAVE_ATK:
|
|
|
|
- case EL_FIRE_MANTLE:
|
|
|
|
- case EL_CIRCLE_OF_FIRE:
|
|
|
|
- case EL_FIRE_ARROW:
|
|
|
|
- case EL_ICE_NEEDLE:
|
|
|
|
- case EL_WATER_SCREW:
|
|
|
|
- case EL_WATER_SCREW_ATK:
|
|
|
|
- case EL_WIND_SLASH:
|
|
|
|
- case EL_TIDAL_WEAPON:
|
|
|
|
- case EL_ROCK_CRUSHER:
|
|
|
|
- case EL_ROCK_CRUSHER_ATK:
|
|
|
|
- case EL_HURRICANE:
|
|
|
|
- case EL_HURRICANE_ATK:
|
|
|
|
- case KO_BAKURETSU:
|
|
|
|
- case GN_CRAZYWEED_ATK:
|
|
|
|
- case NC_MAGMA_ERUPTION:
|
|
|
|
- dmg.dmotion = clif_skill_damage(src,bl,tick,dmg.amotion,dmg.dmotion,damage,dmg.div_,skill_id,-1,5);
|
|
|
|
- break;
|
|
|
|
- case GN_FIRE_EXPANSION_ACID:
|
|
|
|
- dmg.dmotion = clif_skill_damage(dsrc, bl, tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, CR_ACIDDEMONSTRATION, skill_lv, 8);
|
|
|
|
- break;
|
|
|
|
- case GN_SLINGITEM_RANGEMELEEATK:
|
|
|
|
- dmg.dmotion = clif_skill_damage(src,bl,tick,dmg.amotion,dmg.dmotion,damage,dmg.div_,GN_SLINGITEM,-2,6);
|
|
|
|
- break;
|
|
|
|
- case EL_STONE_RAIN:
|
|
|
|
- dmg.dmotion = clif_skill_damage(dsrc,bl,tick,dmg.amotion,dmg.dmotion,damage,dmg.div_,skill_id,-1,(flag&1)?8:5);
|
|
|
|
- break;
|
|
|
|
- case WM_SEVERE_RAINSTORM_MELEE:
|
|
|
|
- dmg.dmotion = clif_skill_damage(src,bl,tick,dmg.amotion,dmg.dmotion,damage,dmg.div_,WM_SEVERE_RAINSTORM,-2,6);
|
|
|
|
- break;
|
|
|
|
- case WM_REVERBERATION_MELEE:
|
|
|
|
- case WM_REVERBERATION_MAGIC:
|
|
|
|
- dmg.dmotion = clif_skill_damage(src,bl,tick,dmg.amotion,dmg.dmotion,damage,dmg.div_,WM_REVERBERATION,-2,6);
|
|
|
|
- break;
|
|
|
|
- case HT_CLAYMORETRAP:
|
|
|
|
- case HT_BLASTMINE:
|
|
|
|
- case HT_FLASHER:
|
|
|
|
- case HT_FREEZINGTRAP:
|
|
|
|
- case RA_CLUSTERBOMB:
|
|
|
|
- case RA_FIRINGTRAP:
|
|
|
|
- case RA_ICEBOUNDTRAP:
|
|
|
|
- dmg.dmotion = clif_skill_damage(src,bl,tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, skill_id,flag&SD_LEVEL?-1:skill_lv, 5);
|
|
|
|
- if( dsrc != src ) // avoid damage display redundancy
|
|
|
|
|
|
+ case PA_GOSPEL: //Should look like Holy Cross [Skotlex]
|
|
|
|
+ dmg.dmotion = clif_skill_damage(dsrc,bl,tick,dmg.amotion,dmg.dmotion, damage, dmg.div_, CR_HOLYCROSS, -1, 5);
|
|
|
|
+ break;
|
|
|
|
+ //Skills that need be passed as a normal attack for the client to display correctly.
|
|
|
|
+ case HVAN_EXPLOSION:
|
|
|
|
+ case NPC_SELFDESTRUCTION:
|
|
|
|
+ if(src->type == BL_PC)
|
|
|
|
+ dmg.blewcount = 10;
|
|
|
|
+ dmg.amotion = 0; //Disable delay or attack will do no damage since source is dead by the time it takes effect. [Skotlex]
|
|
|
|
+ // fall through
|
|
|
|
+ case KN_AUTOCOUNTER:
|
|
|
|
+ case NPC_CRITICALSLASH:
|
|
|
|
+ case TF_DOUBLE:
|
|
|
|
+ case GS_CHAINACTION:
|
|
|
|
+ dmg.dmotion = clif_damage(src,bl,tick,dmg.amotion,dmg.dmotion,damage,dmg.div_,(enum e_damage_type)dmg.type,dmg.damage2);
|
|
|
|
+ break;
|
|
|
|
+
|
|
|
|
+ case AS_SPLASHER:
|
|
|
|
+ if( flag&SD_ANIMATION ) // the surrounding targets
|
|
|
|
+ dmg.dmotion = clif_skill_damage(dsrc,bl,tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, skill_id, -1, 5); // needs -1 as skill level
|
|
|
|
+ else // the central target doesn't display an animation
|
|
|
|
+ dmg.dmotion = clif_skill_damage(dsrc,bl,tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, skill_id, -2, 5); // needs -2(!) as skill level
|
|
|
|
+ break;
|
|
|
|
+ case WL_HELLINFERNO:
|
|
|
|
+ case SR_EARTHSHAKER:
|
|
|
|
+ dmg.dmotion = clif_skill_damage(src,bl,tick,dmg.amotion,dmg.dmotion,damage,1,skill_id,-2,6);
|
|
|
|
+ break;
|
|
|
|
+ case WL_SOULEXPANSION:
|
|
|
|
+ case WL_COMET:
|
|
|
|
+ case KO_MUCHANAGE:
|
|
|
|
+ case NJ_HUUMA:
|
|
|
|
+ dmg.dmotion = clif_skill_damage(src,bl,tick,dmg.amotion,dmg.dmotion,damage,dmg.div_,skill_id,skill_lv,8);
|
|
|
|
+ break;
|
|
|
|
+ case WL_CHAINLIGHTNING_ATK:
|
|
|
|
+ dmg.dmotion = clif_skill_damage(src,bl,tick,dmg.amotion,dmg.dmotion,damage,1,WL_CHAINLIGHTNING,-2,6);
|
|
|
|
+ break;
|
|
|
|
+ case LG_OVERBRAND:
|
|
|
|
+ case LG_OVERBRAND_BRANDISH:
|
|
|
|
+ dmg.amotion = status_get_amotion(src) * 2;
|
|
|
|
+ case LG_OVERBRAND_PLUSATK:
|
|
|
|
+ dmg.dmotion = clif_skill_damage(dsrc,bl,tick,status_get_amotion(src),dmg.dmotion,damage,dmg.div_,skill_id,-1,5);
|
|
|
|
+ break;
|
|
|
|
+ case EL_FIRE_BOMB:
|
|
|
|
+ case EL_FIRE_BOMB_ATK:
|
|
|
|
+ case EL_FIRE_WAVE:
|
|
|
|
+ case EL_FIRE_WAVE_ATK:
|
|
|
|
+ case EL_FIRE_MANTLE:
|
|
|
|
+ case EL_CIRCLE_OF_FIRE:
|
|
|
|
+ case EL_FIRE_ARROW:
|
|
|
|
+ case EL_ICE_NEEDLE:
|
|
|
|
+ case EL_WATER_SCREW:
|
|
|
|
+ case EL_WATER_SCREW_ATK:
|
|
|
|
+ case EL_WIND_SLASH:
|
|
|
|
+ case EL_TIDAL_WEAPON:
|
|
|
|
+ case EL_ROCK_CRUSHER:
|
|
|
|
+ case EL_ROCK_CRUSHER_ATK:
|
|
|
|
+ case EL_HURRICANE:
|
|
|
|
+ case EL_HURRICANE_ATK:
|
|
|
|
+ case KO_BAKURETSU:
|
|
|
|
+ case GN_CRAZYWEED_ATK:
|
|
|
|
+ case NC_MAGMA_ERUPTION:
|
|
|
|
+ dmg.dmotion = clif_skill_damage(src,bl,tick,dmg.amotion,dmg.dmotion,damage,dmg.div_,skill_id,-1,5);
|
|
|
|
+ break;
|
|
|
|
+ case GN_FIRE_EXPANSION_ACID:
|
|
|
|
+ dmg.dmotion = clif_skill_damage(dsrc, bl, tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, CR_ACIDDEMONSTRATION, skill_lv, 8);
|
|
|
|
+ break;
|
|
|
|
+ case GN_SLINGITEM_RANGEMELEEATK:
|
|
|
|
+ dmg.dmotion = clif_skill_damage(src,bl,tick,dmg.amotion,dmg.dmotion,damage,dmg.div_,GN_SLINGITEM,-2,6);
|
|
|
|
+ break;
|
|
|
|
+ case EL_STONE_RAIN:
|
|
|
|
+ dmg.dmotion = clif_skill_damage(dsrc,bl,tick,dmg.amotion,dmg.dmotion,damage,dmg.div_,skill_id,-1,(flag&1)?8:5);
|
|
|
|
+ break;
|
|
|
|
+ case WM_SEVERE_RAINSTORM_MELEE:
|
|
|
|
+ dmg.dmotion = clif_skill_damage(src,bl,tick,dmg.amotion,dmg.dmotion,damage,dmg.div_,WM_SEVERE_RAINSTORM,-2,6);
|
|
|
|
+ break;
|
|
|
|
+ case WM_REVERBERATION_MELEE:
|
|
|
|
+ case WM_REVERBERATION_MAGIC:
|
|
|
|
+ dmg.dmotion = clif_skill_damage(src,bl,tick,dmg.amotion,dmg.dmotion,damage,dmg.div_,WM_REVERBERATION,-2,6);
|
|
|
|
+ break;
|
|
|
|
+ case HT_CLAYMORETRAP:
|
|
|
|
+ case HT_BLASTMINE:
|
|
|
|
+ case HT_FLASHER:
|
|
|
|
+ case HT_FREEZINGTRAP:
|
|
|
|
+ case RA_CLUSTERBOMB:
|
|
|
|
+ case RA_FIRINGTRAP:
|
|
|
|
+ case RA_ICEBOUNDTRAP:
|
|
|
|
+ dmg.dmotion = clif_skill_damage(src,bl,tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, skill_id,flag&SD_LEVEL?-1:skill_lv, 5);
|
|
|
|
+ if( dsrc != src ) // avoid damage display redundancy
|
|
|
|
+ break;
|
|
|
|
+ case HT_LANDMINE:
|
|
|
|
+ dmg.dmotion = clif_skill_damage(dsrc,bl,tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, skill_id, -1, type);
|
|
|
|
+ break;
|
|
|
|
+ case WZ_SIGHTBLASTER:
|
|
|
|
+ dmg.dmotion = clif_skill_damage(src,bl,tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, skill_id, flag&SD_LEVEL?-1:skill_lv, 5);
|
|
|
|
+ break;
|
|
|
|
+ case AB_DUPLELIGHT_MELEE:
|
|
|
|
+ case AB_DUPLELIGHT_MAGIC:
|
|
|
|
+ dmg.amotion = 300;/* makes the damage value not overlap with previous damage (when displayed by the client) */
|
|
|
|
+ default:
|
|
|
|
+ if( flag&SD_ANIMATION && dmg.div_ < 2 ) //Disabling skill animation doesn't works on multi-hit.
|
|
|
|
+ type = 5;
|
|
|
|
+ if( bl->type == BL_SKILL ){
|
|
|
|
+ TBL_SKILL *su = (TBL_SKILL*)bl;
|
|
|
|
+ if( su->group && skill_get_inf2(su->group->skill_id)&INF2_TRAP )// show damage on trap targets
|
|
|
|
+ clif_skill_damage(src,bl,tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, skill_id, flag&SD_LEVEL?-1:skill_lv, 5);
|
|
|
|
+ }
|
|
|
|
+ dmg.dmotion = clif_skill_damage(dsrc,bl,tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, skill_id, flag&SD_LEVEL?-1:skill_lv, type);
|
|
break;
|
|
break;
|
|
- case HT_LANDMINE:
|
|
|
|
- dmg.dmotion = clif_skill_damage(dsrc,bl,tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, skill_id, -1, type);
|
|
|
|
- break;
|
|
|
|
- case WZ_SIGHTBLASTER:
|
|
|
|
- dmg.dmotion = clif_skill_damage(src,bl,tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, skill_id, flag&SD_LEVEL?-1:skill_lv, 5);
|
|
|
|
- break;
|
|
|
|
- case AB_DUPLELIGHT_MELEE:
|
|
|
|
- case AB_DUPLELIGHT_MAGIC:
|
|
|
|
- dmg.amotion = 300;/* makes the damage value not overlap with previous damage (when displayed by the client) */
|
|
|
|
- default:
|
|
|
|
- if( flag&SD_ANIMATION && dmg.div_ < 2 ) //Disabling skill animation doesn't works on multi-hit.
|
|
|
|
- type = 5;
|
|
|
|
- if( bl->type == BL_SKILL ){
|
|
|
|
- TBL_SKILL *su = (TBL_SKILL*)bl;
|
|
|
|
- if( su->group && skill_get_inf2(su->group->skill_id)&INF2_TRAP )// show damage on trap targets
|
|
|
|
- clif_skill_damage(src,bl,tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, skill_id, flag&SD_LEVEL?-1:skill_lv, 5);
|
|
|
|
- }
|
|
|
|
- dmg.dmotion = clif_skill_damage(dsrc,bl,tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, skill_id, flag&SD_LEVEL?-1:skill_lv, type);
|
|
|
|
- break;
|
|
|
|
}
|
|
}
|
|
|
|
|
|
map_freeblock_lock();
|
|
map_freeblock_lock();
|
|
@@ -3144,11 +3150,15 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list *
|
|
if(!rmdamage){
|
|
if(!rmdamage){
|
|
clif_damage(d_bl,d_bl, gettick(), 0, 0, damage, 0, DMG_NORMAL, 0);
|
|
clif_damage(d_bl,d_bl, gettick(), 0, 0, damage, 0, DMG_NORMAL, 0);
|
|
status_fix_damage(NULL,d_bl, damage, 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, DMG_NORMAL, 0);
|
|
|
|
- status_fix_damage(bl,bl, damage, 0);
|
|
|
|
|
|
+ } else {
|
|
|
|
+ bool isDevotRdamage = false;
|
|
|
|
+ if (battle_config.devotion_rdamage && battle_config.devotion_rdamage > rand()%100)
|
|
|
|
+ isDevotRdamage = true;
|
|
|
|
+ // If !isDevotRdamage, 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,(!isDevotRdamage) ? bl : d_bl, gettick(), 0, 0, damage, 0, DMG_NORMAL, 0);
|
|
|
|
+ status_fix_damage(bl,(!isDevotRdamage) ? bl : d_bl, damage, 0);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
else {
|