diff --git a/doc/status_change.txt b/doc/status_change.txt index 01fe1f873f..05d65001b6 100644 --- a/doc/status_change.txt +++ b/doc/status_change.txt @@ -1275,7 +1275,7 @@ SC_FOOD_LUK_CASH (SI_FOOD_LUK_CASH) val1: +LUK SC_FEAR () - desc: + desc: Cause SC_ANKLE for 2 seconds, Hit/Flee -20%, remove blind, immune to blind val1: SC_BURNING (SI_BURNT) diff --git a/src/map/status.c b/src/map/status.c index 48e0809577..e1292dd968 100644 --- a/src/map/status.c +++ b/src/map/status.c @@ -87,6 +87,7 @@ static unsigned short status_calc_ematk(struct block_list *,struct status_change static int status_get_hpbonus(struct block_list *bl, enum e_status_bonus type); static int status_get_spbonus(struct block_list *bl, enum e_status_bonus type); static unsigned int status_calc_maxhpsp_pc(struct map_session_data* sd, unsigned int stat, bool isHP); +static int status_get_sc_interval(enum sc_type type); static bool status_change_isDisabledOnMap_(sc_type type, bool mapIsVS, bool mapIsPVP, bool mapIsGVG, bool mapIsBG, unsigned int mapZone); #define status_change_isDisabledOnMap(type, m) ( status_change_isDisabledOnMap_((type), map_flag_vs((m)), map[(m)].flag.pvp, map_flag_gvg((m)), map[(m)].flag.battleground, map[(m)].zone << 3) ) @@ -2004,6 +2005,7 @@ bool status_check_skilluse(struct block_list *src, struct block_list *target, ui (sc->data[SC_BASILICA] && (sc->data[SC_BASILICA]->val4 != src->id || skill_id != HP_BASILICA)) || // Only Basilica caster that can cast, and only Basilica to cancel it (sc->data[SC_MARIONETTE] && skill_id != CG_MARIONETTE) || // Only skill you can use is marionette again to cancel it (sc->data[SC_MARIONETTE2] && skill_id == CG_MARIONETTE) || // Cannot use marionette if you are being buffed by another + (sc->data[SC_ANKLE] && skill_block_check(src, SC_ANKLE, skill_id)) || (sc->data[SC_STASIS] && skill_block_check(src, SC_STASIS, skill_id)) || (sc->data[SC_BITE] && skill_block_check(src, SC_BITE, skill_id)) || (sc->data[SC_KAGEHUMI] && skill_block_check(src, SC_KAGEHUMI, skill_id)) @@ -7309,7 +7311,7 @@ void status_change_init(struct block_list *bl) * through the timer (e.g. those that deal damage in regular intervals) * @param type: Status change (SC_*) *------------------------------------------*/ -int status_get_sc_interval(enum sc_type type) +static int status_get_sc_interval(enum sc_type type) { switch (type) { case SC_POISON: @@ -7893,8 +7895,11 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty return 0; // Cannot override other opt1 status changes. [Skotlex] if((type == SC_FREEZE || type == SC_FREEZING || type == SC_CRYSTALIZE) && sc->data[SC_WARMER]) return 0; // Immune to Frozen and Freezing status if under Warmer status. [Jobbie] - break; - + break; + case SC_BLIND: + if (sc->data[SC_FEAR]) + return 0; + break; case SC_ALL_RIDING: if( !sd || !&sd->sc || sc->option&(OPTION_RIDING|OPTION_DRAGON|OPTION_WUGRIDER|OPTION_MADOGEAR) ) return 0; @@ -7903,19 +7908,16 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty status_change_end(bl, SC_ALL_RIDING, INVALID_TIMER); return 0; } - break; - + break; // They're all like berserk, do not everlap each other case SC_BERSERK: if(sc->data[SC_SATURDAYNIGHTFEVER]) return 0; break; - case SC_BURNING: if(sc->opt1 || sc->data[SC_FREEZING]) return 0; - break; - + break; case SC_SIGNUMCRUCIS: // Only affects demons and undead element (but not players) if((!undead_flag && status->race!=RC_DEMON) || bl->type == BL_PC) @@ -7960,7 +7962,6 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty case SC_TWOHANDQUICKEN: if(sc->data[SC_DECREASEAGI] || sc->data[SC_ADORAMUS]) return 0; - case SC_INCREASEAGI: case SC_CONCENTRATE: case SC_SPEARQUICKEN: @@ -8513,6 +8514,9 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty status_change_end(bl, SC_FREEZE, INVALID_TIMER); status_change_end(bl, SC_STONE, INVALID_TIMER); break; + case SC_FEAR: + status_change_end(bl, SC_BLIND, INVALID_TIMER); + break; case SC_FREEZING: status_change_end(bl, SC_BURNING, INVALID_TIMER); break; @@ -9571,9 +9575,7 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty /* General */ case SC_FEAR: - val2 = 2; - val4 = tick / 1000; - tick_time = 1000; // [GodLesZ] tick time + status_change_start(src,bl,SC_ANKLE,10000,val1,0,0,0,2000,SCSTART_NOAVOID|SCSTART_NOTICKDEF|SCSTART_NORATEDEF); break; /* Rune Knight */ @@ -10449,7 +10451,6 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty case SC_TINDER_BREAKER2: case SC_BITE: case SC_THORNSTRAP: - case SC_FEAR: case SC_MEIKYOUSISUI: case SC_KYOUGAKU: case SC_PARALYSIS: @@ -12184,15 +12185,6 @@ int status_change_timer(int tid, unsigned int tick, int id, intptr_t data) } break; - case SC_FEAR: - if( --(sce->val4) >= 0 ) { - if( sce->val2 > 0 ) - sce->val2--; - sc_timer_next(1000 + tick, status_change_timer, bl->id, data); - return 0; - } - break; - case SC_SPHERE_1: case SC_SPHERE_2: case SC_SPHERE_3: @@ -12964,6 +12956,7 @@ int status_change_spread(struct block_list *src, struct block_list *bl, bool typ //case SC_STRIPHELM: //case SC__STRIPACCESSORY: //case SC_BITE: + case SC_FEAR: case SC_FREEZING: case SC_VENOMBLEED: if (sc->data[i]->timer != INVALID_TIMER) @@ -12987,9 +12980,6 @@ int status_change_spread(struct block_list *src, struct block_list *bl, bool typ else data.tick = INVALID_TIMER; break; - case SC_FEAR: - data.tick = sc->data[i]->val4 * 1000; - break; default: continue; } diff --git a/src/map/status.h b/src/map/status.h index d3885fce5b..bb24b23807 100644 --- a/src/map/status.h +++ b/src/map/status.h @@ -2150,7 +2150,6 @@ struct status_change *status_get_sc(struct block_list *bl); int status_isdead(struct block_list *bl); int status_isimmune(struct block_list *bl); -int status_get_sc_interval(enum sc_type type); int status_get_sc_def(struct block_list *src,struct block_list *bl, enum sc_type type, int rate, int tick, unsigned char flag); //Short version, receives rate in 1->100 range, and does not uses a flag setting. #define sc_start(src, bl, type, rate, val1, tick) status_change_start(src,bl,type,100*(rate),val1,0,0,0,tick,SCSTART_NONE) diff --git a/src/map/unit.c b/src/map/unit.c index 4c722a046e..8e3d3fbe1d 100644 --- a/src/map/unit.c +++ b/src/map/unit.c @@ -1358,7 +1358,6 @@ int unit_can_move(struct block_list *bl) { // Status changes that block movement if (sc) { if( sc->cant.move // status placed here are ones that cannot be cached by sc->cant.move for they depend on other conditions other than their availability - || (sc->data[SC_FEAR] && sc->data[SC_FEAR]->val2 > 0) || (sc->data[SC_SPIDERWEB] && sc->data[SC_SPIDERWEB]->val1) || (sc->data[SC_DANCING] && sc->data[SC_DANCING]->val4 && ( !sc->data[SC_LONGING] ||