From 7dfdffc814f164fe7f6461f9767cc531ef150c83 Mon Sep 17 00:00:00 2001
From: Andrei Karas <akaras@inbox.ru>
Date: Fri, 9 Jan 2015 13:40:04 +0300
Subject: Convert pcdb_checkid into function in pc interface.

---
 src/map/atcommand.c |  2 +-
 src/map/clif.c      | 22 +++++++++++-----------
 src/map/mob.c       |  8 ++++----
 src/map/pc.c        | 27 +++++++++++++++++++++------
 src/map/pc.h        | 15 ++-------------
 src/map/script.c    |  4 ++--
 src/map/status.c    |  8 ++++----
 7 files changed, 45 insertions(+), 41 deletions(-)

diff --git a/src/map/atcommand.c b/src/map/atcommand.c
index 5e50a06ee..215ecbc70 100644
--- a/src/map/atcommand.c
+++ b/src/map/atcommand.c
@@ -971,7 +971,7 @@ ACMD(jobchange) {
 		return true;
 	}
 
-	if (pcdb_checkid(job)) {
+	if (pc->db_checkid(job)) {
 		if (pc->jobchange(sd, job, upper) == 0)
 			clif->message(fd, msg_txt(12)); // Your job has been changed.
 		else {
diff --git a/src/map/clif.c b/src/map/clif.c
index 9309ad7b3..c20d6585e 100644
--- a/src/map/clif.c
+++ b/src/map/clif.c
@@ -258,13 +258,13 @@ uint32 clif_refresh_ip(void) {
 #if PACKETVER >= 20071106
 static inline unsigned char clif_bl_type(struct block_list *bl) {
 	switch (bl->type) {
-		case BL_PC:    return (disguised(bl) && !pcdb_checkid(status->get_viewdata(bl)->class_))? 0x1:0x0; //PC_TYPE
+		case BL_PC:    return (disguised(bl) && !pc->db_checkid(status->get_viewdata(bl)->class_))? 0x1:0x0; //PC_TYPE
 		case BL_ITEM:  return 0x2; //ITEM_TYPE
 		case BL_SKILL: return 0x3; //SKILL_TYPE
 		case BL_CHAT:  return 0x4; //UNKNOWN_TYPE
-		case BL_MOB:   return pcdb_checkid(status->get_viewdata(bl)->class_)?0x0:0x5; //NPC_MOB_TYPE
-		case BL_NPC:   return pcdb_checkid(status->get_viewdata(bl)->class_)?0x0:0x6; //NPC_EVT_TYPE
-		case BL_PET:   return pcdb_checkid(status->get_viewdata(bl)->class_)?0x0:0x7; //NPC_PET_TYPE
+		case BL_MOB:   return pc->db_checkid(status->get_viewdata(bl)->class_)?0x0:0x5; //NPC_MOB_TYPE
+		case BL_NPC:   return pc->db_checkid(status->get_viewdata(bl)->class_)?0x0:0x6; //NPC_EVT_TYPE
+		case BL_PET:   return pc->db_checkid(status->get_viewdata(bl)->class_)?0x0:0x7; //NPC_PET_TYPE
 		case BL_HOM:   return 0x8; //NPC_HOM_TYPE
 		case BL_MER:   return 0x9; //NPC_MERSOL_TYPE
 		case BL_ELEM:  return 0xa; //NPC_ELEMENTAL_TYPE
@@ -955,7 +955,7 @@ void clif_set_unit_idle(struct block_list* bl, struct map_session_data *tsd, enu
 	nullpo_retv(bl);
 	
 #if PACKETVER < 20091103
-	if( !pcdb_checkid(vd->class_) ) {
+	if( !pc->db_checkid(vd->class_) ) {
 		clif->set_unit_idle2(bl,tsd,target);
 		return;
 	}
@@ -1022,7 +1022,7 @@ void clif_set_unit_idle(struct block_list* bl, struct map_session_data *tsd, enu
 
 	if( disguised(bl) ) {
 #if PACKETVER >= 20091103
-		p.objecttype = pcdb_checkid(status->get_viewdata(bl)->class_) ? 0x0 : 0x5; //PC_TYPE : NPC_MOB_TYPE
+		p.objecttype = pc->db_checkid(status->get_viewdata(bl)->class_) ? 0x0 : 0x5; //PC_TYPE : NPC_MOB_TYPE
 		p.GID = -bl->id;
 #else
 		p.GID = -bl->id;
@@ -1086,7 +1086,7 @@ void clif_spawn_unit(struct block_list* bl, enum send_target target) {
 	nullpo_retv(bl);
 
 #if PACKETVER < 20091103
-	if( !pcdb_checkid(vd->class_) ) {
+	if( !pc->db_checkid(vd->class_) ) {
 		clif->spawn_unit2(bl,target);
 		return;
 	}
@@ -1152,7 +1152,7 @@ void clif_spawn_unit(struct block_list* bl, enum send_target target) {
 		if( sd->status.class_ != sd->disguise )
 			clif->send(&p,sizeof(p),bl,target);
 #if PACKETVER >= 20091103
-		p.objecttype = pcdb_checkid(status->get_viewdata(bl)->class_) ? 0x0 : 0x5; //PC_TYPE : NPC_MOB_TYPE
+		p.objecttype = pc->db_checkid(status->get_viewdata(bl)->class_) ? 0x0 : 0x5; //PC_TYPE : NPC_MOB_TYPE
 		p.GID = -bl->id;
 #else
 		p.GID = -bl->id;
@@ -1233,7 +1233,7 @@ void clif_set_unit_walking(struct block_list* bl, struct map_session_data *tsd,
 
 	if( disguised(bl) ) {
 #if PACKETVER >= 20091103
-		p.objecttype = pcdb_checkid(status->get_viewdata(bl)->class_) ? 0x0 : 0x5; //PC_TYPE : NPC_MOB_TYPE
+		p.objecttype = pc->db_checkid(status->get_viewdata(bl)->class_) ? 0x0 : 0x5; //PC_TYPE : NPC_MOB_TYPE
 		p.GID = -bl->id;
 #else
 		p.GID = -bl->id;
@@ -1250,7 +1250,7 @@ void clif_class_change(struct block_list *bl,int class_,int type)
 {
 	nullpo_retv(bl);
 
-	if(!pcdb_checkid(class_))
+	if(!pc->db_checkid(class_))
 	{// player classes yield missing sprites
 		unsigned char buf[16];
 		WBUFW(buf,0)=0x1b0;
@@ -8879,7 +8879,7 @@ void clif_feel_info(struct map_session_data* sd, unsigned char feel_level, unsig
  *------------------------------------------*/
 void clif_hate_info(struct map_session_data *sd, unsigned char hate_level,int class_, unsigned char type)
 {
-	if( pcdb_checkid(class_) ) {
+	if( pc->db_checkid(class_) ) {
 		clif->starskill(sd, pc->job_name(class_), class_, hate_level, type ? 10 : 11);
 	} else if( mob->db_checkid(class_) ) {
 		clif->starskill(sd, mob->db(class_)->jname, class_, hate_level, type ? 10 : 11);
diff --git a/src/map/mob.c b/src/map/mob.c
index ce5854928..30a359bc7 100644
--- a/src/map/mob.c
+++ b/src/map/mob.c
@@ -1610,7 +1610,7 @@ bool mob_ai_sub_hard(struct mob_data *md, int64 tick) {
 			memmove(&md->lootitem[0], &md->lootitem[1], (LOOTITEM_SIZE-1)*sizeof(md->lootitem[0]));
 			memcpy (&md->lootitem[LOOTITEM_SIZE-1], &fitem->item_data, sizeof(md->lootitem[0]));
 		}
-		if (pcdb_checkid(md->vd->class_)) {
+		if (pc->db_checkid(md->vd->class_)) {
 			//Give them walk act/delay to properly mimic players. [Skotlex]
 			clif->takeitem(&md->bl,tbl);
 			md->ud.canact_tick = tick + md->status.amotion;
@@ -2627,7 +2627,7 @@ int mob_dead(struct mob_data *md, struct block_list *src, int type) {
 
 	if( !rebirth ) {
 
-		if( pcdb_checkid(md->vd->class_) ) {//Player mobs are not removed automatically by the client.
+		if( pc->db_checkid(md->vd->class_) ) {//Player mobs are not removed automatically by the client.
 			/* first we set them dead, then we delay the out sight effect */
 			clif->clearunit_area(&md->bl,CLR_DEAD);
 			clif->clearunit_delayed(&md->bl, CLR_OUTSIGHT,tick+3000);
@@ -3670,7 +3670,7 @@ bool mob_parse_dbrow(char** str) {
 		ShowError("mob_parse_dbrow: Invalid monster ID %d, must be in range %d-%d.\n", class_, 1000, MAX_MOB_DB);
 		return false;
 	}
-	if (pcdb_checkid(class_)) {
+	if (pc->db_checkid(class_)) {
 		ShowError("mob_parse_dbrow: Invalid monster ID %d, reserved for player classes.\n", class_);
 		return false;
 	}
@@ -4030,7 +4030,7 @@ bool mob_readdb_mobavail(char* str[], int columns, int current)
 	mob->db_data[class_]->vd.class_=k;
 
 	//Player sprites
-	if(pcdb_checkid(k) && columns==12) {
+	if(pc->db_checkid(k) && columns==12) {
 		mob->db_data[class_]->vd.sex=atoi(str[2]);
 		mob->db_data[class_]->vd.hair_style=atoi(str[3]);
 		mob->db_data[class_]->vd.hair_color=atoi(str[4]);
diff --git a/src/map/pc.c b/src/map/pc.c
index b8902d753..09c406a7c 100644
--- a/src/map/pc.c
+++ b/src/map/pc.c
@@ -59,7 +59,7 @@ struct pc_interface pc_s;
 
 //Converts a class to its array index for CLASS_COUNT defined arrays.
 //Note that it does not do a validity check for speed purposes, where parsing
-//player input make sure to use a pcdb_checkid first!
+//player input make sure to use a pc->db_checkid first!
 int pc_class2idx(int class_) {
 	if (class_ >= JOB_NOVICE_HIGH)
 		return class_- JOB_NOVICE_HIGH+JOB_MAX_BASIC;
@@ -1222,7 +1222,7 @@ int pc_set_hate_mob(struct map_session_data *sd, int pos, struct block_list *bl)
 	}
 
 	class_ = status->get_class(bl);
-	if (!pcdb_checkid(class_)) {
+	if (!pc->db_checkid(class_)) {
 		unsigned int max_hp = status_get_max_hp(bl);
 		if ((pos == 1 && max_hp < 6000) || (pos == 2 && max_hp < 20000))
 			return 0;
@@ -10307,7 +10307,7 @@ int pc_readdb(void) {
 		if (job_count < 1)
 			continue;
 		job_id = jobs[0];
-		if (!pcdb_checkid(job_id)) {
+		if (!pc->db_checkid(job_id)) {
 			ShowError("pc_readdb: Invalid job ID %d.\n", job_id);
 			continue;
 		}
@@ -10343,7 +10343,7 @@ int pc_readdb(void) {
 		//ShowDebug("%s - Class %d: %d\n", type?"Job":"Base", job_id, pc->max_level[job][type]);
 		for (i = 1; i < job_count; i++) {
 			job_id = jobs[i];
-			if (!pcdb_checkid(job_id)) {
+			if (!pc->db_checkid(job_id)) {
 				ShowError("pc_readdb: Invalid job ID %d.\n", job_id);
 				continue;
 			}
@@ -10355,7 +10355,7 @@ int pc_readdb(void) {
 	}
 	fclose(fp);
 	for (i = 0; i < JOB_MAX; i++) {
-		if (!pcdb_checkid(i)) continue;
+		if (!pc->db_checkid(i)) continue;
 		if (i == JOB_WEDDING || i == JOB_XMAS || i == JOB_SUMMER)
 			continue; //Classes that do not need exp tables.
 		j = pc->class2idx(i);
@@ -10846,6 +10846,20 @@ void pc_autotrade_populate(struct map_session_data *sd) {
 	
 	idb_remove(pc->at_db, sd->status.char_id);
 }
+
+//Checks if the given class value corresponds to a player class. [Skotlex]
+//JOB_NOVICE isn't checked for class_ is supposed to be unsigned
+bool pc_db_checkid(unsigned int class_)
+{
+	return class_ < JOB_MAX_BASIC
+		|| (class_ >= JOB_NOVICE_HIGH    && class_ <= JOB_DARK_COLLECTOR )
+		|| (class_ >= JOB_RUNE_KNIGHT    && class_ <= JOB_MECHANIC_T2    )
+		|| (class_ >= JOB_BABY_RUNE      && class_ <= JOB_BABY_MECHANIC2 )
+		|| (class_ >= JOB_SUPER_NOVICE_E && class_ <= JOB_SUPER_BABY_E   )
+		|| (class_ >= JOB_KAGEROU        && class_ <= JOB_OBORO          )
+		|| (class_ >= JOB_REBELLION      && class_ <  JOB_MAX            );
+}
+
 void do_final_pc(void) {
 	
 	db_destroy(pc->itemcd_db);
@@ -11201,7 +11215,8 @@ void pc_defaults(void) {
 	pc->expiration_timer = pc_expiration_timer;
 	pc->global_expiration_timer = pc_global_expiration_timer;
 	pc->expire_check = pc_expire_check;
-	
+	pc->db_checkid = pc_db_checkid;
+
 	/**
 	 * Autotrade persistency [Ind/Hercules <3]
 	 **/
diff --git a/src/map/pc.h b/src/map/pc.h
index 8472eb34e..1f5e26270 100644
--- a/src/map/pc.h
+++ b/src/map/pc.h
@@ -618,19 +618,6 @@ struct map_session_data {
 //Weapon check considering dual wielding.
 #define pc_check_weapontype(sd, type) ((type)&((sd)->status.weapon < MAX_WEAPON_TYPE? \
 	1<<(sd)->status.weapon:(1<<(sd)->weapontype1)|(1<<(sd)->weapontype2)|(1<<(sd)->status.weapon)))
-//Checks if the given class value corresponds to a player class. [Skotlex]
-//JOB_NOVICE isn't checked for class_ is supposed to be unsigned
-#define pcdb_checkid_sub(class_) \
-( \
-    ( (class_) <  JOB_MAX_BASIC ) \
- || ( (class_) >= JOB_NOVICE_HIGH    && (class_) <= JOB_DARK_COLLECTOR ) \
- || ( (class_) >= JOB_RUNE_KNIGHT    && (class_) <= JOB_MECHANIC_T2    ) \
- || ( (class_) >= JOB_BABY_RUNE      && (class_) <= JOB_BABY_MECHANIC2 ) \
- || ( (class_) >= JOB_SUPER_NOVICE_E && (class_) <= JOB_SUPER_BABY_E   ) \
- || ( (class_) >= JOB_KAGEROU        && (class_) <= JOB_OBORO          ) \
- || ( (class_) >= JOB_REBELLION      && (class_) <  JOB_MAX            ) \
-)
-#define pcdb_checkid(class_) pcdb_checkid_sub((unsigned int)(class_))
 
 // clientside display macros (values to the left/right of the "+")
 #ifdef RENEWAL
@@ -1023,6 +1010,8 @@ struct pc_interface {
 	int (*global_expiration_timer) (int tid, int64 tick, int id, intptr_t data);
 	void (*expire_check) (struct map_session_data *sd);
 
+	bool (*db_checkid) (unsigned int class_);
+
 	/**
 	 * Autotrade persistency [Ind/Hercules <3]
 	 **/
diff --git a/src/map/script.c b/src/map/script.c
index aca4650c5..612bfa69e 100644
--- a/src/map/script.c
+++ b/src/map/script.c
@@ -5548,7 +5548,7 @@ BUILDIN(jobchange)
 	if( script_hasdata(st,3) )
 		upper=script_getnum(st,3);
 
-	if (pcdb_checkid(job))
+	if (pc->db_checkid(job))
 	{
 		TBL_PC* sd;
 
@@ -16487,7 +16487,7 @@ BUILDIN(questinfo)
 	if(script_hasdata(st, 5)) {
 		job = script_getnum(st, 5);
 
-		if (!pcdb_checkid(job))
+		if (!pc->db_checkid(job))
 			ShowError("buildin_questinfo: Nonexistant Job Class.\n");
 		else {
 			qi.hasJob = true;
diff --git a/src/map/status.c b/src/map/status.c
index 7b4e6f274..9a63e32a5 100644
--- a/src/map/status.c
+++ b/src/map/status.c
@@ -6218,7 +6218,7 @@ void status_set_viewdata(struct block_list *bl, int class_)
 	case BL_PC:
 		{
 			TBL_PC* sd = (TBL_PC*)bl;
-			if (pcdb_checkid(class_)) {
+			if (pc->db_checkid(class_)) {
 				if (pc_isridingpeco(sd)) {
 					switch (class_) {
 						//Adapt class to a Mounted one.
@@ -6285,7 +6285,7 @@ void status_set_viewdata(struct block_list *bl, int class_)
 			TBL_PET* pd = (TBL_PET*)bl;
 			if (vd) {
 				memcpy(&pd->vd, vd, sizeof(struct view_data));
-				if (!pcdb_checkid(vd->class_)) {
+				if (!pc->db_checkid(vd->class_)) {
 					pd->vd.hair_style = battle_config.pet_hair_style;
 					if(pd->pet.equip) {
 						pd->vd.head_bottom = itemdb_viewid(pd->pet.equip);
@@ -12046,7 +12046,7 @@ bool status_readdb_job1(char* fields[], int columns, int current)
 
 	class_ = atoi(fields[0]);
 
-	if(!pcdb_checkid(class_))
+	if(!pc->db_checkid(class_))
 	{
 		ShowWarning("status_readdb_job1: Invalid job class %d specified.\n", class_);
 		return false;
@@ -12074,7 +12074,7 @@ bool status_readdb_job2(char* fields[], int columns, int current)
 
 	class_ = atoi(fields[0]);
 
-	if(!pcdb_checkid(class_))
+	if(!pc->db_checkid(class_))
 	{
 		ShowWarning("status_readdb_job2: Invalid job class %d specified.\n", class_);
 		return false;
-- 
cgit v1.2.3-70-g09d2