//===== Hercules Plugin ====================================== //= nobonedrop mapflag //===== By: ================================================== //= AnnieRuru //= Originally by Cydh //===== Current Version: ===================================== //= 0.2 //===== Compatible With: ===================================== //= Hercules 2018-04-04 //===== Description: ========================================= //= disable bone drop on certain maps //===== Topic ================================================ //= http://herc.ws/board/topic/11648-no-bone-drop-on-specific-map-script-for-herc/ //===== Additional Comments: ================================= //= only if your bone_drop battleflag set as 1 or 2 //============================================================ #include "common/hercules.h" #include "map/pc.h" #include "map/map.h" #include "map/npc.h" #include "common/memmgr.h" #include "plugins/HPMHooking.h" #include "common/HPMDataCheck.h" HPExport struct hplugin_info pinfo = { "nobonedrop", SERVER_TYPE_MAP, "0.2", HPM_VERSION, }; struct mapflag_data { unsigned nobonedrop : 1; }; int bone_drop_value = 0; void npc_parse_unknown_mapflag_pre( const char **name, const char **w3, const char **w4, const char **start, const char **buffer, const char **filepath, int **retval ) { if ( !strcmp( *w3,"nobonedrop" ) ) { int16 m = map->mapname2mapid( *name ); struct mapflag_data *mf; if ( !( mf = getFromMAPD( &map->list[m], 0 ) ) ) { CREATE( mf, struct mapflag_data, 1 ); addToMAPD( &map->list[m], mf, 0, true ); } mf->nobonedrop = 1; hookStop(); } return; } int pc_dead_pre( struct map_session_data **sd, struct block_list **src ) { struct mapflag_data *mf = getFromMAPD( &map->list[ (*sd)->bl.m ], 0 ); if ( mf && mf->nobonedrop ) battle->bc->bone_drop = 0; return 0; } int pc_dead_post( int retVal, struct map_session_data *sd, struct block_list *src ) { struct mapflag_data *mf = getFromMAPD( &map->list[sd->bl.m], 0 ); if ( mf && mf->nobonedrop ) battle->bc->bone_drop = bone_drop_value; return retVal; } // flush all nobonedrop mapflag back to default upon @reloadscript void map_flags_init_pre(void) { int i; for ( i = 0; i < map->count; ++i ) { struct mapflag_data *mf = getFromMAPD( &map->list[i], 0 ); if ( mf ) removeFromMAPD( &map->list[i], 0 ); } return; } HPExport void plugin_init (void) { bone_drop_value = battle->bc->bone_drop; addHookPre( npc, parse_unknown_mapflag, npc_parse_unknown_mapflag_pre ); addHookPre( pc, dead, pc_dead_pre ); addHookPost( pc, dead, pc_dead_post ); addHookPre( map, flags_init, map_flags_init_pre ); }