Browse Source

add chat options to igore channels and players

Kolja Strohm 2 years ago
parent
commit
fc03969777

+ 20 - 2
FactoryCraft/Chat.cpp

@@ -8,7 +8,8 @@
 #include <AsynchronCall.h>
 
 Chat::Chat()
-    : Fenster()
+    : Fenster(),
+      optionsAdded(0)
 {
     setStyle(
         Fenster::Style::Erlaubt
@@ -43,6 +44,8 @@ Chat::Chat()
     zTTextFeld()->addStyle(TextFeld::Style::Center);
     setKMin(200, 100);
 
+    options = new ChatOptions();
+
     history = new ChatHistory();
     history->setSize(getInnenBreite(), getInnenHeight() - 20);
     addMember(history);
@@ -118,20 +121,35 @@ Chat::Chat()
         [this](void* p, void* o, Framework::MausEreignis me) {
             if (me.id == ME_RLinks)
             {
-                // TODO: open Options
+                options->addStyle(Fenster::Style::Sichtbar);
             }
             return 1;
         });
     addMember(optionsButton);
 }
 
+Chat ::~Chat()
+{
+    options->release();
+}
+
 void Chat::addMessage(char* data)
 {
     history->addMessage(new ChatMessage(data));
 }
 
+void Chat::initOptions(char* data)
+{
+    options->init(data);
+}
+
 bool Chat::tick(double time)
 {
+    if (!optionsAdded)
+    {
+        optionsAdded = 1;
+        uiFactory.initParam.bildschirm->addMember(dynamic_cast<Zeichnung*>(options->getThis()));
+    }
     history->setSize(getInnenBreite(), getInnenHeight() - 20);
     commandLine->setSize(getInnenBreite() - 40, 20);
     commandLine->setPosition(20, getInnenHeight() - 20);

+ 5 - 0
FactoryCraft/Chat.h

@@ -5,6 +5,7 @@
 #include <Knopf.h>
 
 #include "ChatHistory.h"
+#include "ChatOptions.h"
 
 class Chat : public Framework::Fenster
 {
@@ -13,10 +14,14 @@ private:
     Framework::TextFeld* commandLine;
     Framework::Knopf* sendButton;
     Framework::Knopf* optionsButton;
+    ChatOptions* options;
+    bool optionsAdded;
     
 public:
     Chat();
+    ~Chat();
 
     void addMessage(char* data);
+    void initOptions(char* data);
     bool tick(double time) override;
 };

+ 279 - 0
FactoryCraft/ChatOptions.cpp

@@ -0,0 +1,279 @@
+#include "ChatOptions.h"
+
+#include <DateiSystem.h>
+
+#include "Globals.h"
+#include "Initialisierung.h"
+
+ChatOptions::ChatOptions()
+    : Fenster()
+{
+    setStyle(
+        Fenster::Style::Erlaubt | Fenster::Style::Rahmen
+        | Fenster::Style::BodyHAlpha | Fenster::Style::Titel
+        | Fenster::Style::TitelHAlpha | Fenster::Style::Closable
+        | Fenster::Style::ClosingHAlpha | Fenster::Style::ClosingKlickBuffer
+        | Fenster::Style::TitelHintergrund | Fenster::Style::BodyHintergrund
+        | Fenster::Style::ClosingHintergrund | Fenster::Style::MEIgnoreInside
+        | Fenster::Style::Beweglich);
+    removeStyle(Fenster::Style::Sichtbar);
+    setTitel("Chat options");
+    setClosingMe([this](void* p, void* o, Framework::MausEreignis me) {
+        if (me.id == Framework::ME_RLinks)
+        {
+            removeStyle(Fenster::Style::Sichtbar);
+        }
+        return 1;
+    });
+    setSize(262, 367);
+    setPosition(5, uiFactory.initParam.bildschirm->getBackBufferSize().y - 680);
+    setMausEreignis(Framework::_ret1ME);
+    setTastaturEreignis(Framework::_ret1TE);
+    setRBreite(1);
+    setRFarbe(0xFF52525E);
+    setKBgFarbe(0xA0000000);
+    setTBgFarbe(0xA0000000);
+    setSBgFarbe(0xA0000000);
+    setTSchriftZ(
+        dynamic_cast<Schrift*>(uiFactory.initParam.schrift->getThis()));
+    zTTextFeld()->setSize(0, 20);
+    zTTextFeld()->addStyle(TextFeld::Style::Center);
+
+    infoChannel = initKontrollKnopf(5,
+        5,
+        250,
+        20,
+        Framework::KontrollKnopf::Style::Normal
+            & ~Framework::KontrollKnopf::Style::Rahmen,
+        "Show info messages");
+    infoChannel->setNMausEreignis([this](void* p, void* o, MausEreignis me) {
+        if (me.id == ME_RLinks)
+        {
+            char msg[13];
+            msg[0]
+                = infoChannel->hatStyle(KontrollKnopf::Style::Selected) ? 1 : 2;
+            msg[1] = 11;
+            memcpy(msg + 2, "system:INFO", 11);
+            World::INSTANCE->zClient()->chatAPIRequest(msg, 13);
+        }
+        return 1;
+    });
+    addMember(infoChannel);
+    warningChannel = initKontrollKnopf(5,
+        30,
+        250,
+        20,
+        Framework::KontrollKnopf::Style::Normal
+            & ~Framework::KontrollKnopf::Style::Rahmen,
+        "Show warning messages");
+    warningChannel->setNMausEreignis([this](void* p, void* o, MausEreignis me) {
+        if (me.id == ME_RLinks)
+        {
+            char msg[16];
+            msg[0] = warningChannel->hatStyle(KontrollKnopf::Style::Selected)
+                       ? 1
+                       : 2;
+            msg[1] = 14;
+            memcpy(msg + 2, "system:WARNING", 14);
+            World::INSTANCE->zClient()->chatAPIRequest(msg, 16);
+        }
+        return 1;
+    });
+    addMember(warningChannel);
+    errorChannel = initKontrollKnopf(5,
+        55,
+        250,
+        20,
+        Framework::KontrollKnopf::Style::Normal
+            & ~Framework::KontrollKnopf::Style::Rahmen,
+        "Show error messages");
+    errorChannel->setNMausEreignis([this](void* p, void* o, MausEreignis me) {
+        if (me.id == ME_RLinks)
+        {
+            char msg[14];
+            msg[0] = errorChannel->hatStyle(KontrollKnopf::Style::Selected) ? 1
+                                                                            : 2;
+            msg[1] = 12;
+            memcpy(msg + 2, "system:ERROR", 12);
+            World::INSTANCE->zClient()->chatAPIRequest(msg, 14);
+        }
+        return 1;
+    });
+    addMember(errorChannel);
+    TextFeld* blackListLabel = initTextFeld(5,
+        90,
+        250,
+        20,
+        Framework::TextFeld::Style::Text | Framework::TextFeld::Style::VCenter,
+        "Ignored players:");
+    addMember(blackListLabel);
+
+    LTDBDatei dat;
+    dat.setDatei(new Text("data/bilder/gui_icons.ltdb"));
+    dat.leseDaten(0);
+    plus = dat.laden(0, new Text("plus.png"));
+    trash = dat.laden(0, new Text("trash.png"));
+
+    playerName = initTextFeld(
+        5, 115, 225, 20, Framework::TextFeld::Style::TextFeld, "");
+    playerName->setTastaturEreignis(
+        [this](void* o, void* p, TastaturEreignis te) {
+            if (te.id == TE_Release && te.virtualKey == T_Enter)
+            {
+                if (playerName->zText()->getLength())
+                {
+                    addIgnoredPlayer(playerName->zText()->getText(), 1);
+                    playerName->setText("");
+                }
+            }
+            return 1;
+        });
+    addMember(playerName);
+    addButton = initKnopf(235,
+        115,
+        20,
+        20,
+        Framework::Knopf::Style::HBild | Framework::Knopf::Style::HAlpha
+            | Framework::Knopf::Style::Hintergrund,
+        "");
+    addButton->setAlphaFeldFarbe(0x5F337AB7);
+    addButton->setToolTipText("Add player to list of ignored players",
+        uiFactory.initParam.bildschirm,
+        uiFactory.initParam.schrift);
+    addButton->setHintergrundBildZ(dynamic_cast<Bild*>(plus->getThis()));
+    addButton->setMausEreignis([this](void* o, void* p, MausEreignis me) {
+        if (me.id == ME_RLinks)
+        {
+            if (playerName->zText()->getLength())
+            {
+                addIgnoredPlayer(playerName->zText()->getText(), 1);
+                playerName->setText("");
+            }
+        }
+        return 1;
+    });
+    addMember(addButton);
+    blackList = initObjTabelle(5,
+        140,
+        250,
+        200,
+        Framework::ObjTabelle::Style::normal
+            | Framework::ObjTabelle::Style::VScroll,
+        {
+            {"Player", 212, 212, 212},
+            {"Remove", 20,  20,  20 }
+    },
+        0);
+    addMember(blackList);
+}
+
+ChatOptions::~ChatOptions()
+{
+    if (plus) plus->release();
+    if (trash) trash->release();
+}
+
+void ChatOptions::init(char* data)
+{
+    infoChannel->removeStyle(KontrollKnopf::Style::Selected);
+    warningChannel->removeStyle(KontrollKnopf::Style::Selected);
+    errorChannel->removeStyle(KontrollKnopf::Style::Selected);
+    int len = *(int*)data;
+    data += 4;
+    for (int i = 0; i < len; i++)
+    {
+        char len = *(data++);
+        data += len;
+        if (len == 11)
+        {
+            infoChannel->addStyle(KontrollKnopf::Style::Selected);
+        }
+        if (len == 12)
+        {
+            errorChannel->addStyle(KontrollKnopf::Style::Selected);
+        }
+        if (len == 14)
+        {
+            warningChannel->addStyle(KontrollKnopf::Style::Selected);
+        }
+    }
+    uiFactory.initParam.bildschirm->postAction([this]() {
+        while (blackList->getZeilenAnzahl())
+        {
+            blackList->removeZeile(0);
+        }
+    });
+    len = *(int*)data;
+    data += 4;
+    for (int i = 0; i < len; i++)
+    {
+        char len = *(data++);
+        char* name = new char[len + 1];
+        memcpy(name, data, len);
+        name[len] = 0;
+        data += len;
+        addIgnoredPlayer(name, 0);
+        delete[] name;
+    }
+}
+
+void ChatOptions::addIgnoredPlayer(Framework::Text playerName, bool msg)
+{
+    if (blackList->getZeilenNummer(playerName) >= 0) return;
+    if (msg)
+    {
+        char* msg = new char[2 + playerName.getLength()];
+        msg[0] = 3;
+        msg[1] = (char)playerName.getLength();
+        memcpy(msg + 2, playerName, playerName.getLength());
+        World::INSTANCE->zClient()->chatAPIRequest(
+            msg, 2 + playerName.getLength());
+        delete[] msg;
+    }
+    uiFactory.initParam.bildschirm->postAction([this, playerName]() {
+        if (blackList->getZeilenNummer(playerName) >= 0) return;
+        blackList->addZeile(playerName);
+        blackList->setZeichnungZ("Player",
+            playerName,
+            initTextFeld(0,
+                0,
+                0,
+                0,
+                TextFeld::Style::Text | TextFeld::Style::VCenter,
+                playerName.getText()));
+        Knopf* removeButton = initKnopf(0,
+            0,
+            0,
+            0,
+            Framework::Knopf::Style::HBild | Framework::Knopf::Style::HAlpha
+                | Framework::Knopf::Style::Hintergrund,
+            "");
+        removeButton->removeStyle(Knopf::Style::Rahmen);
+        removeButton->setAlphaFeldFarbe(0x5F337AB7);
+        removeButton->setToolTipText(
+            "Remove player from list of ignored players",
+            uiFactory.initParam.bildschirm,
+            uiFactory.initParam.schrift);
+        removeButton->setHintergrundBildZ(
+            dynamic_cast<Bild*>(trash->getThis()));
+        removeButton->setMausEreignis(
+            [this, playerName](void* o, void* p, MausEreignis me) {
+                if (me.id == ME_RLinks)
+                {
+                    uiFactory.initParam.bildschirm->postAction(
+                        [this, playerName]() {
+                            char* msg = new char[2 + playerName.getLength()];
+                            msg[0] = 4;
+                            msg[1] = (char)playerName.getLength();
+                            memcpy(msg + 2, playerName, playerName.getLength());
+                            World::INSTANCE->zClient()->chatAPIRequest(
+                                msg, 2 + playerName.getLength());
+                            delete[] msg;
+                            blackList->removeZeile(playerName);
+                        });
+                }
+                return 1;
+            });
+        blackList->setZeichnungZ("Remove", playerName, removeButton);
+    });
+}

+ 28 - 0
FactoryCraft/ChatOptions.h

@@ -0,0 +1,28 @@
+#pragma once
+
+#include <Fenster.h>
+#include <Knopf.h>
+#include <Liste.h>
+#include <Tabelle.h>
+
+class ChatOptions : public Framework::Fenster
+{
+private:
+    Framework::KontrollKnopf* infoChannel;
+    Framework::KontrollKnopf* warningChannel;
+    Framework::KontrollKnopf* errorChannel;
+
+    Framework::Bild* plus;
+    Framework::Bild* trash;
+
+    Framework::TextFeld* playerName;
+    Framework::Knopf* addButton;
+    Framework::ObjTabelle* blackList;
+
+public:
+    ChatOptions();
+    ~ChatOptions();
+    
+    void init(char* data);
+    void addIgnoredPlayer(Framework::Text playerName, bool msg);
+};

+ 12 - 0
FactoryCraft/FactoryClient.cpp

@@ -454,6 +454,18 @@ void FactoryClient::sendChatMessage(Framework::Text message)
     cs.unlock();
 }
 
