summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorskotlex <skotlex@54d463be-8e91-2dee-dedb-b68131a5f0ec>2007-03-26 20:21:56 +0000
committerskotlex <skotlex@54d463be-8e91-2dee-dedb-b68131a5f0ec>2007-03-26 20:21:56 +0000
commit6f618da64a31933954f3f5cbe8b3608d16681ed1 (patch)
tree7988eabfe90c65ec567d27c35127389954f97c8c
parent7663ec43d2d64f7690e70f49cf66765b9a41f11e (diff)
downloadhercules-6f618da64a31933954f3f5cbe8b3608d16681ed1.tar.gz
hercules-6f618da64a31933954f3f5cbe8b3608d16681ed1.tar.bz2
hercules-6f618da64a31933954f3f5cbe8b3608d16681ed1.tar.xz
hercules-6f618da64a31933954f3f5cbe8b3608d16681ed1.zip
- Cleaned up some the mob skill use code. The skill re-use delay is set at the time the skill is used rather than when it finishes casting. The invalid target check was also moved to the mob skill db reading function.
- Skills can be used now when the autoskill menu is open (since there's no packet sent by the client when you hit on cancel) git-svn-id: https://rathena.svn.sourceforge.net/svnroot/rathena/trunk@10074 54d463be-8e91-2dee-dedb-b68131a5f0ec
-rw-r--r--Changelog-Trunk.txt5
-rw-r--r--src/map/clif.c6
-rw-r--r--src/map/mob.c174
-rw-r--r--src/map/skill.c26
-rw-r--r--src/map/status.c2
5 files changed, 108 insertions, 105 deletions
diff --git a/Changelog-Trunk.txt b/Changelog-Trunk.txt
index 814a26616..5b81d4c0e 100644
--- a/Changelog-Trunk.txt
+++ b/Changelog-Trunk.txt
@@ -4,6 +4,11 @@ AS OF SVN REV. 5091, WE ARE NOW USING TRUNK. ALL UNTESTED BUGFIXES/FEATURES GO
IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK.
2007/03/27
+ * Cleaned up some the mob skill use code. The skill re-use delay is set at
+ the time the skill is used rather than when it finishes casting. The
+ invalid target check was also moved to the mob skill db reading function.
+ * Skills can be used now when the autoskill menu is open (since there's no
+ packet sent by the client when you hit on cancel). [Skotlex]
* Added some svn:ignore properties [Toms]
* Solved console plugins compilation error [Toms]
* Changed MAX_LEVEL to the standard value 99. Memory consumption-= 55MB.
diff --git a/src/map/clif.c b/src/map/clif.c
index a06857834..b2d70f55e 100644
--- a/src/map/clif.c
+++ b/src/map/clif.c
@@ -9670,6 +9670,7 @@ void clif_parse_UseSkillToId(int fd, struct map_session_data *sd) {
if (sd->menuskill_id == SA_TAMINGMONSTER)
sd->menuskill_id = sd->menuskill_lv = 0; //Cancel pet capture.
else
+ if (sd->menuskill_id != SA_AUTOSPELL)
return; //Can't use skills while a menu is open.
}
if (sd->skillitem == skillnum) {
@@ -9774,6 +9775,7 @@ void clif_parse_UseSkillToPosSub(int fd, struct map_session_data *sd, int skilll
if (sd->menuskill_id == SA_TAMINGMONSTER)
sd->menuskill_id = sd->menuskill_lv = 0; //Cancel pet capture.
else
+ if (sd->menuskill_id != SA_AUTOSPELL)
return; //Can't use skills while a menu is open.
}
@@ -9841,7 +9843,9 @@ void clif_parse_UseSkillMap(int fd,struct map_session_data *sd)
if(sd->sc.option&(OPTION_WEDDING|OPTION_XMAS))
return;
- if(sd->menuskill_id && sd->menuskill_id != RFIFOW(fd,2))
+ if(sd->menuskill_id &&
+ sd->menuskill_id != RFIFOW(fd,2) &&
+ sd->menuskill_id != SA_AUTOSPELL)
return; //Can't use skills while a menu is open.
pc_delinvincibletimer(sd);
diff --git a/src/map/mob.c b/src/map/mob.c
index c56e4362f..fa23e1b7b 100644
--- a/src/map/mob.c
+++ b/src/map/mob.c
@@ -2675,8 +2675,9 @@ int mobskill_use(struct mob_data *md, unsigned int tick, int event)
{
struct mob_skill *ms;
struct block_list *fbl = NULL; //Friend bl, which can either be a BL_PC or BL_MOB depending on the situation. [Skotlex]
+ struct block_list *bl;
struct mob_data *fmd = NULL;
- int i,n;
+ int i,j,n;
nullpo_retr (0, md);
nullpo_retr (0, ms = md->db->skill);
@@ -2734,7 +2735,6 @@ int mobskill_use(struct mob_data *md, unsigned int tick, int event)
if (!md->sc.count) {
flag = 0;
} else if (ms[i].cond2 == -1) {
- int j;
for (j = SC_COMMON_MIN; j <= SC_COMMON_MAX; j++)
if ((flag = (md->sc.data[j].timer != -1)) != 0)
break;
@@ -2778,103 +2778,95 @@ int mobskill_use(struct mob_data *md, unsigned int tick, int event)
//Execute skill
if (skill_get_casttype(ms[i].skill_id) == CAST_GROUND)
- {
- struct block_list *bl = NULL;
- short x = 0, y = 0;
- if (ms[i].target <= MST_AROUND) {
- switch (ms[i].target) {
- case MST_RANDOM: //Pick a random enemy within skill range.
- bl = battle_getenemy(&md->bl, DEFAULT_ENEMY_TYPE(md),
- skill_get_range2(&md->bl, ms[i].skill_id, ms[i].skill_lv));
- break;
- case MST_TARGET:
- case MST_AROUND5:
- case MST_AROUND6:
- case MST_AROUND7:
- case MST_AROUND8:
- bl = map_id2bl(md->target_id);
- break;
- case MST_MASTER:
- bl = &md->bl;
- if (md->master_id)
- bl = map_id2bl(md->master_id);
- if (bl) //Otherwise, fall through.
- break;
- case MST_FRIEND:
- if (fbl)
- {
- bl = fbl;
- break;
- } else if (fmd) {
- bl= &fmd->bl;
- break;
- } // else fall through
- default:
- bl = &md->bl;
+ { //Ground skill.
+ short x, y;
+ switch (ms[i].target) {
+ case MST_RANDOM: //Pick a random enemy within skill range.
+ bl = battle_getenemy(&md->bl, DEFAULT_ENEMY_TYPE(md),
+ skill_get_range2(&md->bl, ms[i].skill_id, ms[i].skill_lv));
+ break;
+ case MST_TARGET:
+ case MST_AROUND5:
+ case MST_AROUND6:
+ case MST_AROUND7:
+ case MST_AROUND8:
+ bl = map_id2bl(md->target_id);
+ break;
+ case MST_MASTER:
+ bl = &md->bl;
+ if (md->master_id)
+ bl = map_id2bl(md->master_id);
+ if (bl) //Otherwise, fall through.
break;
- }
- if (bl != NULL) {
- x = bl->x; y=bl->y;
- }
+ case MST_FRIEND:
+ bl = fbl?fbl:(fmd?&fmd->bl:&md->bl);
+ break;
+ default:
+ bl = &md->bl;
+ break;
}
- if (x <= 0 || y <= 0)
- continue;
+ if (!bl) continue;
+ x = bl->x;
+ y = bl->y;
// Look for an area to cast the spell around...
if (ms[i].target >= MST_AROUND1 || ms[i].target >= MST_AROUND5) {
- int r = ms[i].target >= MST_AROUND1?
+ j = ms[i].target >= MST_AROUND1?
(ms[i].target-MST_AROUND1) +1:
(ms[i].target-MST_AROUND5) +1;
- map_search_freecell(&md->bl, md->bl.m, &x, &y, r, r, 3);
+ map_search_freecell(&md->bl, md->bl.m, &x, &y, j, j, 3);
}
md->skillidx = i;
flag = unit_skilluse_pos2(&md->bl, x, y, ms[i].skill_id, ms[i].skill_lv,
ms[i].casttime, ms[i].cancel);
- if (!flag) md->skillidx = -1; //Skill failed.
- return flag;
} else {
- if (ms[i].target <= MST_MASTER) {
- struct block_list *bl;
- switch (ms[i].target) {
- case MST_RANDOM: //Pick a random enemy within skill range.
- bl = battle_getenemy(&md->bl, DEFAULT_ENEMY_TYPE(md),
- skill_get_range2(&md->bl, ms[i].skill_id, ms[i].skill_lv));
+ //Targetted skill
+ switch (ms[i].target) {
+ case MST_RANDOM: //Pick a random enemy within skill range.
+ bl = battle_getenemy(&md->bl, DEFAULT_ENEMY_TYPE(md),
+ skill_get_range2(&md->bl, ms[i].skill_id, ms[i].skill_lv));
+ break;
+ case MST_TARGET:
+ bl = map_id2bl(md->target_id);
+ break;
+ case MST_MASTER:
+ bl = &md->bl;
+ if (md->master_id)
+ bl = map_id2bl(md->master_id);
+ if (bl) //Otherwise, fall through.
break;
- case MST_TARGET:
- bl = map_id2bl(md->target_id);
+ case MST_FRIEND:
+ if (fbl) {
+ bl = fbl;
break;
- case MST_MASTER:
- bl = &md->bl;
- if (md->master_id)
- bl = map_id2bl(md->master_id);
- if (bl) //Otherwise, fall through.
- break;
- case MST_FRIEND:
- if (fbl) {
- bl = fbl;
- break;
- } else if (fmd) {
- bl = &fmd->bl;
- break;
- } // else fall through
- default:
- bl = &md->bl;
+ } else if (fmd) {
+ bl = &fmd->bl;
break;
- }
- md->skillidx = i;
- flag = (bl && unit_skilluse_id2(&md->bl, bl->id, ms[i].skill_id, ms[i].skill_lv,
- ms[i].casttime, ms[i].cancel));
- if (!flag) md->skillidx = -1;
- return flag;
- } else {
- if (battle_config.error_log)
- ShowWarning("Wrong mob skill target 'around' for non-ground skill %d (%s). Mob %d - %s\n",
- ms[i].skill_id, skill_get_name(ms[i].skill_id), md->class_, md->db->sprite);
- continue;
+ } // else fall through
+ default:
+ bl = &md->bl;
+ break;
}
+ if (!bl) continue;
+ md->skillidx = i;
+ flag = unit_skilluse_id2(&md->bl, bl->id, ms[i].skill_id, ms[i].skill_lv,
+ ms[i].casttime, ms[i].cancel);
+ }
+ //Skill used. Post-setups...
+ if (!flag)
+ { //Skill failed.
+ md->skillidx = -1;
+ return 0;
}
+ if(battle_config.mob_ai&0x200)
+ { //pass on delay to same skill.
+ for (j = 0; j < md->db->maxskill; j++)
+ if (md->db->skill[j].skill_id == ms[i].skill_id)
+ md->skilldelay[j]=tick;
+ } else
+ md->skilldelay[i]=tick;
return 1;
}
-
+ //No skill was used.
return 0;
}
/*==========================================
@@ -3827,6 +3819,26 @@ static int mob_readskilldb(void)
if( strcmp(sp[9],target[j].str)==0)
ms->target=target[j].id;
}
+
+ //Check that the target condition is right for the skill type. [Skotlex]
+ if (skill_get_casttype(ms->skill_id) == CAST_GROUND)
+ { //Ground skill.
+ if (ms->target > MST_AROUND)
+ {
+ if (battle_config.error_log)
+ ShowWarning("Wrong mob skill target for ground skill %d (%s) for %s\n",
+ ms->skill_id, skill_get_name(ms[i].skill_id),
+ mob_id < 0?"all mobs":mob_db_data[mob_id]->sprite);
+ ms->target = MST_TARGET;
+ }
+ } else if (ms[i].target > MST_MASTER) {
+ if (battle_config.error_log)
+ ShowWarning("Wrong mob skill target 'around' for non-ground skill %d (%s). for %s\n",
+ ms[i].skill_id, skill_get_name(ms[i].skill_id),
+ mob_id < 0?"all mobs":mob_db_data[mob_id]->sprite);
+ ms->target = MST_TARGET;
+ }
+
ms->cond1=-1;
tmp = sizeof(cond1)/sizeof(cond1[0]);
for(j=0;j<tmp && strcmp(sp[10],cond1[j].str);j++);
diff --git a/src/map/skill.c b/src/map/skill.c
index 66b923a62..91c7b327f 100644
--- a/src/map/skill.c
+++ b/src/map/skill.c
@@ -5678,17 +5678,8 @@ int skill_castend_id (int tid, unsigned int tick, int id, int data)
md->last_thinktime=tick +md->status.amotion;
else
md->last_thinktime=tick +md->status.adelay;
- if(battle_config.mob_ai&0x200) { //pass on delay to same skill.
- int i;
- for (i = 0; i < md->db->maxskill; i++)
- if (md->db->skill[i].skill_id == ud->skillid)
- md->skilldelay[i]=tick;
- } else
- if(md->skillidx >= 0) {
- md->skilldelay[md->skillidx]=tick;
- if (md->db->skill[md->skillidx].emotion >= 0)
- clif_emotion(src, md->db->skill[md->skillidx].emotion);
- }
+ if(md->skillidx >= 0 && md->db->skill[md->skillidx].emotion >= 0)
+ clif_emotion(src, md->db->skill[md->skillidx].emotion);
}
if(src != target && battle_config.skill_add_range &&
@@ -5864,17 +5855,8 @@ int skill_castend_pos (int tid, unsigned int tick, int id, int data)
md->last_thinktime=tick +md->status.amotion;
else
md->last_thinktime=tick +md->status.adelay;
- if(battle_config.mob_ai&0x200) { //pass on delay to same skill.
- int i;
- for (i = 0; i < md->db->maxskill; i++)
- if (md->db->skill[i].skill_id == ud->skillid)
- md->skilldelay[i]=tick;
- } else
- if(md->skillidx >= 0) {
- md->skilldelay[md->skillidx]=tick;
- if (md->db->skill[md->skillidx].emotion >= 0)
- clif_emotion(src, md->db->skill[md->skillidx].emotion);
- }
+ if(md->skillidx >= 0 && md->db->skill[md->skillidx].emotion >= 0)
+ clif_emotion(src, md->db->skill[md->skillidx].emotion);
}
if(battle_config.skill_log && battle_config.skill_log&src->type)
diff --git a/src/map/status.c b/src/map/status.c
index 2e1c45833..e0375bfad 100644
--- a/src/map/status.c
+++ b/src/map/status.c
@@ -428,7 +428,7 @@ void initChangeTables(void) {
StatusIconChangeTable[SC_INTFOOD] = SI_FOODINT;
StatusIconChangeTable[SC_DEXFOOD] = SI_FOODDEX;
StatusIconChangeTable[SC_LUKFOOD] = SI_FOODLUK;
- StatusIconChangeTable[SC_FLEEFOOD] = SI_FOODFLEE;
+ StatusIconChangeTable[SC_FLEEFOOD]= SI_FOODFLEE;
StatusIconChangeTable[SC_HITFOOD] = SI_FOODHIT;
//Other SC which are not necessarily associated to skills.
StatusChangeFlagTable[SC_ASPDPOTION0] = SCB_ASPD;