summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorKenpachi Developer <Kenpachi.Developer@gmx.de>2020-05-17 00:50:37 +0200
committerKenpachi Developer <Kenpachi.Developer@gmx.de>2020-06-01 02:01:55 +0200
commitf9ea7676708eebef5006466e8e108b863f7106d9 (patch)
treeffd3d22bac6d5b72e8d4c9e2a49c05652ae638ab /src
parent29a544a23092e6b1703905f4719ebca412e9558b (diff)
downloadhercules-f9ea7676708eebef5006466e8e108b863f7106d9.tar.gz
hercules-f9ea7676708eebef5006466e8e108b863f7106d9.tar.bz2
hercules-f9ea7676708eebef5006466e8e108b863f7106d9.tar.xz
hercules-f9ea7676708eebef5006466e8e108b863f7106d9.zip
Make InterruptCast can be grouped by levels
Diffstat (limited to 'src')
-rw-r--r--src/map/skill.c43
-rw-r--r--src/map/skill.h5
-rw-r--r--src/map/unit.c4
-rw-r--r--src/plugins/HPMHooking/HPMHooking.Defs.inc4
-rw-r--r--src/plugins/HPMHooking/HPMHooking_map.Hooks.inc12
5 files changed, 49 insertions, 19 deletions
diff --git a/src/map/skill.c b/src/map/skill.c
index 8be97842e..5ac1bdf71 100644
--- a/src/map/skill.c
+++ b/src/map/skill.c
@@ -539,14 +539,26 @@ static int skill_get_inf2(int skill_id)
return skill->dbs->db[idx].inf2;
}
-static int skill_get_castcancel(int skill_id)
+/**
+ * Gets a skill's cast interruptibility by its ID and level.
+ *
+ * @param skill_id The skill's ID.
+ * @param skill_lv The skill's level.
+ * @return The skill's cast interruptibility corresponding to the passed level. Defaults to 0 in case of error.
+ *
+ **/
+static int skill_get_castcancel(int skill_id, int skill_lv)
{
- int idx;
if (skill_id == 0)
return 0;
- idx = skill->get_index(skill_id);
+
+ Assert_ret(skill_lv > 0);
+
+ int idx = skill->get_index(skill_id);
+
Assert_ret(idx != 0);
- return skill->dbs->db[idx].castcancel;
+
+ return skill->dbs->db[idx].castcancel[skill_get_lvl_idx(skill_lv)];
}
static int skill_get_maxcount(int skill_id, int skill_lv)
@@ -20923,12 +20935,29 @@ static void skill_validate_interrupt_cast(struct config_setting_t *conf, struct
nullpo_retv(conf);
nullpo_retv(sk);
- sk->castcancel = 0;
+ skill->level_set_value(sk->castcancel, 0);
+
+ struct config_setting_t *t = libconfig->setting_get_member(conf, "InterruptCast");
+
+ if (t != NULL && config_setting_is_group(t)) {
+ for (int i = 0; i < MAX_SKILL_LEVEL; i++) {
+ char lv[6]; // Big enough to contain "Lv999" in case of custom MAX_SKILL_LEVEL.
+ safesnprintf(lv, sizeof(lv), "Lv%d", i + 1);
+ int interrupt_cast;
+
+ if (libconfig->setting_lookup_bool(t, lv, &interrupt_cast) == CONFIG_TRUE)
+ sk->castcancel[i] = (interrupt_cast != 0) ? 1 : 0;
+ }
+
+ return;
+ }
int interrupt_cast;
- if (libconfig->setting_lookup_bool(conf, "InterruptCast", &interrupt_cast) == CONFIG_TRUE)
- sk->castcancel = (interrupt_cast != 0) ? 1 : 0;
+ if (libconfig->setting_lookup_bool(conf, "InterruptCast", &interrupt_cast) == CONFIG_TRUE) {
+ if (interrupt_cast != 0)
+ skill->level_set_value(sk->castcancel, 1);
+ }
}
/**
diff --git a/src/map/skill.h b/src/map/skill.h
index af8f3774b..598917f2a 100644
--- a/src/map/skill.h
+++ b/src/map/skill.h
@@ -1764,7 +1764,8 @@ struct s_skill_db {
int fixed_cast[MAX_SKILL_LEVEL];
#endif
int upkeep_time[MAX_SKILL_LEVEL],upkeep_time2[MAX_SKILL_LEVEL],cooldown[MAX_SKILL_LEVEL];
- int castcancel,cast_def_rate;
+ int castcancel[MAX_SKILL_LEVEL];
+ int cast_def_rate;
int inf2;
int maxcount[MAX_SKILL_LEVEL];
int skill_type[MAX_SKILL_LEVEL];
@@ -1997,7 +1998,7 @@ struct skill_interface {
int (*get_ammo_qty) (int skill_id, int skill_lv);
int (*get_unit_id) (int skill_id, int flag);
int (*get_inf2) (int skill_id);
- int (*get_castcancel) (int skill_id);
+ int (*get_castcancel) (int skill_id, int skill_lv);
int (*get_maxcount) (int skill_id, int skill_lv);
int (*get_blewcount) (int skill_id, int skill_lv);
int (*get_unit_flag) (int skill_id);
diff --git a/src/map/unit.c b/src/map/unit.c
index 53e517045..223a4a82b 100644
--- a/src/map/unit.c
+++ b/src/map/unit.c
@@ -1152,7 +1152,7 @@ static int unit_stop_walking(struct block_list *bl, int flag)
static int unit_skilluse_id(struct block_list *src, int target_id, uint16 skill_id, uint16 skill_lv)
{
int casttime = skill->cast_fix(src, skill_id, skill_lv);
- int castcancel = skill->get_castcancel(skill_id);
+ int castcancel = skill->get_castcancel(skill_id, skill_lv);
int ret = unit->skilluse_id2(src, target_id, skill_id, skill_lv, casttime, castcancel);
struct map_session_data *sd = BL_CAST(BL_PC, src);
@@ -1790,7 +1790,7 @@ static int unit_skilluse_id2(struct block_list *src, int target_id, uint16 skill
static int unit_skilluse_pos(struct block_list *src, short skill_x, short skill_y, uint16 skill_id, uint16 skill_lv)
{
int casttime = skill->cast_fix(src, skill_id, skill_lv);
- int castcancel = skill->get_castcancel(skill_id);
+ int castcancel = skill->get_castcancel(skill_id, skill_lv);
int ret = unit->skilluse_pos2(src, skill_x, skill_y, skill_id, skill_lv, casttime, castcancel);
struct map_session_data *sd = BL_CAST(BL_PC, src);
diff --git a/src/plugins/HPMHooking/HPMHooking.Defs.inc b/src/plugins/HPMHooking/HPMHooking.Defs.inc
index 5f789a9b1..8973ecfdb 100644
--- a/src/plugins/HPMHooking/HPMHooking.Defs.inc
+++ b/src/plugins/HPMHooking/HPMHooking.Defs.inc
@@ -7296,8 +7296,8 @@ typedef int (*HPMHOOK_pre_skill_get_unit_id) (int *skill_id, int *flag);
typedef int (*HPMHOOK_post_skill_get_unit_id) (int retVal___, int skill_id, int flag);
typedef int (*HPMHOOK_pre_skill_get_inf2) (int *skill_id);
typedef int (*HPMHOOK_post_skill_get_inf2) (int retVal___, int skill_id);
-typedef int (*HPMHOOK_pre_skill_get_castcancel) (int *skill_id);
-typedef int (*HPMHOOK_post_skill_get_castcancel) (int retVal___, int skill_id);
+typedef int (*HPMHOOK_pre_skill_get_castcancel) (int *skill_id, int *skill_lv);
+typedef int (*HPMHOOK_post_skill_get_castcancel) (int retVal___, int skill_id, int skill_lv);
typedef int (*HPMHOOK_pre_skill_get_maxcount) (int *skill_id, int *skill_lv);
typedef int (*HPMHOOK_post_skill_get_maxcount) (int retVal___, int skill_id, int skill_lv);
typedef int (*HPMHOOK_pre_skill_get_blewcount) (int *skill_id, int *skill_lv);
diff --git a/src/plugins/HPMHooking/HPMHooking_map.Hooks.inc b/src/plugins/HPMHooking/HPMHooking_map.Hooks.inc
index 2f38a5a3d..3b4948853 100644
--- a/src/plugins/HPMHooking/HPMHooking_map.Hooks.inc
+++ b/src/plugins/HPMHooking/HPMHooking_map.Hooks.inc
@@ -77660,15 +77660,15 @@ int HP_skill_get_inf2(int skill_id) {
}
return retVal___;
}
-int HP_skill_get_castcancel(int skill_id) {
+int HP_skill_get_castcancel(int skill_id, int skill_lv) {
int hIndex = 0;
int retVal___ = 0;
if (HPMHooks.count.HP_skill_get_castcancel_pre > 0) {
- int (*preHookFunc) (int *skill_id);
+ int (*preHookFunc) (int *skill_id, int *skill_lv);
*HPMforce_return = false;
for (hIndex = 0; hIndex < HPMHooks.count.HP_skill_get_castcancel_pre; hIndex++) {
preHookFunc = HPMHooks.list.HP_skill_get_castcancel_pre[hIndex].func;
- retVal___ = preHookFunc(&skill_id);
+ retVal___ = preHookFunc(&skill_id, &skill_lv);
}
if (*HPMforce_return) {
*HPMforce_return = false;
@@ -77676,13 +77676,13 @@ int HP_skill_get_castcancel(int skill_id) {
}
}
{
- retVal___ = HPMHooks.source.skill.get_castcancel(skill_id);
+ retVal___ = HPMHooks.source.skill.get_castcancel(skill_id, skill_lv);
}
if (HPMHooks.count.HP_skill_get_castcancel_post > 0) {
- int (*postHookFunc) (int retVal___, int skill_id);
+ int (*postHookFunc) (int retVal___, int skill_id, int skill_lv);
for (hIndex = 0; hIndex < HPMHooks.count.HP_skill_get_castcancel_post; hIndex++) {
postHookFunc = HPMHooks.list.HP_skill_get_castcancel_post[hIndex].func;
- retVal___ = postHookFunc(retVal___, skill_id);
+ retVal___ = postHookFunc(retVal___, skill_id, skill_lv);
}
}
return retVal___;