diff --git a/db/re/skill_db.txt b/db/re/skill_db.txt index b571318a9a..df62f90b4a 100644 --- a/db/re/skill_db.txt +++ b/db/re/skill_db.txt @@ -760,7 +760,7 @@ 2027,0,6,4,0,0x1,0,5,1,no,0,0,0,none,0, GC_POISONINGWEAPON,Poisoning Weapon 2028,0,6,4,0,0x1,0,5,1,no,0,0,0,none,0, GC_WEAPONBLOCKING,Weapon Blocking 2029,-2,6,4,-1,0x2,1,5,1,no,0,0,0,weapon,3, GC_COUNTERSLASH,Counter Slash -2030,-2,6,4,-1,0x1,0,5,1,no,0,0x200,0,weapon,0, GC_WEAPONCRUSH,Weapon Crush //CHECK SHould this and the above skill have INF2 0x200? +2030,-2,6,4,-1,0,0,5,1,no,0,0x200,0,weapon,0, GC_WEAPONCRUSH,Weapon Crush 2031,1,6,1,-1,0,0,5,1,no,0,0,0,weapon,0, GC_VENOMPRESSURE,Venom Pressure 2032,5,6,2,0,0x1,0,5,1,yes,0,0,1,none,0, GC_POISONSMOKE,Poison Smoke 2033,0,6,4,0,0x1,0,5,1,no,0,0,0,weapon,0, GC_CLOAKINGEXCEED,Cloaking Exceed diff --git a/src/map/battle.c b/src/map/battle.c index a0eaec172b..6ce5115a76 100644 --- a/src/map/battle.c +++ b/src/map/battle.c @@ -4612,9 +4612,13 @@ int battle_calc_return_damage(struct block_list* bl, struct block_list *src, int sc = status_get_sc(bl); if( sc && sc->data[SC_REFLECTDAMAGE] ) { - int max_damage = (int64)status_get_max_hp(bl) * status_get_lv(bl) / 100; - rdamage = (int64)(*dmg) * sc->data[SC_REFLECTDAMAGE]->val2 / 100; - if( rdamage > max_damage ) rdamage = max_damage; + if( rnd()%100 <= sc->data[SC_REFLECTDAMAGE]->val1*10 + 30 ){ + int max_damage = (int64)status_get_max_hp(bl) * status_get_lv(bl) / 100; + rdamage = (int64)(*dmg) * sc->data[SC_REFLECTDAMAGE]->val2 / 100; + if( --(sc->data[SC_REFLECTDAMAGE]->val3) < 1) + status_change_end(bl,SC_REFLECTDAMAGE,INVALID_TIMER); + if( rdamage > max_damage ) rdamage = max_damage; + } }else if( sc && sc->data[SC_CRESCENTELBOW] && !is_boss(src) && rnd()%100 < sc->data[SC_CRESCENTELBOW]->val2 ){ //ATK [{(Target HP / 100) x Skill Level} x Caster Base Level / 125] % + [Received damage x {1 + (Skill Level x 0.2)}] int ratio = (int64)(status_get_hp(src) / 100) * sc->data[SC_CRESCENTELBOW]->val1 * status_get_lv(bl) / 125; diff --git a/src/map/skill.c b/src/map/skill.c index 3e6daba19c..258efe1afa 100644 --- a/src/map/skill.c +++ b/src/map/skill.c @@ -2450,7 +2450,7 @@ int skill_attack (int attack_type, struct block_list* src, struct block_list *ds damage = 1; if( damage > 0 && (( dmg.flag&BF_WEAPON && src != bl && ( src == dsrc || ( dsrc->type == BL_SKILL && ( skill_id == SG_SUN_WARM || skill_id == SG_MOON_WARM || skill_id == SG_STAR_WARM ) ) )) - || (sc && sc->data[SC_REFLECTDAMAGE])) ) + || ((sc && sc->data[SC_REFLECTDAMAGE]) && !dmg.flag&(BF_MAGIC|BF_LONG) && !skill_get_inf2(skill_id)&INF2_TRAP)) ) rdamage = battle_calc_return_damage(bl,src, &damage, dmg.flag, skill_id); if( damage && sc && sc->data[SC_GENSOU] && dmg.flag&BF_MAGIC ){ diff --git a/src/map/status.c b/src/map/status.c index aa39e3ac63..78a63fa9c6 100644 --- a/src/map/status.c +++ b/src/map/status.c @@ -8472,10 +8472,10 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty } break; case SC_REFLECTDAMAGE: - val2 = 15 + 5 * val1; - val3 = (val1==5)?20:(val1+4)*2; // SP consumption - val4 = tick/10000; - tick_time = 10000; // [GodLesZ] tick time + val2 = 15 + 5 * val1; // Reflect amount + val3 = val1*5 + 25; // Number of reflects + val4 = tick/1000; // Number of SP cycles (duration) + tick_time = 1000; // [GodLesZ] tick time break; case SC_FORCEOFVANGUARD: // This is not the official way to handle it but I think we should use it. [pakpil] val2 = 20 + 12 * (val1 - 1); // Chance @@ -10604,9 +10604,9 @@ int status_change_timer(int tid, unsigned int tick, int id, intptr_t data) case SC_REFLECTDAMAGE: if( --(sce->val4) >= 0 ) { - if( !status_charge(bl,0,sce->val3) ) - break; - sc_timer_next(10000 + tick, status_change_timer, bl->id, data); + if( !status_charge(bl,0,10) ) + break; + sc_timer_next(1000 + tick, status_change_timer, bl->id, data); return 0; } break;