diff options
-rw-r--r-- | Changelog-Trunk.txt | 5 | ||||
-rw-r--r-- | src/map/clif.c | 6 | ||||
-rw-r--r-- | src/map/mob.c | 174 | ||||
-rw-r--r-- | src/map/skill.c | 26 | ||||
-rw-r--r-- | src/map/status.c | 2 |
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; |