diff options
-rw-r--r-- | Changelog-Trunk.txt | 2 | ||||
-rw-r--r-- | doc/script_commands.txt | 6 | ||||
-rw-r--r-- | src/map/mob.c | 2 | ||||
-rw-r--r-- | src/map/mob.h | 1 | ||||
-rw-r--r-- | src/map/script.c | 30 |
5 files changed, 36 insertions, 5 deletions
diff --git a/Changelog-Trunk.txt b/Changelog-Trunk.txt index 6dbdedf6b..e9195bab2 100644 --- a/Changelog-Trunk.txt +++ b/Changelog-Trunk.txt @@ -7,7 +7,7 @@ IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK. * Extended script command 'set' to return the variable reference (topic:190602). [FlavioJS] * Fixed a bug where the "OnMyMobDead" event wouldn't trigger if the mob was killed and never attacked. (bugreport:1725) [SketchyPhoenix] * Reworded a comment in can_copy to make more sense. - * Modified *killmonsterall to support a new argument that will allow it to kill monsters using the new OnMyMobDead behavior (in order to avoid breaking older scripts). + * Modified *killmonster and *killmonsterall to support a new argument that will allow it to kill monsters using the new OnMyMobDead behavior (in order to avoid breaking older scripts) (bugreport:1734) 2008/06/19 * Added Sirius_White's fix for sense working on emperium. (bugreport: 1679) [SketchyPhoenix] * Fixed SC_CHANGEUNDEAD behavior: Blessing and Increase AGI deals 1 damage and does not apply buffs to those inflicted by it. diff --git a/doc/script_commands.txt b/doc/script_commands.txt index 091ad5293..a4aae4a7e 100644 --- a/doc/script_commands.txt +++ b/doc/script_commands.txt @@ -4609,7 +4609,7 @@ For more good examples see just about any official 2-1 or 2-2 job quest script. --------------------------------------- -*killmonster "<map name>","<event label>"; +*killmonster "<map name>","<event label>"{,<type>}; This command will kill all monsters that were spawned with 'monster' or 'addmonster' and have a specified event label attached to them. Commonly used to @@ -4621,6 +4621,10 @@ command, and all monsters summoned with GM commands, but no other ones - that is, all non-permanent monsters) on the specified map will be killed regardless of the event label value. +As of r12876 killmonster now supports an optional argument type. Using 1 for type +will make the command fire "OnMyMobDead" events from any monsters that do die +as a result of this command. + --------------------------------------- *killmonsterall "<map name>"{,<type>}; diff --git a/src/map/mob.c b/src/map/mob.c index 9859de698..adc8d8c83 100644 --- a/src/map/mob.c +++ b/src/map/mob.c @@ -2532,7 +2532,7 @@ int mob_dead(struct mob_data *md, struct block_list *src, int type) if(md->nd) mob_script_callback(md, src, CALLBACK_DEAD); else - if(md->npc_event[0]) + if(md->npc_event[0] && !md->npc_killmonster) { md->status.hp = 0; //So that npc_event invoked functions KNOW that I am dead. if(src) diff --git a/src/map/mob.h b/src/map/mob.h index cade69305..0a65e1c42 100644 --- a/src/map/mob.h +++ b/src/map/mob.h @@ -141,6 +141,7 @@ struct mob_data { short skillidx; unsigned int skilldelay[MAX_MOBSKILL]; char npc_event[50]; + int npc_killmonster; //for new killmonster behavior }; diff --git a/src/map/script.c b/src/map/script.c index db2ab5a86..4eb2e6324 100644 --- a/src/map/script.c +++ b/src/map/script.c @@ -7468,6 +7468,24 @@ BUILDIN_FUNC(areamonster) /*========================================== * モンスター削除 *------------------------------------------*/ + static int buildin_killmonster_sub_strip(struct block_list *bl,va_list ap) +{ //same fix but with killmonster instead - stripping events from mobs. + TBL_MOB* md = (TBL_MOB*)bl; + char *event=va_arg(ap,char *); + int allflag=va_arg(ap,int); + + md->npc_killmonster = 1; + + if(!allflag){ + if(strcmp(event,md->npc_event)==0) + status_kill(bl); + }else{ + if(!md->spawn) + status_kill(bl); + } + md->npc_killmonster = 0; + return 0; +} static int buildin_killmonster_sub(struct block_list *bl,va_list ap) { TBL_MOB* md = (TBL_MOB*)bl; @@ -7496,7 +7514,15 @@ BUILDIN_FUNC(killmonster) if( (m=map_mapname2mapid(mapname))<0 ) return 0; - map_foreachinmap(buildin_killmonster_sub, m, BL_MOB, event ,allflag); + + if( script_hasdata(st,4) ) { + if ( script_getnum(st,4) == 1 ) { + map_foreachinmap(buildin_killmonster_sub, m, BL_MOB, event ,allflag); + return 0; + } + } + + map_foreachinmap(buildin_killmonster_sub_strip, m, BL_MOB, event ,allflag); return 0; } @@ -13456,7 +13482,7 @@ struct script_function buildin_func[] = { BUILDIN_DEF(produce,"i"), BUILDIN_DEF(monster,"siisii*"), BUILDIN_DEF(areamonster,"siiiisii*"), - BUILDIN_DEF(killmonster,"ss"), + BUILDIN_DEF(killmonster,"ss?"), BUILDIN_DEF(killmonsterall,"s?"), BUILDIN_DEF(clone,"siisi*"), BUILDIN_DEF(doevent,"s"), |