+void FactoryClient::chatAPIRequest(char* data, unsigned short length)
+{
+    if (!background) return;
+    cs.lock();
+    short totalLength = length + 1;
+    background->sende((char*)&totalLength, 2);
+    char msgId = 6;
+    background->sende(&msgId, 1);
+    background->sende(data, length);
+    cs.unlock();
+}
+
 bool FactoryClient::isConnected()
 {
     return foreground->isConnected() && background->isConnected();

+ 1 - 0
FactoryCraft/FactoryClient.h

@@ -51,5 +51,6 @@ public:
         unsigned short length);
     void craftingUIMLRequest(int itemTypeId);
     void sendChatMessage(Framework::Text message);
+    void chatAPIRequest(char* data, unsigned short length);
     bool isConnected();
 };

+ 2 - 0
FactoryCraft/FactoryCraft.vcxproj

@@ -177,6 +177,7 @@ copy "..\..\..\..\..\Allgemein\Network\x64\Release\Network.dll" "network.dll"</C
     <ClCompile Include="Chat.cpp" />
     <ClCompile Include="ChatHistory.cpp" />
     <ClCompile Include="ChatMessage.cpp" />
+    <ClCompile Include="ChatOptions.cpp" />
     <ClCompile Include="Chunk.cpp" />
     <ClCompile Include="CraftingGrid.cpp" />
     <ClCompile Include="CraftingRecipies.cpp" />
