summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKenpachi Developer <Kenpachi.Developer@gmx.de>2020-05-17 06:33:07 +0200
committerKenpachi Developer <Kenpachi.Developer@gmx.de>2020-06-01 02:01:56 +0200
commitaac63c5714ad207c53f8f69837cfcb05ffdb3137 (patch)
tree2dd99d53aa849bff2a275a38fb08c53f1081b94c
parent887820f62769ffcc09de0053ba6a645b83cf74d9 (diff)
downloadhercules-aac63c5714ad207c53f8f69837cfcb05ffdb3137.tar.gz
hercules-aac63c5714ad207c53f8f69837cfcb05ffdb3137.tar.bz2
hercules-aac63c5714ad207c53f8f69837cfcb05ffdb3137.tar.xz
hercules-aac63c5714ad207c53f8f69837cfcb05ffdb3137.zip
Make Unit->Interval can be grouped by levels
-rw-r--r--src/map/skill.c50
-rw-r--r--src/map/skill.h4
-rw-r--r--src/plugins/HPMHooking/HPMHooking.Defs.inc4
-rw-r--r--src/plugins/HPMHooking/HPMHooking_map.Hooks.inc12
4 files changed, 51 insertions, 19 deletions
diff --git a/src/map/skill.c b/src/map/skill.c
index 0761592ca..d57931b54 100644
--- a/src/map/skill.c
+++ b/src/map/skill.c
@@ -706,14 +706,26 @@ static int skill_get_unit_id(int skill_id, int skill_lv, int flag)
return skill->dbs->db[idx].unit_id[skill_get_lvl_idx(skill_lv)][flag];
}
-static int skill_get_unit_interval(int skill_id)
+/**
+ * Gets a skill's unit interval by its ID and level.
+ *
+ * @param skill_id The skill's ID.
+ * @param skill_lv The skill's level.
+ * @return The skill's unit interval corresponding to the passed level. Defaults to 0 in case of error.
+ *
+ **/
+static int skill_get_unit_interval(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].unit_interval;
+
+ return skill->dbs->db[idx].unit_interval[skill_get_lvl_idx(skill_lv)];
}
static int skill_get_unit_range(int skill_id, int skill_lv)
@@ -11855,7 +11867,7 @@ static int skill_castend_pos2(struct block_list *src, int x, int y, uint16 skill
skill->unitsetting(src, skill_id, skill_lv, x, y, 0); // Set bomb on current Position
clif->skill_nodamage(src, src, skill_id, skill_lv, 1);
if( skill->blown(src, src, 3 * skill_lv, unit->getdir(src), 0) && sc) {
- sc_start(src, src, SC__FEINTBOMB_MASTER, 100, 0, skill->get_unit_interval(SC_FEINTBOMB));
+ sc_start(src, src, SC__FEINTBOMB_MASTER, 100, 0, skill->get_unit_interval(SC_FEINTBOMB, skill_lv));
}
break;
@@ -12105,7 +12117,7 @@ static bool skill_dance_switch(struct skill_unit *su, int flag)
group->unit_id = skill->get_unit_id(skill_id, 1, 0);
group->target_flag = skill->get_unit_target(skill_id);
group->bl_flag = skill->get_unit_bl_target(skill_id);
- group->interval = skill->get_unit_interval(skill_id);
+ group->interval = skill->get_unit_interval(skill_id, 1);
} else {
//Restore
group->skill_id = backup.skill_id;
@@ -12138,7 +12150,7 @@ static struct skill_unit_group *skill_unitsetting(struct block_list *src, uint16
limit = skill->get_time(skill_id,skill_lv);
range = skill->get_unit_range(skill_id,skill_lv);
- interval = skill->get_unit_interval(skill_id);
+ interval = skill->get_unit_interval(skill_id, skill_lv);
target = skill->get_unit_target(skill_id);
unit_flag = skill->get_unit_flag(skill_id);
layout = skill->get_unit_layout(skill_id,skill_lv,src,x,y);
@@ -22680,13 +22692,33 @@ static void skill_validate_unit_interval(struct config_setting_t *conf, struct s
nullpo_retv(conf);
nullpo_retv(sk);
- sk->unit_interval = 0;
+ skill->level_set_value(sk->unit_interval, 0);
+
+ struct config_setting_t *t = libconfig->setting_get_member(conf, "Interval");
+
+ 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 unit_interval;
+
+ if (libconfig->setting_lookup_int(t, lv, &unit_interval) == CONFIG_TRUE) {
+ if (unit_interval >= INFINITE_DURATION)
+ sk->unit_interval[i] = unit_interval;
+ else
+ ShowWarning("%s: Invalid unit interval %d specified in level %d for skill ID %d in %s! Must be greater than or equal to %d. Defaulting to 0...\n",
+ __func__, unit_interval, i + 1, sk->nameid, conf->file, INFINITE_DURATION);
+ }
+ }
+
+ return;
+ }
int unit_interval;
if (libconfig->setting_lookup_int(conf, "Interval", &unit_interval) == CONFIG_TRUE) {
if (unit_interval >= INFINITE_DURATION)
- sk->unit_interval = unit_interval;
+ skill->level_set_value(sk->unit_interval, unit_interval);
else
ShowWarning("%s: Invalid unit interval %d specified for skill ID %d in %s! Must be greater than or equal to %d. Defaulting to 0...\n",
__func__, unit_interval, sk->nameid, conf->file, INFINITE_DURATION);
diff --git a/src/map/skill.h b/src/map/skill.h
index b5d38e6e2..c32a8b639 100644
--- a/src/map/skill.h
+++ b/src/map/skill.h
@@ -1781,7 +1781,7 @@ struct s_skill_db {
int unit_id[MAX_SKILL_LEVEL][2];
int unit_layout_type[MAX_SKILL_LEVEL];
int unit_range[MAX_SKILL_LEVEL];
- int unit_interval;
+ int unit_interval[MAX_SKILL_LEVEL];
int unit_target;
int unit_flag;
};
@@ -2007,7 +2007,7 @@ struct skill_interface {
int (*get_blewcount) (int skill_id, int skill_lv);
int (*get_unit_flag) (int skill_id);
int (*get_unit_target) (int skill_id);
- int (*get_unit_interval) (int skill_id);
+ int (*get_unit_interval) (int skill_id, int skill_lv);
int (*get_unit_bl_target) (int skill_id);
int (*get_unit_layout_type) (int skill_id, int skill_lv);
int (*get_unit_range) (int skill_id, int skill_lv);
diff --git a/src/plugins/HPMHooking/HPMHooking.Defs.inc b/src/plugins/HPMHooking/HPMHooking.Defs.inc
index 494634bc0..e75dbaa97 100644
--- a/src/plugins/HPMHooking/HPMHooking.Defs.inc
+++ b/src/plugins/HPMHooking/HPMHooking.Defs.inc
@@ -7306,8 +7306,8 @@ typedef int (*HPMHOOK_pre_skill_get_unit_flag) (int *skill_id);
typedef int (*HPMHOOK_post_skill_get_unit_flag) (int retVal___, int skill_id);
typedef int (*HPMHOOK_pre_skill_get_unit_target) (int *skill_id);
typedef int (*HPMHOOK_post_skill_get_unit_target) (int retVal___, int skill_id);
-typedef int (*HPMHOOK_pre_skill_get_unit_interval) (int *skill_id);
-typedef int (*HPMHOOK_post_skill_get_unit_interval) (int retVal___, int skill_id);
+typedef int (*HPMHOOK_pre_skill_get_unit_interval) (int *skill_id, int *skill_lv);
+typedef int (*HPMHOOK_post_skill_get_unit_interval) (int retVal___, int skill_id, int skill_lv);
typedef int (*HPMHOOK_pre_skill_get_unit_bl_target) (int *skill_id);
typedef int (*HPMHOOK_post_skill_get_unit_bl_target) (int retVal___, int skill_id);
typedef int (*HPMHOOK_pre_skill_get_unit_layout_type) (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 d8685e1c5..80c309a8c 100644
--- a/src/plugins/HPMHooking/HPMHooking_map.Hooks.inc
+++ b/src/plugins/HPMHooking/HPMHooking_map.Hooks.inc
@@ -77795,15 +77795,15 @@ int HP_skill_get_unit_target(int skill_id) {
}
return retVal___;
}
-int HP_skill_get_unit_interval(int skill_id) {
+int HP_skill_get_unit_interval(int skill_id, int skill_lv) {
int hIndex = 0;
int retVal___ = 0;
if (HPMHooks.count.HP_skill_get_unit_interval_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_unit_interval_pre; hIndex++) {
preHookFunc = HPMHooks.list.HP_skill_get_unit_interval_pre[hIndex].func;
- retVal___ = preHookFunc(&skill_id);
+ retVal___ = preHookFunc(&skill_id, &skill_lv);
}
if (*HPMforce_return) {
*HPMforce_return = false;
@@ -77811,13 +77811,13 @@ int HP_skill_get_unit_interval(int skill_id) {
}
}
{
- retVal___ = HPMHooks.source.skill.get_unit_interval(skill_id);
+ retVal___ = HPMHooks.source.skill.get_unit_interval(skill_id, skill_lv);
}
if (HPMHooks.count.HP_skill_get_unit_interval_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_unit_interval_post; hIndex++) {
postHookFunc = HPMHooks.list.HP_skill_get_unit_interval_post[hIndex].func;
- retVal___ = postHookFunc(retVal___, skill_id);
+ retVal___ = postHookFunc(retVal___, skill_id, skill_lv);
}
}
return retVal___;