diff options
-rw-r--r-- | src/common/HPMi.h | 5 | ||||
-rw-r--r-- | src/map/HPMmap.c | 29 | ||||
-rw-r--r-- | src/map/HPMmap.h | 2 | ||||
-rw-r--r-- | src/map/map.c | 1 | ||||
-rw-r--r-- | src/map/pc_groups.c | 13 | ||||
-rw-r--r-- | src/map/pc_groups.h | 13 |
6 files changed, 57 insertions, 6 deletions
diff --git a/src/common/HPMi.h b/src/common/HPMi.h index 742132cde..78a3a9ab5 100644 --- a/src/common/HPMi.h +++ b/src/common/HPMi.h @@ -138,6 +138,9 @@ enum HPluginConfType { /* HPMi->addBattleConf */ #define addBattleConf(bcname,funcname) HPMi->addConf(HPMi->pid,HPCT_BATTLE,bcname,funcname) +/* HPMi->addPCGPermission */ +#define addGroupPermission(pcgname,maskptr) HPMi->addPCGPermission(HPMi->pid,pcgname,&maskptr) + /* Hercules Plugin Mananger Include Interface */ HPExport struct HPMi_interface { /* */ @@ -161,6 +164,8 @@ HPExport struct HPMi_interface { bool (*addArg) (unsigned int pluginID, char *name, bool has_param,void (*func) (char *param),void (*help) (void)); /* battle-config recv param */ bool (*addConf) (unsigned int pluginID, enum HPluginConfType type, char *name, void (*func) (const char *val)); + /* pc group permission */ + void (*addPCGPermission) (unsigned int pluginID, char *name, unsigned int *mask); } HPMi_s; #ifndef _HPM_H_ HPExport struct HPMi_interface *HPMi; diff --git a/src/map/HPMmap.c b/src/map/HPMmap.c index 8d7c74ef2..9c09a7ad1 100644 --- a/src/map/HPMmap.c +++ b/src/map/HPMmap.c @@ -65,8 +65,9 @@ void HPM_map_grabHPData(struct HPDataOperationStorage *ret, enum HPluginDataType } void HPM_map_plugin_load_sub(struct hplugin *plugin) { - plugin->hpi->addCommand = HPM->import_symbol("addCommand",plugin->idx); - plugin->hpi->addScript = HPM->import_symbol("addScript",plugin->idx); + plugin->hpi->addCommand = HPM->import_symbol("addCommand",plugin->idx); + plugin->hpi->addScript = HPM->import_symbol("addScript",plugin->idx); + plugin->hpi->addPCGPermission = HPM->import_symbol("addGroupPermission",plugin->idx); } bool HPM_map_add_atcommand(char *name, AtCommandFunc func) { @@ -98,6 +99,30 @@ void HPM_map_atcommands(void) { } void HPM_map_do_final(void) { + unsigned char i; + if( atcommand_list ) aFree(atcommand_list); + /** + * why is pcg->HPM being cleared here? because PCG's do_final is not final, + * is used on reload, and would thus cause plugin-provided permissions to go away + **/ + for( i = 0; i < pcg->HPMpermissions_count; i++ ) { + aFree(pcg->HPMpermissions[i].name); + } + if( pcg->HPMpermissions ) + aFree(pcg->HPMpermissions); +} + +/** + * Adds a new group permission to the HPM-provided list + **/ +void HPM_map_add_group_permission(unsigned int pluginID, char *name, unsigned int *mask) { + unsigned char index = pcg->HPMpermissions_count; + + RECREATE(pcg->HPMpermissions, struct pc_groups_new_permission, ++pcg->HPMpermissions_count); + + pcg->HPMpermissions[index].pID = pluginID; + pcg->HPMpermissions[index].name = aStrdup(name); + pcg->HPMpermissions[index].mask = mask; } diff --git a/src/map/HPMmap.h b/src/map/HPMmap.h index f5fe70276..f86f02eb9 100644 --- a/src/map/HPMmap.h +++ b/src/map/HPMmap.h @@ -20,4 +20,6 @@ void HPM_map_plugin_load_sub(struct hplugin *plugin); void HPM_map_do_final(void); +void HPM_map_add_group_permission(unsigned int pluginID, char *name, unsigned int *mask); + #endif /* _HPM_MAP_ */ diff --git a/src/map/map.c b/src/map/map.c index 68a675a37..5344d11bf 100644 --- a/src/map/map.c +++ b/src/map/map.c @@ -5379,6 +5379,7 @@ void map_hp_symbols(void) { /* specific */ HPM->share(atcommand->create,"addCommand"); HPM->share(script->addScript,"addScript"); + HPM->share(HPM_map_add_group_permission,"addGroupPermission"); } void map_load_defaults(void) { diff --git a/src/map/pc_groups.c b/src/map/pc_groups.c index 59dd951c7..4ddb95c9b 100644 --- a/src/map/pc_groups.c +++ b/src/map/pc_groups.c @@ -423,10 +423,17 @@ void do_init_pc_groups(void) { for(i = 0; i < len; i++) { unsigned int p; - if( ( p = pcg->add_permission(pc_g_defaults[i].name) ) != pc_g_defaults[i].permission ) + if( ( p = pc_groups_add_permission(pc_g_defaults[i].name) ) != pc_g_defaults[i].permission ) ShowError("do_init_pc_groups: %s error : %d != %d\n",pc_g_defaults[i].name,p,pc_g_defaults[i].permission); } + /** + * Handle plugin-provided permissions + **/ + for(i = 0; i < pcg->HPMpermissions_count; i++) { + *pcg->HPMpermissions[i].mask = pc_groups_add_permission(pcg->HPMpermissions[i].name); + } + pcg->db = idb_alloc(DB_OPT_RELEASE_DATA); pcg->name_db = stridb_alloc(DB_OPT_DUP_KEY, 0); @@ -502,6 +509,9 @@ void pc_groups_defaults(void) { pcg->permissions = NULL; pcg->permission_count = 0; /* */ + pcg->HPMpermissions = NULL; + pcg->HPMpermissions_count = 0; + /* */ pcg->init = do_init_pc_groups; pcg->final = do_final_pc_groups; pcg->reload = pc_groups_reload; @@ -514,5 +524,4 @@ void pc_groups_defaults(void) { pcg->get_name = pc_group_get_name; pcg->get_level = pc_group_get_level; pcg->get_idx = pc_group_get_idx; - pcg->add_permission = pc_groups_add_permission; } diff --git a/src/map/pc_groups.h b/src/map/pc_groups.h index 943fb7fa5..3396512ea 100644 --- a/src/map/pc_groups.h +++ b/src/map/pc_groups.h @@ -49,12 +49,19 @@ struct GroupSettings { config_setting_t *root; // groups.[] }; +typedef struct GroupSettings GroupSettings; + struct pc_groups_permission_table { char *name; unsigned int permission; }; -typedef struct GroupSettings GroupSettings; +/* used by plugins to list permissions */ +struct pc_groups_new_permission { + unsigned int pID;/* plugin identity (for the future unload during runtime support) */ + char *name;/* aStrdup' of the permission name */ + unsigned int *mask;/* pointer to the plugin val that will store the value of the mask */ +}; struct pc_groups_interface { /* */ @@ -64,6 +71,9 @@ struct pc_groups_interface { struct pc_groups_permission_table *permissions; unsigned char permission_count; /* */ + struct pc_groups_new_permission *HPMpermissions; + unsigned char HPMpermissions_count; + /* */ void (*init) (void); void (*final) (void); void (*reload) (void); @@ -76,7 +86,6 @@ struct pc_groups_interface { const char* (*get_name) (GroupSettings *group); int (*get_level) (GroupSettings *group); int (*get_idx) (GroupSettings *group); - unsigned int (*add_permission) (const char *name); }; struct pc_groups_interface *pcg; |