summaryrefslogtreecommitdiff
path: root/src/map
diff options
context:
space:
mode:
authorKenpachi Developer <Kenpachi.Developer@gmx.de>2020-01-26 23:33:39 +0100
committerHaru <haru@dotalux.com>2020-02-09 23:56:00 +0100
commit29dfb34968fe42945bad712ce3ac8806d49ba473 (patch)
tree96700b03fad18a5aac85800148d929b3624f76ad /src/map
parent7b003f2028906218bb6cff68e5e97ec47ad6681e (diff)
downloadhercules-29dfb34968fe42945bad712ce3ac8806d49ba473.tar.gz
hercules-29dfb34968fe42945bad712ce3ac8806d49ba473.tar.bz2
hercules-29dfb34968fe42945bad712ce3ac8806d49ba473.tar.xz
hercules-29dfb34968fe42945bad712ce3ac8806d49ba473.zip
Added skill_is_item_skill() function.
Diffstat (limited to 'src/map')
-rw-r--r--src/map/clif.c2
-rw-r--r--src/map/skill.c23
-rw-r--r--src/map/skill.h1
-rw-r--r--src/map/unit.c8
4 files changed, 24 insertions, 10 deletions
diff --git a/src/map/clif.c b/src/map/clif.c
index 24de61ec0..23fc3a74d 100644
--- a/src/map/clif.c
+++ b/src/map/clif.c
@@ -6762,7 +6762,7 @@ static void clif_item_skill(struct map_session_data *sd, uint16 skill_id, uint16
int type = skill->get_inf(skill_id);
- if (sd->state.itemskill_castonself == 1 && sd->itemskill_id == sd->skillitem && sd->itemskill_lv == sd->skillitemlv)
+ if (sd->state.itemskill_castonself == 1 && skill->is_item_skill(sd, skill_id, skill_lv))
type = INF_SELF_SKILL;
WFIFOHEAD(fd,packet_len(0x147));
diff --git a/src/map/skill.c b/src/map/skill.c
index 6f0cb424b..a8dbefbd7 100644
--- a/src/map/skill.c
+++ b/src/map/skill.c
@@ -13994,6 +13994,22 @@ static bool skill_is_combo(int skill_id)
return false;
}
+/**
+ * Checks if a skill is casted by an item (itemskill() script command).
+ *
+ * @param sd The charcater's session data.
+ * @param skill_id The skill's ID.
+ * @param skill_lv The skill's level.
+ * @return true if skill is casted by an item, otherwise false.
+ */
+static bool skill_is_item_skill(struct map_session_data *sd, int skill_id, int skill_lv)
+{
+ nullpo_retr(false, sd);
+
+ return (sd->skillitem == skill_id && sd->skillitemlv == skill_lv
+ && sd->itemskill_id == skill_id && sd->itemskill_lv == skill_lv);
+}
+
static int skill_check_condition_castbegin(struct map_session_data *sd, uint16 skill_id, uint16 skill_lv)
{
struct status_data *st;
@@ -14009,7 +14025,7 @@ static int skill_check_condition_castbegin(struct map_session_data *sd, uint16 s
return 0;
if ((sd->state.itemskill_conditions_checked == 1 || sd->state.itemskill_no_conditions == 1)
- && sd->itemskill_id == sd->skillitem && sd->itemskill_lv == sd->skillitemlv) {
+ && skill->is_item_skill(sd, skill_id, skill_lv)) {
return 1;
}
@@ -14998,7 +15014,7 @@ static int skill_check_condition_castend(struct map_session_data *sd, uint16 ski
return 0;
if ((sd->state.itemskill_conditions_checked == 1 || sd->state.itemskill_no_conditions == 1)
- && sd->itemskill_id == sd->skillitem && sd->itemskill_lv == sd->skillitemlv) {
+ && skill->is_item_skill(sd, skill_id, skill_lv)) {
return 1;
}
@@ -15203,7 +15219,7 @@ static int skill_consume_requirement(struct map_session_data *sd, uint16 skill_i
nullpo_ret(sd);
- if (sd->state.itemskill_no_conditions == 1 && sd->itemskill_id == sd->skillitem && sd->itemskill_lv == sd->skillitemlv)
+ if (sd->state.itemskill_no_conditions == 1 && skill->is_item_skill(sd, skill_id, skill_lv))
return 1;
req = skill->get_requirement(sd,skill_id,skill_lv);
@@ -21611,6 +21627,7 @@ void skill_defaults(void)
skill->cast_fix_sc = skill_castfix_sc;
skill->vf_cast_fix = skill_vfcastfix;
skill->delay_fix = skill_delay_fix;
+ skill->is_item_skill = skill_is_item_skill;
skill->check_condition_castbegin = skill_check_condition_castbegin;
skill->check_condition_castend = skill_check_condition_castend;
skill->consume_requirement = skill_consume_requirement;
diff --git a/src/map/skill.h b/src/map/skill.h
index 188a1c927..eff9ed7fc 100644
--- a/src/map/skill.h
+++ b/src/map/skill.h
@@ -2019,6 +2019,7 @@ struct skill_interface {
int (*cast_fix_sc) ( struct block_list *bl, int time);
int (*vf_cast_fix) ( struct block_list *bl, double time, uint16 skill_id, uint16 skill_lv);
int (*delay_fix) ( struct block_list *bl, uint16 skill_id, uint16 skill_lv);
+ bool (*is_item_skill) (struct map_session_data *sd, int skill_id, int skill_lv);
int (*check_condition_castbegin) (struct map_session_data *sd, uint16 skill_id, uint16 skill_lv);
int (*check_condition_castend) (struct map_session_data *sd, uint16 skill_id, uint16 skill_lv);
int (*consume_requirement) (struct map_session_data *sd, uint16 skill_id, uint16 skill_lv, short type);
diff --git a/src/map/unit.c b/src/map/unit.c
index 0a6008247..29a01aea7 100644
--- a/src/map/unit.c
+++ b/src/map/unit.c
@@ -1606,10 +1606,8 @@ static int unit_skilluse_id2(struct block_list *src, int target_id, uint16 skill
if (!ud->state.running) //need TK_RUN or WUGDASH handler to be done before that, see bugreport:6026
unit->stop_walking(src, STOPWALKING_FLAG_FIXPOS);// even though this is not how official works but this will do the trick. bugreport:6829
- if (sd != NULL && sd->state.itemskill_no_casttime == 1 && sd->itemskill_id == sd->skillitem
- && sd->itemskill_lv == sd->skillitemlv) {
+ if (sd != NULL && sd->state.itemskill_no_casttime == 1 && skill->is_item_skill(sd, skill_id, skill_lv))
casttime = 0;
- }
// in official this is triggered even if no cast time.
clif->useskill(src, src->id, target_id, 0,0, skill_id, skill_lv, casttime);
@@ -1814,10 +1812,8 @@ static int unit_skilluse_pos2(struct block_list *src, short skill_x, short skill
unit->stop_walking(src, STOPWALKING_FLAG_FIXPOS);
- if (sd != NULL && sd->state.itemskill_no_casttime == 1 && sd->itemskill_id == sd->skillitem
- && sd->itemskill_lv == sd->skillitemlv) {
+ if (sd != NULL && sd->state.itemskill_no_casttime == 1 && skill->is_item_skill(sd, skill_id, skill_lv))
casttime = 0;
- }
// in official this is triggered even if no cast time.
clif->useskill(src, src->id, 0, skill_x, skill_y, skill_id, skill_lv, casttime);