All pastes #1868384 Raw Edit

Stuff

public diff v1 · immutable
#1868384 ·published 2010-04-19 19:33 UTC
rendered paste body
From 562307971fd506a0758c83fb0d37bb0ed3441e0e Mon Sep 17 00:00:00 2001From: Andrei Karas <akaras@inbox.ru>Date: Mon, 19 Apr 2010 20:05:35 +0300Subject: [PATCH] Add afk mode for player.Add variable cur_time for current time.Add command /away [text]--- src/client.cpp         |    1 + src/client.h           |    1 + src/commandhandler.cpp |    9 ++++++ src/commandhandler.h   |    5 +++ src/game.cpp           |    2 + src/gui/chat.cpp       |    5 +++ src/localplayer.cpp    |   69 +++++++++++++++++++++++++++++++++++++++++++++++- src/localplayer.h      |   24 ++++++++++++++++ 8 files changed, 115 insertions(+), 1 deletions(-)diff --git a/src/client.cpp b/src/client.cppindex 8debb55..44df362 100644--- a/src/client.cpp+++ b/src/client.cpp@@ -125,6 +125,7 @@ void ErrorListener::action(const gcn::ActionEvent &) volatile int tick_time;       /**< Tick counter */ volatile int fps = 0;         /**< Frames counted in the last second */ volatile int frame_count = 0; /**< Counts the frames during one second */+volatile int cur_time;  /**  * Advances game logic counter.diff --git a/src/client.h b/src/client.hindex 233ee64..c120b24 100644--- a/src/client.h+++ b/src/client.h@@ -50,6 +50,7 @@ static const short DEFAULT_PORT = 6901;  extern volatile int fps; extern volatile int tick_time;+extern volatile int cur_time;  class ErrorListener : public gcn::ActionListener {diff --git a/src/commandhandler.cpp b/src/commandhandler.cppindex 8d70b71..80a3b99 100644--- a/src/commandhandler.cpp+++ b/src/commandhandler.cpp@@ -122,6 +122,10 @@ void CommandHandler::handleCommand(const std::string &command, ChatTab *tab)     {         handlePresent(args, tab);     }+    else if (type == "away")+    {+        handleAway(args, tab);+    }     else     {         tab->chatLog(_("Unknown command."));@@ -507,3 +511,8 @@ void CommandHandler::handleUnignore(const std::string &args, ChatTab *tab)     else         tab->chatLog(_("Player could not be unignored!"), BY_SERVER); }++void CommandHandler::handleAway(const std::string &args, ChatTab *tab)+{+    player_node->setAway(args);+}diff --git a/src/commandhandler.h b/src/commandhandler.hindex dec554b..c65c367 100644--- a/src/commandhandler.h+++ b/src/commandhandler.h@@ -142,6 +142,11 @@ class CommandHandler          * Handle an unignore command.          */         void handleUnignore(const std::string &args, ChatTab *tab);++        /**+         * Handle away command.+         */+        void handleAway(const std::string &args, ChatTab *tab); };  extern CommandHandler *commandHandler;diff --git a/src/game.cpp b/src/game.cppindex 88c74de..79f2186 100644--- a/src/game.cpp+++ b/src/game.cpp@@ -339,6 +339,8 @@ void Game::logic()     if (mCurrentMap)         mCurrentMap->update(); +    cur_time = time(NULL);+     // Handle network stuff     if (!Net::getGameHandler()->isConnected())     {diff --git a/src/gui/chat.cpp b/src/gui/chat.cppindex 8965ec7..d53bcf0 100644--- a/src/gui/chat.cpp+++ b/src/gui/chat.cpp@@ -456,9 +456,14 @@ void ChatWindow::whisper(const std::string &nick,     if (tab)     {         if (own)+        {             tab->chatInput(mes);+        }         else+        {             tab->chatLog(nick, mes);+            player_node->afkRespond(tab, nick);+        }     }     else     {diff --git a/src/localplayer.cpp b/src/localplayer.cppindex ff7961b..17ac3d5 100644--- a/src/localplayer.cpp+++ b/src/localplayer.cpp@@ -42,6 +42,7 @@ #include "gui/gui.h" #include "gui/inventorywindow.h" #include "gui/ministatus.h"+#include "gui/okdialog.h" #include "gui/skilldialog.h" #include "gui/statuswindow.h" #include "gui/theme.h"@@ -49,6 +50,7 @@  #include "gui/widgets/chattab.h" +#include "net/chathandler.h" #include "net/guildhandler.h" #include "net/inventoryhandler.h" #include "net/net.h"@@ -73,6 +75,8 @@ // TODO: This can fine tuned later on when running is added... const short walkingKeyboardDelay = 1000; +#define AWAY_LIMIT_TIMER 60+ LocalPlayer *player_node = NULL;  LocalPlayer::LocalPlayer(int id, int subtype):@@ -100,8 +104,13 @@ LocalPlayer::LocalPlayer(int id, int subtype):     mPathSetByMouse(false),     mInventory(new Inventory(Inventory::INVENTORY)),     mLocalWalkTime(-1),-    mMessageTime(0)+    mMessageTime(0),+    mAwayDialog(0),+    mAfkTime(0),+    mAwayMode(false) {+    mAwayListener = new AwayListener();+     mUpdateName = true;      mTextColor = &Theme::getThemeColor(Theme::PLAYER);@@ -1414,3 +1423,61 @@ void LocalPlayer::optionChanged(const std::string &value)         setShowName(config.getValue("showownname", 1));     } }++void LocalPlayer::changeAwayMode()+{+    mAwayMode = !mAwayMode;+    mAfkTime = 0;+    if (mAwayMode)+    {+        cancelFollow();+        mAwayDialog = new OkDialog(_("Away"),+                config.getValue("afkMessage", "I am away from keyboard"));+        mAwayDialog->addActionListener(mAwayListener);+    }+    else+    {+        mAwayDialog = 0;+    }+}++void LocalPlayer::setAway(std::string message)+{+    if (!message.empty())+        config.setValue("afkMessage", message);+    changeAwayMode();+}++void LocalPlayer::afkRespond(ChatTab *tab, const std::string &nick)+{+    if (mAwayMode)+    {+        if (mAfkTime == 0+            || cur_time < mAfkTime+            || cur_time - mAfkTime > AWAY_LIMIT_TIMER)+        {+            std::string msg = "*AFK*: "+                    + config.getValue("afkMessage", "I am away from keyboard");++            Net::getChatHandler()->privateMessage(nick, msg);+            if (!tab)+            {+                localChatTab->chatLog(getName() + " : " + msg,+                                      ACT_WHISPER, false);+            }+            else+            {+                tab->chatLog(getName(), msg);+            }+            mAfkTime = cur_time;+        }+    }+}++void AwayListener::action(const gcn::ActionEvent &event)+{+    if (event.getId() == "ok" && player_node->getAwayMode())+    {+        player_node->changeAwayMode();+    }+}\ No newline at end of filediff --git a/src/localplayer.h b/src/localplayer.hindex dd7b94d..1073dcb 100644--- a/src/localplayer.h+++ b/src/localplayer.h@@ -26,15 +26,19 @@  #include "gui/userpalette.h" +#include <guichan/actionlistener.hpp>+ #include <memory> #include <vector> +class ChatTab; class Equipment; class FloorItem; class ImageSet; class Inventory; class Item; class Map;+class OkDialog;   struct Special@@ -44,6 +48,12 @@ struct Special     int recharge; }; +class AwayListener : public gcn::ActionListener+{+    public:+        void action(const gcn::ActionEvent &event);+};+  /**  * Attributes used during combat. Available to all the beings.@@ -352,6 +362,15 @@ class LocalPlayer : public Player         bool isPathSetByMouse() const         { return mPathSetByMouse; } +        void changeAwayMode();++        bool getAwayMode()+        { return mAwayMode; }++        void setAway(std::string message);++        void afkRespond(ChatTab *tab, const std::string &nick);+         void addMessageToQueue(const std::string &message,                                int color = UserPalette::EXP_INFO); @@ -480,6 +499,11 @@ class LocalPlayer : public Player         /** Queued exp messages*/         std::list<MessagePair> mMessages;         int mMessageTime;+        AwayListener *mAwayListener;+        OkDialog *mAwayDialog;++        int mAfkTime;+        bool mAwayMode; };  extern LocalPlayer *player_node;-- 1.7.0.4