summaryrefslogtreecommitdiff
path: root/src/char/char.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/char/char.cpp')
-rw-r--r--src/char/char.cpp46
1 files changed, 34 insertions, 12 deletions
diff --git a/src/char/char.cpp b/src/char/char.cpp
index 7ad6dff..0958c5e 100644
--- a/src/char/char.cpp
+++ b/src/char/char.cpp
@@ -562,7 +562,7 @@ void mmo_char_sync_timer(TimerData *, tick_t)
// Function to create a new character
//-----------------------------------
static
-CharPair *make_new_char(Session *s, CharName name, const Stats6& stats, uint8_t slot, uint16_t hair_color, uint16_t hair_style)
+CharPair *make_new_char(Session *s, CharName name, const Stats6& stats, uint8_t slot, uint16_t hair_color, uint16_t hair_style, short& error_code)
{
// ugh
char_session_data *sd = static_cast<char_session_data *>(s->session_data.get());
@@ -572,6 +572,7 @@ CharPair *make_new_char(Session *s, CharName name, const Stats6& stats, uint8_t
{
CHAR_LOG("Make new char error (control char received in the name): (connection #%d, account: %d).\n"_fmt,
s, sd->account_id);
+ error_code = 0x02;
return nullptr;
}
@@ -580,14 +581,16 @@ CharPair *make_new_char(Session *s, CharName name, const Stats6& stats, uint8_t
{
CHAR_LOG("Make new char error (leading/trailing whitespace): (connection #%d, account: %d, name: '%s'.\n"_fmt,
s, sd->account_id, name);
+ error_code = 0x02;
return nullptr;
}
// check lenght of character name
- if (name.to__actual().size() < 4)
+ if (name.to__actual().size() < char_conf.min_name_length)
{
CHAR_LOG("Make new char error (character name too small): (connection #%d, account: %d, name: '%s').\n"_fmt,
s, sd->account_id, name);
+ error_code = 0x02;
return nullptr;
}
@@ -600,6 +603,7 @@ CharPair *make_new_char(Session *s, CharName name, const Stats6& stats, uint8_t
{
CHAR_LOG("Make new char error (invalid letter in the name): (connection #%d, account: %d), name: %s, invalid letter: %c.\n"_fmt,
s, sd->account_id, name, c);
+ error_code = 0x02;
return nullptr;
}
}
@@ -607,16 +611,29 @@ CharPair *make_new_char(Session *s, CharName name, const Stats6& stats, uint8_t
// TODO this comment is obsolete
// this is why it needs to be unsigned
- if (stats.str + stats.agi + stats.vit + stats.int_ + stats.dex + stats.luk != 5 * 6 || // stats
- slot >= 9 ||
- hair_style >= 20 ||
- hair_color >= 12)
+ if (stats.str + stats.agi + stats.vit + stats.int_ + stats.dex + stats.luk != char_conf.total_stat_sum)
{
- CHAR_LOG("Make new char error (invalid values): (connection #%d, account: %d) slot %d, name: %s, stats: %d+%d+%d+%d+%d+%d=%d, hair: %d, hair color: %d\n"_fmt,
+ CHAR_LOG("Make new char error (invalid stats): (connection #%d, account: %d) slot %d, name: %s, stats: %d+%d+%d+%d+%d+%d=%d\n"_fmt,
s, sd->account_id, slot, name,
stats.str, stats.agi, stats.vit, stats.int_, stats.dex, stats.luk,
- stats.str + stats.agi + stats.vit + stats.int_ + stats.dex + stats.luk,
- hair_style, hair_color);
+ stats.str + stats.agi + stats.vit + stats.int_ + stats.dex + stats.luk);
+ error_code = 0x03;
+ return nullptr;
+ }
+
+ if (slot >= char_conf.char_slots)
+ {
+ CHAR_LOG("Make new char error (invalid slot): (connection #%d, account: %d) slot %d, name: %s\n"_fmt,
+ s, sd->account_id, slot, name);
+ error_code = 0x05;
+ return nullptr;
+ }
+
+ if (hair_style > char_conf.max_hair_style || hair_color > char_conf.max_hair_color)
+ {
+ CHAR_LOG("Make new char error (invalid hair): (connection #%d, account: %d) slot %d, name: %s, hair: %d, hair color: %d\n"_fmt,
+ s, sd->account_id, slot, name, hair_style, hair_color);
+ error_code = 0x04;
return nullptr;
}
@@ -624,13 +641,14 @@ CharPair *make_new_char(Session *s, CharName name, const Stats6& stats, uint8_t
for (int i = 0; i < 6; i++)
{
uint8_t statsi = reinterpret_cast<const uint8_t *>(&stats)[i];
- if (statsi < 1 || statsi > 9)
+ if (statsi < char_conf.min_stat_value || statsi > char_conf.max_stat_value)
{
CHAR_LOG("Make new char error (invalid stat value: not between 1 to 9): (connection #%d, account: %d) slot %d, name: %s, stats: %d+%d+%d+%d+%d+%d=%d, hair: %d, hair color: %d\n"_fmt,
s, sd->account_id, slot, name,
stats.str, stats.agi, stats.vit, stats.int_, stats.dex, stats.luk,
stats.str + stats.agi + stats.vit + stats.int_ + stats.dex + stats.luk,
hair_style, hair_color);
+ error_code = 0x03;
return nullptr;
}
}
@@ -644,6 +662,7 @@ CharPair *make_new_char(Session *s, CharName name, const Stats6& stats, uint8_t
stats.str, stats.agi, stats.vit, stats.int_, stats.dex, stats.luk,
stats.str + stats.agi + stats.vit + stats.int_ + stats.dex + stats.luk,
hair_style, hair_color);
+ error_code = 0x01;
return nullptr;
}
if (cd.key.account_id == sd->account_id
@@ -654,6 +673,7 @@ CharPair *make_new_char(Session *s, CharName name, const Stats6& stats, uint8_t
stats.str, stats.agi, stats.vit, stats.int_, stats.dex, stats.luk,
stats.str + stats.agi + stats.vit + stats.int_ + stats.dex + stats.luk,
hair_style, hair_color);
+ error_code = 0x05;
return nullptr;
}
}
@@ -665,6 +685,7 @@ CharPair *make_new_char(Session *s, CharName name, const Stats6& stats, uint8_t
stats.str, stats.agi, stats.vit, stats.int_, stats.dex, stats.luk,
stats.str + stats.agi + stats.vit + stats.int_ + stats.dex + stats.luk,
hair_style, hair_color);
+ error_code = 0x01;
return nullptr;
}
@@ -2355,11 +2376,12 @@ void parse_char(Session *s)
uint8_t slot = fixed.slot;
uint16_t hair_color = fixed.hair_color;
uint16_t hair_style = fixed.hair_style;
- const CharPair *cp = make_new_char(s, name, stats, slot, hair_color, hair_style);
+ short error_code = 0;
+ const CharPair *cp = make_new_char(s, name, stats, slot, hair_color, hair_style, error_code);
if (!cp)
{
Packet_Fixed<0x006e> fixed_6e;
- fixed_6e.code = 0x00;
+ fixed_6e.code = error_code;
send_fpacket<0x006e, 3>(s, fixed_6e);
break;
}