From 46649a93ab9a214c8cb842a25588699f76db0023 Mon Sep 17 00:00:00 2001 From: skotlex Date: Wed, 2 Aug 2006 04:09:01 +0000 Subject: - Fixed NPC_SELFDESTRUCTION damaging yourself, causing the source to be knocked back, as well as making others in the splash damage not receive any damage if they are hurt after the caster. - Fixed NPC_RUN not setting the mob's state to MSS_WALK (normally not set by the mob ai) - unit_walktoxy flag&2 setting will now also ignore unit_can_move, for a forced walk. - Adjusted NPC_RUN level of Marine Spheres (5->7 cells) git-svn-id: https://rathena.svn.sourceforge.net/svnroot/rathena/trunk@8044 54d463be-8e91-2dee-dedb-b68131a5f0ec --- Changelog-Trunk.txt | 4 ++++ db/mob_skill_db.txt | 2 +- src/map/skill.c | 9 +++++++-- src/map/unit.c | 7 ++----- 4 files changed, 14 insertions(+), 8 deletions(-) diff --git a/Changelog-Trunk.txt b/Changelog-Trunk.txt index 3701f990f..3e600b872 100644 --- a/Changelog-Trunk.txt +++ b/Changelog-Trunk.txt @@ -4,6 +4,10 @@ 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/08/01 + * Miscellanous fixes which make the Marine Sphere self destruction work as + best as I can. It only has one flaw: It self-destructs instantly after + walking because if I make it use self-destruction with a cast-bar, + client-side the object stops moving inmediately... [Skotlex] * Modified unit_walktoxy and NPC_RUN to enable running even when the caster does not has the MD_CANMOVE bit on. [Skotlex] * PF_MINDBREAKER will now silently fail if you try to use it on someone who diff --git a/db/mob_skill_db.txt b/db/mob_skill_db.txt index 67310157e..f400ae700 100644 --- a/db/mob_skill_db.txt +++ b/db/mob_skill_db.txt @@ -684,7 +684,7 @@ 1141,Marina@NPC_CRITICALSLASH,attack,170,1,500,500,5000,no,target,always,0,,,,,,6 1141,Marina@NPC_EMOTION,walk,197,1,2000,0,5000,yes,self,always,0,19,,,,, 1141,Marina@NPC_WATERATTACK,attack,184,2,500,500,5000,no,target,always,0,,,,,,6 -1142,Marine Sphere@NPC_RUN,idle,354,5,10000,0,30000,no,master,alchemist,,,,,,, +1142,Marine Sphere@NPC_RUN,idle,354,7,10000,0,30000,no,master,alchemist,,,,,,, 1142,Marine Sphere@NPC_SELFDESTRUCTION,idle,173,1,10000,0,0,no,self,afterskill,354,,,,,, 1142,Marine Sphere@NPC_SELFDESTRUCTION,idle,173,1,10000,2000,5000,no,self,skillused,173,,,,,, 1142,Marine Sphere@NPC_SELFDESTRUCTION,idle,173,1,500,2000,5000,no,self,myhpltmaxrate,99,,,,,, diff --git a/src/map/skill.c b/src/map/skill.c index a78e7820a..678461ae0 100644 --- a/src/map/skill.c +++ b/src/map/skill.c @@ -3098,13 +3098,17 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, int case CR_ACIDDEMONSTRATION: case TF_THROWSTONE: case NPC_SMOKING: - case NPC_SELFDESTRUCTION: case HVAN_EXPLOSION: //[orn] case GS_FLING: case NJ_ZENYNAGE: skill_attack(BF_MISC,src,src,bl,skillid,skilllv,tick,flag); break; + case NPC_SELFDESTRUCTION: + if (src != bl) + skill_attack(BF_MISC,src,src,bl,skillid,skilllv,tick,flag); + break; + // Celest case PF_SOULBURN: if (rand()%100 < (skilllv < 5 ? 30 + skilllv * 10 : 70)) { @@ -4903,7 +4907,8 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, in int dir = (bl == src)?unit_getdir(src):map_calc_dir(src,bl->x,bl->y); //If cast on self, run forward, else run away. unit_stop_attack(src); //Run skillv tiles overriding the can-move check. - unit_walktoxy(src, bl->x + skilllv * mask[dir][0], bl->y + skilllv * mask[dir][1], 2); + if (unit_walktoxy(src, src->x + skilllv * mask[dir][0], src->y + skilllv * mask[dir][1], 2) && md) + md->state.skillstate = MSS_WALK; //Otherwise it isn't updated in the ai. } break; diff --git a/src/map/unit.c b/src/map/unit.c index 9d2356d58..0755ef9c4 100644 --- a/src/map/unit.c +++ b/src/map/unit.c @@ -258,7 +258,7 @@ static int unit_walktoxy_timer(int tid,unsigned int tick,int id,int data) return 0; } -//Easy parameter: &1 -> 1/2 = easy/hard, &2 -> ignore MD_CANMOVE check +//Easy parameter: &1 -> 1/2 = easy/hard, &2 -> force walking. int unit_walktoxy( struct block_list *bl, int x, int y, int easy) { struct unit_data *ud = NULL; struct status_change *sc = NULL; @@ -272,12 +272,9 @@ int unit_walktoxy( struct block_list *bl, int x, int y, int easy) { if( ud == NULL) return 0; - if(!(easy&2) && !status_get_mode(bl)&MD_CANMOVE) + if(!(easy&2) && (!status_get_mode(bl)&MD_CANMOVE || !unit_can_move(bl))) return 0; - if (!unit_can_move(bl)) - return 0; - ud->state.walk_easy = easy&1; ud->target = 0; ud->to_x = x; -- cgit v1.2.3-70-g09d2