viewing paste topic/11648- nobonedrop | C

Posted on the | Last edited on
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
//===== 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 );
}
Viewed 1344 times, submitted by AnnieRuru.