From 778015665ad5880410244d13b8a2062e44eee2be Mon Sep 17 00:00:00 2001
From: mekolat <mekolat@users.noreply.github.com>
Date: Thu, 18 Jun 2015 09:29:35 -0400
Subject: send error code when char creation fails

---
 src/char/char.cpp | 42 ++++++++++++++++++++++++++++++++----------
 1 file changed, 32 insertions(+), 10 deletions(-)

(limited to 'src')

diff --git a/src/char/char.cpp b/src/char/char.cpp
index 7ad6dff..153cccd 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,6 +581,7 @@ 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;
     }
 
@@ -588,6 +590,7 @@ CharPair *make_new_char(Session *s, CharName name, const Stats6& stats, uint8_t
     {
         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 != 5 * 6)
     {
-        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 >= 9)
+    {
+        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 >= 20 || hair_color >= 12)
+    {
+        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;
     }
 
@@ -631,6 +648,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 = 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;
                 }
-- 
cgit v1.2.3-70-g09d2