From 403d1aceaeb74d5994f0390f61cb31b13923168f Mon Sep 17 00:00:00 2001 From: skotlex Date: Mon, 6 Nov 2006 19:07:53 +0000 Subject: - Corrected Kaupe so it doesn't ends on the first part of Soul Destroyer. - Applied some cleaning to the way Tatami Gaeshi knocks back. - Cleaned up the way mobskill_use checks for the correct event. It should fix unlimited mob-skill-casting issues. git-svn-id: https://rathena.svn.sourceforge.net/svnroot/rathena/trunk@9154 54d463be-8e91-2dee-dedb-b68131a5f0ec --- Changelog-Trunk.txt | 5 +++++ src/map/battle.c | 6 ++++-- src/map/mob.c | 17 ++++++++--------- src/map/skill.c | 6 +++++- 4 files changed, 22 insertions(+), 12 deletions(-) diff --git a/Changelog-Trunk.txt b/Changelog-Trunk.txt index 467edcb6a..c8d6eb241 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. 2006/11/06 + * Corrected Kaupe so it doesn't ends on the first part of Soul Destroyer. + [Skotlex] + * Applied some cleaning to the way Tatami Gaeshi knocks back. [Skotlex] + * Cleaned up the way mobskill_use checks for the correct event. It should + fix unlimited mob-skill-casting issues. [Skotlex] * Removed the return code entry when logging GM reload-GM requests (login-sql),it'll just be stored as zero. [Skotlex] * Added a fix on socket.c to not pick INADDR_ANY when choosing our own IP. diff --git a/src/map/battle.c b/src/map/battle.c index 4e1f2692c..96b61e8d6 100644 --- a/src/map/battle.c +++ b/src/map/battle.c @@ -318,8 +318,10 @@ int battle_calc_damage(struct block_list *src,struct block_list *bl,int damage,i (src->type == BL_PC || !skill_num)) { //Kaupe only blocks all skills of players. clif_specialeffect(bl, 462, AREA); - if (--sc->data[SC_KAUPE].val3 <= 0) //We make it work like Safety Wall, even though it only blocks 1 time. - status_change_end(bl, SC_KAUPE, -1); + //Shouldn't end until Breaker's non-weapon part connects. + if (skill_num != ASC_BREAKER || !(flag&BF_WEAPON)) + if (--sc->data[SC_KAUPE].val3 <= 0) //We make it work like Safety Wall, even though it only blocks 1 time. + status_change_end(bl, SC_KAUPE, -1); return 0; } diff --git a/src/map/mob.c b/src/map/mob.c index 2033cddbf..daf71b348 100644 --- a/src/map/mob.c +++ b/src/map/mob.c @@ -2649,7 +2649,7 @@ int mobskill_use(struct mob_data *md, unsigned int tick, int event) if (!battle_config.mob_skill_rate || md->ud.skilltimer != -1 || !md->db->maxskill) return 0; - if (event < 0 && DIFF_TICK(md->ud.canact_tick, tick) > 0) + if (event == -1 && DIFF_TICK(md->ud.canact_tick, tick) > 0) return 0; //Skill act delay only affects non-event skills. //Pick a starting position and loop from that. @@ -2676,11 +2676,12 @@ int mobskill_use(struct mob_data *md, unsigned int tick, int event) if (rand() % 10000 > ms[i].permillage) //Lupus (max value = 10000) continue; - // - flag = (event == ms[i].cond1); - //Avoid entering on defined events to avoid "hyper-active skill use" due to the overflow of calls to this function - //in battle. The only exception is MSC_SKILLUSED which explicitly uses the event value to trigger. [Skotlex] - if (!flag && (event == -1 || (event & 0xffff) == MSC_SKILLUSED)){ + if (ms[i].cond1 == event) + flag = 1; //Trigger skill. + else if (ms[i].cond1 == MSC_SKILLUSED) + flag = ((event & 0xffff) == MSC_SKILLUSED && ((event >> 16) == c2 || c2 == 0)); + else if(event == -1){ + //Avoid entering on defined events to avoid "hyper-active skill use" due to the overflow of calls to this function in battle. switch (ms[i].cond1) { case MSC_ALWAYS: @@ -2723,8 +2724,6 @@ int mobskill_use(struct mob_data *md, unsigned int tick, int event) flag = (unit_counttargeted(&md->bl, 0) >= c2); break; case MSC_AFTERSKILL: flag = (md->ud.skillid == c2); break; - case MSC_SKILLUSED: // specificated skill used - flag = ((event & 0xffff) == MSC_SKILLUSED && ((event >> 16) == c2 || c2 == 0)); break; case MSC_RUDEATTACKED: flag = (md->attacked_count >= RUDE_ATTACKED_COUNT); if (flag) md->attacked_count = 0; //Rude attacked count should be reset after the skill condition is met. Thanks to Komurka [Skotlex] @@ -2850,7 +2849,7 @@ int mobskill_event(struct mob_data *md, struct block_list *src, unsigned int tic if (flag == -1) res = mobskill_use(md, tick, MSC_CASTTARGETED); else if ((flag&0xffff) == MSC_SKILLUSED) - res = mobskill_use(md,tick,flag); + res = mobskill_use(md, tick, flag); else if (flag&BF_SHORT) res = mobskill_use(md, tick, MSC_CLOSEDATTACKED); else if (flag&BF_LONG) diff --git a/src/map/skill.c b/src/map/skill.c index f49744679..bf1bc6998 100644 --- a/src/map/skill.c +++ b/src/map/skill.c @@ -1906,6 +1906,10 @@ int skill_attack (int attack_type, struct block_list* src, struct block_list *ds if(src == bl) type = 4; else flag|=SD_ANIMATION; } + if(skillid == NJ_TATAMIGAESHI) { + dsrc = src; //For correct knockback. + flag|=SD_ANIMATION; + } if(sd) { int flag = 0; //Used to signal if this skill can be combo'ed later on. @@ -2066,7 +2070,7 @@ int skill_attack (int attack_type, struct block_list* src, struct block_list *ds //Only knockback if it's still alive, otherwise a "ghost" is left behind. [Skotlex] if (dmg.blewcount > 0 && !status_isdead(bl)) - skill_blown(skillid==NJ_TATAMIGAESHI?src:dsrc,bl,dmg.blewcount); + skill_blown(dsrc,bl,dmg.blewcount); //Delayed damage must be dealt after the knockback (it needs to know actual position of target) if (dmg.amotion) -- cgit v1.2.3-70-g09d2