/*
Charm System(aka Bonus without equip) Plugin
-- By Dastgir/Hercules
-- For Karazu
-- Please do not remove credits.
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "../3rdparty/libconfig/libconfig.h"
#include "common/HPMi.h"
#include "common/malloc.h"
#include "common/mmo.h"
#include "common/socket.h"
#include "common/strlib.h"
#include "common/sql.h"
#include "common/utils.h"
#include "common/nullpo.h"
#include "common/conf.h"
#include "common/cbasetypes.h"
#include "map/mob.h"
#include "map/map.h"
#include "map/clif.h"
#include "map/pc.h"
#include "map/script.h"
#include "map/elemental.h"
#include "map/npc.h"
#include "map/status.h"
#include "map/storage.h"
#include "map/itemdb.h"
#include "map/guild.h"
#include "common/HPMDataCheck.h" /* should always be the last file included! (if you don't make it last, it'll intentionally break compile time) */
HPExport struct hplugin_info pinfo = {
"Charm System",// Plugin name
SERVER_TYPE_MAP,// Which server types this plugin works with?
"1.0", // Plugin version
HPM_VERSION, // HPM Version (don't change, macro is automatically updated)
};
struct item_charm_data {
bool charm;
};
int charm_stackable(int *nameid){
struct item_data *data;
struct item_charm_data *icdt;
data = itemdb->search(*nameid);
if( !(icdt = getFromITEMDATA(data,0)) )
return 1;
if (icdt->charm==true){
hookStop();
return 0;
}
return 1;
}
int charm_stackable2(struct item_data *data){
struct item_charm_data *icdt;
nullpo_ret(data);
if( !(icdt = getFromITEMDATA(data,0)) )
return 1;
if (icdt->charm==true){
hookStop();
return 0;
}
return 1;
}
int charm_add(int retVal, struct map_session_data *sd,struct item *item_data,int amount,e_log_pick_type log_type){
struct item_data *data;
struct item_charm_data *icdt;
if (retVal!=0){
return retVal;
}
data = itemdb->search(item_data->nameid);
if( !(icdt = getFromITEMDATA(data,0)) )
return retVal;
if(icdt->charm == true) status->calc_pc_(sd,0);
return retVal;
}
int charm_del_pre(struct map_session_data *sd,int *n_,int *amount_,int *type_, short *reason, e_log_pick_type *log_type){
struct item_charm_data *icdt;
int n = *n_;
if (sd->inventory_data[n] == NULL){
return 0;
}
if( !(icdt = getFromITEMDATA(sd->inventory_data[n],0)) )
return 0;
if (icdt->charm == true){
status->calc_pc_(sd,0);
}
return 0;
}
void charm_bonus(struct map_session_data* sd, enum e_status_calc_opt *opt_) {
int i;
struct item_charm_data *icdt;
for ( i=0; i < MAX_INVENTORY; i++ ) { //dh
if ( !sd->inventory_data[i])
continue;
if( !(icdt = getFromITEMDATA(sd->inventory_data[i],0)) )
continue;
if (icdt->charm == false)
continue;
if ( sd->inventory_data[i]->script) {
script->run( sd->inventory_data[i]->script, 0, sd->bl.id, 0 );
}
}
return;
}
void charm_readdb(int* itemid, config_setting_t *it, int *n_, const char *source){
int item_id = *itemid;
struct item_data *id = itemdb->load(item_id);
config_setting_t *t = NULL;
struct item_charm_data *icdt;
if( !(icdt = getFromITEMDATA(id,0)) ) {
CREATE(icdt,struct item_charm_data,1);
addToITEMDATA(id,icdt,0,true);
}
if ((t = libconfig->setting_get_member(it, "Charm"))) {
if (libconfig->setting_get_bool(t)){
icdt->charm = true;
}
}
}
HPExport void plugin_init(void) {
iMalloc = GET_SYMBOL("iMalloc");
mob = GET_SYMBOL("mob");
script = GET_SYMBOL("script");
clif = GET_SYMBOL("clif");
pc = GET_SYMBOL("pc");
map = GET_SYMBOL("map");
npc = GET_SYMBOL("npc");
status = GET_SYMBOL("status");
storage = GET_SYMBOL("storage");
itemdb = GET_SYMBOL("itemdb");
guild = GET_SYMBOL("guild");
nullpo = GET_SYMBOL("nullpo");
libconfig = GET_SYMBOL("libconfig");
addHookPre("itemdb->isstackable", charm_stackable);
addHookPre("itemdb->isstackable2", charm_stackable2);
addHookPre("itemdb->readdb_additional_fields",charm_readdb);
addHookPre("status->calc_pc_additional", charm_bonus);
addHookPost("pc->additem", charm_add);
addHookPre("pc->delitem", charm_del_pre);
}
HPExport void server_online (void) {
ShowInfo ("'%s' Plugin by Dastgir/Hercules. Version '%s'\n",pinfo.name,pinfo.version);
}