summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorHaruna <haru@dotalux.com>2015-04-17 19:25:59 +0200
committerHaruna <haru@dotalux.com>2015-04-17 19:25:59 +0200
commit25f27b58724f053f4829d63eb720fed5768f3128 (patch)
tree5cc3c987af2a4ccdc3f9528cd02dd1c2a6ae266f /src
parent6507a9d475a2467b8d394177e95c2c524bf70544 (diff)
parentdda4f86ce41e63011a1f6ef858b093ce388c912d (diff)
downloadhercules-25f27b58724f053f4829d63eb720fed5768f3128.tar.gz
hercules-25f27b58724f053f4829d63eb720fed5768f3128.tar.bz2
hercules-25f27b58724f053f4829d63eb720fed5768f3128.tar.xz
hercules-25f27b58724f053f4829d63eb720fed5768f3128.zip
Merge pull request #495 from 4144/extjobdb
Allow for plugins read custom fields from jobdb1.
Diffstat (limited to 'src')
-rw-r--r--src/map/status.c267
-rw-r--r--src/map/status.h3
-rw-r--r--src/plugins/HPMHooking/HPMHooking_map.HPMHooksCore.inc4
-rw-r--r--src/plugins/HPMHooking/HPMHooking_map.HookingPoints.inc1
-rw-r--r--src/plugins/HPMHooking/HPMHooking_map.Hooks.inc26
5 files changed, 171 insertions, 130 deletions
diff --git a/src/map/status.c b/src/map/status.c
index 91ab19558..4c6542846 100644
--- a/src/map/status.c
+++ b/src/map/status.c
@@ -12052,18 +12052,11 @@ int status_get_sc_type(sc_type type) {
return status->sc_conf[type];
}
-/*------------------------------------------
-* DB reading.
-* job_db1.txt - weight, hp, sp, aspd
-* job_db2.txt - job level stat bonuses
-* size_fix.txt - size adjustment table for weapons
-* refine_db.txt - refining data table
-*------------------------------------------*/
-void status_read_job_db(void) { /* [malufett/Hercules] */
- int i = 0;
- config_t job_db_conf;
- config_setting_t *jdb = NULL;
- const char *config_filename = "db/"DBPATH"job_db.conf";
+void status_read_job_db_sub(int idx, const char *name, config_setting_t *jdb)
+{
+ config_setting_t *temp = NULL;
+ int i32 = 0;
+
struct {
const char *name;
int id;
@@ -12097,138 +12090,153 @@ void status_read_job_db(void) { /* [malufett/Hercules] */
#endif
};
- if ( libconfig->read_file(&job_db_conf, config_filename) ) {
- ShowError("can't read %s\n", config_filename);
- return;
- }
- while ( (jdb = libconfig->setting_get_elem(job_db_conf.root, i++)) ) {
- int class_, idx, i32 = 0;
- config_setting_t *temp = NULL;
- const char *name = config_setting_name(jdb);
-
- if ( (class_ = pc->check_job_name(name)) == -1 ) {
- ShowWarning("pc_read_job_db: '%s' unknown job name!\n", name);
- continue;
- }
-
- idx = pc->class2idx(class_);
- if ( (temp = libconfig->setting_get_member(jdb, "Inherit")) ) {
- int nidx = 0, iidx, w;
- const char *iname;
- while ( (iname = libconfig->setting_get_string_elem(temp, nidx++)) ) {
- int iclass, ave, total = 0;
- if ( (iclass = pc->check_job_name(iname)) == -1 ) {
- ShowWarning("status_read_job_db: '%s' trying to inherit unknown '%s'!\n", name, iname);
- continue;
- }
- iidx = pc->class2idx(iclass);
- status->max_weight_base[idx] = status->max_weight_base[iidx];
- memcpy(&status->aspd_base[idx], &status->aspd_base[iidx], sizeof(status->aspd_base[iidx]));
- for ( w = 1; w <= MAX_LEVEL && status->HP_table[iidx][w]; w++ ) {
- status->HP_table[idx][w] = status->HP_table[iidx][w];
- total += status->HP_table[idx][w];
- }
- ave = total / (w - 1);
- for ( ; w <= pc->max_level[idx][0]; w++ ) {
- status->HP_table[idx][w] = min(ave * w, battle_config.max_hp);
- }
- for ( w = 1; w <= MAX_LEVEL && status->SP_table[iidx][w]; w++ ) {
- status->SP_table[idx][w] = status->SP_table[iidx][w];
- total += status->SP_table[idx][w];
- }
- ave = total / (w - 1);
- for ( ; w <= pc->max_level[idx][0]; w++ ) {
- status->SP_table[idx][w] = min(ave * w, battle_config.max_sp);
- }
+ if ((temp = libconfig->setting_get_member(jdb, "Inherit"))) {
+ int nidx = 0, iidx, w;
+ const char *iname;
+ while ((iname = libconfig->setting_get_string_elem(temp, nidx++))) {
+ int iclass, ave, total = 0;
+ if ((iclass = pc->check_job_name(iname)) == -1) {
+ ShowWarning("status_read_job_db: '%s' trying to inherit unknown '%s'!\n", name, iname);
+ continue;
+ }
+ iidx = pc->class2idx(iclass);
+ status->max_weight_base[idx] = status->max_weight_base[iidx];
+ memcpy(&status->aspd_base[idx], &status->aspd_base[iidx], sizeof(status->aspd_base[iidx]));
+ for (w = 1; w <= MAX_LEVEL && status->HP_table[iidx][w]; w++) {
+ status->HP_table[idx][w] = status->HP_table[iidx][w];
+ total += status->HP_table[idx][w];
+ }
+ ave = total / (w - 1);
+ for ( ; w <= pc->max_level[idx][0]; w++) {
+ status->HP_table[idx][w] = min(ave * w, battle_config.max_hp);
+ }
+ for (w = 1; w <= MAX_LEVEL && status->SP_table[iidx][w]; w++) {
+ status->SP_table[idx][w] = status->SP_table[iidx][w];
+ total += status->SP_table[idx][w];
+ }
+ ave = total / (w - 1);
+ for ( ; w <= pc->max_level[idx][0]; w++) {
+ status->SP_table[idx][w] = min(ave * w, battle_config.max_sp);
}
}
- if ( (temp = libconfig->setting_get_member(jdb, "InheritHP")) ) {
- int nidx = 0, iidx;
- const char *iname;
- while ( (iname = libconfig->setting_get_string_elem(temp, nidx++)) ) {
- int iclass, w, ave, total = 0;
- if ( (iclass = pc->check_job_name(iname)) == -1 ) {
- ShowWarning("status_read_job_db: '%s' trying to inherit unknown '%s' HP!\n", name, iname);
- continue;
- }
- iidx = pc->class2idx(iclass);
- for ( w = 1; w <= MAX_LEVEL && status->HP_table[iidx][w]; w++ ) {
- status->HP_table[idx][w] = status->HP_table[iidx][w];
- total += status->HP_table[idx][w];
- }
- ave = total / (w - 1);
- for ( ; w <= pc->max_level[idx][0]; w++ ) {
- status->HP_table[idx][w] = min(ave * w, battle_config.max_hp);
- }
+ }
+ if ((temp = libconfig->setting_get_member(jdb, "InheritHP"))) {
+ int nidx = 0, iidx;
+ const char *iname;
+ while ((iname = libconfig->setting_get_string_elem(temp, nidx++))) {
+ int iclass, w, ave, total = 0;
+ if ((iclass = pc->check_job_name(iname)) == -1) {
+ ShowWarning("status_read_job_db: '%s' trying to inherit unknown '%s' HP!\n", name, iname);
+ continue;
+ }
+ iidx = pc->class2idx(iclass);
+ for (w = 1; w <= MAX_LEVEL && status->HP_table[iidx][w]; w++) {
+ status->HP_table[idx][w] = status->HP_table[iidx][w];
+ total += status->HP_table[idx][w];
+ }
+ ave = total / (w - 1);
+ for ( ; w <= pc->max_level[idx][0]; w++ ) {
+ status->HP_table[idx][w] = min(ave * w, battle_config.max_hp);
}
}
- if ( (temp = libconfig->setting_get_member(jdb, "InheritSP")) ) {
- int nidx = 0, iidx, ave, total = 0;
- const char *iname;
- while ( (iname = libconfig->setting_get_string_elem(temp, nidx++)) ) {
- int iclass, w;
- if ( (iclass = pc->check_job_name(iname)) == -1 ) {
- ShowWarning("status_read_job_db: '%s' trying to inherit unknown '%s' SP!\n", name, iname);
- continue;
- }
- iidx = pc->class2idx(iclass);
- for ( w = 1; w <= MAX_LEVEL && status->SP_table[iidx][w]; w++ ) {
- status->SP_table[idx][w] = status->SP_table[iidx][w];
- total += status->SP_table[idx][w];
- }
- ave = total / (w - 1);
- for ( ; w <= pc->max_level[idx][0]; w++ ) {
- status->SP_table[idx][w] = min(ave * w, battle_config.max_sp);
- }
+ }
+ if ((temp = libconfig->setting_get_member(jdb, "InheritSP"))) {
+ int nidx = 0, iidx, ave, total = 0;
+ const char *iname;
+ while ((iname = libconfig->setting_get_string_elem(temp, nidx++))) {
+ int iclass, w;
+ if ((iclass = pc->check_job_name(iname)) == -1) {
+ ShowWarning("status_read_job_db: '%s' trying to inherit unknown '%s' SP!\n", name, iname);
+ continue;
+ }
+ iidx = pc->class2idx(iclass);
+ for (w = 1; w <= MAX_LEVEL && status->SP_table[iidx][w]; w++) {
+ status->SP_table[idx][w] = status->SP_table[iidx][w];
+ total += status->SP_table[idx][w];
+ }
+ ave = total / (w - 1);
+ for ( ; w <= pc->max_level[idx][0]; w++) {
+ status->SP_table[idx][w] = min(ave * w, battle_config.max_sp);
}
}
+ }
- if ( libconfig->setting_lookup_int(jdb, "Weight", &i32) )
- status->max_weight_base[idx] = i32;
- else if ( !status->max_weight_base[idx] )
- status->max_weight_base[idx] = 20000;
+ if (libconfig->setting_lookup_int(jdb, "Weight", &i32))
+ status->max_weight_base[idx] = i32;
+ else if (!status->max_weight_base[idx])
+ status->max_weight_base[idx] = 20000;
- if ( (temp = libconfig->setting_get_member(jdb, "BaseASPD")) ) {
- int widx = 0;
- config_setting_t *wpn = NULL;
- while ( (wpn = libconfig->setting_get_elem(temp, widx++)) ) {
- int w, wlen = ARRAYLENGTH(wnames);
- const char *wname = config_setting_name(wpn);
+ if ((temp = libconfig->setting_get_member(jdb, "BaseASPD"))) {
+ int widx = 0;
+ config_setting_t *wpn = NULL;
+ while ((wpn = libconfig->setting_get_elem(temp, widx++))) {
+ int w, wlen = ARRAYLENGTH(wnames);
+ const char *wname = config_setting_name(wpn);
- ARR_FIND(0, wlen, w, strcmp(wnames[w].name, wname) == 0);
- if ( w != wlen ) {
- status->aspd_base[idx][wnames[w].id] = libconfig->setting_get_int(wpn);
- } else {
- ShowWarning("status_read_job_db: unknown weapon type '%s'!\n", wname);
- }
+ ARR_FIND(0, wlen, w, strcmp(wnames[w].name, wname) == 0);
+ if (w != wlen) {
+ status->aspd_base[idx][wnames[w].id] = libconfig->setting_get_int(wpn);
+ } else {
+ ShowWarning("status_read_job_db: unknown weapon type '%s'!\n", wname);
}
}
+ }
- if ( (temp = libconfig->setting_get_member(jdb, "HPTable")) ) {
- int level = 0, ave, total = 0;
- config_setting_t *hp = NULL;
- while ( (hp = libconfig->setting_get_elem(temp, level++)) ) {
- status->HP_table[idx][level] = i32 = min(libconfig->setting_get_int(hp), battle_config.max_hp);
- total += i32 - status->HP_table[idx][level - 1];
- }
- ave = total / (level - 1);
- for ( ; level <= pc->max_level[idx][0]; level++ ) { /* limit only to possible maximum level of the given class */
- status->HP_table[idx][level] = min(ave * level, battle_config.max_hp); /* some are still empty? then let's use the average increase */
- }
+ if ((temp = libconfig->setting_get_member(jdb, "HPTable"))) {
+ int level = 0, ave, total = 0;
+ config_setting_t *hp = NULL;
+ while ((hp = libconfig->setting_get_elem(temp, level++))) {
+ status->HP_table[idx][level] = i32 = min(libconfig->setting_get_int(hp), battle_config.max_hp);
+ total += i32 - status->HP_table[idx][level - 1];
+ }
+ ave = total / (level - 1);
+ for ( ; level <= pc->max_level[idx][0]; level++ ) { /* limit only to possible maximum level of the given class */
+ status->HP_table[idx][level] = min(ave * level, battle_config.max_hp); /* some are still empty? then let's use the average increase */
}
+ }
- if ( (temp = libconfig->setting_get_member(jdb, "SPTable")) ) {
- int level = 0, ave, total = 0;
- config_setting_t *sp = NULL;
- while ( (sp = libconfig->setting_get_elem(temp, level++)) ) {
- status->SP_table[idx][level] = i32 = min(libconfig->setting_get_int(sp), battle_config.max_sp);
- total += i32 - status->SP_table[idx][level - 1];
- }
- ave = total / (level - 1);
- for ( ; level <= pc->max_level[idx][0]; level++ ) {
- status->SP_table[idx][level] = min(ave * level, battle_config.max_sp);
- }
+ if ((temp = libconfig->setting_get_member(jdb, "SPTable"))) {
+ int level = 0, ave, total = 0;
+ config_setting_t *sp = NULL;
+ while ((sp = libconfig->setting_get_elem(temp, level++))) {
+ status->SP_table[idx][level] = i32 = min(libconfig->setting_get_int(sp), battle_config.max_sp);
+ total += i32 - status->SP_table[idx][level - 1];
+ }
+ ave = total / (level - 1);
+ for ( ; level <= pc->max_level[idx][0]; level++ ) {
+ status->SP_table[idx][level] = min(ave * level, battle_config.max_sp);
+ }
+ }
+}
+
+/*------------------------------------------
+* DB reading.
+* job_db.conf - weight, hp, sp, aspd
+* job_db2.txt - job level stat bonuses
+* size_fix.txt - size adjustment table for weapons
+* refine_db.txt - refining data table
+*------------------------------------------*/
+void status_read_job_db(void) { /* [malufett/Hercules] */
+ int i = 0;
+ config_t job_db_conf;
+ config_setting_t *jdb = NULL;
+ const char *config_filename = "db/"DBPATH"job_db.conf";
+
+ if ( libconfig->read_file(&job_db_conf, config_filename) ) {
+ ShowError("can't read %s\n", config_filename);
+ return;
+ }
+ while ( (jdb = libconfig->setting_get_elem(job_db_conf.root, i++)) ) {
+ int class_, idx;
+ const char *name = config_setting_name(jdb);
+
+ if ( (class_ = pc->check_job_name(name)) == -1 ) {
+ ShowWarning("pc_read_job_db: '%s' unknown job name!\n", name);
+ continue;
}
+
+ idx = pc->class2idx(class_);
+ status->read_job_db_sub(idx, name, jdb);
}
libconfig->destroy(&job_db_conf);
}
@@ -12547,4 +12555,5 @@ void status_defaults(void) {
status->readdb_refine = status_readdb_refine;
status->readdb_scconfig = status_readdb_scconfig;
status->read_job_db = status_read_job_db;
+ status->read_job_db_sub = status_read_job_db_sub;
}
diff --git a/src/map/status.h b/src/map/status.h
index 98d5d415c..c8a7a08f7 100644
--- a/src/map/status.h
+++ b/src/map/status.h
@@ -6,7 +6,7 @@
#define MAP_STATUS_H
#include "../config/core.h" // defType, RENEWAL, RENEWAL_ASPD
-
+#include "../common/conf.h"
#include "../common/cbasetypes.h"
#include "../common/mmo.h" // NEW_CARTS
@@ -2116,6 +2116,7 @@ struct status_interface {
bool (*readdb_refine) (char *fields[], int columns, int current);
bool (*readdb_scconfig) (char *fields[], int columns, int current);
void (*read_job_db) (void);
+ void (*read_job_db_sub) (int idx, const char *name, config_setting_t *jdb);
};
struct status_interface *status;
diff --git a/src/plugins/HPMHooking/HPMHooking_map.HPMHooksCore.inc b/src/plugins/HPMHooking/HPMHooking_map.HPMHooksCore.inc
index d7a6cf672..7ae80e07c 100644
--- a/src/plugins/HPMHooking/HPMHooking_map.HPMHooksCore.inc
+++ b/src/plugins/HPMHooking/HPMHooking_map.HPMHooksCore.inc
@@ -5053,6 +5053,8 @@ struct {
struct HPMHookPoint *HP_status_readdb_scconfig_post;
struct HPMHookPoint *HP_status_read_job_db_pre;
struct HPMHookPoint *HP_status_read_job_db_post;
+ struct HPMHookPoint *HP_status_read_job_db_sub_pre;
+ struct HPMHookPoint *HP_status_read_job_db_sub_post;
struct HPMHookPoint *HP_storage_reconnect_pre;
struct HPMHookPoint *HP_storage_reconnect_post;
struct HPMHookPoint *HP_storage_delitem_pre;
@@ -10260,6 +10262,8 @@ struct {
int HP_status_readdb_scconfig_post;
int HP_status_read_job_db_pre;
int HP_status_read_job_db_post;
+ int HP_status_read_job_db_sub_pre;
+ int HP_status_read_job_db_sub_post;
int HP_storage_reconnect_pre;
int HP_storage_reconnect_post;
int HP_storage_delitem_pre;
diff --git a/src/plugins/HPMHooking/HPMHooking_map.HookingPoints.inc b/src/plugins/HPMHooking/HPMHooking_map.HookingPoints.inc
index 05ceb4ab1..ac34c8d07 100644
--- a/src/plugins/HPMHooking/HPMHooking_map.HookingPoints.inc
+++ b/src/plugins/HPMHooking/HPMHooking_map.HookingPoints.inc
@@ -2564,6 +2564,7 @@ struct HookingPointData HookingPoints[] = {
{ HP_POP(status->readdb_refine, HP_status_readdb_refine) },
{ HP_POP(status->readdb_scconfig, HP_status_readdb_scconfig) },
{ HP_POP(status->read_job_db, HP_status_read_job_db) },
+ { HP_POP(status->read_job_db_sub, HP_status_read_job_db_sub) },
/* storage */
{ HP_POP(storage->reconnect, HP_storage_reconnect) },
{ HP_POP(storage->delitem, HP_storage_delitem) },
diff --git a/src/plugins/HPMHooking/HPMHooking_map.Hooks.inc b/src/plugins/HPMHooking/HPMHooking_map.Hooks.inc
index 8f7c4f0b4..42e6a574d 100644
--- a/src/plugins/HPMHooking/HPMHooking_map.Hooks.inc
+++ b/src/plugins/HPMHooking/HPMHooking_map.Hooks.inc
@@ -67963,6 +67963,32 @@ void HP_status_read_job_db(void) {
}
return;
}
+void HP_status_read_job_db_sub(int idx, const char *name, config_setting_t *jdb) {
+ int hIndex = 0;
+ if( HPMHooks.count.HP_status_read_job_db_sub_pre ) {
+ void (*preHookFunc) (int *idx, const char *name, config_setting_t *jdb);
+ *HPMforce_return = false;
+ for(hIndex = 0; hIndex < HPMHooks.count.HP_status_read_job_db_sub_pre; hIndex++ ) {
+ preHookFunc = HPMHooks.list.HP_status_read_job_db_sub_pre[hIndex].func;
+ preHookFunc(&idx, name, jdb);
+ }
+ if( *HPMforce_return ) {
+ *HPMforce_return = false;
+ return;
+ }
+ }
+ {
+ HPMHooks.source.status.read_job_db_sub(idx, name, jdb);
+ }
+ if( HPMHooks.count.HP_status_read_job_db_sub_post ) {
+ void (*postHookFunc) (int *idx, const char *name, config_setting_t *jdb);
+ for(hIndex = 0; hIndex < HPMHooks.count.HP_status_read_job_db_sub_post; hIndex++ ) {
+ postHookFunc = HPMHooks.list.HP_status_read_job_db_sub_post[hIndex].func;
+ postHookFunc(&idx, name, jdb);
+ }
+ }
+ return;
+}
/* storage */
void HP_storage_reconnect(void) {
int hIndex = 0;