summaryrefslogtreecommitdiff
path: root/src/map/skill.c
diff options
context:
space:
mode:
authorInkfish <Inkfish@54d463be-8e91-2dee-dedb-b68131a5f0ec>2009-06-02 11:48:33 +0000
committerInkfish <Inkfish@54d463be-8e91-2dee-dedb-b68131a5f0ec>2009-06-02 11:48:33 +0000
commitd8876e3c3ee55dd74ed8b330fdcc7c06cb9e3072 (patch)
tree76422502360277a507b05c9ae19b1b07ad7bbc36 /src/map/skill.c
parentf7da3e7ad422759affddf1aaa926bee4b7908532 (diff)
downloadhercules-d8876e3c3ee55dd74ed8b330fdcc7c06cb9e3072.tar.gz
hercules-d8876e3c3ee55dd74ed8b330fdcc7c06cb9e3072.tar.bz2
hercules-d8876e3c3ee55dd74ed8b330fdcc7c06cb9e3072.tar.xz
hercules-d8876e3c3ee55dd74ed8b330fdcc7c06cb9e3072.zip
Fixed skills used through items and Hocus-pocus consume requirements if you have them. (bugreport:3164)
git-svn-id: https://rathena.svn.sourceforge.net/svnroot/rathena/trunk@13836 54d463be-8e91-2dee-dedb-b68131a5f0ec
Diffstat (limited to 'src/map/skill.c')
-rw-r--r--src/map/skill.c106
1 files changed, 52 insertions, 54 deletions
diff --git a/src/map/skill.c b/src/map/skill.c
index 3c7d8f82c..739fd9373 100644
--- a/src/map/skill.c
+++ b/src/map/skill.c
@@ -4363,14 +4363,20 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, in
break;
}
clif_skill_nodamage(src,bl,skillid,skilllv,1);
- if(skilllv == 1) {
- // possibility to skip menu [LuzZza]
- if(!battle_config.skip_teleport_lv1_menu && sd->skillitem != AL_TELEPORT)
+
+ // FIXME: Before r13836, sd->skillitem was never equal to AL_TELEPORT!!
+ // So, neither normal casted, nor item skill, nor autocasts would skip the menu! What was this intended to do?
+ // Now, I assume only autocasts teleport may always skip the menu. [Inkfish]
+ if( skilllv == 1 )
+ {
+ if( !battle_config.skip_teleport_lv1_menu && sd->skillitem == AL_TELEPORT ) // possibility to skip menu [LuzZza]
clif_skill_warppoint(sd,skillid,skilllv, (unsigned short)-1,0,0,0);
else
pc_randomwarp(sd,3);
- } else {
- if (sd->skillitem != AL_TELEPORT)
+ }
+ else
+ {
+ if( sd->skillitem == AL_TELEPORT )
clif_skill_warppoint(sd,skillid,skilllv, (unsigned short)-1,sd->status.save_point.map,0,0);
else //Autocasted Teleport level 2??
pc_setpos(sd,sd->status.save_point.map,sd->status.save_point.x,sd->status.save_point.y,3);
@@ -5854,6 +5860,9 @@ int skill_castend_id(int tid, unsigned int tick, int id, intptr data)
sc->data[SC_SPIRIT]->val3 = 0; //Clear bounced spell check.
}
+ if( sd && sd->skillitem == ud->skillid )
+ sd->skillitem = sd->skillitemlv = 0;
+
if (ud->skilltimer == -1) {
if(md) md->skillidx = -1;
else ud->skillid = 0; //mobs can't clear this one as it is used for skill condition 'afterskill'
@@ -5901,9 +5910,10 @@ int skill_castend_id(int tid, unsigned int tick, int id, intptr data)
//You can't place a skill failed packet here because it would be
//sent in ALL cases, even cases where skill_check_condition fails
//which would lead to double 'skill failed' messages u.u [Skotlex]
- if(sd) sd->skillitem = sd->skillitemlv = 0;
- else
- if(md) md->skillidx = -1;
+ if(sd)
+ sd->skillitem = sd->skillitemlv = 0;
+ else if(md)
+ md->skillidx = -1;
return 0;
}
@@ -6028,6 +6038,9 @@ int skill_castend_pos(int tid, unsigned int tick, int id, intptr data)
map_freeblock_lock();
skill_castend_pos2(src,ud->skillx,ud->skilly,ud->skillid,ud->skilllv,tick,0);
+ if( sd && sd->skillitem == ud->skillid )
+ sd->skillitem = sd->skillitemlv = 0;
+
if (ud->skilltimer == -1) {
if (md) md->skillidx = -1;
else ud->skillid = 0; //Non mobs can't clear this one as it is used for skill condition 'afterskill'
@@ -8056,48 +8069,44 @@ int skill_check_condition_castbegin(struct map_session_data* sd, short skill, sh
if (lv <= 0 || sd->chatID) return 0;
- if( battle_config.gm_skilluncond &&
- pc_isGM(sd)>= battle_config.gm_skilluncond &&
- sd->skillitem != skill)
- { //GMs don't override the skillItem check, otherwise they can use items without them being consumed! [Skotlex]
- sd->skillitem = sd->skillitemlv = 0;
- //Need to do arrow state check.
- sd->state.arrow_atk = skill_get_ammotype(skill)?1:0;
- //Need to do Spiritball check.
- sd->spiritball_old = sd->spiritball;
+ if( battle_config.gm_skilluncond && pc_isGM(sd)>= battle_config.gm_skilluncond && sd->skillitem != skill )
+ { //GMs don't override the skillItem check, otherwise they can use items without them being consumed! [Skotlex]
+ sd->state.arrow_atk = skill_get_ammotype(skill)?1:0; //Need to do arrow state check.
+ sd->spiritball_old = sd->spiritball; //Need to do Spiritball check.
return 1;
}
if(pc_is90overweight(sd)) {
clif_skill_fail(sd,skill,9,0);
- sd->skillitem = sd->skillitemlv = 0;
return 0;
}
- if( sd->state.abra_flag )
+ if( sd->menuskill_id == AM_PHARMACY )
{
- if( sd->skillitem == skill )
- return 1;
- sd->skillitem = sd->skillitemlv = sd->state.abra_flag = 0; // Cancelled, using a different skill
- }
-
- if (sd->menuskill_id == AM_PHARMACY &&
- (skill == AM_PHARMACY || skill == AC_MAKINGARROW || skill == BS_REPAIRWEAPON ||
- skill == AM_TWILIGHT1 || skill == AM_TWILIGHT2 || skill == AM_TWILIGHT3
- )) {
- sd->skillitem = sd->skillitemlv = 0;
- return 0;
+ switch( skill )
+ {
+ case AM_PHARMACY:
+ case AC_MAKINGARROW:
+ case BS_REPAIRWEAPON:
+ case AM_TWILIGHT1:
+ case AM_TWILIGHT2:
+ case AM_TWILIGHT3:
+ return 0;
+ }
}
status = &sd->battle_status;
sc = &sd->sc;
if( !sc->count )
sc = NULL;
-
- if(sd->skillitem == skill) {
- // When a target was selected
- { //Consume items that were skipped in pc_use_item [Skotlex]
- if((i = sd->itemindex) == -1 ||
+
+ if( sd->skillitem == skill )
+ {
+ if( sd->state.abra_flag ) // Hocus-Pocus was used. [Inkfish]
+ sd->state.abra_flag = 0;
+ else
+ { // When a target was selected, consume items that were skipped in pc_use_item [Skotlex]
+ if( (i = sd->itemindex) == -1 ||
sd->status.inventory[i].nameid != sd->itemid ||
sd->inventory_data[i] == NULL ||
!sd->inventory_data[i]->flag.delay_consume ||
@@ -8558,29 +8567,18 @@ int skill_check_condition_castend(struct map_session_data* sd, short skill, shor
return 0;
if( battle_config.gm_skilluncond && pc_isGM(sd) >= battle_config.gm_skilluncond && sd->skillitem != skill )
- { //GMs don't override the skillItem check, otherwise they can use items without them being consumed! [Skotlex]
- sd->skillitem = sd->skillitemlv = 0;
- //Need to do arrow state check.
- sd->state.arrow_atk = skill_get_ammotype(skill)?1:0;
- //Need to do Spiritball check.
- sd->spiritball_old = sd->spiritball;
+ { //GMs don't override the skillItem check, otherwise they can use items without them being consumed! [Skotlex]
+ sd->state.arrow_atk = skill_get_ammotype(skill)?1:0; //Need to do arrow state check.
+ sd->spiritball_old = sd->spiritball; //Need to do Spiritball check.
return 1;
}
if( pc_is90overweight(sd) )
{
clif_skill_fail(sd,skill,9,0);
- sd->skillitem = sd->skillitemlv = 0;
return 0;
}
- if( sd->state.abra_flag )
- { // Abracadabra skill, skip requisites!
- sd->skillitem = sd->skillitemlv = sd->state.abra_flag = 0; // Clear out the data.
- if( sd->skillitem == skill )
- return 1;
- }
-
if( sd->menuskill_id == AM_PHARMACY )
{ // Cast start or cast end??
switch( skill )
@@ -8591,16 +8589,12 @@ int skill_check_condition_castend(struct map_session_data* sd, short skill, shor
case AM_TWILIGHT1:
case AM_TWILIGHT2:
case AM_TWILIGHT3:
- sd->skillitem = sd->skillitemlv = 0;
return 0;
}
}
- if( sd->skillitem == skill )
- { // Casting finished
- sd->skillitem = sd->skillitemlv = 0;
+ if( sd->skillitem == skill ) // Casting finished (Item skill or Hocus-Pocus)
return 1;
- }
// perform skill-specific checks (and actions)
switch( skill )
@@ -8740,6 +8734,10 @@ struct skill_condition skill_get_requirement(struct map_session_data* sd, short
if( !sd )
return req;
+
+ if( sd->skillitem == skill )
+ return req; // Item skills and Hocus-Pocus don't have requirements.[Inkfish]
+
j = skill_get_index(skill);
if( j == 0 ) // invalid skill id
return req;