From 69f77548a8a821c2180af2d38460bfb2e02d3fd2 Mon Sep 17 00:00:00 2001
From: in1tiate <radwoodward@vikings.grayson.edu>
Date: Fri, 30 Apr 2021 22:58:04 -0500
Subject: [PATCH 1/4] add firstperson variable and command toggle

---
 include/aoclient.h         | 19 ++++++++++++++++++-
 src/commands/area.cpp      |  6 +++---
 src/commands/messaging.cpp |  7 +++++++
 3 files changed, 28 insertions(+), 4 deletions(-)

diff --git a/include/aoclient.h b/include/aoclient.h
index 1c2f799..bfdf32f 100644
--- a/include/aoclient.h
+++ b/include/aoclient.h
@@ -161,6 +161,13 @@ class AOClient : public QObject {
      */
     bool global_enabled = true;
 
+    /**
+     * @brief If true, the client's messages will be sent in first-person mode.
+     *
+     * @see AOClient::cmdFirstPerson
+     */
+    bool first_person = false;
+
     /**
      * @brief If true, the client may not use in-character chat.
      */
@@ -1528,6 +1535,15 @@ class AOClient : public QObject {
      */
     void cmdS(int argc, QStringList argv);
 
+    /**
+     * @brief Toggle whether the client's messages will be sent in first person mode.
+     *
+     * @details No arguments.
+     *
+     * @iscommand
+     */
+    void cmdFirstPerson(int argc, QStringList argv);
+
     ///@}
 
     /**
@@ -1983,7 +1999,8 @@ class AOClient : public QObject {
         {"charselect",         {ACLFlags.value("NONE"),         0, &AOClient::cmdCharSelect}},
         {"togglemusic",        {ACLFlags.value("CM"),           0, &AOClient::cmdToggleMusic}},
         {"a",                  {ACLFlags.value("NONE"),         2, &AOClient::cmdA}},
-        {"s",                  {ACLFlags.value("NONE"),         0, &AOClient::cmdS}}
+        {"s",                  {ACLFlags.value("NONE"),         0, &AOClient::cmdS}},
+        {"firstperson",        {ACLFlags.value("NONE"),         0, &AOClient::cmdFirstPerson}},
     };
 
     /**
diff --git a/src/commands/area.cpp b/src/commands/area.cpp
index 8ae19af..705c400 100644
--- a/src/commands/area.cpp
+++ b/src/commands/area.cpp
@@ -260,14 +260,14 @@ void AOClient::cmdBgLock(int argc, QStringList argv)
 {
     AreaData* area = server->areas[current_area];
     area->bg_locked = true;
-    server->broadcast(AOPacket("CT", {"Server", current_char + " locked the background.", "1"}), current_area);
+    server->broadcast(AOPacket("CT", {server->server_name, current_char + " locked the background.", "1"}), current_area);
 }
 
 void AOClient::cmdBgUnlock(int argc, QStringList argv)
 {
     AreaData* area = server->areas[current_area];
     area->bg_locked = false;
-    server->broadcast(AOPacket("CT", {"Server", current_char + " unlocked the background.", "1"}), current_area);
+    server->broadcast(AOPacket("CT", {server->server_name, current_char + " unlocked the background.", "1"}), current_area);
 }
 
 void AOClient::cmdStatus(int argc, QStringList argv)
@@ -291,7 +291,7 @@ void AOClient::cmdStatus(int argc, QStringList argv)
         return;
     }
     arup(ARUPType::STATUS, true);
-    sendServerMessageArea(ooc_name + " changed status to " + arg);
+    server->broadcast(AOPacket("CT", {server->server_name, current_char + " changed status to " + arg.toUpper(), "1"}), current_area);
 }
 
 void AOClient::cmdJudgeLog(int argc, QStringList argv)
diff --git a/src/commands/messaging.cpp b/src/commands/messaging.cpp
index 044169d..2df2c15 100644
--- a/src/commands/messaging.cpp
+++ b/src/commands/messaging.cpp
@@ -445,3 +445,10 @@ void AOClient::cmdS(int argc, QStringList argv)
             server->broadcast(AOPacket("CT", {"[CM]" + sender_name, ooc_message}), i);
     }
 }
+
+void AOClient::cmdFirstPerson(int argc, QStringList argv)
+{
+    first_person = !first_person;
+    QString str_en = first_person ? "enabled" : "disabled";
+    sendServerMessage("First person mode " + str_en + ".");
+}

From 0e05ed63f24d1886ca12726e85da7e41bc3bcf4a Mon Sep 17 00:00:00 2001
From: in1tiate <radwoodward@vikings.grayson.edu>
Date: Fri, 30 Apr 2021 23:01:12 -0500
Subject: [PATCH 2/4] add firstperson cid check

---
 src/packets.cpp | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/src/packets.cpp b/src/packets.cpp
index 10f25c7..2841836 100644
--- a/src/packets.cpp
+++ b/src/packets.cpp
@@ -568,7 +568,10 @@ AOPacket AOClient::validateIcPacket(AOPacket packet)
     // char id
     if (incoming_args[8].toInt() != char_id)
         return invalid;
-    args.append(incoming_args[8].toString());
+    if (first_person)
+        args.append("-1"); // messages with a cid of -1 don't update the viewport
+    else
+        args.append(incoming_args[8].toString());
 
     // sfx delay
     args.append(incoming_args[9].toString());

From b6f4982643745c66034ef7ee792c4cc78ae199f7 Mon Sep 17 00:00:00 2001
From: in1tiate <radwoodward@vikings.grayson.edu>
Date: Fri, 30 Apr 2021 23:01:52 -0500
Subject: [PATCH 3/4] validate ic packets with a cid of -1

---
 src/packets.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/packets.cpp b/src/packets.cpp
index 2841836..dceddf2 100644
--- a/src/packets.cpp
+++ b/src/packets.cpp
@@ -566,7 +566,7 @@ AOPacket AOClient::validateIcPacket(AOPacket packet)
     args.append(QString::number(emote_mod));
 
     // char id
-    if (incoming_args[8].toInt() != char_id)
+    if (incoming_args[8].toInt() != char_id && incoming_args[8].toInt() != -1)
         return invalid;
     if (first_person)
         args.append("-1"); // messages with a cid of -1 don't update the viewport

From 05201ac82df36c9a146215f301006122ec15d70b Mon Sep 17 00:00:00 2001
From: in1tiate <radwoodward@vikings.grayson.edu>
Date: Fri, 30 Apr 2021 23:05:18 -0500
Subject: [PATCH 4/4] woops, thats not how that works

---
 src/packets.cpp | 9 ++++-----
 1 file changed, 4 insertions(+), 5 deletions(-)

diff --git a/src/packets.cpp b/src/packets.cpp
index dceddf2..e11d3b3 100644
--- a/src/packets.cpp
+++ b/src/packets.cpp
@@ -502,6 +502,8 @@ AOPacket AOClient::validateIcPacket(AOPacket packet)
 
     // emote
     emote = incoming_args[3].toString();
+    if (first_person)
+        emote = "";
     args.append(emote);
 
     // message text
@@ -566,12 +568,9 @@ AOPacket AOClient::validateIcPacket(AOPacket packet)
     args.append(QString::number(emote_mod));
 
     // char id
-    if (incoming_args[8].toInt() != char_id && incoming_args[8].toInt() != -1)
+    if (incoming_args[8].toInt() != char_id)
         return invalid;
-    if (first_person)
-        args.append("-1"); // messages with a cid of -1 don't update the viewport
-    else
-        args.append(incoming_args[8].toString());
+    args.append(incoming_args[8].toString());
 
     // sfx delay
     args.append(incoming_args[9].toString());