summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJared Adams <jaxad0127@gmail.com>2009-04-02 06:08:23 -0600
committerJared Adams <jaxad0127@gmail.com>2009-04-02 06:10:19 -0600
commit128f908908b77b242b749b27879ba2a9f70a94f6 (patch)
tree613c7966a2711189b999bbed152294f3659f70f9
parented907c859026ad2133858012b4798f7c074366c4 (diff)
downloadmana-128f908908b77b242b749b27879ba2a9f70a94f6.tar.gz
mana-128f908908b77b242b749b27879ba2a9f70a94f6.tar.bz2
mana-128f908908b77b242b749b27879ba2a9f70a94f6.tar.xz
mana-128f908908b77b242b749b27879ba2a9f70a94f6.zip
Add some missing handler for eAthena
Also expand aAthena's AdminHandler
-rw-r--r--src/game.cpp3
-rw-r--r--src/game.h1
-rw-r--r--src/gui/popupmenu.cpp17
-rw-r--r--src/net/adminhandler.h2
-rw-r--r--src/net/ea/adminhandler.cpp32
-rw-r--r--src/net/ea/adminhandler.h2
-rw-r--r--src/net/ea/maphandler.cpp117
-rw-r--r--src/net/ea/maphandler.h46
-rw-r--r--src/net/ea/protocol.h3
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());
diff --git a/src/game.h b/src/game.h
index 4491621a..60de5cd9 100644
--- a/src/game.h
+++ b/src/game.h
@@ -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);