@@ -222,6 +223,7 @@ copy "..\..\..\..\..\Allgemein\Network\x64\Release\Network.dll" "network.dll"</C
     <ClInclude Include="Chat.h" />
     <ClInclude Include="ChatHistory.h" />
     <ClInclude Include="ChatMessage.h" />
+    <ClInclude Include="ChatOptions.h" />
     <ClInclude Include="Chunk.h" />
     <ClInclude Include="Constants.h" />
     <ClInclude Include="CraftingGrid.h" />

+ 6 - 0
FactoryCraft/FactoryCraft.vcxproj.filters

@@ -187,6 +187,9 @@
     <ClCompile Include="ChatMessage.cpp">
       <Filter>Menu\chat</Filter>
     </ClCompile>
+    <ClCompile Include="ChatOptions.cpp">
+      <Filter>Menu\chat</Filter>
+    </ClCompile>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="Area.h">
@@ -324,6 +327,9 @@
     <ClInclude Include="ChatHistory.h">
       <Filter>Menu\chat</Filter>
     </ClInclude>
+    <ClInclude Include="ChatOptions.h">
+      <Filter>Menu\chat</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <FxCompile Include="DX11CustomVertexShader.hlsl">

+ 27 - 3
FactoryCraft/Initialisierung.cpp

