Jelajahi Sumber

fix problems with chat observer configuration

Kolja Strohm 1 tahun lalu
induk
melakukan
b6d4561fdf

+ 11 - 0
FactoryCraft/Chat.cpp

@@ -87,6 +87,13 @@ void Chat::addObserver(int entityId)
                 nMsg, Game::INSTANCE->zEntity(entityId));
         }
     }
+    Entity* zPlayer = Game::INSTANCE->zEntity(entityId);
+    if (zPlayer)
+    {
+        NetworkMessage* options = new NetworkMessage();
+        options->sendChatOptions(obs);
+        Game::INSTANCE->sendMessage(options, zPlayer);
+    }
     cs.unlock();
 }
 
@@ -162,6 +169,7 @@ void Chat::chatApi(Framework::StreamReader* zRequest,
                 }
             }
             delete[] buffer;
+            break;
         }
     case 2: // remove channel
         {
@@ -178,6 +186,7 @@ void Chat::chatApi(Framework::StreamReader* zRequest,
                 }
             }
             delete[] buffer;
+            break;
         }
     case 3: // add ignored player
         {
@@ -194,6 +203,7 @@ void Chat::chatApi(Framework::StreamReader* zRequest,
                 }
             }
             delete[] buffer;
+            break;
         }
     case 4: // remove ignored player
         {
@@ -210,6 +220,7 @@ void Chat::chatApi(Framework::StreamReader* zRequest,
                 }
             }
             delete[] buffer;
+            break;
         }
     }
 }

+ 28 - 19
FactoryCraft/ChatObserver.cpp

@@ -13,9 +13,9 @@ ChatObserver::ChatObserver(int entityId)
                     + entityId + ".observer");
     if (config.existiert() && config.open(Datei::Style::lesen))
     {
-        int cCount;
-        config.lese((char*)&cCount, sizeof(int));
-        for (int i = 0; i < cCount; i++)
+        int count;
+        config.lese((char*)&count, sizeof(int));
+        for (int i = 0; i < count; i++)
         {
             char len;
             config.lese(&len, 1);
@@ -24,7 +24,8 @@ ChatObserver::ChatObserver(int entityId)
             buffer[(int)len] = 0;
             channel.add(new Framework::Text(buffer));
         }
-        while (!config.istEnde())
+        config.lese((char*)&count, sizeof(int));
+        for (int i = 0; i < count; i++)
         {
             char len;
             config.lese(&len, 1);
@@ -89,7 +90,7 @@ void ChatObserver::addIgnoredPlayer(Framework::Text playerName)
 
 void ChatObserver::removeIgnoredPlayer(Framework::Text playerName)
 {
-    for (auto it = this->channel.begin(); it;)
+    for (auto it = this->ignoredPlayers.begin(); it;)
     {
         if (it->istGleich(playerName))
         {
@@ -110,26 +111,34 @@ void ChatObserver::save() const
     Framework::Datei config;
     config.setDatei(Game::INSTANCE->getWorldDirectory() + "/chat/observer/"
                     + entityId + ".observer");
+    config.erstellen();
     if (config.open(Datei::Style::schreiben))
     {
-        int cCount = channel.getEintragAnzahl();
-        config.schreibe((char*)&cCount, sizeof(int));
-        for (Framework::Text* c : channel)
-        {
-            char len = (char)c->getLength();
-            config.schreibe(&len, 1);
-            config.schreibe(c->getText(), len);
-        }
-        for (Framework::Text* ignored : ignoredPlayers)
-        {
-            char len = (char)ignored->getLength();
-            config.schreibe(&len, 1);
-            config.schreibe(ignored->getText(), len);
-        }
+        writeTo(&config);
         config.close();
     }
 }
 
+void ChatObserver::writeTo(Framework::StreamWriter* zWriter) const
+{
+    int count = channel.getEintragAnzahl();
+    zWriter->schreibe((char*)&count, sizeof(int));
+    for (Framework::Text* c : channel)
+    {
+        char len = (char)c->getLength();
+        zWriter->schreibe(&len, 1);
+        zWriter->schreibe(c->getText(), len);
+    }
+    count = ignoredPlayers.getEintragAnzahl();
+    zWriter->schreibe((char*)&count, sizeof(int));
+    for (Framework::Text* ignored : ignoredPlayers)
+    {
+        char len = (char)ignored->getLength();
+        zWriter->schreibe(&len, 1);
+        zWriter->schreibe(ignored->getText(), len);
+    }
+}
+
 bool ChatObserver::isValid() const
 {
     return Game::INSTANCE->zEntity(entityId) != 0;

+ 2 - 0
FactoryCraft/ChatObserver.h

@@ -2,6 +2,7 @@
 
 #include <Text.h>
 #include <Array.h>
+#include <Writer.h>
 
 class ChatObserver : public virtual Framework::ReferenceCounter
 {
@@ -20,6 +21,7 @@ public:
     void removeIgnoredPlayer(Framework::Text playerName);
     int getEntityId() const;
     void save() const;
+    void writeTo(Framework::StreamWriter* zWriter) const;
     bool isValid() const;
     Framework::Text getPlayerName() const;
 };

+ 13 - 0
FactoryCraft/NetworkMessage.cpp

@@ -110,6 +110,19 @@ void NetworkMessage::sendChatMessage(ChatMessage* zMsg)
     setMessage(msg, (int)buffer.getSize());
 }
 
+void NetworkMessage::sendChatOptions(ChatObserver* zOptions)
+{
+    delete[] address;
+    addressLength = 1;
+    address = new char[1];
+    address[0] = 5; // chat options
+    InMemoryBuffer buffer;
+    zOptions->writeTo(&buffer);
+    char* msg = new char[buffer.getSize()];
+    buffer.lese(msg, (int)buffer.getSize());
+    setMessage(msg, (int)buffer.getSize());
+}
+
 void NetworkMessage::setUseBackground()
 {
     useBackground = 1;

+ 2 - 0
FactoryCraft/NetworkMessage.h

@@ -10,6 +10,7 @@ class Entity;
 class Dimension;
 
 class ChatMessage;
+class ChatObserver;
 
 class NetworkMessage : public virtual Framework::ReferenceCounter
 {
@@ -33,6 +34,7 @@ public:
     void addressGui(Framework::Text elementId);
     void setMessage(char* msg, int length);
     void sendChatMessage(ChatMessage* zMsg);
+    void sendChatOptions(ChatObserver* zOptions);
     void setUseBackground();
     void sendToAll();