Corrected some statuses and Mado Gear interaction (#3782)
* Follow up to 0d81697. * Added a separate check for Mado Gear and blocking Merchant/Blacksmith/Whitesmith specific statuses. * Harmonized the statuses with the new allowed skill list. Thanks to @slyx88!
This commit is contained in:
parent
634e1b3991
commit
0da05e29c3
@ -9560,14 +9560,12 @@ void pc_setoption(struct map_session_data *sd,int type)
|
|||||||
}
|
}
|
||||||
if( (sd->class_&MAPID_THIRDMASK) == MAPID_MECHANIC ) {
|
if( (sd->class_&MAPID_THIRDMASK) == MAPID_MECHANIC ) {
|
||||||
if( type&OPTION_MADOGEAR && !(p_type&OPTION_MADOGEAR) ) {
|
if( type&OPTION_MADOGEAR && !(p_type&OPTION_MADOGEAR) ) {
|
||||||
static const sc_type statuses [] = { SC_MAXIMIZEPOWER, SC_OVERTHRUST, SC_WEAPONPERFECTION, SC_ADRENALINE, SC_CARTBOOST, SC_MELTDOWN, SC_MAXOVERTHRUST };
|
|
||||||
|
|
||||||
status_calc_pc(sd,SCO_NONE);
|
status_calc_pc(sd,SCO_NONE);
|
||||||
for (uint8 i = 0; i < ARRAYLENGTH(statuses); i++) {
|
for (const auto &sc : mado_statuses) {
|
||||||
int skill_id = status_sc2skill(statuses[i]);
|
uint16 skill_id = status_sc2skill(sc);
|
||||||
|
|
||||||
if (skill_id > 0 && !skill_get_inf2(skill_id, INF2_ALLOWONMADO))
|
if (skill_id > 0 && !skill_get_inf2(skill_id, INF2_ALLOWONMADO))
|
||||||
status_change_end(&sd->bl,statuses[i],INVALID_TIMER);
|
status_change_end(&sd->bl,sc,INVALID_TIMER);
|
||||||
}
|
}
|
||||||
pc_bonus_script_clear(sd,BSF_REM_ON_MADOGEAR);
|
pc_bonus_script_clear(sd,BSF_REM_ON_MADOGEAR);
|
||||||
|
|
||||||
|
@ -9223,6 +9223,19 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Statuses from Merchant family skills that can be blocked while using Madogear; see pc.cpp::pc_setoption for cancellation
|
||||||
|
if (sc->option & OPTION_MADOGEAR) {
|
||||||
|
for (const auto &madosc : mado_statuses) {
|
||||||
|
if (type != madosc)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
uint16 skill_id = status_sc2skill(type);
|
||||||
|
|
||||||
|
if (skill_id > 0 && !skill_get_inf2(skill_id, INF2_ALLOWONMADO))
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Adjust tick according to status resistances
|
// Adjust tick according to status resistances
|
||||||
if( !(flag&(SCSTART_NOAVOID|SCSTART_LOADED)) ) {
|
if( !(flag&(SCSTART_NOAVOID|SCSTART_LOADED)) ) {
|
||||||
duration = status_get_sc_def(src, bl, type, rate, duration, flag);
|
duration = status_get_sc_def(src, bl, type, rate, duration, flag);
|
||||||
@ -9341,21 +9354,10 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
|
|||||||
case SC_OVERTHRUST:
|
case SC_OVERTHRUST:
|
||||||
if (sc->data[SC_MAXOVERTHRUST])
|
if (sc->data[SC_MAXOVERTHRUST])
|
||||||
return 0; // Overthrust can't take effect if under Max Overthrust. [Skotlex]
|
return 0; // Overthrust can't take effect if under Max Overthrust. [Skotlex]
|
||||||
case SC_MAXOVERTHRUST:
|
|
||||||
if( sc->option&OPTION_MADOGEAR )
|
|
||||||
return 0; // Overthrust and Overthrust Max cannot be used on Mado Gear [Ind]
|
|
||||||
break;
|
break;
|
||||||
case SC_ADRENALINE:
|
case SC_ADRENALINE:
|
||||||
if (sc->data[SC_QUAGMIRE] ||
|
|
||||||
sc->data[SC_DECREASEAGI] ||
|
|
||||||
sc->option&OPTION_MADOGEAR // Adrenaline doesn't affect Mado Gear [Ind]
|
|
||||||
)
|
|
||||||
return 0;
|
|
||||||
break;
|
|
||||||
case SC_ADRENALINE2:
|
case SC_ADRENALINE2:
|
||||||
if (sc->data[SC_QUAGMIRE] ||
|
if (sc->data[SC_QUAGMIRE] || sc->data[SC_DECREASEAGI])
|
||||||
sc->data[SC_DECREASEAGI]
|
|
||||||
)
|
|
||||||
return 0;
|
return 0;
|
||||||
break;
|
break;
|
||||||
case SC_MAGNIFICAT:
|
case SC_MAGNIFICAT:
|
||||||
@ -9372,10 +9374,10 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
|
|||||||
case SC_SPEARQUICKEN:
|
case SC_SPEARQUICKEN:
|
||||||
case SC_TRUESIGHT:
|
case SC_TRUESIGHT:
|
||||||
case SC_WINDWALK:
|
case SC_WINDWALK:
|
||||||
case SC_CARTBOOST:
|
|
||||||
case SC_ASSNCROS:
|
case SC_ASSNCROS:
|
||||||
if (sc->option&OPTION_MADOGEAR)
|
if (sc->option&OPTION_MADOGEAR)
|
||||||
return 0; // Mado is immune to Wind Walk, Cart Boost, etc (others above) [Ind]
|
return 0; // Mado is immune to the above [Ind]
|
||||||
|
case SC_CARTBOOST:
|
||||||
if (sc->data[SC_QUAGMIRE])
|
if (sc->data[SC_QUAGMIRE])
|
||||||
return 0;
|
return 0;
|
||||||
break;
|
break;
|
||||||
|
@ -4,6 +4,8 @@
|
|||||||
#ifndef STATUS_HPP
|
#ifndef STATUS_HPP
|
||||||
#define STATUS_HPP
|
#define STATUS_HPP
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
#include "../common/database.hpp"
|
#include "../common/database.hpp"
|
||||||
#include "../common/mmo.hpp"
|
#include "../common/mmo.hpp"
|
||||||
#include "../common/timer.hpp"
|
#include "../common/timer.hpp"
|
||||||
@ -2603,6 +2605,19 @@ struct status_change {
|
|||||||
struct status_change_entry *data[SC_MAX];
|
struct status_change_entry *data[SC_MAX];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/// Statuses that are cancelled/disabled while on Madogear
|
||||||
|
static const std::vector<sc_type> mado_statuses = {
|
||||||
|
SC_LOUD,
|
||||||
|
SC_CARTBOOST,
|
||||||
|
SC_MELTDOWN,
|
||||||
|
SC_ADRENALINE,
|
||||||
|
SC_ADRENALINE2,
|
||||||
|
SC_WEAPONPERFECTION,
|
||||||
|
SC_MAXIMIZEPOWER,
|
||||||
|
SC_OVERTHRUST,
|
||||||
|
SC_MAXOVERTHRUST
|
||||||
|
};
|
||||||
|
|
||||||
// for looking up associated data
|
// for looking up associated data
|
||||||
sc_type status_skill2sc(int skill);
|
sc_type status_skill2sc(int skill);
|
||||||
int status_sc2skill(sc_type sc);
|
int status_sc2skill(sc_type sc);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user