@@ -12,8 +12,8 @@
 
 Knopf* createKnopf(const Framework::UIInitParam& params)
 {
-    Knopf* ret
-        = Framework::defaultUI(params.schrift, params.bildschirm).createKnopf(params);
+    Knopf* ret = Framework::defaultUI(params.schrift, params.bildschirm)
+                     .createKnopf(params);
     ret->setHintergrundFarbe(0xFF000000);
     ret->setRahmenFarbe(0xFF2E6DA4);
     ret->setSchriftFarbe(0xFFFFFFFF);
@@ -34,6 +34,30 @@ TextFeld* createTextFeld(const Framework::UIInitParam& params)
     return ret;
 }
 
+KontrollKnopf* createKontrollKnopf(const Framework::UIInitParam& params)
+{
+    KontrollKnopf* ret = Framework::defaultUI(params.schrift, params.bildschirm)
+                             .createKontrollKnopf(params);
+    ret->removeStyle(KontrollKnopf::Style::Rahmen);
+    ret->setRahmenFarbe(0xFF2E6DA4);
+    ret->setHintergrundFarbe(0xFF000000);
+    ret->setKAFFarbe(0xFF3d3d3d);
+    ret->setKAFStrength(10);
+    return ret;
+}
+
+ObjTabelle* createObjTabelle(const Framework::UIInitParam& params)
+{
+    ObjTabelle* ret = Framework::defaultUI(params.schrift, params.bildschirm)
+                          .createObjTabelle(params);
+    ret->setRahmenFarbe(0xFF6d6d6d);
+    ret->setHintergrundFarbe(0xFF000000);
+    ret->setRasterFarbe(0xFF6d6d6d);
+    ret->setVertikalScrollPos(0);
+    ret->setHorizontalScrollPos(0);
+    return ret;
+}
+
 Knopf* initKnopf(int x, int y, int br, int hö, __int64 style, char* titel)
 {
     Knopf* ret = uiFactory.createKnopf(uiFactory.initParam);
@@ -69,7 +93,7 @@ Fenster* initFenster(int x, int y, int br, int h
     return ret;
 }
 
-TextFeld* initTextFeld(int x, int y, int br, int hö, __int64 style, char* txt)
+TextFeld* initTextFeld(int x, int y, int br, int hö, __int64 style, const char* txt)
 {
     TextFeld* ret = uiFactory.createTextFeld(uiFactory.initParam);
     ret->setStyle(style);

+ 3 - 1
FactoryCraft/Initialisierung.h

@@ -22,11 +22,13 @@ struct OBJTabelleSpalteIni
 
 Knopf* createKnopf(const Framework::UIInitParam& params);
 TextFeld* createTextFeld(const Framework::UIInitParam& params);
+KontrollKnopf* createKontrollKnopf(const Framework::UIInitParam& params);
+ObjTabelle* createObjTabelle(const Framework::UIInitParam& params);
 
 Knopf* initKnopf(int x, int y, int br, int hö, __int64 style, char* titel);
 KontrollKnopf* initKontrollKnopf(
     int x, int y, int br, int hö, __int64 style, char* txt);
-TextFeld* initTextFeld(int x, int y, int br, int hö, __int64 style, char* txt);
+TextFeld* initTextFeld(int x, int y, int br, int hö, __int64 style, const char* txt);
 BildZ* initBildZ(int x, int y, int br, int hö, __int64 style, Bild* b);
 AuswahlBox* initAuswahlBox(int x,
     int y,

+ 2 - 0
FactoryCraft/Main.cpp

@@ -171,6 +171,8 @@ int KSGStart Framework::Start(Framework::Startparam p)
     uiFactory = Framework::defaultUI(fontRegister->get("normal"), &screen);
     uiFactory.createKnopf = createKnopf;
     uiFactory.createTextFeld = createTextFeld;
+    uiFactory.createKontrollKnopf = createKontrollKnopf;
+    uiFactory.createObjTabelle = createObjTabelle;
     initMenus();
 
     RenderTh rTh;

+ 7 - 0
FactoryCraft/World.cpp

@@ -117,6 +117,13 @@ void World::update(bool background)
                         ->addMessage(data + 1);
                     break;
                 }
+            case 5: // chat options
+                {
+                    ((Game*)(Menu*)menuRegister->get("game"))
+                        ->zChat()
+                        ->initOptions(data + 1);
+                    break;
+                }
             }
             delete[] data;
             // TODO: process messages