Fear status change (#1048)
* Fear now causes the SC_ANKLE status change for 2 seconds rather than having a weird custom implementation * Fear now removes blind and makes you immune to it * Fixed SC_ANKLE not properly blocking teleportation * Some code optimizations
This commit is contained in:
parent
4b3d8ddc5c
commit
fbb8edba39
@ -1275,7 +1275,7 @@ SC_FOOD_LUK_CASH (SI_FOOD_LUK_CASH)
|
|||||||
val1: +LUK
|
val1: +LUK
|
||||||
|
|
||||||
SC_FEAR ()
|
SC_FEAR ()
|
||||||
desc:
|
desc: Cause SC_ANKLE for 2 seconds, Hit/Flee -20%, remove blind, immune to blind
|
||||||
val1:
|
val1:
|
||||||
|
|
||||||
SC_BURNING (SI_BURNT)
|
SC_BURNING (SI_BURNT)
|
||||||
|
@ -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_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 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 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);
|
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) )
|
#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_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_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_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_STASIS] && skill_block_check(src, SC_STASIS, skill_id)) ||
|
||||||
(sc->data[SC_BITE] && skill_block_check(src, SC_BITE, 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))
|
(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)
|
* through the timer (e.g. those that deal damage in regular intervals)
|
||||||
* @param type: Status change (SC_*)
|
* @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) {
|
switch (type) {
|
||||||
case SC_POISON:
|
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]
|
return 0; // Cannot override other opt1 status changes. [Skotlex]
|
||||||
if((type == SC_FREEZE || type == SC_FREEZING || type == SC_CRYSTALIZE) && sc->data[SC_WARMER])
|
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]
|
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:
|
case SC_ALL_RIDING:
|
||||||
if( !sd || !&sd->sc || sc->option&(OPTION_RIDING|OPTION_DRAGON|OPTION_WUGRIDER|OPTION_MADOGEAR) )
|
if( !sd || !&sd->sc || sc->option&(OPTION_RIDING|OPTION_DRAGON|OPTION_WUGRIDER|OPTION_MADOGEAR) )
|
||||||
return 0;
|
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);
|
status_change_end(bl, SC_ALL_RIDING, INVALID_TIMER);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// They're all like berserk, do not everlap each other
|
// They're all like berserk, do not everlap each other
|
||||||
case SC_BERSERK:
|
case SC_BERSERK:
|
||||||
if(sc->data[SC_SATURDAYNIGHTFEVER])
|
if(sc->data[SC_SATURDAYNIGHTFEVER])
|
||||||
return 0;
|
return 0;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SC_BURNING:
|
case SC_BURNING:
|
||||||
if(sc->opt1 || sc->data[SC_FREEZING])
|
if(sc->opt1 || sc->data[SC_FREEZING])
|
||||||
return 0;
|
return 0;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SC_SIGNUMCRUCIS:
|
case SC_SIGNUMCRUCIS:
|
||||||
// Only affects demons and undead element (but not players)
|
// Only affects demons and undead element (but not players)
|
||||||
if((!undead_flag && status->race!=RC_DEMON) || bl->type == BL_PC)
|
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:
|
case SC_TWOHANDQUICKEN:
|
||||||
if(sc->data[SC_DECREASEAGI] || sc->data[SC_ADORAMUS])
|
if(sc->data[SC_DECREASEAGI] || sc->data[SC_ADORAMUS])
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
case SC_INCREASEAGI:
|
case SC_INCREASEAGI:
|
||||||
case SC_CONCENTRATE:
|
case SC_CONCENTRATE:
|
||||||
case SC_SPEARQUICKEN:
|
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_FREEZE, INVALID_TIMER);
|
||||||
status_change_end(bl, SC_STONE, INVALID_TIMER);
|
status_change_end(bl, SC_STONE, INVALID_TIMER);
|
||||||
break;
|
break;
|
||||||
|
case SC_FEAR:
|
||||||
|
status_change_end(bl, SC_BLIND, INVALID_TIMER);
|
||||||
|
break;
|
||||||
case SC_FREEZING:
|
case SC_FREEZING:
|
||||||
status_change_end(bl, SC_BURNING, INVALID_TIMER);
|
status_change_end(bl, SC_BURNING, INVALID_TIMER);
|
||||||
break;
|
break;
|
||||||
@ -9571,9 +9575,7 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
|
|||||||
|
|
||||||
/* General */
|
/* General */
|
||||||
case SC_FEAR:
|
case SC_FEAR:
|
||||||
val2 = 2;
|
status_change_start(src,bl,SC_ANKLE,10000,val1,0,0,0,2000,SCSTART_NOAVOID|SCSTART_NOTICKDEF|SCSTART_NORATEDEF);
|
||||||
val4 = tick / 1000;
|
|
||||||
tick_time = 1000; // [GodLesZ] tick time
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/* Rune Knight */
|
/* 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_TINDER_BREAKER2:
|
||||||
case SC_BITE:
|
case SC_BITE:
|
||||||
case SC_THORNSTRAP:
|
case SC_THORNSTRAP:
|
||||||
case SC_FEAR:
|
|
||||||
case SC_MEIKYOUSISUI:
|
case SC_MEIKYOUSISUI:
|
||||||
case SC_KYOUGAKU:
|
case SC_KYOUGAKU:
|
||||||
case SC_PARALYSIS:
|
case SC_PARALYSIS:
|
||||||
@ -12184,15 +12185,6 @@ int status_change_timer(int tid, unsigned int tick, int id, intptr_t data)
|
|||||||
}
|
}
|
||||||
break;
|
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_1:
|
||||||
case SC_SPHERE_2:
|
case SC_SPHERE_2:
|
||||||
case SC_SPHERE_3:
|
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_STRIPHELM:
|
||||||
//case SC__STRIPACCESSORY:
|
//case SC__STRIPACCESSORY:
|
||||||
//case SC_BITE:
|
//case SC_BITE:
|
||||||
|
case SC_FEAR:
|
||||||
case SC_FREEZING:
|
case SC_FREEZING:
|
||||||
case SC_VENOMBLEED:
|
case SC_VENOMBLEED:
|
||||||
if (sc->data[i]->timer != INVALID_TIMER)
|
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
|
else
|
||||||
data.tick = INVALID_TIMER;
|
data.tick = INVALID_TIMER;
|
||||||
break;
|
break;
|
||||||
case SC_FEAR:
|
|
||||||
data.tick = sc->data[i]->val4 * 1000;
|
|
||||||
break;
|
|
||||||
default:
|
default:
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -2150,7 +2150,6 @@ struct status_change *status_get_sc(struct block_list *bl);
|
|||||||
int status_isdead(struct block_list *bl);
|
int status_isdead(struct block_list *bl);
|
||||||
int status_isimmune(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);
|
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.
|
//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)
|
#define sc_start(src, bl, type, rate, val1, tick) status_change_start(src,bl,type,100*(rate),val1,0,0,0,tick,SCSTART_NONE)
|
||||||
|
@ -1358,7 +1358,6 @@ int unit_can_move(struct block_list *bl) {
|
|||||||
// Status changes that block movement
|
// Status changes that block movement
|
||||||
if (sc) {
|
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
|
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_SPIDERWEB] && sc->data[SC_SPIDERWEB]->val1)
|
||||||
|| (sc->data[SC_DANCING] && sc->data[SC_DANCING]->val4 && (
|
|| (sc->data[SC_DANCING] && sc->data[SC_DANCING]->val4 && (
|
||||||
!sc->data[SC_LONGING] ||
|
!sc->data[SC_LONGING] ||
|
||||||
|
Loading…
x
Reference in New Issue
Block a user