diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/game.cpp | 3 | ||||
-rw-r--r-- | src/game.h | 1 | ||||
-rw-r--r-- | src/gui/popupmenu.cpp | 17 | ||||
-rw-r--r-- | src/net/adminhandler.h | 2 | ||||
-rw-r--r-- | src/net/ea/adminhandler.cpp | 32 | ||||
-rw-r--r-- | src/net/ea/adminhandler.h | 2 | ||||
-rw-r--r-- | src/net/ea/maphandler.cpp | 117 | ||||
-rw-r--r-- | src/net/ea/maphandler.h | 46 | ||||
-rw-r--r-- | src/net/ea/protocol.h | 3 |
9 files changed, 217 insertions, 6 deletions
diff --git a/src/game.cpp b/src/game.cpp index 9b6524f2..15beb99c 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -101,6 +101,7 @@ #else #include "net/ea/gui/partytab.h" #include "net/ea/network.h" +#include "net/ea/adminhandler.h" #include "net/ea/chathandler.h" #include "net/ea/beinghandler.h" #include "net/ea/buysellhandler.h" @@ -360,6 +361,7 @@ Game::Game(): #else Game::Game(Network *network): mNetwork(network), + mAdminHandler(new AdminHandler), mBeingHandler(new BeingHandler(config.getValue("EnableSync", 0) == 1)), mEquipmentHandler(new EquipmentHandler), mSkillHandler(new SkillHandler), @@ -420,6 +422,7 @@ Game::Game(Network *network): Net::registerHandler(mTradeHandler.get()); Net::registerHandler(mEffectHandler.get()); #else + network->registerHandler(mAdminHandler.get()); network->registerHandler(mBeingHandler.get()); network->registerHandler(mBuySellHandler.get()); network->registerHandler(mChatHandler.get()); @@ -70,6 +70,7 @@ class Game : public ConfigListener MessageHandlerPtr mGuildHandler; MessageHandlerPtr mEffectHandler; #else + MessageHandlerPtr mAdminHandler; MessageHandlerPtr mEquipmentHandler; MessageHandlerPtr mSkillHandler; #endif diff --git a/src/gui/popupmenu.cpp b/src/gui/popupmenu.cpp index 8bb6acbb..2b49ff30 100644 --- a/src/gui/popupmenu.cpp +++ b/src/gui/popupmenu.cpp @@ -35,6 +35,11 @@ #include "npc.h" #include "player_relations.h" +#include "net/net.h" +#ifdef EATHENA_SUPPORT +#include "net/ea/adminhandler.h" +#endif + #include "resources/itemdb.h" #include "resources/iteminfo.h" @@ -108,6 +113,7 @@ void PopupMenu::showPopup(int x, int y, Being *being) mBrowserBox->addRow("##3---"); mBrowserBox->addRow(strprintf(_("@@party-invite|Invite %s to party@@"), name.c_str())); + //mBrowserBox->addRow(_("@@admin-kick|Kick player@@")); } break; @@ -117,6 +123,10 @@ void PopupMenu::showPopup(int x, int y, Being *being) mBrowserBox->addRow(_("@@talk|Talk To NPC@@")); break; + /*case Being::MONSTER: + mBrowserBox->addRow(_("@@admin-kick|Kick monster@@")); + break;*/ + default: /* Other beings aren't interesting... */ break; @@ -290,6 +300,13 @@ void PopupMenu::handleLink(const std::string &link) player_node->inviteToParty(dynamic_cast<Player*> (being)); } #endif + else if (link == "admin-kick" && + being && + (being->getType() == Being::PLAYER || + being->getType() == Being::MONSTER)) + { + adminHandler->kick(being->getId()); + } // Unknown actions else diff --git a/src/net/adminhandler.h b/src/net/adminhandler.h index c3a029b1..c6073b4f 100644 --- a/src/net/adminhandler.h +++ b/src/net/adminhandler.h @@ -46,6 +46,8 @@ class AdminHandler virtual void unban(const std::string &name) {} + virtual void mute(int playerId, int type, int limit) {} + // TODO }; } diff --git a/src/net/ea/adminhandler.cpp b/src/net/ea/adminhandler.cpp index 83b798a6..c1194ef1 100644 --- a/src/net/ea/adminhandler.cpp +++ b/src/net/ea/adminhandler.cpp @@ -21,6 +21,7 @@ #include "net/ea/adminhandler.h" +#include "net/ea/chathandler.h" #include "net/ea/protocol.h" #include "net/messagein.h" @@ -39,13 +40,12 @@ #include <string> -#define SERVER_NAME "Server" - AdminHandler *adminHandler; AdminHandler::AdminHandler() { static const Uint16 _messages[] = { + SMSG_ADMIN_KICK_ACK, 0 }; handledMessages = _messages; @@ -54,9 +54,15 @@ AdminHandler::AdminHandler() void AdminHandler::handleMessage(MessageIn &msg) { + int id; switch (msg.getId()) { - case SMSG_WHISPER_RESPONSE: + case SMSG_ADMIN_KICK_ACK: + id = msg.readInt32(); + if (id == 0) + localChatTab->chatLog(_("Kick failed!"), BY_SERVER); + else + localChatTab->chatLog(_("Kick succedded!"), BY_SERVER); break; } } @@ -89,17 +95,31 @@ void AdminHandler::kick(int playerId) void AdminHandler::kick(const std::string &name) { - // Unsupported + chatHandler->talk("@kick " + name); } void AdminHandler::ban(int playerId) {} void AdminHandler::ban(const std::string &name) -{} +{ + chatHandler->talk("@ban " + name); +} void AdminHandler::unban(int playerId) {} void AdminHandler::unban(const std::string &name) -{} +{ + chatHandler->talk("@unban " + name); +} + +void AdminHandler::mute(int playerId, int type, int limit) +{ + return; // Still looking into this + + MessageOut outMsg(CMSG_ADMIN_MUTE); + outMsg.writeInt32(playerId); + outMsg.writeInt8(type); + outMsg.writeInt16(limit); +} diff --git a/src/net/ea/adminhandler.h b/src/net/ea/adminhandler.h index 95dd8072..ae40e9d7 100644 --- a/src/net/ea/adminhandler.h +++ b/src/net/ea/adminhandler.h @@ -49,6 +49,8 @@ class AdminHandler : public MessageHandler, public Net::AdminHandler virtual void unban(int playerId); virtual void unban(const std::string &name); + + virtual void mute(int playerId, int type, int limit); }; extern AdminHandler *adminHandler; diff --git a/src/net/ea/maphandler.cpp b/src/net/ea/maphandler.cpp new file mode 100644 index 00000000..c7fe42d9 --- /dev/null +++ b/src/net/ea/maphandler.cpp @@ -0,0 +1,117 @@ +/* + * The Mana World + * Copyright (C) 2004 The Mana World Development Team + * + * This file is part of The Mana World. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "net/ea/maphandler.h" + +#include "net/ea/protocol.h" + +#include "net/messagein.h" +#include "net/messageout.h" + +#include "localplayer.h" +#include "log.h" +#include "main.h" + +#include "gui/widgets/chattab.h" + +#include "utils/gettext.h" +#include "utils/stringutils.h" + +MapHandler *mapHandler; + +MapHandler::MapHandler() +{ + static const Uint16 _messages[] = { + SMSG_CONNECTION_PROBLEM, + SMSG_LOGIN_SUCCESS, + SMSG_SERVER_PING, + SMSG_WHO_ANSWER, + 0 + }; + handledMessages = _messages; + mapHandler = this; +} + +void MapHandler::handleMessage(MessageIn &msg) +{ + int code; + unsigned char direction; + + switch (msg.getId()) + { + case SMSG_CONNECTION_PROBLEM: + code = msg.readInt8(); + logger->log("Connection problem: %i", code); + + switch (code) { + case 0: + errorMessage = _("Authentication failed"); + break; + case 2: + errorMessage = _("This account is already logged in"); + break; + default: + errorMessage = _("Unknown connection error"); + break; + } + state = STATE_ERROR; + break; + + case SMSG_LOGIN_SUCCESS: + msg.readInt32(); // server tick + msg.readCoordinates(player_node->mX, player_node->mY, direction); + msg.skip(2); // unknown + logger->log("Protocol: Player start position: (%d, %d), Direction: %d", + player_node->mX, player_node->mY, direction); + state = STATE_GAME; + break; + + case SMSG_SERVER_PING: + // We ignore this for now + // int tick = msg.readInt32() + break; + + case SMSG_WHO_ANSWER: + localChatTab->chatLog("Online users: " + toString(msg.readInt32()), + BY_SERVER); + break; + } +} + +void MapHandler::connect() +{ + // TODO +} + +void MapHandler::mapLoaded(const std::string &mapName) +{ + MessageOut outMsg(CMSG_MAP_LOADED); +} + +void MapHandler::who() +{ + MessageOut outMsg(0x00c1); +} + +void MapHandler::quit() +{ + MessageOut outMsg(CMSG_CLIENT_QUIT); +} diff --git a/src/net/ea/maphandler.h b/src/net/ea/maphandler.h new file mode 100644 index 00000000..c264cf10 --- /dev/null +++ b/src/net/ea/maphandler.h @@ -0,0 +1,46 @@ +/* + * The Mana World + * Copyright (C) 2004 The Mana World Development Team + * + * This file is part of The Mana World. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef NET_EA_MAPHANDLER_H +#define NET_EA_MAPHANDLER_H + +#include "net/messagehandler.h" +#include "net/net.h" + +class MapHandler : public MessageHandler, public Net::MapHandler +{ + public: + MapHandler(); + + virtual void handleMessage(MessageIn &msg); + + virtual void connect(); + + virtual void mapLoaded(const std::string &mapName); + + virtual void who(); + + virtual void quit(); +}; + +extern MapHandler *mapHandler; + +#endif // NET_EA_MAPHANDLER_H diff --git a/src/net/ea/protocol.h b/src/net/ea/protocol.h index 5a2260e6..356b34a4 100644 --- a/src/net/ea/protocol.h +++ b/src/net/ea/protocol.h @@ -117,6 +117,8 @@ static const int STORAGE_OFFSET = 1; #define SMSG_PLAYER_STORAGE_REMOVE 0x00f6 /**< Remove item/equip from storage */ #define SMSG_PLAYER_STORAGE_CLOSE 0x00f8 /**< Storage access closed */ +#define SMSG_ADMIN_KICK_ACK 0x00cd + /********************************** * Packets from client to server * **********************************/ @@ -166,6 +168,7 @@ static const int STORAGE_OFFSET = 1; #define CMSG_ADMIN_LOCAL_ANNOUNCE 0x019C #define CMSG_ADMIN_HIDE 0x019D #define CMSG_ADMIN_KICK 0x00CC +#define CMSG_ADMIN_MUTE 0x0149 /** Encodes coords and direction in 3 bytes data */ void set_coordinates(char *data, unsigned short x, unsigned short y, unsigned char direction); |