summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorultramage <ultramage@54d463be-8e91-2dee-dedb-b68131a5f0ec>2007-05-19 11:19:35 +0000
committerultramage <ultramage@54d463be-8e91-2dee-dedb-b68131a5f0ec>2007-05-19 11:19:35 +0000
commit0b2f57dd4dd8e3ee2a15f9fb121313f45ebc9926 (patch)
tree951a1d3b39b8bd5bad79cd890a685ea7e85ab041 /src
parentc96e27b729adf2b8244f6985371b8f0dd6547672 (diff)
downloadhercules-0b2f57dd4dd8e3ee2a15f9fb121313f45ebc9926.tar.gz
hercules-0b2f57dd4dd8e3ee2a15f9fb121313f45ebc9926.tar.bz2
hercules-0b2f57dd4dd8e3ee2a15f9fb121313f45ebc9926.tar.xz
hercules-0b2f57dd4dd8e3ee2a15f9fb121313f45ebc9926.zip
Removed the wtf-y mmo_char_fromsql_short() from r2527
git-svn-id: https://rathena.svn.sourceforge.net/svnroot/rathena/trunk@10578 54d463be-8e91-2dee-dedb-b68131a5f0ec
Diffstat (limited to 'src')
-rw-r--r--src/char_sql/char.c294
-rw-r--r--src/common/utils.h3
-rw-r--r--src/map/map.h2
3 files changed, 87 insertions, 212 deletions
diff --git a/src/char_sql/char.c b/src/char_sql/char.c
index d1aedd37b..213091224 100644
--- a/src/char_sql/char.c
+++ b/src/char_sql/char.c
@@ -870,108 +870,100 @@ int memitemdata_to_sql(struct itemtmp mapitem[], int count, int char_id, int tab
}
return 0;
}
+
#ifndef TXT_SQL_CONVERT
//=====================================================================================================
-int mmo_char_fromsql(int char_id, struct mmo_charstatus *p){
+int mmo_char_fromsql(int char_id, struct mmo_charstatus* p, bool load_everything)
+{
int i,j, n;
- double exp;
- char t_msg[128];
- char *str_p = tmp_sql;
- struct mmo_charstatus *cp;
+ char t_msg[128] = "";
+ char* str_p = tmp_sql;
+ struct mmo_charstatus* cp;
memset(p, 0, sizeof(struct mmo_charstatus));
- t_msg[0]= '\0';
p->char_id = char_id;
- if (save_log)
- ShowInfo("Char load request (%d)\n", char_id);
- //`char`( `char_id`,`account_id`,`char_num`,`name`,`class`,`base_level`,`job_level`,`base_exp`,`job_exp`,`zeny`, //9
- //`str`,`agi`,`vit`,`int`,`dex`,`luk`, //15
- //`max_hp`,`hp`,`max_sp`,`sp`,`status_point`,`skill_point`, //21
- //`option`,`karma`,`manner`,`party_id`,`guild_id`,`pet_id`, //27
- //`hair`,`hair_color`,`clothes_color`,`weapon`,`shield`,`head_top`,`head_mid`,`head_bottom`, //35
- //`last_map`,`last_x`,`last_y`,`save_map`,`save_x`,`save_y`)
- //splite 2 parts. cause veeeery long SQL syntax
-
- sprintf(tmp_sql, "SELECT `char_id`,`account_id`,`char_num`,`name`,`class`,`base_level`,`job_level`,`base_exp`,`job_exp`,`zeny`,"
- "`str`,`agi`,`vit`,`int`,`dex`,`luk`, `max_hp`,`hp`,`max_sp`,`sp`,`status_point`,`skill_point` FROM `%s` WHERE `char_id` = '%d'",char_db, char_id); // TBR
+ if (save_log) ShowInfo("Char load request (%d)\n", char_id);
+
+ // read char data
+ sprintf(tmp_sql, "SELECT "
+ "`char_id`,`account_id`,`char_num`,`name`,`class`,`base_level`,`job_level`,`base_exp`,`job_exp`,`zeny`,"
+ "`str`,`agi`,`vit`,`int`,`dex`,`luk`,`max_hp`,`hp`,`max_sp`,`sp`,"
+ "`status_point`,`skill_point`,`option`,`karma`,`manner`,`party_id`,`guild_id`,`pet_id`,`homun_id`,`hair`,"
+ "`hair_color`,`clothes_color`,`weapon`,`shield`,`head_top`,`head_mid`,`head_bottom`,`last_map`,`last_x`,`last_y`,"
+ "`save_map`,`save_x`,`save_y`,`partner_id`,`father`,`mother`,`child`,`fame`"
+ " FROM `%s` WHERE `char_id` = '%d'", char_db, char_id);
if (mysql_query(&mysql_handle, tmp_sql)) {
ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ return 0;
}
sql_res = mysql_store_result(&mysql_handle);
+ if (!sql_res) {
+ ShowError("Load char failed (%d - table %s).\n", char_id, char_db);
+ return 0;
+ }
- if (sql_res) {
- sql_row = mysql_fetch_row(sql_res);
- if (!sql_row)
- { //Just how does this happens? [Skotlex]
- ShowError("Requested non-existant character id: %d!\n", char_id);
- return 0;
- }
-
- p->char_id = char_id;
- p->account_id = atoi(sql_row[1]);
- p->char_num = atoi(sql_row[2]);
- strcpy(p->name, sql_row[3]);
- p->class_ = atoi(sql_row[4]);
- p->base_level = atoi(sql_row[5]);
- p->job_level = atoi(sql_row[6]);
- exp = atof(sql_row[7]);
- p->base_exp = exp<0?0:(exp>UINT_MAX?UINT_MAX:(unsigned int)exp);
- exp = atof(sql_row[8]);
- p->job_exp = exp<0?0:(exp>UINT_MAX?UINT_MAX:(unsigned int)exp);
- p->zeny = atoi(sql_row[9]);
- p->str = atoi(sql_row[10]);
- p->agi = atoi(sql_row[11]);
- p->vit = atoi(sql_row[12]);
- p->int_ = atoi(sql_row[13]);
- p->dex = atoi(sql_row[14]);
- p->luk = atoi(sql_row[15]);
- p->max_hp = atoi(sql_row[16]);
- p->hp = atoi(sql_row[17]);
- p->max_sp = atoi(sql_row[18]);
- p->sp = atoi(sql_row[19]);
- p->status_point = atoi(sql_row[20]) > USHRT_MAX ? USHRT_MAX : atoi(sql_row[20]);
- p->skill_point = atoi(sql_row[21]) > USHRT_MAX ? USHRT_MAX : atoi(sql_row[21]);
- //free mysql result.
+ sql_row = mysql_fetch_row(sql_res);
+ if (!sql_row) { //Just how does this happens? [Skotlex]
+ ShowError("Requested non-existant character id: %d!\n", char_id);
mysql_free_result(sql_res);
- strcat (t_msg, " status");
- } else
- ShowError("Load char failed (%d - table %s).\n", char_id, char_db); //Error?! ERRRRRR WHAT THAT SAY!?
-
- sprintf(tmp_sql, "SELECT `option`,`karma`,`manner`,`party_id`,`guild_id`,`pet_id`,`hair`,`hair_color`,"
- "`clothes_color`,`weapon`,`shield`,`head_top`,`head_mid`,`head_bottom`,"
- "`last_map`,`last_x`,`last_y`,`save_map`,`save_x`,`save_y`, `partner_id`, `father`, `mother`, `child`, `fame`, `homun_id`" //[orn] homun_id
- "FROM `%s` WHERE `char_id` = '%d'",char_db, char_id); // TBR
- if (mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ return 0;
}
- sql_res = mysql_store_result(&mysql_handle);
- sql_row = sql_res?mysql_fetch_row(sql_res):NULL;
- if (sql_row) {
-
- p->option = atoi(sql_row[0]); p->karma = atoi(sql_row[1]); p->manner = atoi(sql_row[2]);
- p->party_id = atoi(sql_row[3]); p->guild_id = atoi(sql_row[4]); p->pet_id = atoi(sql_row[5]);
-
- p->hair = atoi(sql_row[6]); p->hair_color = atoi(sql_row[7]); p->clothes_color = atoi(sql_row[8]);
- p->weapon = atoi(sql_row[9]); p->shield = atoi(sql_row[10]);
- p->head_top = atoi(sql_row[11]); p->head_mid = atoi(sql_row[12]); p->head_bottom = atoi(sql_row[13]);
- p->last_point.map = mapindex_name2id(sql_row[14]); p->last_point.x = atoi(sql_row[15]); p->last_point.y = atoi(sql_row[16]);
- p->save_point.map = mapindex_name2id(sql_row[17]); p->save_point.x = atoi(sql_row[18]); p->save_point.y = atoi(sql_row[19]);
- p->partner_id = atoi(sql_row[20]); p->father = atoi(sql_row[21]); p->mother = atoi(sql_row[22]); p->child = atoi(sql_row[23]);
- p->fame = atoi(sql_row[24]);
- p->hom_id = atoi(sql_row[25]); //[orn] homunculus id
-
- strcat (t_msg, " status2");
- } else
- ShowError("Char load failed (%d - table %s)\n", char_id, char_db); //Error?! ERRRRRR WHAT THAT SAY!?
+ p->char_id = char_id;
+ p->account_id = atoi(sql_row[1]);
+ p->char_num = atoi(sql_row[2]);
+ strncpy(p->name, sql_row[3], NAME_LENGTH-1);
+ p->class_ = atoi(sql_row[4]);
+ p->base_level = atoi(sql_row[5]);
+ p->job_level = atoi(sql_row[6]);
+ p->base_exp = (unsigned int)cap_value(atof(sql_row[7]), 0, UINT_MAX);
+ p->job_exp = (unsigned int)cap_value(atof(sql_row[8]), 0, UINT_MAX);
+ p->zeny = atoi(sql_row[9]);
+ p->str = atoi(sql_row[10]);
+ p->agi = atoi(sql_row[11]);
+ p->vit = atoi(sql_row[12]);
+ p->int_ = atoi(sql_row[13]);
+ p->dex = atoi(sql_row[14]);
+ p->luk = atoi(sql_row[15]);
+ p->max_hp = atoi(sql_row[16]);
+ p->hp = atoi(sql_row[17]);
+ p->max_sp = atoi(sql_row[18]);
+ p->sp = atoi(sql_row[19]);
+ p->status_point = (unsigned short)cap_value(atoi(sql_row[20]), 0, USHRT_MAX);
+ p->skill_point = (unsigned short)cap_value(atoi(sql_row[21]), 0, USHRT_MAX);
+ p->option = atoi(sql_row[22]);
+ p->karma = atoi(sql_row[23]);
+ p->manner = atoi(sql_row[24]);
+ p->party_id = atoi(sql_row[25]);
+ p->guild_id = atoi(sql_row[26]);
+ p->pet_id = atoi(sql_row[27]);
+ p->hom_id = atoi(sql_row[28]);
+ p->hair = atoi(sql_row[29]);
+ p->hair_color = atoi(sql_row[30]);
+ p->clothes_color = atoi(sql_row[31]);
+ p->weapon = atoi(sql_row[32]);
+ p->shield = atoi(sql_row[33]);
+ p->head_top = atoi(sql_row[34]);
+ p->head_mid = atoi(sql_row[35]);
+ p->head_bottom = atoi(sql_row[36]);
+ p->last_point.map = mapindex_name2id(sql_row[37]); p->last_point.x = atoi(sql_row[38]); p->last_point.y = atoi(sql_row[39]);
+ p->save_point.map = mapindex_name2id(sql_row[40]); p->save_point.x = atoi(sql_row[41]); p->save_point.y = atoi(sql_row[42]);
+ p->partner_id = atoi(sql_row[43]);
+ p->father = atoi(sql_row[44]);
+ p->mother = atoi(sql_row[45]);
+ p->child = atoi(sql_row[46]);
+ p->fame = atoi(sql_row[47]);
+
//free mysql result.
- if (sql_res)
- mysql_free_result(sql_res);
+ mysql_free_result(sql_res);
+ strcat (t_msg, " status");
+
+ if (!load_everything) // For quick selection of data when displaying the char menu
+ return 1;
//read memo data
//`memo` (`memo_id`,`char_id`,`map`,`x`,`y`)
@@ -987,7 +979,6 @@ int mmo_char_fromsql(int char_id, struct mmo_charstatus *p){
p->memo_point[i].map = mapindex_name2id(sql_row[0]);
p->memo_point[i].x=atoi(sql_row[1]);
p->memo_point[i].y=atoi(sql_row[2]);
- //i ++;
}
mysql_free_result(sql_res);
strcat (t_msg, " memo");
@@ -1023,14 +1014,11 @@ int mmo_char_fromsql(int char_id, struct mmo_charstatus *p){
strcat (t_msg, " inventory");
}
- //read cart.
+ //read cart
//`cart_inventory` (`id`,`char_id`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`, `card0`, `card1`, `card2`, `card3`)
str_p = tmp_sql;
str_p += sprintf(str_p, "SELECT `id`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`");
-
- for (j=0; j<MAX_SLOTS; j++)
- str_p += sprintf(str_p, ", `card%d`", j);
-
+ for (j = 0; j < MAX_SLOTS; j++) str_p += sprintf(str_p, ", `card%d`", j);
str_p += sprintf(str_p, " FROM `%s` WHERE `char_id`='%d'", cart_db, char_id);
if (mysql_query(&mysql_handle, tmp_sql)) {
@@ -1071,28 +1059,9 @@ int mmo_char_fromsql(int char_id, struct mmo_charstatus *p){
mysql_free_result(sql_res);
strcat (t_msg, " skills");
}
-/* Global-reg loading is now handled by the inter-server.
- //global_reg
- //`global_reg_value` (`char_id`, `str`, `value`)
- sprintf(tmp_sql, "SELECT `str`, `value` FROM `%s` WHERE `type`=3 AND `char_id`='%d'",reg_db, char_id); // TBR
- if (mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- i = 0;
- sql_res = mysql_store_result(&mysql_handle);
- if (sql_res) {
- for(i=0;(sql_row = mysql_fetch_row(sql_res));i++){
- strcpy (p->global_reg[i].str, sql_row[0]);
- strcpy (p->global_reg[i].value, sql_row[1]);
- }
- mysql_free_result(sql_res);
- strcat (t_msg, " reg_values");
- }
- p->global_reg_num=i;
-*/
- //Shamelessly stolen from its_sparky (ie: thanks) and then assimilated by [Skotlex]
+
//Friend list
+ //Shamelessly stolen from its_sparky (ie: thanks) and then assimilated by [Skotlex]
sprintf(tmp_sql, "SELECT f.friend_account, f.friend_id, c.name FROM `%s` f LEFT JOIN `%s` c ON f.friend_account=c.account_id AND f.friend_id=c.char_id WHERE f.char_id='%d'", friend_db, char_db, char_id);
if(mysql_query(&mysql_handle, tmp_sql)){
@@ -1117,108 +1086,13 @@ int mmo_char_fromsql(int char_id, struct mmo_charstatus *p){
strcat (t_msg, " friends");
}
- if (save_log)
- ShowInfo("Loaded char (%d - %s): %s\n", char_id, p->name, t_msg); //ok. all data load successfuly!
+ if (save_log) ShowInfo("Loaded char (%d - %s): %s\n", char_id, p->name, t_msg); //ok. all data load successfuly!
cp = idb_ensure(char_db_, char_id, create_charstatus);
memcpy(cp, p, sizeof(struct mmo_charstatus));
return 1;
}
-// For quick selection of data when displaying the char menu. [Skotlex]
-//
-int mmo_char_fromsql_short(int char_id, struct mmo_charstatus *p){
- char t_msg[128];
- double exp;
- memset(p, 0, sizeof(struct mmo_charstatus));
- t_msg[0]= '\0';
-
- p->char_id = char_id;
-// ShowInfo("Quick Char load request (%d)\n", char_id);
- //`char`( `char_id`,`account_id`,`char_num`,`name`,`class`,`base_level`,`job_level`,`base_exp`,`job_exp`,`zeny`, //9
- //`str`,`agi`,`vit`,`int`,`dex`,`luk`, //15
- //`max_hp`,`hp`,`max_sp`,`sp`,`status_point`,`skill_point`, //21
- //`option`,`karma`,`manner`,`party_id`,`guild_id`,`pet_id`, //27
- //`hair`,`hair_color`,`clothes_color`,`weapon`,`shield`,`head_top`,`head_mid`,`head_bottom`, //35
- //`last_map`,`last_x`,`last_y`,`save_map`,`save_x`,`save_y`)
- //splite 2 parts. cause veeeery long SQL syntax
-
- sprintf(tmp_sql, "SELECT `char_id`,`account_id`,`char_num`,`name`,`class`,`base_level`,`job_level`,`base_exp`,`job_exp`,`zeny`,"
- "`str`,`agi`,`vit`,`int`,`dex`,`luk`, `max_hp`,`hp`,`max_sp`,`sp`,`status_point`,`skill_point` FROM `%s` WHERE `char_id` = '%d'",char_db, char_id); // TBR
-
- if (mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
-
- sql_res = mysql_store_result(&mysql_handle);
-
- if (sql_res) {
- sql_row = mysql_fetch_row(sql_res);
- if (!sql_row)
- { //Just how does this happens? [Skotlex]
- ShowError("Requested non-existant character id: %d!\n", char_id);
- mysql_free_result(sql_res);
- return 0;
- }
- p->char_id = char_id;
- p->account_id = atoi(sql_row[1]);
- p->char_num = atoi(sql_row[2]);
- strcpy(p->name, sql_row[3]);
- p->class_ = atoi(sql_row[4]);
- p->base_level = atoi(sql_row[5]);
- p->job_level = atoi(sql_row[6]);
- exp = atof(sql_row[7]);
- p->base_exp = exp<0?0:(exp>UINT_MAX?UINT_MAX:(unsigned int)exp);
- exp = atof(sql_row[8]);
- p->job_exp = exp<0?0:(exp>UINT_MAX?UINT_MAX:(unsigned int)exp);
- p->zeny = atoi(sql_row[9]);
- p->str = atoi(sql_row[10]);
- p->agi = atoi(sql_row[11]);
- p->vit = atoi(sql_row[12]);
- p->int_ = atoi(sql_row[13]);
- p->dex = atoi(sql_row[14]);
- p->luk = atoi(sql_row[15]);
- p->max_hp = atoi(sql_row[16]);
- p->hp = atoi(sql_row[17]);
- p->max_sp = atoi(sql_row[18]);
- p->sp = atoi(sql_row[19]);
- p->status_point = atoi(sql_row[20]) > USHRT_MAX ? USHRT_MAX : atoi(sql_row[20]);
- p->skill_point = atoi(sql_row[21]) > USHRT_MAX ? USHRT_MAX : atoi(sql_row[21]);
- //free mysql result.
- mysql_free_result(sql_res);
- strcat (t_msg, " status");
- } else
- ShowError("Load char failed (%d - table %s).\n", char_id, char_db); //Error?! ERRRRRR WHAT THAT SAY!?
-
- sprintf(tmp_sql, "SELECT `option`,`karma`,`manner`,`hair`,`hair_color`,"
- "`clothes_color`,`weapon`,`shield`,`head_top`,`head_mid`,`head_bottom`"
- "FROM `%s` WHERE `char_id` = '%d'",char_db, char_id); // TBR
- if (mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
-
- sql_res = mysql_store_result(&mysql_handle);
- sql_row = sql_res?mysql_fetch_row(sql_res):NULL;
- if (sql_row) {
-
- p->option = atoi(sql_row[0]); p->karma = atoi(sql_row[1]); p->manner = atoi(sql_row[2]);
- p->hair = atoi(sql_row[3]); p->hair_color = atoi(sql_row[4]); p->clothes_color = atoi(sql_row[5]);
- p->weapon = atoi(sql_row[6]); p->shield = atoi(sql_row[7]);
- p->head_top = atoi(sql_row[8]); p->head_mid = atoi(sql_row[9]); p->head_bottom = atoi(sql_row[10]);
-
- strcat (t_msg, " status2");
- } else
- ShowError("Char load failed (%d - table %s)\n", char_id, char_db); //Error?! ERRRRRR WHAT THAT SAY!?
- //free mysql result.
- if (sql_res)
- mysql_free_result(sql_res);
-// if (save_log) //Too much spam :/
-// ShowInfo("Quick Loaded char (%d - %s): %s\n", char_id, p->name, t_msg); //ok. all data load successfuly!
-
- return 1;
-}
//==========================================================================================================
int mmo_char_sql_init(void) {
ShowInfo("Begin Initializing.......\n");
@@ -1787,7 +1661,7 @@ int mmo_char_send006b(int fd, struct char_session_data *sd) {
memset(WFIFOP(fd,4), 0, 20);// unknown bytes
for(i = 0; i < found_num; i++)
{
- mmo_char_fromsql_short(sd->found_char[i], &char_dat);
+ mmo_char_fromsql(sd->found_char[i], &char_dat, false);
j += mmo_char_tobuf(WFIFOP(fd,j), &char_dat);
}
WFIFOW(fd,2) = j;// packet len
@@ -2737,7 +2611,7 @@ int parse_frommap(int fd)
char_data = uidb_get(char_db_,RFIFOL(fd,14));
if (char_data == NULL)
{ //Really shouldn't happen.
- mmo_char_fromsql(RFIFOL(fd,14), &char_dat);
+ mmo_char_fromsql(RFIFOL(fd,14), &char_dat, true);
char_data = &char_dat;
}
//Tell the new map server about this player using Kevin's new auth packet. [Skotlex]
@@ -3271,7 +3145,7 @@ int parse_char(int fd)
{
int char_id = atoi(sql_row[0]);
mysql_free_result(sql_res); //Free'd as soon as possible
- mmo_char_fromsql(char_id, &char_dat);
+ mmo_char_fromsql(char_id, &char_dat, true);
char_dat.sex = sd->sex;
} else {
mysql_free_result(sql_res);
@@ -3419,7 +3293,7 @@ int parse_char(int fd)
int len;
WFIFOHEAD(fd,110);
WFIFOW(fd,0) = 0x6d;
- mmo_char_fromsql_short(i, &char_dat); //Only the short data is needed.
+ mmo_char_fromsql(i, &char_dat, false); //Only the short data is needed.
len = 2 + mmo_char_tobuf(WFIFOP(fd,2), &char_dat);
WFIFOSET(fd,len);
diff --git a/src/common/utils.h b/src/common/utils.h
index ec9cb5416..ba02fc5f1 100644
--- a/src/common/utils.h
+++ b/src/common/utils.h
@@ -31,6 +31,9 @@ void StringBuf_Free(struct StringBuf *);
void findfile(const char *p, const char *pat, void (func)(const char*));
+//Caps values to min/max
+#define cap_value(a, min, max) ((a >= max) ? max : (a <= min) ? min : a)
+
//////////////////////////////////////////////////////////////////////////
// byte word dword access [Shinomori]
//////////////////////////////////////////////////////////////////////////
diff --git a/src/map/map.h b/src/map/map.h
index d7ebb3d6c..4ff29327b 100644
--- a/src/map/map.h
+++ b/src/map/map.h
@@ -180,8 +180,6 @@ enum {
#define map_flag_gvg(m) (map[m].flag.gvg || (agit_flag && map[m].flag.gvg_castle))
//Specifies if the map is tagged as GvG/WoE (regardless of agit_flag status)
#define map_flag_gvg2(m) (map[m].flag.gvg || map[m].flag.gvg_castle)
-//Caps values to min/max
-#define cap_value(a, min, max) (a>=max?max:a<=min?min:a)
//This stackable implementation does not means a BL can be more than one type at a time, but it's
//meant to make it easier to check for multiple types at a time on invocations such as