From 30ffc94a10937f7a6d4bfca6ed909e09a1c29bb7 Mon Sep 17 00:00:00 2001
From: in1tiate <radwoodward@vikings.grayson.edu>
Date: Wed, 10 Mar 2021 19:59:35 -0600
Subject: [PATCH] add forcepos and check for nonexistent client in invite

---
 src/aoclient.cpp |  2 +-
 src/commands.cpp | 47 +++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 48 insertions(+), 1 deletion(-)

diff --git a/src/aoclient.cpp b/src/aoclient.cpp
index 167e919..c993443 100644
--- a/src/aoclient.cpp
+++ b/src/aoclient.cpp
@@ -221,7 +221,7 @@ void AOClient::arup(ARUPType type, bool broadcast)
                 break;
             }
             case ARUPType::STATUS: {
-                QString area_status = QVariant::fromValue(area->status).toString().replace("_", "-");
+                QString area_status = QVariant::fromValue(area->status).toString().replace("_", "-"); // LOOKING_FOR_PLAYERS to LOOKING-FOR-PLAYERS
                 arup_data.append(area_status);
                 break;
             }
diff --git a/src/commands.cpp b/src/commands.cpp
index 1b32529..103eb63 100644
--- a/src/commands.cpp
+++ b/src/commands.cpp
@@ -368,6 +368,41 @@ void AOClient::cmdPos(int argc, QStringList argv)
     sendServerMessage("Position changed to " + pos + ".");
 }
 
+void AOClient::cmdForcePos(int argc, QStringList argv) 
+{
+    bool ok;
+    QList<AOClient*> targets;
+    AreaData* area = server->areas[current_area];
+    int target_id = argv[1].toInt(&ok);
+    int forced_clients = 0;
+    if (!ok && argv[1] != "*") {
+        sendServerMessage("That does not look like a valid ID.");
+        return;
+    }
+    else if (ok) {
+        AOClient* target_client = server->getClientByID(target_id);
+        if (target_client != nullptr)
+            targets.append(target_client);
+        else {
+            sendServerMessage("Target ID not found!");
+            return;
+        }
+    }
+        
+    else if (argv[1] == "*") { // force all clients in the area
+        for (AOClient* client : server->clients) {
+            if (client->current_area == current_area)
+                targets.append(client);
+        }
+    }
+    for (AOClient* target : targets) {
+        target->pos = argv[0];
+        target->sendServerMessage("Position forced to " + target->pos + " by CM.");
+        forced_clients++;
+    }
+    sendServerMessage("Forced " + QString::number(forced_clients) + " into pos " + argv[0] + ".");
+}
+
 void AOClient::cmdG(int argc, QStringList argv)
 {
     QString sender_name = ooc_name;
@@ -483,6 +518,10 @@ void AOClient::cmdInvite(int argc, QStringList argv)
         sendServerMessage("That does not look like a valid ID.");
         return;
     }
+    else if (server->getClientByID(invited_id) == nullptr) {
+        sendServerMessage("No client with that ID found.");
+        return;
+    }
     else if (area->invited.contains(invited_id)) {
         sendServerMessage("That ID is already on the invite list.");
         return;
@@ -500,6 +539,10 @@ void AOClient::cmdUnInvite(int argc, QStringList argv)
         sendServerMessage("That does not look like a valid ID.");
         return;
     }
+    else if (server->getClientByID(uninvited_id) == nullptr) {
+        sendServerMessage("No client with that ID found.");
+        return;
+    }
     else if (area->owners.contains(uninvited_id)) {
         sendServerMessage("You cannot uninvite a CM!");
         return;
@@ -665,6 +708,10 @@ void AOClient::cmdAreaKick(int argc, QStringList argv)
         return;
     }
     AOClient* client_to_kick = server->getClientByID(idx);
+    if (client_to_kick == nullptr) {
+        sendServerMessage("No client with that ID found.");
+        return;
+    }
     client_to_kick->changeArea(0);
     sendServerMessage("Client " + argv[0] + " kicked back to area 0.");
 }