summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--data/graphics/gui/Makefile.am1
-rw-r--r--data/graphics/gui/sticky_button.pngbin0 -> 640 bytes
-rw-r--r--src/Makefile.am16
-rw-r--r--src/beingmanager.cpp39
-rw-r--r--src/beingmanager.h16
-rw-r--r--src/commandhandler.cpp313
-rw-r--r--src/commandhandler.h52
-rw-r--r--src/engine.cpp23
-rw-r--r--src/engine.h12
-rw-r--r--src/equipment.cpp8
-rw-r--r--src/equipment.h4
-rw-r--r--src/game.cpp88
-rw-r--r--src/gui/browserbox.cpp3
-rw-r--r--src/gui/buy.cpp10
-rw-r--r--src/gui/buy.h10
-rw-r--r--src/gui/buysell.cpp22
-rw-r--r--src/gui/buysell.h7
-rw-r--r--src/gui/changeemaildialog.cpp6
-rw-r--r--src/gui/changepassworddialog.cpp8
-rw-r--r--src/gui/char_select.cpp88
-rw-r--r--src/gui/char_select.h14
-rw-r--r--src/gui/chat.cpp47
-rw-r--r--src/gui/chat.h35
-rw-r--r--src/gui/emotecontainer.cpp3
-rw-r--r--src/gui/emoteshortcutcontainer.cpp3
-rw-r--r--src/gui/equipmentwindow.cpp3
-rw-r--r--src/gui/guildwindow.cpp36
-rw-r--r--src/gui/inventorywindow.cpp9
-rw-r--r--src/gui/itemcontainer.cpp14
-rw-r--r--src/gui/itemcontainer.h12
-rw-r--r--src/gui/itemshortcutcontainer.cpp4
-rw-r--r--src/gui/listbox.cpp2
-rw-r--r--src/gui/minimap.cpp13
-rw-r--r--src/gui/npc_text.cpp13
-rw-r--r--src/gui/npc_text.h10
-rw-r--r--src/gui/npcintegerdialog.cpp10
-rw-r--r--src/gui/npcintegerdialog.h10
-rw-r--r--src/gui/npclistdialog.cpp10
-rw-r--r--src/gui/npclistdialog.h11
-rw-r--r--src/gui/npcpostdialog.cpp22
-rw-r--r--src/gui/npcstringdialog.cpp10
-rw-r--r--src/gui/npcstringdialog.h11
-rw-r--r--src/gui/partywindow.cpp38
-rw-r--r--src/gui/partywindow.h3
-rw-r--r--src/gui/playerbox.cpp3
-rw-r--r--src/gui/popup.cpp3
-rw-r--r--src/gui/popupmenu.cpp3
-rw-r--r--src/gui/radiobutton.cpp3
-rw-r--r--src/gui/scrollarea.cpp3
-rw-r--r--src/gui/sell.cpp10
-rw-r--r--src/gui/sell.h10
-rw-r--r--src/gui/serverdialog.cpp4
-rw-r--r--src/gui/setup_colors.cpp2
-rw-r--r--src/gui/shoplistbox.cpp2
-rw-r--r--src/gui/shortcutcontainer.cpp8
-rw-r--r--src/gui/skill.h5
-rw-r--r--src/gui/skilldialog.cpp60
-rw-r--r--src/gui/skilldialog.h15
-rw-r--r--src/gui/skin.cpp15
-rw-r--r--src/gui/skin.h10
-rw-r--r--src/gui/status.cpp3
-rw-r--r--src/gui/storagewindow.cpp20
-rw-r--r--src/gui/storagewindow.h4
-rw-r--r--src/gui/table.cpp2
-rw-r--r--src/gui/textfield.cpp3
-rw-r--r--src/gui/trade.cpp36
-rw-r--r--src/gui/trade.h11
-rw-r--r--src/gui/unregisterdialog.cpp2
-rw-r--r--src/gui/widgets/channeltab.cpp34
-rw-r--r--src/gui/widgets/channeltab.h2
-rw-r--r--src/gui/widgets/chattab.cpp75
-rw-r--r--src/gui/widgets/chattab.h21
-rw-r--r--src/gui/widgets/dropdown.cpp3
-rw-r--r--src/gui/widgets/whispertab.cpp36
-rw-r--r--src/gui/widgets/whispertab.h4
-rw-r--r--src/gui/window.cpp63
-rw-r--r--src/gui/window.h18
-rw-r--r--src/inventory.cpp12
-rw-r--r--src/inventory.h13
-rw-r--r--src/keyboardconfig.cpp2
-rw-r--r--src/keyboardconfig.h2
-rw-r--r--src/localplayer.cpp83
-rw-r--r--src/localplayer.h26
-rw-r--r--src/log.cpp2
-rw-r--r--src/main.cpp38
-rw-r--r--src/map.cpp8
-rw-r--r--src/monster.cpp4
-rw-r--r--src/net/ea/beinghandler.cpp43
-rw-r--r--src/net/ea/buysellhandler.cpp5
-rw-r--r--src/net/ea/chathandler.cpp2
-rw-r--r--src/net/ea/equipmenthandler.cpp47
-rw-r--r--src/net/ea/gui/partytab.cpp53
-rw-r--r--src/net/ea/gui/partytab.h51
-rw-r--r--src/net/ea/inventoryhandler.cpp107
-rw-r--r--src/net/ea/network.cpp9
-rw-r--r--src/net/ea/network.h8
-rw-r--r--src/net/ea/party.cpp (renamed from src/party.cpp)74
-rw-r--r--src/net/ea/party.h (renamed from src/party.h)53
-rw-r--r--src/net/ea/partyhandler.cpp31
-rw-r--r--src/net/ea/partyhandler.h9
-rw-r--r--src/net/ea/playerhandler.cpp11
-rw-r--r--src/net/ea/protocol.h5
-rw-r--r--src/net/ea/skillhandler.cpp3
-rw-r--r--src/net/ea/tradehandler.cpp3
-rw-r--r--src/net/messageout.cpp11
-rw-r--r--src/net/messageout.h4
-rw-r--r--src/net/tmwserv/beinghandler.cpp5
-rw-r--r--src/net/tmwserv/partyhandler.cpp3
-rw-r--r--src/net/tmwserv/playerhandler.cpp3
-rw-r--r--src/net/tmwserv/tradehandler.cpp3
-rw-r--r--src/npc.cpp12
-rw-r--r--src/npc.h14
-rw-r--r--src/player.cpp4
-rw-r--r--src/player.h5
-rw-r--r--src/statuseffect.cpp4
115 files changed, 1103 insertions, 1231 deletions
diff --git a/data/graphics/gui/Makefile.am b/data/graphics/gui/Makefile.am
index aaaac211..78541225 100644
--- a/data/graphics/gui/Makefile.am
+++ b/data/graphics/gui/Makefile.am
@@ -28,6 +28,7 @@ gui_DATA = \
resize.png \
selection.png \
slider.png \
+ sticky_button.png \
speechbubble.xml \
tab.png \
tabselected.png \
diff --git a/data/graphics/gui/sticky_button.png b/data/graphics/gui/sticky_button.png
new file mode 100644
index 00000000..d25fa81c
--- /dev/null
+++ b/data/graphics/gui/sticky_button.png
Binary files differ
diff --git a/src/Makefile.am b/src/Makefile.am
index 4c5893ac..81e40d06 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -33,8 +33,6 @@ tmw_SOURCES = gui/widgets/avatar.cpp \
gui/button.h \
gui/buy.cpp \
gui/buy.h \
- gui/buysell.cpp \
- gui/buysell.h \
gui/char_select.cpp \
gui/char_select.h \
gui/chat.cpp \
@@ -104,6 +102,8 @@ tmw_SOURCES = gui/widgets/avatar.cpp \
gui/ok_dialog.h \
gui/palette.cpp \
gui/palette.h \
+ gui/partywindow.cpp \
+ gui/partywindow.h \
gui/passwordfield.cpp \
gui/passwordfield.h \
gui/playerbox.cpp \
@@ -357,8 +357,6 @@ tmw_SOURCES += \
gui/magic.h \
gui/npcpostdialog.cpp \
gui/npcpostdialog.h \
- gui/partywindow.cpp \
- gui/partywindow.h \
gui/quitdialog.cpp \
gui/quitdialog.h \
gui/serverdialog.cpp \
@@ -431,6 +429,8 @@ endif
if SERVER_EATHENA
tmw_CXXFLAGS += -DEATHENA_SUPPORT
tmw_SOURCES += \
+ gui/buysell.cpp \
+ gui/buysell.h \
gui/char_server.cpp \
gui/char_server.h \
gui/skill.cpp \
@@ -439,6 +439,8 @@ tmw_SOURCES += \
gui/status.h \
gui/storagewindow.cpp \
gui/storagewindow.h \
+ net/ea/gui/partytab.cpp \
+ net/ea/gui/partytab.h \
net/ea/beinghandler.cpp \
net/ea/beinghandler.h \
net/ea/buysellhandler.cpp \
@@ -461,6 +463,8 @@ tmw_SOURCES += \
net/ea/network.h \
net/ea/npchandler.cpp \
net/ea/npchandler.h \
+ net/ea/party.cpp \
+ net/ea/party.h \
net/ea/partyhandler.cpp \
net/ea/partyhandler.h \
net/ea/playerhandler.cpp \
@@ -470,9 +474,7 @@ tmw_SOURCES += \
net/ea/skillhandler.cpp \
net/ea/skillhandler.h \
net/ea/tradehandler.cpp \
- net/ea/tradehandler.h \
- party.cpp \
- party.h
+ net/ea/tradehandler.h
endif
# set the include path found by configure
diff --git a/src/beingmanager.cpp b/src/beingmanager.cpp
index d72c4ee4..8c07aaab 100644
--- a/src/beingmanager.cpp
+++ b/src/beingmanager.cpp
@@ -59,12 +59,9 @@ class FindBeingFunctor
Being::Type type;
} beingFinder;
-#ifdef EATHENA_SUPPORT
-BeingManager::BeingManager(Network *network):
- mNetwork(network)
+BeingManager::BeingManager()
{
}
-#endif
BeingManager::~BeingManager()
{
@@ -84,47 +81,27 @@ void BeingManager::setPlayer(LocalPlayer *player)
mBeings.push_back(player);
}
-#ifdef TMWSERV_SUPPORT
-Being *BeingManager::createBeing(int id, int type, int subtype)
-#else
-Being *BeingManager::createBeing(int id, Uint16 job)
-#endif
+Being *BeingManager::createBeing(int id, Being::Type type, int subtype)
{
Being *being;
-#ifdef TMWSERV_SUPPORT
switch (type)
{
- case OBJECT_PLAYER:
+ case Being::PLAYER:
being = new Player(id, subtype, mMap);
break;
- case OBJECT_NPC:
+ case Being::NPC:
being = new NPC(id, subtype, mMap);
break;
- case OBJECT_MONSTER:
+ case Being::MONSTER:
being = new Monster(id, subtype, mMap);
break;
+ case Being::UNKNOWN:
+ being = new Being(id, subtype, mMap);
+ break;
default:
assert(false);
}
-#else
- if (job <= 25 || (job >= 4001 && job <= 4049))
- being = new Player(id, job, mMap);
- else if (job >= 46 && job <= 1000)
- being = new NPC(id, job, mMap, mNetwork);
- else if (job > 1000 && job <= 2000)
- being = new Monster(id, job, mMap);
- else
- being = new Being(id, job, mMap);
-
- // Player or NPC
- if (job <= 1000 || (job >= 4001 && job <= 4049))
- {
- MessageOut outMsg(mNetwork);
- outMsg.writeInt16(0x0094);
- outMsg.writeInt32(id);//readLong(2));
- }
-#endif
mBeings.push_back(being);
return being;
diff --git a/src/beingmanager.h b/src/beingmanager.h
index 109564fa..727918a8 100644
--- a/src/beingmanager.h
+++ b/src/beingmanager.h
@@ -26,9 +26,6 @@
class LocalPlayer;
class Map;
-#ifdef EATHENA_SUPPORT
-class Network;
-#endif
typedef std::list<Being*> Beings;
typedef Beings::iterator BeingIterator;
@@ -36,9 +33,7 @@ typedef Beings::iterator BeingIterator;
class BeingManager
{
public:
-#ifdef EATHENA_SUPPORT
- BeingManager(Network *network);
-#endif
+ BeingManager();
~BeingManager();
@@ -55,11 +50,7 @@ class BeingManager
/**
* Create a being and add it to the list of beings.
*/
-#ifdef TMWSERV_SUPPORT
- Being *createBeing(int id, int type, int subtype);
-#else
- Being *createBeing(int id, Uint16 job);
-#endif
+ Being *createBeing(int id, Being::Type type, int subtype);
/**
* Remove a Being.
@@ -130,9 +121,6 @@ class BeingManager
protected:
Beings mBeings;
Map *mMap;
-#ifdef EATHENA_SUPPORT
- Network *mNetwork;
-#endif
};
extern BeingManager *beingManager;
diff --git a/src/commandhandler.cpp b/src/commandhandler.cpp
index 7ccd7d80..f2da21e0 100644
--- a/src/commandhandler.cpp
+++ b/src/commandhandler.cpp
@@ -34,8 +34,8 @@
#include "net/tmwserv/chatserver/chatserver.h"
#include "net/tmwserv/gameserver/player.h"
#else
-#include "party.h"
#include "net/messageout.h"
+#include "net/ea/party.h"
#include "net/ea/protocol.h"
#endif
@@ -43,15 +43,10 @@
#include "utils/stringutils.h"
#include "utils/strprintf.h"
-#ifdef TMWSERV_SUPPORT
CommandHandler::CommandHandler()
-#else
-CommandHandler::CommandHandler(Network *network):
- mNetwork(network)
-#endif
{}
-void CommandHandler::handleCommand(const std::string &command)
+void CommandHandler::handleCommand(const std::string &command, ChatTab *tab)
{
std::string::size_type pos = command.find(' ');
std::string type(command, 0, pos);
@@ -59,292 +54,284 @@ void CommandHandler::handleCommand(const std::string &command)
if (type == "announce")
{
- handleAnnounce(args);
+ handleAnnounce(args, tab);
}
else if (type == "help")
{
- handleHelp(args);
+ handleHelp(args, tab);
}
else if (type == "where")
{
- handleWhere();
+ handleWhere(args, tab);
}
else if (type == "who")
{
- handleWho();
+ handleWho(args, tab);
}
else if (type == "msg" || type == "whisper" || type == "w")
{
- handleMsg(args);
+ handleMsg(args, tab);
}
#ifdef TMWSERV_SUPPORT
else if (type == "join")
{
- handleJoin(args);
+ handleJoin(args, tab);
}
else if (type == "list")
{
- handleListChannels();
+ handleListChannels(args, tab);
}
else if (type == "users")
{
- handleListUsers();
+ handleListUsers(args, tab);
}
else if (type == "quit")
{
- handleQuit();
+ handleQuit(args, tab);
}
else if (type == "topic")
{
- handleTopic(args);
+ handleTopic(args, tab);
}
else if (type == "clear")
{
- handleClear();
+ handleClear(args, tab);
}
else if (type == "op")
{
- handleOp(args);
+ handleOp(args, tab);
}
else if (type == "kick")
{
- handleKick(args);
+ handleKick(args, tab);
}
#endif
else if (type == "party")
{
- handleParty(args);
+ handleParty(args, tab);
}
else if (type == "me")
{
- handleMe(args);
+ handleMe(args, tab);
}
else if (type == "record")
{
- handleRecord(args);
+ handleRecord(args, tab);
}
else if (type == "toggle")
{
- handleToggle(args);
+ handleToggle(args, tab);
}
else if (type == "present")
{
- handlePresent(args);
+ handlePresent(args, tab);
}
else
{
- localChatTab->chatLog("Unknown command");
+ tab->chatLog("Unknown command");
}
}
-void CommandHandler::handleAnnounce(const std::string &args)
+void CommandHandler::handleAnnounce(const std::string &args, ChatTab *tab)
{
#ifdef TMWSERV_SUPPORT
Net::ChatServer::announce(args);
#else
- MessageOut outMsg(mNetwork);
- outMsg.writeInt16(0x0099);
+ MessageOut outMsg(0x0099);
outMsg.writeInt16(args.length() + 4);
outMsg.writeString(args, args.length());
#endif
}
-void CommandHandler::handleHelp(const std::string &args)
+void CommandHandler::handleHelp(const std::string &args, ChatTab *tab)
{
if (args == "")
{
- localChatTab->chatLog(_("-- Help --"));
- localChatTab->chatLog(_("/help > Display this help."));
+ tab->chatLog(_("-- Help --"));
+ tab->chatLog(_("/help > Display this help."));
- localChatTab->chatLog(_("/where > Display map name"));
- localChatTab->chatLog(_("/who > Display number of online users"));
- localChatTab->chatLog(_("/me > Tell something about yourself"));
+ tab->chatLog(_("/where > Display map name"));
+ tab->chatLog(_("/who > Display number of online users"));
+ tab->chatLog(_("/me > Tell something about yourself"));
- localChatTab->chatLog(_("/msg > Send a private message to a user"));
- localChatTab->chatLog(_("/whisper > Alias of msg"));
- localChatTab->chatLog(_("/w > Alias of msg"));
- localChatTab->chatLog(_("/close > Close the whisper tab (only works in whisper tabs)"));
+ tab->chatLog(_("/msg > Send a private message to a user"));
+ tab->chatLog(_("/whisper > Alias of msg"));
+ tab->chatLog(_("/w > Alias of msg"));
+ tab->chatLog(_("/close > Close the whisper tab (only works in whisper tabs)"));
#ifdef TMWSERV_SUPPORT
- localChatTab->chatLog(_("/list > Display all public channels"));
- localChatTab->chatLog(_("/users > Lists the users in the current channel"));
- localChatTab->chatLog(_("/join > Join or create a channel"));
- localChatTab->chatLog(_("/topic > Set the topic of the current channel"));
- localChatTab->chatLog(_("/quit > Leave a channel"));
- localChatTab->chatLog(_("/clear > Clears this window"));
- localChatTab->chatLog(_("/op > Make a user a channel operator"));
- localChatTab->chatLog(_("/kick > Kick a user from the channel"));
-
- localChatTab->chatLog(_("/party > Invite a user to party"));
+ tab->chatLog(_("/list > Display all public channels"));
+ tab->chatLog(_("/users > Lists the users in the current channel"));
+ tab->chatLog(_("/join > Join or create a channel"));
+ tab->chatLog(_("/topic > Set the topic of the current channel"));
+ tab->chatLog(_("/quit > Leave a channel"));
+ tab->chatLog(_("/clear > Clears this window"));
+ tab->chatLog(_("/op > Make a user a channel operator"));
+ tab->chatLog(_("/kick > Kick a user from the channel"));
+
+ tab->chatLog(_("/party > Invite a user to party"));
#else
- localChatTab->chatLog(_("/party > Party-related commands"));
+ tab->chatLog(_("/party > Party-related commands"));
#endif
- localChatTab->chatLog(_("/record > Start recording the chat to an external file"));
- localChatTab->chatLog(_("/toggle > Determine whether <return> toggles the chat log"));
- localChatTab->chatLog(_("/present > Get list of players present (sent to chat log, if logging)"));
+ tab->chatLog(_("/record > Start recording the chat to an external file"));
+ tab->chatLog(_("/toggle > Determine whether <return> toggles the chat log"));
+ tab->chatLog(_("/present > Get list of players present (sent to chat log, if logging)"));
- localChatTab->chatLog(_("/announce > Global announcement (GM only)"));
+ tab->chatLog(_("/announce > Global announcement (GM only)"));
- localChatTab->chatLog(_("For more information, type /help <command>"));
+ tab->chatLog(_("For more information, type /help <command>"));
}
else if (args == "announce")
{
- localChatTab->chatLog(_("Command: /announce <msg>"));
- localChatTab->chatLog(_("*** only available to a GM ***"));
- localChatTab->chatLog(_("This command sends the message <msg> to "
+ tab->chatLog(_("Command: /announce <msg>"));
+ tab->chatLog(_("*** only available to a GM ***"));
+ tab->chatLog(_("This command sends the message <msg> to "
"all players currently online."));
}
else if (args == "clear")
{
- localChatTab->chatLog(_("Command: /clear"));
- localChatTab->chatLog(_("This command clears the chat log of previous chat."));
+ tab->chatLog(_("Command: /clear"));
+ tab->chatLog(_("This command clears the chat log of previous chat."));
}
else if (args == "help")
{
- localChatTab->chatLog(_("Command: /help"));
- localChatTab->chatLog(_("This command displays a list of all commands available."));
- localChatTab->chatLog(_("Command: /help <command>"));
- localChatTab->chatLog(_("This command displays help on <command>."));
+ tab->chatLog(_("Command: /help"));
+ tab->chatLog(_("This command displays a list of all commands available."));
+ tab->chatLog(_("Command: /help <command>"));
+ tab->chatLog(_("This command displays help on <command>."));
}
else if (args == "join")
{
- localChatTab->chatLog(_("Command: /join <channel>"));
- localChatTab->chatLog(_("This command makes you enter <channel>."));
- localChatTab->chatLog(_("If <channel> doesn't exist, it's created."));
+ tab->chatLog(_("Command: /join <channel>"));
+ tab->chatLog(_("This command makes you enter <channel>."));
+ tab->chatLog(_("If <channel> doesn't exist, it's created."));
}
else if (args == "kick")
{
- localChatTab->chatLog(_("Command: /kick <nick>"));
- localChatTab->chatLog(_("This command makes <nick> leave the channel."));
- localChatTab->chatLog(_("If the <nick> has spaces in it, enclose it in "
+ tab->chatLog(_("Command: /kick <nick>"));
+ tab->chatLog(_("This command makes <nick> leave the channel."));
+ tab->chatLog(_("If the <nick> has spaces in it, enclose it in "
"double quotes (\")."));
}
else if (args == "list")
{
- localChatTab->chatLog(_("Command: /list"));
- localChatTab->chatLog(_("This command shows a list of all channels."));
+ tab->chatLog(_("Command: /list"));
+ tab->chatLog(_("This command shows a list of all channels."));
}
else if (args == "me")
{
- localChatTab->chatLog(_("Command: /me <message>"));
- localChatTab->chatLog(_("This command tell others you are (doing) <msg>."));
+ tab->chatLog(_("Command: /me <message>"));
+ tab->chatLog(_("This command tell others you are (doing) <msg>."));
}
else if (args == "msg" || args == "whisper" || args == "w")
{
- localChatTab->chatLog(_("Command: /msg <nick> <message>"));
- localChatTab->chatLog(_("Command: /whisper <nick> <message>"));
- localChatTab->chatLog(_("Command: /w <nick> <message>"));
- localChatTab->chatLog(_("This command sends the text <message> to <nick>."));
- localChatTab->chatLog(_("If the <nick> has spaces in it, enclose it in "
+ tab->chatLog(_("Command: /msg <nick> <message>"));
+ tab->chatLog(_("Command: /whisper <nick> <message>"));
+ tab->chatLog(_("Command: /w <nick> <message>"));
+ tab->chatLog(_("This command sends the text <message> to <nick>."));
+ tab->chatLog(_("If the <nick> has spaces in it, enclose it in "
"double quotes (\")."));
}
else if (args == "op")
{
- localChatTab->chatLog(_("Command: /op <nick>"));
- localChatTab->chatLog(_("This command makes <nick> a channel operator."));
- localChatTab->chatLog(_("If the <nick> has spaces in it, enclose it in "
+ tab->chatLog(_("Command: /op <nick>"));
+ tab->chatLog(_("This command makes <nick> a channel operator."));
+ tab->chatLog(_("If the <nick> has spaces in it, enclose it in "
"double quotes (\")."));
- localChatTab->chatLog(_("Channel operators can kick and op other users "
+ tab->chatLog(_("Channel operators can kick and op other users "
"from the channel."));
}
#ifdef TMWSERV_SUPPORT
else if (args == "party")
{
- localChatTab->chatLog(_("Command: /party <nick>"));
- localChatTab->chatLog(_("This command invites <nick> to party with you."));
- localChatTab->chatLog(_("If the <nick> has spaces in it, enclose it in "
+ tab->chatLog(_("Command: /party <nick>"));
+ tab->chatLog(_("This command invites <nick> to party with you."));
+ tab->chatLog(_("If the <nick> has spaces in it, enclose it in "
"double quotes (\")."));
#else
else if (args.substr(0, 5) == "party")
{
- playerParty->help(args);
+ eAthena::Party::help(args);
#endif
}
else if (args == "present")
{
- localChatTab->chatLog(_("Command: /present"));
- localChatTab->chatLog(_("This command gets a list of players within hearing and "
+ tab->chatLog(_("Command: /present"));
+ tab->chatLog(_("This command gets a list of players within hearing and "
"sends it to either the record log if recording, or the chat "
"log otherwise."));
}
else if (args == "quit")
{
- localChatTab->chatLog(_("Command: /quit"));
- localChatTab->chatLog(_("This command leaves the current channel."));
- localChatTab->chatLog(_("If you're the last person in the channel, it will be deleted."));
+ tab->chatLog(_("Command: /quit"));
+ tab->chatLog(_("This command leaves the current channel."));
+ tab->chatLog(_("If you're the last person in the channel, it will be deleted."));
}
else if (args == "record")
{
- localChatTab->chatLog(_("Command: /record <filename>"));
- localChatTab->chatLog(_("This command starts recording the chat log to the file "
+ tab->chatLog(_("Command: /record <filename>"));
+ tab->chatLog(_("This command starts recording the chat log to the file "
"<filename>."));
- localChatTab->chatLog(_("Command: /record"));
- localChatTab->chatLog(_("This command finishes a recording session."));
+ tab->chatLog(_("Command: /record"));
+ tab->chatLog(_("This command finishes a recording session."));
}
else if (args == "toggle")
{
- localChatTab->chatLog(_("Command: /toggle <state>"));
- localChatTab->chatLog(_("This command sets whether the return key should toggle the "
+ tab->chatLog(_("Command: /toggle <state>"));
+ tab->chatLog(_("This command sets whether the return key should toggle the "
"chat log, or whether the chat log turns off automatically."));
- localChatTab->chatLog(_("<state> can be one of \"1\", \"yes\", \"true\" to "
+ tab->chatLog(_("<state> can be one of \"1\", \"yes\", \"true\" to "
"turn the toggle on, or \"0\", \"no\", \"false\" to turn the "
"toggle off."));
- localChatTab->chatLog(_("Command: /toggle"));
- localChatTab->chatLog(_("This command displays the return toggle status."));
+ tab->chatLog(_("Command: /toggle"));
+ tab->chatLog(_("This command displays the return toggle status."));
}
else if (args == "topic")
{
- localChatTab->chatLog(_("Command: /topic <message>"));
- localChatTab->chatLog(_("This command sets the topic to <message>."));
+ tab->chatLog(_("Command: /topic <message>"));
+ tab->chatLog(_("This command sets the topic to <message>."));
}
else if (args == "users")
{
- localChatTab->chatLog(_("Command: /users <channel>"));
- localChatTab->chatLog(_("This command shows the users in <channel>."));
+ tab->chatLog(_("Command: /users <channel>"));
+ tab->chatLog(_("This command shows the users in <channel>."));
}
else if (args == "where")
{
- localChatTab->chatLog(_("Command: /where"));
- localChatTab->chatLog(_("This command displays the name of the current map."));
+ tab->chatLog(_("Command: /where"));
+ tab->chatLog(_("This command displays the name of the current map."));
}
else if (args == "who")
{
- localChatTab->chatLog(_("Command: /who"));
- localChatTab->chatLog(_("This command displays the number of players currently "
+ tab->chatLog(_("Command: /who"));
+ tab->chatLog(_("This command displays the number of players currently "
"online."));
}
else
{
- localChatTab->chatLog(_("Unknown command."));
- localChatTab->chatLog(_("Type /help for a list of commands."));
+ tab->chatLog(_("Unknown command."));
+ tab->chatLog(_("Type /help for a list of commands."));
}
}
-void CommandHandler::handleWhere()
+void CommandHandler::handleWhere(const std::string &args, ChatTab *tab)
{
// TODO: add position
- localChatTab->chatLog(map_path, BY_SERVER);
+ tab->chatLog(map_path, BY_SERVER);
}
-void CommandHandler::handleWho()
+void CommandHandler::handleWho(const std::string &args, ChatTab *tab)
{
#ifdef TMWSERV_SUPPORT
//TODO
#else
- MessageOut outMsg(mNetwork);
- outMsg.writeInt16(0x00c1);
+ MessageOut outMsg(0x00c1);
#endif
}
-void CommandHandler::handleMsg(const std::string &args)
+void CommandHandler::handleMsg(const std::string &args, ChatTab *tab)
{
-#ifdef TMWSERV_SUPPORT
- std::string::size_type pos = args.find(' ');
- std::string recipient(args, 0, pos);
- std::string text(args, pos+1);
- Net::ChatServer::privMsg(recipient, text);
-#else
std::string recvnick = "";
std::string msg = "";
@@ -390,68 +377,67 @@ void CommandHandler::handleMsg(const std::string &args)
chatWindow->whisper(recvnick, msg, true);
}
else
- localChatTab->chatLog("Cannont send empty whispers!");
-#endif
+ tab->chatLog("Cannont send empty whispers!");
}
-void CommandHandler::handleClear()
+void CommandHandler::handleClear(const std::string &args, ChatTab *tab)
{
chatWindow->clearTab();
}
#ifdef TMWSERV_SUPPORT
-void CommandHandler::handleJoin(const std::string &args)
+void CommandHandler::handleJoin(const std::string &args, ChatTab *tab)
{
std::string::size_type pos = args.find(' ');
std::string name(args, 0, pos);
std::string password(args, pos+1);
- localChatTab->chatLog("Requesting to join channel " + name);
+ tab->chatLog("Requesting to join channel " + name);
Net::ChatServer::enterChannel(name, password);
}
-void CommandHandler::handleListChannels()
+void CommandHandler::handleListChannels(const std::string &args, ChatTab *tab)
{
Net::ChatServer::getChannelList();
}
-void CommandHandler::handleListUsers()
+void CommandHandler::handleListUsers(const std::string &args, ChatTab *tab)
{
Net::ChatServer::getUserList(chatWindow->getFocused()->getCaption());
}
-void CommandHandler::handleTopic(const std::string &args)
+void CommandHandler::handleTopic(const std::string &args, ChatTab *tab)
{
- ChannelTab *tab = dynamic_cast<ChannelTab*>(chatWindow->getFocused());
- Channel *channel = tab ? tab->getChannel() : NULL;
+ ChannelTab *channelTab = dynamic_cast<ChannelTab*>(tab);
+ Channel *channel = channelTab ? channelTab->getChannel() : NULL;
if (channel)
{
Net::ChatServer::setChannelTopic(channel->getId(), args);
}
else
{
- localChatTab->chatLog("Unable to set this channel's topic", BY_CHANNEL);
+ tab->chatLog("Unable to set this channel's topic", BY_CHANNEL);
}
}
-void CommandHandler::handleQuit()
+void CommandHandler::handleQuit(const std::string &args, ChatTab *tab)
{
- ChannelTab *tab = dynamic_cast<ChannelTab*>(chatWindow->getFocused());
- Channel *channel = tab ? tab->getChannel() : NULL;
+ ChannelTab *channelTab = dynamic_cast<ChannelTab*>(tab);
+ Channel *channel = channelTab ? channelTab->getChannel() : NULL;
if (channel)
{
Net::ChatServer::quitChannel(channel->getId());
}
else
{
- localChatTab->chatLog("Unable to quit this channel", BY_CHANNEL);
+ tab->chatLog("Unable to quit this channel", BY_CHANNEL);
}
}
-void CommandHandler::handleOp(const std::string &args)
+void CommandHandler::handleOp(const std::string &args, ChatTab *tab)
{
- ChannelTab *tab = dynamic_cast<ChannelTab*>(chatWindow->getFocused());
- Channel *channel = tab ? tab->getChannel() : NULL;
+ ChannelTab *channelTab = dynamic_cast<ChannelTab*>(tab);
+ Channel *channel = channelTab ? channelTab->getChannel() : NULL;
if (channel)
{
// set the user mode 'o' to op a user
@@ -462,14 +448,14 @@ void CommandHandler::handleOp(const std::string &args)
}
else
{
- localChatTab->chatLog("Unable to set this user's mode", BY_CHANNEL);
+ tab->chatLog("Unable to set this user's mode", BY_CHANNEL);
}
}
-void CommandHandler::handleKick(const std::string &args)
+void CommandHandler::handleKick(const std::string &args, ChatTab *tab)
{
- ChannelTab *tab = dynamic_cast<ChannelTab*>(chatWindow->getFocused());
- Channel *channel = tab ? tab->getChannel() : NULL;
+ ChannelTab *channelTab = dynamic_cast<ChannelTab*>(tab);
+ Channel *channel = channelTab ? channelTab->getChannel() : NULL;
if (channel)
{
if (args != "")
@@ -479,13 +465,13 @@ void CommandHandler::handleKick(const std::string &args)
}
else
{
- localChatTab->chatLog("Unable to kick user", BY_CHANNEL);
+ tab->chatLog("Unable to kick user", BY_CHANNEL);
}
}
#endif
-void CommandHandler::handleParty(const std::string &args)
+void CommandHandler::handleParty(const std::string &args, ChatTab *tab)
{
#ifdef TMWSERV_SUPPORT
if (args != "")
@@ -495,7 +481,7 @@ void CommandHandler::handleParty(const std::string &args)
#else
if (args.empty())
{
- localChatTab->chatLog(_("Unknown party command... Type \"/help\" party for more "
+ tab->chatLog(_("Unknown party command... Type \"/help\" party for more "
"information."), BY_SERVER);
return;
}
@@ -520,49 +506,46 @@ void CommandHandler::handleParty(const std::string &args)
{
char temp[2] = ".";
*temp = chatWindow->getPartyPrefix();
- localChatTab->chatLog(_("The current party prefix is ") + std::string(temp));
+ tab->chatLog(_("The current party prefix is ") + std::string(temp));
}
else if (rest.length() != 1)
{
- localChatTab->chatLog(_("Party prefix must be one character long."));
+ tab->chatLog(_("Party prefix must be one character long."));
}
else
{
if (rest == "/")
{
- localChatTab->chatLog(_("Cannot use a '/' as the prefix."));
+ tab->chatLog(_("Cannot use a '/' as the prefix."));
}
else
{
chatWindow->setPartyPrefix(rest.at(0));
- localChatTab->chatLog(_("Changing prefix to ") + rest);
+ tab->chatLog(_("Changing prefix to ") + rest);
}
}
}
else
- playerParty->respond(command, rest);
+ eAthena::Party::respond(command, rest);
#endif
}
-void CommandHandler::handleMe(const std::string &args)
+void CommandHandler::handleMe(const std::string &args, ChatTab *tab)
{
std::string action = strprintf("*%s*", args.c_str());
- chatWindow->chatSend(action);
- //std::stringstream actionStr;
- //actionStr << "*" << args << "*";
- //chatWindow->chatSend(actionStr.str());
+ chatWindow->chatInput(action);
}
-void CommandHandler::handleRecord(const std::string &args)
+void CommandHandler::handleRecord(const std::string &args, ChatTab *tab)
{
chatWindow->setRecordingFile(args);
}
-void CommandHandler::handleToggle(const std::string &args)
+void CommandHandler::handleToggle(const std::string &args, ChatTab *tab)
{
if (args.empty())
{
- localChatTab->chatLog(chatWindow->getReturnTogglesChat() ?
+ tab->chatLog(chatWindow->getReturnTogglesChat() ?
_("Return toggles chat.") : _("Message closes chat."));
return;
}
@@ -573,7 +556,7 @@ void CommandHandler::handleToggle(const std::string &args)
opt == "y" || opt == "Y" ||
opt == "t" || opt == "T")
{
- localChatTab->chatLog(_("Return now toggles chat."));
+ tab->chatLog(_("Return now toggles chat."));
chatWindow->setReturnTogglesChat(true);
return;
}
@@ -581,16 +564,16 @@ void CommandHandler::handleToggle(const std::string &args)
opt == "n" || opt == "N" ||
opt == "f" || opt == "F")
{
- localChatTab->chatLog(_("Message now closes chat."));
+ tab->chatLog(_("Message now closes chat."));
chatWindow->setReturnTogglesChat(false);
return;
}
else
- localChatTab->chatLog(_("Options to /toggle are \"yes\", \"no\", \"true\", "
+ tab->chatLog(_("Options to /toggle are \"yes\", \"no\", \"true\", "
"\"false\", \"1\", \"0\"."));
}
-void CommandHandler::handlePresent(const std::string &args)
+void CommandHandler::handlePresent(const std::string &args, ChatTab *tab)
{
chatWindow->doPresent();
}
diff --git a/src/commandhandler.h b/src/commandhandler.h
index 2adf4e1b..b9b61647 100644
--- a/src/commandhandler.h
+++ b/src/commandhandler.h
@@ -24,9 +24,9 @@
#include <string>
-#ifdef EATHENA_SUPPORT
-class Network;
-#endif
+class ChatTab;
+
+extern ChatTab *localChatTab;
/**
* A class to parse and handle user commands
@@ -37,11 +37,7 @@ class CommandHandler
/**
* Constructor
*/
-#ifdef TMWSERV_SUPPORT
CommandHandler();
-#else
- CommandHandler(Network *network);
-#endif
/**
* Destructor
@@ -51,102 +47,98 @@ class CommandHandler
/**
* Parse and handle the given command.
*/
- void handleCommand(const std::string &command);
+ void handleCommand(const std::string &command, ChatTab *tab = localChatTab);
private:
/**
* Handle an announce command.
*/
- void handleAnnounce(const std::string &args);
+ void handleAnnounce(const std::string &args, ChatTab *tab);
/**
* Handle a help command.
*/
- void handleHelp(const std::string &args);
+ void handleHelp(const std::string &args, ChatTab *tab);
/**
* Handle a where command.
*/
- void handleWhere();
+ void handleWhere(const std::string &args, ChatTab *tab);
/**
* Handle a who command.
*/
- void handleWho();
+ void handleWho(const std::string &args, ChatTab *tab);
/**
* Handle a msg command.
*/
- void handleMsg(const std::string &args);
+ void handleMsg(const std::string &args, ChatTab *tab);
/**
* Handle a join command.
*/
- void handleJoin(const std::string &args);
+ void handleJoin(const std::string &args, ChatTab *tab);
/**
* Handle a listchannels command.
*/
- void handleListChannels();
+ void handleListChannels(const std::string &args, ChatTab *tab);
/**
* Handle a listusers command.
*/
- void handleListUsers();
+ void handleListUsers(const std::string &args, ChatTab *tab);
/**
* Handle a topic command.
*/
- void handleTopic(const std::string &args);
+ void handleTopic(const std::string &args, ChatTab *tab);
/**
* Handle a quit command.
*/
- void handleQuit();
+ void handleQuit(const std::string &args, ChatTab *tab);
/**
* Handle a clear command.
*/
- void handleClear();
+ void handleClear(const std::string &args, ChatTab *tab);
/**
* Handle a party command.
*/
- void handleParty(const std::string &args);
+ void handleParty(const std::string &args, ChatTab *tab);
/**
* Handle a op command.
*/
- void handleOp(const std::string &args);
+ void handleOp(const std::string &args, ChatTab *tab);
/**
* Handle a kick command.
*/
- void handleKick(const std::string &args);
+ void handleKick(const std::string &args, ChatTab *tab);
/**
* Handle a me command.
*/
- void handleMe(const std::string &args);
+ void handleMe(const std::string &args, ChatTab *tab);
/**
* Handle a record command.
*/
- void handleRecord(const std::string &args);
+ void handleRecord(const std::string &args, ChatTab *tab);
/**
* Handle a toggle command.
*/
- void handleToggle(const std::string &args);
+ void handleToggle(const std::string &args, ChatTab *tab);
/**
* Handle a present command.
*/
- void handlePresent(const std::string &args);
-
-#ifdef EATHENA_SUPPORT
- Network *mNetwork;
-#endif
+ void handlePresent(const std::string &args, ChatTab *tab);
};
extern CommandHandler *commandHandler;
diff --git a/src/engine.cpp b/src/engine.cpp
index da4eb336..04d06e38 100644
--- a/src/engine.cpp
+++ b/src/engine.cpp
@@ -33,25 +33,14 @@
#include "gui/minimap.h"
#include "gui/viewport.h"
-#ifdef EATHENA_SUPPORT
-#include "net/messageout.h"
-#include "net/ea/protocol.h"
-#endif
-
#include "resources/mapreader.h"
#include "resources/monsterdb.h"
#include "resources/resourcemanager.h"
#include "utils/stringutils.h"
-#ifdef TMWSERV_SUPPORT
Engine::Engine():
mCurrentMap(NULL)
-#else
-Engine::Engine(Network *network):
- mCurrentMap(NULL),
- mNetwork(network)
-#endif
{
}
@@ -60,7 +49,7 @@ Engine::~Engine()
delete mCurrentMap;
}
-void Engine::changeMap(const std::string &mapPath)
+bool Engine::changeMap(const std::string &mapPath)
{
// Clean up floor items, beings and particles
floorItemManager->clear();
@@ -77,11 +66,7 @@ void Engine::changeMap(const std::string &mapPath)
mMapName = mapPath;
// Store full map path in global var
-#ifdef TMWSERV_SUPPORT
map_path = "maps/" + mapPath + ".tmx";
-#else
- map_path = "maps/" + mapPath.substr(0, mapPath.rfind(".")) + ".tmx";
-#endif
ResourceManager *resman = ResourceManager::getInstance();
if (!resman->exists(map_path))
map_path += ".gz";
@@ -149,11 +134,7 @@ void Engine::changeMap(const std::string &mapPath)
mCurrentMap = newMap;
-#ifdef EATHENA_SUPPORT
- // Send "map loaded"
- MessageOut outMsg(mNetwork);
- outMsg.writeInt16(CMSG_MAP_LOADED);
-#endif
+ return true;
}
void Engine::logic()
diff --git a/src/engine.h b/src/engine.h
index 60b1f6c8..963270e8 100644
--- a/src/engine.h
+++ b/src/engine.h
@@ -25,9 +25,6 @@
#include <string>
class Map;
-#ifdef EATHENA_SUPPORT
-class Network;
-#endif
/**
* Game engine. Actually hardly does anything anymore except keeping track of
@@ -39,11 +36,7 @@ class Engine
/**
* Constructor.
*/
-#ifdef EATHENA_SUPPORT
- Engine(Network *network);
-#else
Engine();
-#endif
/**
* Destructor.
@@ -60,7 +53,7 @@ class Engine
/**
* Sets the currently active map.
*/
- void changeMap(const std::string &mapName);
+ bool changeMap(const std::string &mapName);
/**
* Performs engine logic. This method is called 100 times per second.
@@ -69,9 +62,6 @@ class Engine
private:
Map *mCurrentMap;
-#ifdef EATHENA_SUPPORT
- Network *mNetwork;
-#endif
std::string mMapName;
};
diff --git a/src/equipment.cpp b/src/equipment.cpp
index c8e58b8c..8fc09fa9 100644
--- a/src/equipment.cpp
+++ b/src/equipment.cpp
@@ -36,7 +36,7 @@ Equipment::Equipment()
#ifdef TMWSERV_SUPPORT
std::fill_n(mEquipment, EQUIPMENT_SIZE, (Item*) 0);
#else
- std::fill_n(mEquipment, EQUIPMENT_SIZE, 0);
+ std::fill_n(mEquipment, EQUIPMENT_SIZE, -1);
#endif
}
@@ -74,4 +74,10 @@ void Equipment::setEquipment(int index, int inventoryIndex)
item->setEquipped(true);
}
+void Equipment::removeEquipment(int index)
+{
+ if (index >= 0 && index < EQUIPMENT_SIZE)
+ mEquipment[index] = -1;
+}
+
#endif
diff --git a/src/equipment.h b/src/equipment.h
index 7605175a..63555361 100644
--- a/src/equipment.h
+++ b/src/equipment.h
@@ -75,7 +75,7 @@ class Equipment
/**
* Remove equipment from the given slot.
*/
- void removeEquipment(int index) { if (index >= 0 && index < EQUIPMENT_SIZE) mEquipment[index] = 0; }
+ void removeEquipment(int index);
/**
* Returns the item used in the arrow slot.
@@ -90,7 +90,7 @@ class Equipment
private:
#ifdef TMWSERV_SUPPORT
- Item* mEquipment[EQUIPMENT_SIZE];
+ Item *mEquipment[EQUIPMENT_SIZE];
#else
int mEquipment[EQUIPMENT_SIZE];
int mArrows;
diff --git a/src/game.cpp b/src/game.cpp
index 91d8fa3a..20bf1af1 100644
--- a/src/game.cpp
+++ b/src/game.cpp
@@ -43,9 +43,6 @@
#include "log.h"
#include "npc.h"
#include "particle.h"
-#ifdef EATHENA_SUPPORT
-#include "party.h"
-#endif
#include "player_relations.h"
#include "gui/widgets/chattab.h"
@@ -77,12 +74,12 @@
#include "gui/status.h"
#include "gui/trade.h"
#include "gui/viewport.h"
+#include "gui/partywindow.h"
#ifdef TMWSERV_SUPPORT
#include "gui/buddywindow.h"
#include "gui/guildwindow.h"
#include "gui/magic.h"
#include "gui/npcpostdialog.h"
-#include "gui/partywindow.h"
#include "gui/quitdialog.h"
#else
#include "gui/storagewindow.h"
@@ -157,12 +154,12 @@ NpcListDialog *npcListDialog;
NpcTextDialog *npcTextDialog;
NpcStringDialog *npcStringDialog;
SkillDialog *skillDialog;
+PartyWindow *partyWindow;
#ifdef TMWSERV_SUPPORT
BuddyWindow *buddyWindow;
GuildWindow *guildWindow;
MagicDialog *magicDialog;
NpcPostDialog *npcPostDialog;
-PartyWindow *partyWindow;
#else
StorageWindow *storageWindow;
#endif
@@ -182,9 +179,6 @@ Particle *particleEngine = NULL;
EffectManager *effectManager = NULL;
ChatTab *localChatTab = NULL;
-#ifdef EATHENA_SUPPORT
-Party *playerParty = NULL;
-#endif
const int MAX_TIME = 10000;
@@ -239,14 +233,9 @@ int get_elapsed_time(int start_time)
/**
* Create all the various globally accessible gui windows
*/
-#ifdef TMWSERV_SUPPORT
-void createGuiWindows()
-#else
-void createGuiWindows(Network *network)
-#endif
+static void createGuiWindows()
{
// Create dialogs
-#ifdef TMWSERV_SUPPORT
chatWindow = new ChatWindow;
buyDialog = new BuyDialog;
sellDialog = new SellDialog;
@@ -255,24 +244,17 @@ void createGuiWindows(Network *network)
npcIntegerDialog = new NpcIntegerDialog;
npcListDialog = new NpcListDialog;
npcStringDialog = new NpcStringDialog;
- npcPostDialog = new NpcPostDialog();
- magicDialog = new MagicDialog();
+ partyWindow = new PartyWindow;
+#ifdef TMWSERV_SUPPORT
+ npcPostDialog = new NpcPostDialog;
+ magicDialog = new MagicDialog;
equipmentWindow = new EquipmentWindow(player_node->mEquipment.get());
- buddyWindow = new BuddyWindow();
- guildWindow = new GuildWindow();
- partyWindow = new PartyWindow();
+ buddyWindow = new BuddyWindow;
+ guildWindow = new GuildWindow;
#else
- chatWindow = new ChatWindow(network);
- buyDialog = new BuyDialog(network);
- sellDialog = new SellDialog(network);
- buySellDialog = new BuySellDialog(network);
- tradeWindow = new TradeWindow(network);
+ buySellDialog = new BuySellDialog;
equipmentWindow = new EquipmentWindow;
- npcTextDialog = new NpcTextDialog(network);
- npcIntegerDialog = new NpcIntegerDialog(network);
- npcListDialog = new NpcListDialog(network);
- npcStringDialog = new NpcStringDialog(network);
- storageWindow = new StorageWindow(network);
+ storageWindow = new StorageWindow;
#endif
menuWindow = new MenuWindow;
statusWindow = new StatusWindow(player_node);
@@ -328,7 +310,7 @@ void createGuiWindows(Network *network)
/**
* Destroy all the globally accessible gui windows
*/
-void destroyGuiWindows()
+static void destroyGuiWindows()
{
logger->setChatWindow(NULL);
delete localChatTab; // Need to do this first, so it can remove itself
@@ -347,12 +329,12 @@ void destroyGuiWindows()
delete npcListDialog;
delete npcTextDialog;
delete npcStringDialog;
+ delete partyWindow;
#ifdef TMWSERV_SUPPORT
delete npcPostDialog;
delete magicDialog;
delete buddyWindow;
delete guildWindow;
- delete partyWindow;
#endif
delete skillDialog;
delete minimap;
@@ -369,10 +351,10 @@ void destroyGuiWindows()
#ifdef TMWSERV_SUPPORT
Game::Game():
- mBeingHandler(new BeingHandler()),
- mGuildHandler(new GuildHandler()),
- mPartyHandler(new PartyHandler()),
- mEffectHandler(new EffectHandler()),
+ mBeingHandler(new BeingHandler),
+ mGuildHandler(new GuildHandler),
+ mPartyHandler(new PartyHandler),
+ mEffectHandler(new EffectHandler),
#else
Game::Game(Network *network):
mNetwork(network),
@@ -392,22 +374,13 @@ Game::Game(Network *network):
{
done = false;
-#ifdef TMWSERV_SUPPORT
createGuiWindows();
engine = new Engine;
beingManager = new BeingManager;
- commandHandler = new CommandHandler();
-#else
- createGuiWindows(network);
- engine = new Engine(network);
-
- beingManager = new BeingManager(network);
- commandHandler = new CommandHandler(network);
-#endif
-
+ commandHandler = new CommandHandler;
floorItemManager = new FloorItemManager;
- channelManager = new ChannelManager();
+ channelManager = new ChannelManager;
effectManager = new EffectManager;
particleEngine = new Particle(NULL);
@@ -424,10 +397,6 @@ Game::Game(Network *network):
// Initialize beings
beingManager->setPlayer(player_node);
-#ifdef EATHENA_SUPPORT
- player_node->setNetwork(network);
- playerParty = new Party(network);
-#endif
Joystick::init();
// TODO: The user should be able to choose which one to use
@@ -468,11 +437,12 @@ Game::Game(Network *network):
* packet is handled by the older version, but its response
* is ignored by the client
*/
- MessageOut msg(mNetwork);
- msg.writeInt16(CMSG_CLIENT_PING);
+ MessageOut msg(CMSG_CLIENT_PING);
msg.writeInt32(tick_time);
+ map_path = map_path.substr(0, map_path.rfind("."));
engine->changeMap(map_path);
+ MessageOut outMsg(CMSG_MAP_LOADED);
#endif
setupWindow->setInGame(true);
@@ -482,8 +452,6 @@ Game::~Game()
{
#ifdef TMWSERV_SUPPORT
Net::clearHandlers();
-#else
- delete playerParty;
#endif
destroyGuiWindows();
@@ -745,6 +713,17 @@ void Game::handleInput()
used = true;
}
+ if (keyboard.isKeyActive(keyboard.KEY_PREV_CHAT_TAB))
+ {
+ chatWindow->prevTab();
+ return;
+ }
+ else if (keyboard.isKeyActive(keyboard.KEY_NEXT_CHAT_TAB))
+ {
+ chatWindow->nextTab();
+ return;
+ }
+
const int tKey = keyboard.getKeyIndex(event.key.keysym.sym);
switch (tKey)
{
@@ -903,7 +882,6 @@ void Game::handleInput()
break;
case KeyboardConfig::KEY_WINDOW_MINIMAP:
minimap->toggle();
- requestedWindow = minimap;
break;
case KeyboardConfig::KEY_WINDOW_CHAT:
requestedWindow = chatWindow;
diff --git a/src/gui/browserbox.cpp b/src/gui/browserbox.cpp
index 2f667237..0240b67b 100644
--- a/src/gui/browserbox.cpp
+++ b/src/gui/browserbox.cpp
@@ -244,9 +244,6 @@ void BrowserBox::mouseMoved(gcn::MouseEvent &event)
void BrowserBox::draw(gcn::Graphics *graphics)
{
- if (!isVisible())
- return;
-
if (mOpaque)
{
graphics->setColor(guiPalette->getColor(Palette::BACKGROUND));
diff --git a/src/gui/buy.cpp b/src/gui/buy.cpp
index 6df2ae25..6d336e4c 100644
--- a/src/gui/buy.cpp
+++ b/src/gui/buy.cpp
@@ -46,15 +46,8 @@
#include "utils/gettext.h"
#include "utils/strprintf.h"
-#ifdef TMWSERV_SUPPORT
BuyDialog::BuyDialog():
-#else
-BuyDialog::BuyDialog(Network *network):
-#endif
Window(_("Buy")),
-#ifndef TMWSERV_SUPPORT
- mNetwork(network),
-#endif
mMoney(0), mAmountItems(0), mMaxItems(0)
{
setWindowName("Buy");
@@ -199,8 +192,7 @@ void BuyDialog::action(const gcn::ActionEvent &event)
Net::GameServer::Player::tradeWithNPC
(mShopItems->at(selectedItem)->getId(), mAmountItems);
#else
- MessageOut outMsg(mNetwork);
- outMsg.writeInt16(CMSG_NPC_BUY_REQUEST);
+ MessageOut outMsg(CMSG_NPC_BUY_REQUEST);
outMsg.writeInt16(8);
outMsg.writeInt16(mAmountItems);
outMsg.writeInt16(mShopItems->at(selectedItem)->getId());
diff --git a/src/gui/buy.h b/src/gui/buy.h
index 200394b9..1e022652 100644
--- a/src/gui/buy.h
+++ b/src/gui/buy.h
@@ -29,9 +29,6 @@
#include "../guichanfwd.h"
-#ifndef TMWSERV_SUPPORT
-class Network;
-#endif
class ShopItems;
class ShopListBox;
class ListBox;
@@ -50,11 +47,7 @@ class BuyDialog : public Window, public gcn::ActionListener,
*
* @see Window::Window
*/
-#ifdef TMWSERV_SUPPORT
BuyDialog();
-#else
- BuyDialog(Network *network);
-#endif
/**
* Destructor
@@ -116,9 +109,6 @@ class BuyDialog : public Window, public gcn::ActionListener,
*/
void close();
private:
-#ifdef EATHENA_SUPPORT
- Network *mNetwork;
-#endif
gcn::Button *mBuyButton;
gcn::Button *mQuitButton;
gcn::Button *mAddMaxButton;
diff --git a/src/gui/buysell.cpp b/src/gui/buysell.cpp
index b9a6a1dc..a0e2fc93 100644
--- a/src/gui/buysell.cpp
+++ b/src/gui/buysell.cpp
@@ -19,20 +19,19 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
-#include "button.h"
#include "buysell.h"
-#include "../npc.h"
+#include "npc.h"
-#include "../net/messageout.h"
-#ifdef EATHENA_SUPPORT
-#include "../net/ea/protocol.h"
-#endif
+#include "gui/button.h"
-#include "../utils/gettext.h"
+#include "net/messageout.h"
+#include "net/ea/protocol.h"
-BuySellDialog::BuySellDialog(Network *network):
- Window(_("Shop")), mNetwork(network)
+#include "utils/gettext.h"
+
+BuySellDialog::BuySellDialog():
+ Window(_("Shop"))
{
setWindowName("BuySell");
Button *buyButton = 0;
@@ -96,10 +95,7 @@ void BuySellDialog::action(const gcn::ActionEvent &event)
return;
}
-#ifdef EATHENA_SUPPORT
- MessageOut outMsg(mNetwork);
- outMsg.writeInt16(CMSG_NPC_BUY_SELL_REQUEST);
+ MessageOut outMsg(CMSG_NPC_BUY_SELL_REQUEST);
outMsg.writeInt32(current_npc);
outMsg.writeInt8(action);
-#endif
}
diff --git a/src/gui/buysell.h b/src/gui/buysell.h
index 4b137554..ff956e09 100644
--- a/src/gui/buysell.h
+++ b/src/gui/buysell.h
@@ -26,8 +26,6 @@
#include "window.h"
-class Network;
-
/**
* A dialog to choose between buying or selling at a shop.
*
@@ -42,7 +40,7 @@ class BuySellDialog : public Window, public gcn::ActionListener
*
* @see Window::Window
*/
- BuySellDialog(Network *network);
+ BuySellDialog();
/**
* Check for current NPC
@@ -55,9 +53,6 @@ class BuySellDialog : public Window, public gcn::ActionListener
* Called when receiving actions from the widgets.
*/
void action(const gcn::ActionEvent &event);
-
- private:
- Network *mNetwork;
};
extern BuySellDialog *buySellDialog;
diff --git a/src/gui/changeemaildialog.cpp b/src/gui/changeemaildialog.cpp
index 0ed95bd7..14cfb1e7 100644
--- a/src/gui/changeemaildialog.cpp
+++ b/src/gui/changeemaildialog.cpp
@@ -40,14 +40,14 @@
ChangeEmailDialog::ChangeEmailDialog(Window *parent, LoginData *loginData):
Window(_("Change Email Address"), true, parent),
- mWrongDataNoticeListener(new WrongDataNoticeListener()),
+ mWrongDataNoticeListener(new WrongDataNoticeListener),
mLoginData(loginData)
{
gcn::Label *accountLabel = new gcn::Label(strprintf(_("Account: %s"),
mLoginData->username.c_str()));
gcn::Label *newEmailLabel = new gcn::Label(_("Type New Email Address twice:"));
- mFirstEmailField = new TextField();
- mSecondEmailField = new TextField();
+ mFirstEmailField = new TextField;
+ mSecondEmailField = new TextField;
mChangeEmailButton = new Button(_("Change Email Address"), "change_email", this);
mCancelButton = new Button(_("Cancel"), "cancel", this);
diff --git a/src/gui/changepassworddialog.cpp b/src/gui/changepassworddialog.cpp
index 7c1e5bcd..4bc97326 100644
--- a/src/gui/changepassworddialog.cpp
+++ b/src/gui/changepassworddialog.cpp
@@ -41,16 +41,16 @@
ChangePasswordDialog::ChangePasswordDialog(Window *parent, LoginData *loginData):
Window(_("Change Password"), true, parent),
- mWrongDataNoticeListener(new WrongDataNoticeListener()),
+ mWrongDataNoticeListener(new WrongDataNoticeListener),
mLoginData(loginData)
{
gcn::Label *accountLabel = new gcn::Label(strprintf(_("Account: %s"),
mLoginData->username.c_str()));
gcn::Label *oldPassLabel = new gcn::Label(_("Password:"));
- mOldPassField = new PasswordField();
+ mOldPassField = new PasswordField;
gcn::Label *newPassLabel = new gcn::Label(_("Type New Password twice:"));
- mFirstPassField = new PasswordField();
- mSecondPassField = new PasswordField();
+ mFirstPassField = new PasswordField;
+ mSecondPassField = new PasswordField;
mChangePassButton = new Button(_("Change Password"), "change_password", this);
mCancelButton = new Button(_("Cancel"), "cancel", this);
diff --git a/src/gui/char_select.cpp b/src/gui/char_select.cpp
index 4ab3d9ef..bf885de9 100644
--- a/src/gui/char_select.cpp
+++ b/src/gui/char_select.cpp
@@ -19,50 +19,48 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
-#include <string>
-
-#include <guichan/font.hpp>
-
-#include "button.h"
-#include "char_select.h"
-#include "confirm_dialog.h"
-#include "label.h"
-#include "ok_dialog.h"
-#include "playerbox.h"
-#include "textfield.h"
+#include "gui/button.h"
+#include "gui/char_select.h"
+#include "gui/confirm_dialog.h"
+#include "gui/label.h"
+#include "gui/ok_dialog.h"
+#include "gui/playerbox.h"
+#include "gui/textfield.h"
#ifdef TMWSERV_SUPPORT
-#include "radiobutton.h"
-#include "slider.h"
+#include "gui/radiobutton.h"
+#include "gui/slider.h"
-#include "unregisterdialog.h"
-#include "changepassworddialog.h"
-#include "changeemaildialog.h"
+#include "gui/unregisterdialog.h"
+#include "gui/changepassworddialog.h"
+#include "gui/changeemaildialog.h"
-#include "../logindata.h"
+#include "logindata.h"
-#include "../net/tmwserv/accountserver/account.h"
-#include "../net/tmwserv/charserverhandler.h"
+#include "net/tmwserv/accountserver/account.h"
+#include "net/tmwserv/charserverhandler.h"
#else
-#include "../net/ea/charserverhandler.h"
+#include "net/ea/charserverhandler.h"
#endif
-#include "widgets/layout.h"
+#include "gui/widgets/layout.h"
+
+#include "game.h"
+#include "localplayer.h"
+#include "main.h"
+#include "units.h"
-#include "../game.h"
-#include "../localplayer.h"
-#include "../main.h"
-#include "../units.h"
+#include "net/messageout.h"
-#include "../net/messageout.h"
+#include "resources/colordb.h"
-#include "../resources/colordb.h"
+#include "utils/gettext.h"
+#include "utils/strprintf.h"
+#include "utils/stringutils.h"
-#include "../utils/gettext.h"
-#include "../utils/strprintf.h"
-#include "../utils/stringutils.h"
+#include <guichan/font.hpp>
-#define MAX_SLOT 2
+#include <string>
// Defined in main.cpp, used here for setting the char create dialog
extern CharServerHandler charServerHandler;
@@ -100,12 +98,13 @@ void CharDeleteConfirm::action(const gcn::ActionEvent &event)
CharSelectDialog::CharSelectDialog(LockedArray<LocalPlayer*> *charInfo,
LoginData *loginData):
Window(_("Account and Character Management")),
- mCharInfo(charInfo), mCharSelected(false), mLoginData(loginData)
+ mCharInfo(charInfo),
+ mCharSelected(false),
+ mLoginData(loginData)
#else
-CharSelectDialog::CharSelectDialog(Network *network,
- LockedArray<LocalPlayer*> *charInfo,
+CharSelectDialog::CharSelectDialog(LockedArray<LocalPlayer*> *charInfo,
Gender gender):
- Window(_("Select Character")), mNetwork(network),
+ Window(_("Select Character")),
mCharInfo(charInfo),
mCharSelected(false),
mGender(gender)
@@ -257,12 +256,11 @@ void CharSelectDialog::action(const gcn::ActionEvent &event)
{
new CharDeleteConfirm(this);
}
- else if (n_character <= MAX_SLOT)
+ else if (n_character <= maxSlot)
{
// Start new character dialog
CharCreateDialog *charCreateDialog =
- new CharCreateDialog(this, mCharInfo->getPos(),
- mNetwork, mGender);
+ new CharCreateDialog(this, mCharInfo->getPos(), mGender);
charServerHandler.setCharCreateDialog(charCreateDialog);
}
}
@@ -348,8 +346,7 @@ void CharSelectDialog::attemptCharDelete()
Net::AccountServer::Account::deleteCharacter(mCharInfo->getPos());
#else
// Request character deletion
- MessageOut outMsg(mNetwork);
- outMsg.writeInt16(0x0068);
+ MessageOut outMsg(0x0068);
outMsg.writeInt32(mCharInfo->getEntry()->mCharId);
outMsg.writeString("a@a.com", 40);
#endif
@@ -362,8 +359,7 @@ void CharSelectDialog::attemptCharSelect()
Net::AccountServer::Account::selectCharacter(mCharInfo->getPos());
#else
// Request character selection
- MessageOut outMsg(mNetwork);
- outMsg.writeInt16(0x0066);
+ MessageOut outMsg(0x0066);
outMsg.writeInt8(mCharInfo->getPos());
#endif
mCharInfo->lock();
@@ -400,13 +396,10 @@ bool CharSelectDialog::selectByName(const std::string &name)
#ifdef TMWSERV_SUPPORT
CharCreateDialog::CharCreateDialog(Window *parent, int slot):
#else
-CharCreateDialog::CharCreateDialog(Window *parent, int slot, Network *network,
+CharCreateDialog::CharCreateDialog(Window *parent, int slot,
Gender gender):
#endif
Window(_("Create Character"), true, parent),
-#ifndef TMWSERV_SUPPORT
- mNetwork(network),
-#endif
mSlot(slot)
{
mPlayer = new Player(0, 0, NULL);
@@ -693,8 +686,7 @@ int CharCreateDialog::getDistributedPoints()
void CharCreateDialog::attemptCharCreate()
{
// Send character infos
- MessageOut outMsg(mNetwork);
- outMsg.writeInt16(0x0067);
+ MessageOut outMsg(0x0067);
outMsg.writeString(getName(), 24);
outMsg.writeInt8(5);
outMsg.writeInt8(5);
diff --git a/src/gui/char_select.h b/src/gui/char_select.h
index b29953d3..cf770010 100644
--- a/src/gui/char_select.h
+++ b/src/gui/char_select.h
@@ -32,8 +32,6 @@
#ifdef TMWSERV_SUPPORT
#include "../logindata.h"
-#else
-class Network;
#endif
class LocalPlayer;
@@ -56,8 +54,7 @@ class CharSelectDialog : public Window, public gcn::ActionListener
CharSelectDialog(LockedArray<LocalPlayer*> *charInfo,
LoginData *loginData);
#else
- CharSelectDialog(Network *network,
- LockedArray<LocalPlayer*> *charInfo,
+ CharSelectDialog(LockedArray<LocalPlayer*> *charInfo,
Gender gender);
#endif
@@ -70,9 +67,6 @@ class CharSelectDialog : public Window, public gcn::ActionListener
bool selectByName(const std::string &name);
private:
-#ifdef EATHENA_SUPPORT
- Network *mNetwork;
-#endif
LockedArray<LocalPlayer*> *mCharInfo;
gcn::Button *mSelectButton;
@@ -129,8 +123,7 @@ class CharCreateDialog : public Window, public gcn::ActionListener
#ifdef TMWSERV_SUPPORT
CharCreateDialog(Window *parent, int slot);
#else
- CharCreateDialog(Window *parent, int slot, Network *network,
- Gender gender);
+ CharCreateDialog(Window *parent, int slot, Gender gender);
#endif
/**
@@ -162,9 +155,6 @@ class CharCreateDialog : public Window, public gcn::ActionListener
*/
void attemptCharCreate();
-#ifdef EATHENA_SUPPORT
- Network *mNetwork;
-#endif
gcn::TextField *mNameField;
gcn::Label *mNameLabel;
gcn::Button *mNextHairColorButton;
diff --git a/src/gui/chat.cpp b/src/gui/chat.cpp
index b0b15dbc..10993027 100644
--- a/src/gui/chat.cpp
+++ b/src/gui/chat.cpp
@@ -27,6 +27,7 @@
#include "gui/scrollarea.h"
#include "gui/sdlinput.h"
+#include "gui/widgets/chattab.h"
#include "gui/widgets/tabbedarea.h"
#include "gui/widgets/whispertab.h"
@@ -39,13 +40,8 @@
#include <guichan/focushandler.hpp>
-#ifdef TMWSERV_SUPPORT
ChatWindow::ChatWindow():
- Window("Chat"),
-#else
-ChatWindow::ChatWindow(Network * network):
- Window(""), mNetwork(network),
-#endif
+ Window(_("Chat")),
mTmpVisible(false)
{
setWindowName("Chat");
@@ -61,7 +57,7 @@ ChatWindow::ChatWindow(Network * network):
mChatInput->setActionEventId("chatinput");
mChatInput->addActionListener(this);
- mChatTabs = new TabbedArea();
+ mChatTabs = new TabbedArea;
add(mChatTabs);
add(mChatInput);
@@ -82,7 +78,7 @@ ChatWindow::ChatWindow(Network * network):
// run the @assert command for the player again. Convenience for GMs.
if (config.getValue(player_node->getName() + "GMassert", 0)) {
std::string cmd = "@assert";
- chatSend(cmd);
+ chatInput(cmd);
}
#endif
mRecorder = new Recorder(this);
@@ -163,6 +159,28 @@ void ChatWindow::clearTab()
clearTab(getFocused());
}
+void ChatWindow::prevTab()
+{
+ int tab = mChatTabs->getSelectedTabIndex();
+
+ if (tab == 0)
+ tab = mChatTabs->getNumberOfTabs();
+ tab--;
+
+ mChatTabs->setSelectedTab(tab);
+}
+
+void ChatWindow::nextTab()
+{
+ int tab = mChatTabs->getSelectedTabIndex();
+
+ tab++;
+ if (tab == mChatTabs->getNumberOfTabs())
+ tab = 0;
+
+ mChatTabs->setSelectedTab(tab);
+}
+
void ChatWindow::action(const gcn::ActionEvent &event)
{
if (event.getId() == "chatinput")
@@ -180,7 +198,7 @@ void ChatWindow::action(const gcn::ActionEvent &event)
mCurHist = mHistory.end();
// Send the message to the server
- chatSend(message);
+ chatInput(message);
// Clear the text from the chat input
mChatInput->setText("");
@@ -258,10 +276,10 @@ void ChatWindow::removeWhisper(std::string nick)
mWhispers.erase(nick);
}
-void ChatWindow::chatSend(std::string &msg)
+void ChatWindow::chatInput(std::string &msg)
{
ChatTab *tab = getFocused();
- tab->chatSend(msg);
+ tab->chatInput(msg);
}
void ChatWindow::doPresent()
@@ -298,12 +316,12 @@ void ChatWindow::doPresent()
mRecorder->record(timeStr.str() + _("Present: ") + response + ".");
- localChatTab->chatLog(_("Attendance written to record log."),
+ getFocused()->chatLog(_("Attendance written to record log."),
BY_SERVER, true);
}
else
{
- localChatTab->chatLog(_("Present: ") + response, BY_SERVER);
+ getFocused()->chatLog(_("Present: ") + response, BY_SERVER);
}
}
@@ -377,6 +395,7 @@ void ChatWindow::setRecordingFile(const std::string &msg)
void ChatWindow::whisper(std::string nick, std::string mes, bool own)
{
if (mes.length() == 0) return;
+
std::string playerName = player_node->getName();
std::string tempNick = nick;
@@ -395,7 +414,7 @@ void ChatWindow::whisper(std::string nick, std::string mes, bool own)
}
if (own)
- tab->chatSend(mes);
+ tab->chatInput(mes);
else
tab->chatLog(nick, mes);
}
diff --git a/src/gui/chat.h b/src/gui/chat.h
index 177aa38f..3a2f7fdb 100644
--- a/src/gui/chat.h
+++ b/src/gui/chat.h
@@ -22,6 +22,8 @@
#ifndef CHAT_H
#define CHAT_H
+#include "window.h"
+
#include <list>
#include <string>
#include <map>
@@ -31,10 +33,6 @@
#include <guichan/widget.hpp>
#include <guichan/widgetlistener.hpp>
-#include "widgets/chattab.h"
-
-#include "window.h"
-
class BrowserBox;
class Channel;
class ChatTab;
@@ -42,19 +40,9 @@ class Recorder;
class ScrollArea;
class TabbedArea;
class ItemLinkHandler;
-#ifdef EATHENA_SUPPORT
-class Network;
-#endif
+class Tab;
class WhisperTab;
-/**
- * gets in between usernick and message text depending on
- * message type
- */
-#define CAT_NORMAL ": "
-#define CAT_IS ""
-#define CAT_WHISPER " whispers: "
-
#define DEFAULT_CHAT_WINDOW_SCROLL 7 // 1 means `1/8th of the window size'.
/** One item in the chat log */
@@ -78,11 +66,7 @@ class ChatWindow : public Window,
/**
* Constructor.
*/
-#ifdef TMWSERV_SUPPORT
ChatWindow();
-#else
- ChatWindow(Network *network);
-#endif
/**
* Destructor: used to write back values to the config file
@@ -119,6 +103,16 @@ class ChatWindow : public Window,
void clearTab();
/**
+ * Switch to the previous tab in order
+ */
+ void prevTab();
+
+ /**
+ * Switch to the next tab in order
+ */
+ void nextTab();
+
+ /**
* Performs action.
*/
void action(const gcn::ActionEvent &event);
@@ -142,7 +136,7 @@ class ChatWindow : public Window,
* @param msg The message text which is to be sent.
*
*/
- void chatSend(std::string &msg);
+ void chatInput(std::string &msg);
/** Called when key is pressed */
void keyPressed(gcn::KeyEvent &event);
@@ -199,7 +193,6 @@ class ChatWindow : public Window,
void adjustTabSize();
#ifdef EATHENA_SUPPORT
- Network *mNetwork;
char mPartyPrefix; /**< Messages beginning with the prefix are sent to
the party */
#endif
diff --git a/src/gui/emotecontainer.cpp b/src/gui/emotecontainer.cpp
index b4caf4f1..3425cde8 100644
--- a/src/gui/emotecontainer.cpp
+++ b/src/gui/emotecontainer.cpp
@@ -79,9 +79,6 @@ EmoteContainer::~EmoteContainer()
void EmoteContainer::draw(gcn::Graphics *graphics)
{
- if (!isVisible())
- return;
-
int columns = getWidth() / gridWidth;
// Have at least 1 column
diff --git a/src/gui/emoteshortcutcontainer.cpp b/src/gui/emoteshortcutcontainer.cpp
index 661f42a7..ae5eb859 100644
--- a/src/gui/emoteshortcutcontainer.cpp
+++ b/src/gui/emoteshortcutcontainer.cpp
@@ -76,9 +76,6 @@ EmoteShortcutContainer::~EmoteShortcutContainer()
void EmoteShortcutContainer::draw(gcn::Graphics *graphics)
{
- if (!isVisible())
- return;
-
if (config.getValue("guialpha", 0.8) != mAlpha)
{
mAlpha = config.getValue("guialpha", 0.8);
diff --git a/src/gui/equipmentwindow.cpp b/src/gui/equipmentwindow.cpp
index 96500e88..0be33ca6 100644
--- a/src/gui/equipmentwindow.cpp
+++ b/src/gui/equipmentwindow.cpp
@@ -121,9 +121,6 @@ EquipmentWindow::~EquipmentWindow()
void EquipmentWindow::draw(gcn::Graphics *graphics)
{
- if (!isVisible())
- return;
-
// Draw window graphics
Window::draw(graphics);
diff --git a/src/gui/guildwindow.cpp b/src/gui/guildwindow.cpp
index c8a1872f..0d48b4f3 100644
--- a/src/gui/guildwindow.cpp
+++ b/src/gui/guildwindow.cpp
@@ -20,26 +20,26 @@
* $$
*/
-#include "guildwindow.h"
+#include "gui/guildwindow.h"
-#include "button.h"
-#include "chat.h"
-#include "confirm_dialog.h"
-#include "guildlistbox.h"
-#include "scrollarea.h"
-#include "textdialog.h"
-#include "windowcontainer.h"
+#include "gui/button.h"
+#include "gui/confirm_dialog.h"
+#include "gui/guildlistbox.h"
+#include "gui/scrollarea.h"
+#include "gui/textdialog.h"
+#include "gui/windowcontainer.h"
-#include "widgets/layout.h"
-#include "widgets/tabbedarea.h"
+#include "gui/widgets/chattab.h"
+#include "gui/widgets/layout.h"
+#include "gui/widgets/tabbedarea.h"
-#include "../guild.h"
-#include "../log.h"
-#include "../localplayer.h"
+#include "guild.h"
+#include "log.h"
+#include "localplayer.h"
-#include "../net/tmwserv/chatserver/guild.h"
-#include "../utils/dtor.h"
-#include "../utils/gettext.h"
+#include "net/tmwserv/chatserver/guild.h"
+#include "utils/dtor.h"
+#include "utils/gettext.h"
#include <algorithm>
@@ -64,7 +64,7 @@ GuildWindow::GuildWindow():
mGuildButton[1]->setEnabled(false);
mGuildButton[2]->setEnabled(false);
- mGuildTabs = new TabbedArea();
+ mGuildTabs = new TabbedArea;
place(0, 0, mGuildButton[0]);
place(1, 0, mGuildButton[1]);
@@ -169,7 +169,7 @@ void GuildWindow::action(const gcn::ActionEvent &event)
void GuildWindow::newGuildTab(const std::string &guildName)
{
// Create new tab
- GuildListBox *list = new GuildListBox();
+ GuildListBox *list = new GuildListBox;
list->setListModel(player_node->getGuild(guildName));
ScrollArea *sa = new ScrollArea(list);
sa->setDimension(gcn::Rectangle(5, 5, 135, 250));
diff --git a/src/gui/inventorywindow.cpp b/src/gui/inventorywindow.cpp
index 612c978a..51c1372c 100644
--- a/src/gui/inventorywindow.cpp
+++ b/src/gui/inventorywindow.cpp
@@ -57,7 +57,7 @@ InventoryWindow::InventoryWindow(int invSize):
setResizable(false);
setCloseButton(true);
- setDefaultSize(375, 307, ImageRect::CENTER);
+ setDefaultSize(387, 307, ImageRect::CENTER);
addKeyListener(this);
std::string longestUseString = getFont()->getWidth(_("Equip")) >
@@ -74,14 +74,13 @@ InventoryWindow::InventoryWindow(int invSize):
mDropButton = new Button(_("Drop"), "drop", this);
#ifdef TMWSERV_SUPPORT
mSplitButton = new Button(_("Split"), "split", this);
-#endif
-
mItems = new ItemContainer(player_node->getInventory(), 10, 5);
+#else
+ mItems = new ItemContainer(player_node->getInventory(), 10, 10);
+#endif
mItems->addSelectionListener(this);
- // The window is supposed to be exactly large enough for now
mInvenScroll = new ScrollArea(mItems);
- mInvenScroll->setVerticalScrollPolicy(gcn::ScrollArea::SHOW_NEVER);
mInvenScroll->setHorizontalScrollPolicy(gcn::ScrollArea::SHOW_NEVER);
mTotalWeight = -1;
diff --git a/src/gui/itemcontainer.cpp b/src/gui/itemcontainer.cpp
index abce257d..70cf8176 100644
--- a/src/gui/itemcontainer.cpp
+++ b/src/gui/itemcontainer.cpp
@@ -61,7 +61,7 @@ ItemContainer::ItemContainer(Inventory *inventory,
mSwapItems(false),
mDescItems(false)
{
- mItemPopup = new ItemPopup();
+ mItemPopup = new ItemPopup;
setFocusable(true);
ResourceManager *resman = ResourceManager::getInstance();
@@ -281,9 +281,11 @@ void ItemContainer::mouseReleased(gcn::MouseEvent &event)
};
int index = getSlotIndex(event.getX(), event.getY());
- if (index == Inventory::NO_SLOT_INDEX) return;
+ if (index == Inventory::NO_SLOT_INDEX)
+ return;
Item *item = mInventory->getItem(index);
- if (item == mSelectedItem) return;
+ if (item == mSelectedItem)
+ return;
player_node->moveInvItem(mSelectedItem, index);
setSelectedItem(NULL);
mSelectionStatus = SEL_NONE;
@@ -314,12 +316,12 @@ void ItemContainer::mouseExited(gcn::MouseEvent &event)
mItemPopup->setVisible(false);
}
-int ItemContainer::getSlotIndex(const int posX, const int posY) const
+int ItemContainer::getSlotIndex(int x, int y) const
{
- if (getDimension().isPointInRect(posX, posY))
+ if (x < getWidth() && y < getHeight())
{
// Takes into account, boxes are overlapping each other.
- return (posY / (BOX_HEIGHT - 1)) * mGridColumns + (posX / (BOX_WIDTH - 1));
+ return (y / (BOX_HEIGHT - 1)) * mGridColumns + (x / (BOX_WIDTH - 1));
}
return Inventory::NO_SLOT_INDEX;
}
diff --git a/src/gui/itemcontainer.h b/src/gui/itemcontainer.h
index a28ca392..b2857563 100644
--- a/src/gui/itemcontainer.h
+++ b/src/gui/itemcontainer.h
@@ -69,9 +69,12 @@ class ItemContainer : public gcn::Widget,
void keyPressed(gcn::KeyEvent &event);
void keyReleased(gcn::KeyEvent &event);
+
void mousePressed(gcn::MouseEvent &event);
void mouseDragged(gcn::MouseEvent &event);
void mouseReleased(gcn::MouseEvent &event);
+ void mouseMoved(gcn::MouseEvent &event);
+ void mouseExited(gcn::MouseEvent &event);
/**
* Returns the selected item.
@@ -125,9 +128,6 @@ class ItemContainer : public gcn::Widget,
*/
void keyAction();
- void mouseExited(gcn::MouseEvent &event);
- void mouseMoved(gcn::MouseEvent &event);
-
/**
* Moves the highlight in the direction specified.
*
@@ -158,11 +158,11 @@ class ItemContainer : public gcn::Widget,
/**
* Gets the slot index based on the cursor position.
*
- * @param posX The X Coordinate position.
- * @param posY The Y Coordinate position.
+ * @param x The X coordinate position.
+ * @param y The Y coordinate position.
* @return The slot index on success, -1 on failure.
*/
- int getSlotIndex(int posX, int posY) const;
+ int getSlotIndex(int x, int y) const;
Inventory *mInventory;
int mGridColumns, mGridRows;
diff --git a/src/gui/itemshortcutcontainer.cpp b/src/gui/itemshortcutcontainer.cpp
index d4de3477..97c3b640 100644
--- a/src/gui/itemshortcutcontainer.cpp
+++ b/src/gui/itemshortcutcontainer.cpp
@@ -70,9 +70,6 @@ ItemShortcutContainer::~ItemShortcutContainer()
void ItemShortcutContainer::draw(gcn::Graphics *graphics)
{
- if (!isVisible())
- return;
-
if (config.getValue("guialpha", 0.8) != mAlpha)
{
mAlpha = config.getValue("guialpha", 0.8);
@@ -255,4 +252,3 @@ void ItemShortcutContainer::mouseExited(gcn::MouseEvent &event)
{
mItemPopup->setVisible(false);
}
-
diff --git a/src/gui/listbox.cpp b/src/gui/listbox.cpp
index dbd8e674..70b4fc55 100644
--- a/src/gui/listbox.cpp
+++ b/src/gui/listbox.cpp
@@ -38,7 +38,7 @@ ListBox::ListBox(gcn::ListModel *listModel):
void ListBox::draw(gcn::Graphics *graphics)
{
- if (!mListModel || !isVisible())
+ if (!mListModel)
return;
if (config.getValue("guialpha", 0.8) != mAlpha)
diff --git a/src/gui/minimap.cpp b/src/gui/minimap.cpp
index 6bca796d..bfd34390 100644
--- a/src/gui/minimap.cpp
+++ b/src/gui/minimap.cpp
@@ -45,6 +45,9 @@ Minimap::Minimap():
setDefaultSize(5, 25, 100, 100);
setResizable(true);
+ setStickyButton(true);
+ setSticky(false);
+
loadWindowState();
}
@@ -92,21 +95,13 @@ void Minimap::setMapImage(Image *img)
void Minimap::toggle()
{
- mShow = !mShow;
+ setVisible(!isVisible(), true);
}
void Minimap::draw(gcn::Graphics *graphics)
{
- setVisible(mShow);
-
- if (!isVisible())
- return;
-
Window::draw(graphics);
- if (!mShow)
- return;
-
const gcn::Rectangle a = getChildrenArea();
graphics->pushClipArea(a);
diff --git a/src/gui/npc_text.cpp b/src/gui/npc_text.cpp
index 9fa57be8..31f48486 100644
--- a/src/gui/npc_text.cpp
+++ b/src/gui/npc_text.cpp
@@ -37,15 +37,8 @@
#include "../utils/gettext.h"
-#ifdef TMWSERV_SUPPORT
NpcTextDialog::NpcTextDialog()
-#else
-NpcTextDialog::NpcTextDialog(Network *network)
-#endif
: Window(_("NPC"))
-#ifdef EATHENA_SUPPORT
- , mNetwork(network)
-#endif
, mState(NPC_TEXT_STATE_WAITING)
{
setWindowName("NPCText");
@@ -136,8 +129,7 @@ void NpcTextDialog::nextDialog(int npcID)
#ifdef TMWSERV_SUPPORT
Net::GameServer::Player::talkToNPC(npcID, false);
#else
- MessageOut outMsg(mNetwork);
- outMsg.writeInt16(CMSG_NPC_NEXT_REQUEST);
+ MessageOut outMsg(CMSG_NPC_NEXT_REQUEST);
outMsg.writeInt32(npcID);
#endif
}
@@ -145,8 +137,7 @@ void NpcTextDialog::nextDialog(int npcID)
void NpcTextDialog::closeDialog(int npcID)
{
#ifdef EATHENA_SUPPORT
- MessageOut outMsg(mNetwork);
- outMsg.writeInt16(CMSG_NPC_CLOSE);
+ MessageOut outMsg(CMSG_NPC_CLOSE);
outMsg.writeInt32(npcID);
#endif
}
diff --git a/src/gui/npc_text.h b/src/gui/npc_text.h
index 16c1d5fd..231ac684 100644
--- a/src/gui/npc_text.h
+++ b/src/gui/npc_text.h
@@ -30,9 +30,6 @@
#include "../npc.h"
-#ifdef EATHENA_SUPPORT
-class Network;
-#endif
class TextBox;
/**
@@ -48,11 +45,7 @@ class NpcTextDialog : public Window, public gcn::ActionListener
*
* @see Window::Window
*/
-#ifdef TMWSERV_SUPPORT
NpcTextDialog();
-#else
- NpcTextDialog(Network *network);
-#endif
/**
* Called when receiving actions from the widgets.
@@ -101,9 +94,6 @@ class NpcTextDialog : public Window, public gcn::ActionListener
void widgetResized(const gcn::Event &event);
private:
-#ifdef EATHENA_SUPPORT
- Network *mNetwork;
-#endif
gcn::ScrollArea *mScrollArea;
TextBox *mTextBox;
gcn::Button *mButton;
diff --git a/src/gui/npcintegerdialog.cpp b/src/gui/npcintegerdialog.cpp
index a7ae2748..4d2ae1ce 100644
--- a/src/gui/npcintegerdialog.cpp
+++ b/src/gui/npcintegerdialog.cpp
@@ -36,15 +36,8 @@
#include "../utils/gettext.h"
#include "../utils/strprintf.h"
-#ifdef TMWSERV_SUPPORT
NpcIntegerDialog::NpcIntegerDialog()
-#else
-NpcIntegerDialog::NpcIntegerDialog(Network *network)
-#endif
: Window(_("NPC Number Request"))
-#ifdef EATHENA_SUPPORT
- , mNetwork(network)
-#endif
{
setWindowName("NPCInteger");
mValueField = new IntTextField;
@@ -127,8 +120,7 @@ void NpcIntegerDialog::action(const gcn::ActionEvent &event)
NPC::isTalking = false;
#ifdef EATHENA_SUPPORT
- MessageOut outMsg(mNetwork);
- outMsg.writeInt16(CMSG_NPC_INT_RESPONSE);
+ MessageOut outMsg(CMSG_NPC_INT_RESPONSE);
outMsg.writeInt32(current_npc);
outMsg.writeInt32(mValueField->getValue());
#endif
diff --git a/src/gui/npcintegerdialog.h b/src/gui/npcintegerdialog.h
index df74c904..bb3a8e20 100644
--- a/src/gui/npcintegerdialog.h
+++ b/src/gui/npcintegerdialog.h
@@ -26,9 +26,6 @@
#include "window.h"
-#ifdef EATHENA_SUPPORT
-class Network;
-#endif
class IntTextField;
/**
@@ -44,11 +41,7 @@ class NpcIntegerDialog : public Window, public gcn::ActionListener
*
* @see Window::Window
*/
-#ifdef TMWSERV_SUPPORT
NpcIntegerDialog();
-#else
- NpcIntegerDialog(Network *network);
-#endif
/**
* Called when receiving actions from the widgets.
@@ -93,9 +86,6 @@ class NpcIntegerDialog : public Window, public gcn::ActionListener
void setVisible(bool visible);
private:
-#ifdef EATHENA_SUPPORT
- Network *mNetwork;
-#endif
gcn::Button *mDecButton;
gcn::Button *mIncButton;
IntTextField *mValueField;
diff --git a/src/gui/npclistdialog.cpp b/src/gui/npclistdialog.cpp
index ff91c9fc..efac8954 100644
--- a/src/gui/npclistdialog.cpp
+++ b/src/gui/npclistdialog.cpp
@@ -41,15 +41,8 @@
#include "../utils/gettext.h"
#include "../utils/strprintf.h"
-#ifdef TMWSERV_SUPPORT
NpcListDialog::NpcListDialog()
-#else
-NpcListDialog::NpcListDialog(Network *network)
-#endif
: Window("NPC")
-#ifdef EATHENA_SUPPORT
- , mNetwork(network)
-#endif
{
setWindowName("NPCList");
setResizable(true);
@@ -143,8 +136,7 @@ void NpcListDialog::action(const gcn::ActionEvent &event)
#ifdef TMWSERV_SUPPORT
Net::GameServer::Player::selectFromNPC(current_npc, choice);
#else
- MessageOut outMsg(mNetwork);
- outMsg.writeInt16(CMSG_NPC_LIST_CHOICE);
+ MessageOut outMsg(CMSG_NPC_LIST_CHOICE);
outMsg.writeInt32(current_npc);
outMsg.writeInt8(choice);
#endif
diff --git a/src/gui/npclistdialog.h b/src/gui/npclistdialog.h
index 6c1e02e3..fa297304 100644
--- a/src/gui/npclistdialog.h
+++ b/src/gui/npclistdialog.h
@@ -29,10 +29,6 @@
#include <vector>
-#ifdef EATHENA_SUPPORT
-class Network;
-#endif
-
/**
* The npc list dialog.
*
@@ -47,11 +43,7 @@ class NpcListDialog : public Window, public gcn::ActionListener,
*
* @see Window::Window
*/
-#ifdef TMWSERV_SUPPORT
NpcListDialog();
-#else
- NpcListDialog(Network *network);
-#endif
/**
* Called when receiving actions from the widgets.
@@ -94,9 +86,6 @@ class NpcListDialog : public Window, public gcn::ActionListener,
void requestFocus();
private:
-#ifdef EATHENA_SUPPORT
- Network *mNetwork;
-#endif
gcn::ListBox *mItemList;
std::vector<std::string> mItems;
diff --git a/src/gui/npcpostdialog.cpp b/src/gui/npcpostdialog.cpp
index 278bc397..5c083612 100644
--- a/src/gui/npcpostdialog.cpp
+++ b/src/gui/npcpostdialog.cpp
@@ -19,15 +19,17 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
-#include "npcpostdialog.h"
-#include "textbox.h"
-#include "textfield.h"
-#include "button.h"
-#include "scrollarea.h"
-#include "chat.h"
+#include "gui/npcpostdialog.h"
-#include "../net/tmwserv/gameserver/player.h"
-#include "../utils/gettext.h"
+#include "gui/textbox.h"
+#include "gui/textfield.h"
+#include "gui/button.h"
+#include "gui/scrollarea.h"
+
+#include "gui/widgets/chattab.h"
+
+#include "net/tmwserv/gameserver/player.h"
+#include "utils/gettext.h"
#include <guichan/widgets/label.hpp>
@@ -39,7 +41,7 @@ NpcPostDialog::NpcPostDialog():
// create text field for receiver
gcn::Label *senderText = new gcn::Label("To:");
senderText->setPosition(5, 5);
- mSender = new TextField();
+ mSender = new TextField;
mSender->setPosition(senderText->getWidth() + 5, 5);
mSender->setWidth(65);
@@ -52,7 +54,7 @@ NpcPostDialog::NpcPostDialog():
sendButton->getY());
// create textfield for letter
- mText = new TextBox();
+ mText = new TextBox;
mText->setHeight(400 - (mSender->getHeight() + sendButton->getHeight()));
mText->setEditable(true);
diff --git a/src/gui/npcstringdialog.cpp b/src/gui/npcstringdialog.cpp
index c84de015..e5137d9c 100644
--- a/src/gui/npcstringdialog.cpp
+++ b/src/gui/npcstringdialog.cpp
@@ -36,15 +36,8 @@
#include "../utils/gettext.h"
#include "../utils/strprintf.h"
-#ifdef TMWSERV_SUPPORT
NpcStringDialog::NpcStringDialog()
-#else
-NpcStringDialog::NpcStringDialog(Network *network)
-#endif
: Window(_("NPC Text Request"))
-#ifdef EATHENA_SUPPORT
- , mNetwork(network)
-#endif
{
setWindowName("NPCString");
mValueField = new TextField("");
@@ -95,8 +88,7 @@ void NpcStringDialog::action(const gcn::ActionEvent &event)
mValueField->setText("");
#ifdef EATHENA_SUPPORT
- MessageOut outMsg(mNetwork);
- outMsg.writeInt16(CMSG_NPC_STR_RESPONSE);
+ MessageOut outMsg(CMSG_NPC_STR_RESPONSE);
outMsg.writeInt16(text.length() + 9);
outMsg.writeInt32(current_npc);
outMsg.writeString(text, text.length());
diff --git a/src/gui/npcstringdialog.h b/src/gui/npcstringdialog.h
index 94cd59b2..37d46cc0 100644
--- a/src/gui/npcstringdialog.h
+++ b/src/gui/npcstringdialog.h
@@ -26,10 +26,6 @@
#include <guichan/actionlistener.hpp>
-#ifdef EATHENA_SUPPORT
-class Network;
-#endif
-
/**
* The npc integer input dialog.
*
@@ -43,11 +39,7 @@ class NpcStringDialog : public Window, public gcn::ActionListener
*
* @see Window::Window
*/
-#ifdef TMWSERV_SUPPORT
NpcStringDialog();
-#else
- NpcStringDialog(Network *network);
-#endif
/**
* Called when receiving actions from the widgets.
@@ -79,9 +71,6 @@ class NpcStringDialog : public Window, public gcn::ActionListener
void setVisible(bool visible);
private:
-#ifdef EATHENA_SUPPORT
- Network *mNetwork;
-#endif
gcn::TextField *mValueField;
std::string mDefault;
};
diff --git a/src/gui/partywindow.cpp b/src/gui/partywindow.cpp
index 3f857b5c..f5cebdfd 100644
--- a/src/gui/partywindow.cpp
+++ b/src/gui/partywindow.cpp
@@ -19,13 +19,19 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
-#include "partywindow.h"
-#include "chat.h"
+#include "gui/partywindow.h"
-#include "widgets/avatar.h"
+#include "gui/widgets/avatar.h"
+#include "gui/widgets/chattab.h"
-#include "../utils/gettext.h"
-#include "../net/tmwserv/chatserver/party.h"
+#ifdef TMWSERV_SUPPORT
+#include "net/tmwserv/chatserver/party.h"
+#else
+#include "net/ea/party.h"
+#endif
+
+#include "utils/gettext.h"
+#include "utils/strprintf.h"
PartyWindow::PartyWindow() : Window(_("Party"))
{
@@ -106,7 +112,8 @@ void PartyWindow::removePartyMember(const std::string &memberName)
}
}
-void PartyWindow::showPartyInvite(const std::string &inviter)
+void PartyWindow::showPartyInvite(const std::string &inviter,
+ const std::string &partyName)
{
// check there isnt already an invite showing
if (mPartyInviter != "")
@@ -116,8 +123,15 @@ void PartyWindow::showPartyInvite(const std::string &inviter)
return;
}
+ std::string msg;
// log invite
- std::string msg = inviter + " has invited you to join their party";
+ if (partyName.empty())
+ msg = strprintf("%s has invited you to join their party",
+ inviter.c_str());
+ else
+ msg = strprintf("%s has invited you to join the %s party",
+ inviter.c_str(), partyName.c_str());
+
localChatTab->chatLog(msg, BY_SERVER);
// show invite
@@ -135,11 +149,21 @@ void PartyWindow::action(const gcn::ActionEvent &event)
if (eventId == "yes")
{
localChatTab->chatLog("Accepted invite from " + mPartyInviter);
+#ifdef TMWSERV_SUPPORT
Net::ChatServer::Party::acceptInvite(mPartyInviter);
+#else
+ eAthena::Party::respondToInvite(true);
+#endif
mPartyInviter = "";
}
else if (eventId == "no")
{
+ localChatTab->chatLog("Rejected invite from " + mPartyInviter);
+#ifdef TMWSERV_SUPPORT
+ // TODO
+#else
+ eAthena::Party::respondToInvite(false);
+#endif
mPartyInviter = "";
}
}
diff --git a/src/gui/partywindow.h b/src/gui/partywindow.h
index b587cc42..64cfb582 100644
--- a/src/gui/partywindow.h
+++ b/src/gui/partywindow.h
@@ -77,7 +77,8 @@ class PartyWindow : public Window, gcn::ActionListener
/**
* Show party invite
*/
- void showPartyInvite(const std::string &inviter);
+ void showPartyInvite(const std::string &inviter,
+ const std::string &partyName = "");
/**
* Handle events
diff --git a/src/gui/playerbox.cpp b/src/gui/playerbox.cpp
index 58ef4cd7..d00194bd 100644
--- a/src/gui/playerbox.cpp
+++ b/src/gui/playerbox.cpp
@@ -78,9 +78,6 @@ PlayerBox::~PlayerBox()
void PlayerBox::draw(gcn::Graphics *graphics)
{
- if (!isVisible())
- return;
-
if (mPlayer)
{
// Draw character
diff --git a/src/gui/popup.cpp b/src/gui/popup.cpp
index 648a9d6a..46246639 100644
--- a/src/gui/popup.cpp
+++ b/src/gui/popup.cpp
@@ -108,9 +108,6 @@ void Popup::savePopupConfiguration()
void Popup::draw(gcn::Graphics *graphics)
{
- if (!isVisible())
- return;
-
Graphics *g = static_cast<Graphics*>(graphics);
g->drawImageRect(0, 0, getWidth(), getHeight(), mSkin->getBorder());
diff --git a/src/gui/popupmenu.cpp b/src/gui/popupmenu.cpp
index 5b5b2b8c..1f36ef45 100644
--- a/src/gui/popupmenu.cpp
+++ b/src/gui/popupmenu.cpp
@@ -297,8 +297,7 @@ void PopupMenu::handleLink(const std::string &link)
being &&
being->getType() == Being::PLAYER)
{
- MessageOut outMsg(player_node->getNetwork());
- outMsg.writeInt16(CMSG_PARTY_INVITE);
+ MessageOut outMsg(CMSG_PARTY_INVITE);
outMsg.writeInt32(being->getId());
}
#endif
diff --git a/src/gui/radiobutton.cpp b/src/gui/radiobutton.cpp
index 4a98e29a..d563a2db 100644
--- a/src/gui/radiobutton.cpp
+++ b/src/gui/radiobutton.cpp
@@ -69,9 +69,6 @@ RadioButton::~RadioButton()
void RadioButton::drawBox(gcn::Graphics* graphics)
{
- if (!isVisible())
- return;
-
if (config.getValue("guialpha", 0.8) != mAlpha)
{
mAlpha = config.getValue("guialpha", 0.8);
diff --git a/src/gui/scrollarea.cpp b/src/gui/scrollarea.cpp
index a867822e..2fa087c1 100644
--- a/src/gui/scrollarea.cpp
+++ b/src/gui/scrollarea.cpp
@@ -170,9 +170,6 @@ void ScrollArea::logic()
void ScrollArea::draw(gcn::Graphics *graphics)
{
- if (!isVisible())
- return;
-
if (mVBarVisible)
{
drawUpButton(graphics);
diff --git a/src/gui/sell.cpp b/src/gui/sell.cpp
index e7671110..1e1155a7 100644
--- a/src/gui/sell.cpp
+++ b/src/gui/sell.cpp
@@ -46,14 +46,8 @@
#include "utils/gettext.h"
#include "utils/strprintf.h"
-#ifdef TMWSERV_SUPPORT
SellDialog::SellDialog():
Window(_("Sell")),
-#else
-SellDialog::SellDialog(Network *network):
- Window(_("Sell")),
- mNetwork(network),
-#endif
mMaxItems(0), mAmountItems(0)
{
setWindowName("Sell");
@@ -207,15 +201,13 @@ void SellDialog::action(const gcn::ActionEvent &event)
(mShopItems->at(selectedItem)->getId(), mAmountItems);
#else
// Attempt sell
- MessageOut outMsg(mNetwork);
-
ShopItem *item = mShopItems->at(selectedItem);
int sellCount;
mPlayerMoney +=
mAmountItems * mShopItems->at(selectedItem)->getPrice();
mMaxItems -= mAmountItems;
while (mAmountItems > 0) {
- outMsg.writeInt16(CMSG_NPC_SELL_REQUEST);
+ MessageOut outMsg(CMSG_NPC_SELL_REQUEST);
outMsg.writeInt16(8);
outMsg.writeInt16(item->getCurrentInvIndex());
// This order is important, item->getCurrentInvIndex() would return
diff --git a/src/gui/sell.h b/src/gui/sell.h
index b6388a1f..b3e59b4f 100644
--- a/src/gui/sell.h
+++ b/src/gui/sell.h
@@ -30,9 +30,6 @@
#include "window.h"
class Item;
-#ifdef EATHENA_SUPPORT
-class Network;
-#endif
class ShopItems;
class ShopListBox;
@@ -49,11 +46,7 @@ class SellDialog : public Window, gcn::ActionListener, gcn::SelectionListener
*
* @see Window::Window
*/
-#ifdef TMWSERV_SUPPORT
SellDialog();
-#else
- SellDialog(Network *network);
-#endif
/**
* Destructor
@@ -111,9 +104,6 @@ class SellDialog : public Window, gcn::ActionListener, gcn::SelectionListener
*/
void updateButtonsAndLabels();
-#ifdef EATHENA_SUPPORT
- Network *mNetwork;
-#endif
gcn::Button *mSellButton;
gcn::Button *mQuitButton;
gcn::Button *mAddMaxButton;
diff --git a/src/gui/serverdialog.cpp b/src/gui/serverdialog.cpp
index a57be06c..9d679acb 100644
--- a/src/gui/serverdialog.cpp
+++ b/src/gui/serverdialog.cpp
@@ -80,7 +80,7 @@ ServerDialog::ServerDialog(LoginData *loginData):
mPortField = new TextField(toString(mLoginData->port));
// Add the most used servers from config
- mMostUsedServersListModel = new ServersListModel();
+ mMostUsedServersListModel = new ServersListModel;
Server currentServer;
std::string currentConfig = "";
for (int i=0; i<=MAX_SERVERLIST; i++)
@@ -101,7 +101,7 @@ ServerDialog::ServerDialog(LoginData *loginData):
mMostUsedServersListBox = new ListBox(NULL);
mMostUsedServersListBox->setListModel(mMostUsedServersListModel);
- mMostUsedServersScrollArea = new ScrollArea();
+ mMostUsedServersScrollArea = new ScrollArea;
mMostUsedServersDropDown = new DropDown(mMostUsedServersListModel,
mMostUsedServersScrollArea, mMostUsedServersListBox);
diff --git a/src/gui/setup_colors.cpp b/src/gui/setup_colors.cpp
index caa53e2d..ed1b6d09 100644
--- a/src/gui/setup_colors.cpp
+++ b/src/gui/setup_colors.cpp
@@ -79,7 +79,7 @@ Setup_Colors::Setup_Colors() :
mGradTypeSlider->addActionListener(this);
mGradTypeSlider->setEnabled(false);
- mGradTypeText = new Label();
+ mGradTypeText = new Label;
mRedLabel = new Label(_("Red: "));
diff --git a/src/gui/shoplistbox.cpp b/src/gui/shoplistbox.cpp
index 8801c51a..b35c1d80 100644
--- a/src/gui/shoplistbox.cpp
+++ b/src/gui/shoplistbox.cpp
@@ -58,7 +58,7 @@ void ShopListBox::setPlayersMoney(int money)
void ShopListBox::draw(gcn::Graphics *gcnGraphics)
{
- if (!mListModel || !isVisible())
+ if (!mListModel)
return;
if (config.getValue("guialpha", 0.8) != mAlpha)
diff --git a/src/gui/shortcutcontainer.cpp b/src/gui/shortcutcontainer.cpp
index 9067e921..228a484e 100644
--- a/src/gui/shortcutcontainer.cpp
+++ b/src/gui/shortcutcontainer.cpp
@@ -42,12 +42,12 @@ void ShortcutContainer::widgetResized(const gcn::Event &event)
if (mGridWidth < 1)
mGridWidth = 1;
- setHeight((mMaxItems / mGridWidth) * mBoxHeight);
+ mGridHeight = mMaxItems / mGridWidth;
- mGridHeight = getHeight() / mBoxHeight;
+ if (mMaxItems % mGridWidth != 0 || mGridHeight < 1)
+ ++mGridHeight;
- if (mGridHeight < 1)
- mGridHeight = 1;
+ setHeight(mGridHeight * mBoxHeight);
}
int ShortcutContainer::getIndexFromGrid(int pointX, int pointY) const
diff --git a/src/gui/skill.h b/src/gui/skill.h
index 0600d106..0d6336f3 100644
--- a/src/gui/skill.h
+++ b/src/gui/skill.h
@@ -22,18 +22,19 @@
#ifndef SKILL_H
#define SKILL_H
+#include "gui/window.h"
+
#include <vector>
#include <guichan/actionlistener.hpp>
-#include "window.h"
-
struct SKILL {
short id; /**< Index into "skill_db" array */
short lv, sp;
};
class GuiTable;
+class ScrollArea;
class SkillGuiTableModel;
/**
diff --git a/src/gui/skilldialog.cpp b/src/gui/skilldialog.cpp
index e30299d4..4afd92ac 100644
--- a/src/gui/skilldialog.cpp
+++ b/src/gui/skilldialog.cpp
@@ -19,28 +19,30 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
-#include <guichan/widgets/label.hpp>
-#include <guichan/widgets/container.hpp>
-#include <guichan/widgets/icon.hpp>
+#include "gui/skilldialog.h"
+
+#include "gui/icon.h"
+#include "gui/button.h"
+#include "gui/listbox.h"
+#include "gui/scrollarea.h"
+#include "gui/windowcontainer.h"
+#include "gui/progressbar.h"
-#include "skilldialog.h"
+#include "gui/widgets/tabbedarea.h"
-#include "icon.h"
-#include "button.h"
-#include "listbox.h"
-#include "scrollarea.h"
-#include "windowcontainer.h"
-#include "progressbar.h"
+#include "localplayer.h"
-#include "widgets/tabbedarea.h"
+#include "utils/dtor.h"
+#include "utils/gettext.h"
+#include "utils/stringutils.h"
-#include "../localplayer.h"
+#include <guichan/widgets/label.hpp>
+#include <guichan/widgets/container.hpp>
+#include <guichan/widgets/icon.hpp>
-#include "../utils/dtor.h"
-#include "../utils/gettext.h"
-#include "../utils/stringutils.h"
+#include <vector>
-class Skill_Tab : public GCContainer, public gcn::ActionListener
+class SkillTab : public GCContainer, public gcn::ActionListener
{
public:
/**
@@ -51,7 +53,7 @@ class Skill_Tab : public GCContainer, public gcn::ActionListener
/**
* Constructor
*/
- Skill_Tab(const std::string &type);
+ SkillTab(const std::string &type);
/**
* Update this tab
@@ -102,21 +104,21 @@ SkillDialog::SkillDialog():
setCloseButton(true);
setDefaultSize(windowContainer->getWidth() - 280, 30, 275, 425);
- TabbedArea *panel = new TabbedArea();
+ TabbedArea *panel = new TabbedArea;
panel->setDimension(gcn::Rectangle(5, 5, 270, 420));
- Skill_Tab *tab;
+ SkillTab *tab;
// Add each type of skill tab to the panel
- tab = new Skill_Tab("Weapon");
+ tab = new SkillTab("Weapon");
panel->addTab(_("Weapons"), tab);
mTabs.push_back(tab);
- tab = new Skill_Tab("Magic");
+ tab = new SkillTab("Magic");
panel->addTab(_("Magic"), tab);
mTabs.push_back(tab);
- tab = new Skill_Tab("Craft");
+ tab = new SkillTab("Craft");
panel->addTab(_("Crafts"), tab);
mTabs.push_back(tab);
@@ -153,14 +155,14 @@ void SkillDialog::draw(gcn::Graphics *g)
void SkillDialog::update()
{
- for(std::list<Skill_Tab*>::const_iterator i = mTabs.begin();
+ for(std::list<SkillTab*>::const_iterator i = mTabs.begin();
i != mTabs.end(); ++i)
{
(*i)->update();
}
}
-Skill_Tab::Skill_Tab(const std::string &type): type(type)
+SkillTab::SkillTab(const std::string &type): type(type)
{
setOpaque(false);
setDimension(gcn::Rectangle(0, 0, 270, 420));
@@ -200,7 +202,7 @@ Skill_Tab::Skill_Tab(const std::string &type): type(type)
}
-int Skill_Tab::getSkillNum()
+int SkillTab::getSkillNum()
{
int skillNum = 0;
@@ -222,7 +224,7 @@ int Skill_Tab::getSkillNum()
else return skillNum;
}
-int Skill_Tab::getSkillBegin()
+int SkillTab::getSkillBegin()
{
int skillBegin = 0;
@@ -244,14 +246,14 @@ int Skill_Tab::getSkillBegin()
else return skillBegin;
}
-Icon* Skill_Tab::getIcon(int index)
+Icon* SkillTab::getIcon(int index)
{
int skillBegin = getSkillBegin();
std::string icon = LocalPlayer::getSkillInfo(index + skillBegin).icon;
return new Icon(icon);
}
-void Skill_Tab::updateSkill(int index)
+void SkillTab::updateSkill(int index)
{
int skillBegin = getSkillBegin();
@@ -306,7 +308,7 @@ void Skill_Tab::updateSkill(int index)
}
}
-void Skill_Tab::update()
+void SkillTab::update()
{
int skillNum = getSkillNum();
diff --git a/src/gui/skilldialog.h b/src/gui/skilldialog.h
index b79be800..8d1f6a88 100644
--- a/src/gui/skilldialog.h
+++ b/src/gui/skilldialog.h
@@ -22,20 +22,19 @@
#ifndef SKILL_H
#define SKILL_H
-#include <vector>
-#include <list>
+#include "gui/window.h"
+#include "gui/gccontainer.h"
+
+#include "guichanfwd.h"
#include <guichan/listmodel.hpp>
#include <guichan/actionlistener.hpp>
-#include "window.h"
-#include "gccontainer.h"
-
-#include "../guichanfwd.h"
+#include <list>
class ProgressBar;
class Icon;
-class Skill_Tab;
+class SkillTab;
/**
* The skill dialog.
@@ -71,7 +70,7 @@ class SkillDialog : public Window, public gcn::ActionListener
void draw(gcn::Graphics *g);
private:
- std::list<Skill_Tab*> mTabs;
+ std::list<SkillTab*> mTabs;
};
extern SkillDialog *skillDialog;
diff --git a/src/gui/skin.cpp b/src/gui/skin.cpp
index b16bdfe6..0130ad71 100644
--- a/src/gui/skin.cpp
+++ b/src/gui/skin.cpp
@@ -47,14 +47,16 @@ class SkinConfigListener : public ConfigListener
}
};
-Skin::Skin(ImageRect skin, Image *close,
+Skin::Skin(ImageRect skin, Image *close, Image *stickyUp, Image *stickyDown,
const std::string &filePath,
const std::string &name):
instances(0),
mFilePath(filePath),
mName(name),
border(skin),
- closeImage(close)
+ closeImage(close),
+ stickyImageUp(stickyUp),
+ stickyImageDown(stickyDown)
{
}
@@ -219,7 +221,14 @@ Skin *SkinLoader::load(const std::string &filename,
// Hard-coded for now until we update the above code to look for window buttons.
Image *closeImage = resman->getImage("graphics/gui/close_button.png");
- Skin *skin = new Skin(border, closeImage, filename);
+ Image *sticky = resman->getImage("graphics/gui/sticky_button.png");
+ Image *stickyImageUp = sticky->getSubImage(0, 0, 15, 15);
+ Image *stickyImageDown = sticky->getSubImage(15, 0, 15, 15);
+
+ sticky->decRef();
+
+ Skin *skin = new Skin(border, closeImage, stickyImageUp, stickyImageDown,
+ filename);
mSkins[filename] = skin;
diff --git a/src/gui/skin.h b/src/gui/skin.h
index df905b05..30f7f360 100644
--- a/src/gui/skin.h
+++ b/src/gui/skin.h
@@ -34,7 +34,7 @@ class Image;
class Skin
{
public:
- Skin(ImageRect skin, Image *close,
+ Skin(ImageRect skin, Image *close, Image *stickyUp, Image *stickyDown,
const std::string &filePath,
const std::string &name = "");
@@ -63,6 +63,12 @@ class Skin
Image *getCloseImage() const { return closeImage; }
/**
+ * Returns the image used by a sticky button for this skin.
+ */
+ Image *getStickyImage(bool state) const
+ { return state ? stickyImageDown : stickyImageUp; }
+
+ /**
* Returns the number of instances which use this skin.
*/
int getNumberOfInstances() const { return instances; }
@@ -89,6 +95,8 @@ class Skin
std::string mName; /**< Name of the skin to use */
ImageRect border; /**< The window border and background */
Image *closeImage; /**< Close Button Image */
+ Image *stickyImageUp; /**< Sticky Button Image */
+ Image *stickyImageDown; /**< Sticky Button Image */
};
// Map containing all window skins
diff --git a/src/gui/status.cpp b/src/gui/status.cpp
index e298c3e2..e6f57de5 100644
--- a/src/gui/status.cpp
+++ b/src/gui/status.cpp
@@ -253,9 +253,6 @@ void StatusWindow::update()
void StatusWindow::draw(gcn::Graphics *g)
{
- if (!isVisible())
- return;
-
update();
Window::draw(g);
diff --git a/src/gui/storagewindow.cpp b/src/gui/storagewindow.cpp
index 1289a4e7..8c25401d 100644
--- a/src/gui/storagewindow.cpp
+++ b/src/gui/storagewindow.cpp
@@ -51,9 +51,8 @@
#include "../utils/gettext.h"
#include "../utils/strprintf.h"
-StorageWindow::StorageWindow(Network *network, int invSize):
+StorageWindow::StorageWindow(int invSize):
Window(_("Storage")),
- mNetwork(network),
mMaxSlots(invSize),
mItemDesc(false)
{
@@ -188,24 +187,21 @@ Item* StorageWindow::getSelectedItem() const
return mItems->getSelectedItem();
}
-void StorageWindow::addStore(Item* item, int ammount)
+void StorageWindow::addStore(Item *item, int ammount)
{
- MessageOut outMsg(mNetwork);
- outMsg.writeInt16(CMSG_MOVE_TO_STORAGE);
- outMsg.writeInt16(item->getInvIndex());
+ MessageOut outMsg(CMSG_MOVE_TO_STORAGE);
+ outMsg.writeInt16(item->getInvIndex() + INVENTORY_OFFSET);
outMsg.writeInt32(ammount);
}
-void StorageWindow::removeStore(Item* item, int ammount)
+void StorageWindow::removeStore(Item *item, int ammount)
{
- MessageOut outMsg(mNetwork);
- outMsg.writeInt16(CSMG_MOVE_FROM_STORAGE);
- outMsg.writeInt16(item->getInvIndex());
+ MessageOut outMsg(CSMG_MOVE_FROM_STORAGE);
+ outMsg.writeInt16(item->getInvIndex() + STORAGE_OFFSET);
outMsg.writeInt32(ammount);
}
void StorageWindow::close()
{
- MessageOut outMsg(mNetwork);
- outMsg.writeInt16(CMSG_CLOSE_STORAGE);
+ MessageOut outMsg(CMSG_CLOSE_STORAGE);
}
diff --git a/src/gui/storagewindow.h b/src/gui/storagewindow.h
index cc0df2af..de0937b5 100644
--- a/src/gui/storagewindow.h
+++ b/src/gui/storagewindow.h
@@ -31,7 +31,6 @@
class Item;
class ItemContainer;
-class Network;
class ProgressBar;
class TextBox;
@@ -47,7 +46,7 @@ class StorageWindow : public Window, gcn::ActionListener,
/**
* Constructor.
*/
- StorageWindow(Network *network, int invSize = (STORAGE_SIZE - 1));
+ StorageWindow(int invSize = (STORAGE_SIZE - 1));
/**
* Destructor.
@@ -88,7 +87,6 @@ class StorageWindow : public Window, gcn::ActionListener,
void close();
private:
- Network *mNetwork;
ItemContainer *mItems;
int mSlots;
diff --git a/src/gui/table.cpp b/src/gui/table.cpp
index 4dda9246..e98d76e5 100644
--- a/src/gui/table.cpp
+++ b/src/gui/table.cpp
@@ -265,7 +265,7 @@ void GuiTable::installActionListeners()
// -- widget ops
void GuiTable::draw(gcn::Graphics* graphics)
{
- if (!mModel || !isVisible())
+ if (!mModel)
return;
if (config.getValue("guialpha", 0.8) != mAlpha)
diff --git a/src/gui/textfield.cpp b/src/gui/textfield.cpp
index c94710b3..48a00dcc 100644
--- a/src/gui/textfield.cpp
+++ b/src/gui/textfield.cpp
@@ -84,9 +84,6 @@ TextField::~TextField()
void TextField::draw(gcn::Graphics *graphics)
{
- if (!isVisible())
- return;
-
if (isFocused())
{
drawCaret(graphics,
diff --git a/src/gui/trade.cpp b/src/gui/trade.cpp
index 8aa3c3ea..e6df9ad8 100644
--- a/src/gui/trade.cpp
+++ b/src/gui/trade.cpp
@@ -24,7 +24,7 @@
#include <guichan/font.hpp>
#include "button.h"
-#include "chat.h"
+#include "widgets/chattab.h"
#include "inventorywindow.h"
#include "item_amount.h"
#include "itemcontainer.h"
@@ -51,20 +51,12 @@
#include "../utils/stringutils.h"
#include "../utils/strprintf.h"
-#ifdef TMWSERV_SUPPORT
TradeWindow::TradeWindow():
-#else
-TradeWindow::TradeWindow(Network *network):
-#endif
Window(_("Trade: You")),
-#ifdef EATHENA_SUPPORT
- mNetwork(network),
- mMyInventory(new Inventory(INVENTORY_SIZE, 2)),
- mPartnerInventory(new Inventory(INVENTORY_SIZE, 2))
-#else
mMyInventory(new Inventory(INVENTORY_SIZE)),
- mPartnerInventory(new Inventory(INVENTORY_SIZE)),
- mStatus(PREPARING)
+ mPartnerInventory(new Inventory(INVENTORY_SIZE))
+#ifdef TMWSERV_SUPPORT
+ , mStatus(PREPARING)
#endif
{
setWindowName("Trade");
@@ -252,9 +244,8 @@ void TradeWindow::tradeItem(Item *item, int quantity)
// function. Detect the actual server version, and re-enable this
// for that version only.
//addItem(item->getId(), true, quantity, item->isEquipment());
- MessageOut outMsg(mNetwork);
- outMsg.writeInt16(CMSG_TRADE_ITEM_ADD_REQUEST);
- outMsg.writeInt16(item->getInvIndex());
+ MessageOut outMsg(CMSG_TRADE_ITEM_ADD_REQUEST);
+ outMsg.writeInt16(item->getInvIndex() + INVENTORY_OFFSET);
outMsg.writeInt32(quantity);
#endif
}
@@ -329,8 +320,7 @@ void TradeWindow::action(const gcn::ActionEvent &event)
#ifdef TMWSERV_SUPPORT
Net::GameServer::Player::acceptTrade(false);
#else
- MessageOut outMsg(mNetwork);
- outMsg.writeInt16(CMSG_TRADE_CANCEL_REQUEST);
+ MessageOut outMsg(CMSG_TRADE_CANCEL_REQUEST);
#endif
}
#ifdef EATHENA_SUPPORT
@@ -342,8 +332,7 @@ void TradeWindow::action(const gcn::ActionEvent &event)
{
mMoneyField->setText(toString(tempInt));
- MessageOut outMsg(mNetwork);
- outMsg.writeInt16(CMSG_TRADE_ITEM_ADD_REQUEST);
+ MessageOut outMsg(CMSG_TRADE_ITEM_ADD_REQUEST);
outMsg.writeInt16(0);
outMsg.writeInt32(tempInt);
}
@@ -352,8 +341,7 @@ void TradeWindow::action(const gcn::ActionEvent &event)
mMoneyField->setText("");
}
mMoneyField->setEnabled(false);
- MessageOut outMsg(mNetwork);
- outMsg.writeInt16(CMSG_TRADE_ADD_COMPLETE);
+ MessageOut outMsg(CMSG_TRADE_ADD_COMPLETE);
}
#endif
else if (event.getId() == "trade")
@@ -362,8 +350,7 @@ void TradeWindow::action(const gcn::ActionEvent &event)
Net::GameServer::Player::acceptTrade(true);
setStatus(PROPOSING);
#else
- MessageOut outMsg(mNetwork);
- outMsg.writeInt16(CMSG_TRADE_OK);
+ MessageOut outMsg(CMSG_TRADE_OK);
#endif
}
#ifdef TMWSERV_SUPPORT
@@ -382,7 +369,6 @@ void TradeWindow::close()
#ifdef TMWSERV_SUPPORT
Net::GameServer::Player::acceptTrade(false);
#else
- MessageOut outMsg(mNetwork);
- outMsg.writeInt16(CMSG_TRADE_CANCEL_REQUEST);
+ MessageOut outMsg(CMSG_TRADE_CANCEL_REQUEST);
#endif
}
diff --git a/src/gui/trade.h b/src/gui/trade.h
index 4c215ba6..e2767c5b 100644
--- a/src/gui/trade.h
+++ b/src/gui/trade.h
@@ -34,9 +34,6 @@
class Inventory;
class Item;
class ItemContainer;
-#ifdef EATHENA_SUPPORT
-class Network;
-#endif
class ScrollArea;
/**
@@ -50,11 +47,7 @@ class TradeWindow : public Window, gcn::ActionListener, gcn::SelectionListener
/**
* Constructor.
*/
-#ifdef TMWSERV_SUPPORT
TradeWindow();
-#else
- TradeWindow(Network *network);
-#endif
/**
* Destructor.
@@ -139,10 +132,6 @@ class TradeWindow : public Window, gcn::ActionListener, gcn::SelectionListener
void setStatus(Status);
#endif
-#ifdef EATHENA_SUPPORT
- Network *mNetwork;
-#endif
-
typedef const std::auto_ptr<Inventory> InventoryPtr;
InventoryPtr mMyInventory;
InventoryPtr mPartnerInventory;
diff --git a/src/gui/unregisterdialog.cpp b/src/gui/unregisterdialog.cpp
index 7906afc1..c133c9f7 100644
--- a/src/gui/unregisterdialog.cpp
+++ b/src/gui/unregisterdialog.cpp
@@ -42,7 +42,7 @@
UnRegisterDialog::UnRegisterDialog(Window *parent, LoginData *loginData):
Window("Unregister", true, parent),
- mWrongDataNoticeListener(new WrongDataNoticeListener()),
+ mWrongDataNoticeListener(new WrongDataNoticeListener),
mLoginData(loginData)
{
gcn::Label *userLabel = new gcn::Label(strprintf(_("Name: %s"), mLoginData->username.c_str()));
diff --git a/src/gui/widgets/channeltab.cpp b/src/gui/widgets/channeltab.cpp
index c17aec0a..375ead26 100644
--- a/src/gui/widgets/channeltab.cpp
+++ b/src/gui/widgets/channeltab.cpp
@@ -19,40 +19,18 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
-#include <guichan/widgets/label.hpp>
-
#include "channeltab.h"
-#include "../browserbox.h"
-#include "../chatinput.h"
-#include "../itemlinkhandler.h"
-#include "../recorder.h"
-#include "../scrollarea.h"
-
-#include "../../beingmanager.h"
-#include "../../commandhandler.h"
-#include "../../channel.h"
-#include "../../configuration.h"
-#include "../../game.h"
-#include "../../localplayer.h"
+#include "channel.h"
#ifdef TMWSERV_SUPPORT
-#include "../../net/tmwserv/chatserver/chatserver.h"
-#include "../../net/tmwserv/gameserver/player.h"
+#include "net/tmwserv/chatserver/chatserver.h"
+#include "net/tmwserv/gameserver/player.h"
#else
-#include "../../party.h"
-#include "../../net/messageout.h"
-#include "../../net/ea/protocol.h"
+#include "net/messageout.h"
+#include "net/ea/protocol.h"
#endif
-#include "../../resources/iteminfo.h"
-#include "../../resources/itemdb.h"
-
-#include "../../utils/dtor.h"
-#include "../../utils/gettext.h"
-#include "../../utils/strprintf.h"
-#include "../../utils/stringutils.h"
-
ChannelTab::ChannelTab(Channel *channel) : ChatTab(channel->getName()),
mChannel(channel)
{
@@ -63,7 +41,7 @@ ChannelTab::~ChannelTab()
{
}
-void ChannelTab::sendChat(const std::string &msg) {
+void ChannelTab::handleInput(const std::string &msg) {
#ifdef TMSERV_SUPPORT
Net::ChatServer::chat(getId(), msg);
#endif
diff --git a/src/gui/widgets/channeltab.h b/src/gui/widgets/channeltab.h
index 04a11e29..8c98189b 100644
--- a/src/gui/widgets/channeltab.h
+++ b/src/gui/widgets/channeltab.h
@@ -48,7 +48,7 @@ class ChannelTab : public ChatTab
*/
~ChannelTab();
- void sendChat(const std::string &msg);
+ void handleInput(const std::string &msg);
private:
Channel *mChannel;
diff --git a/src/gui/widgets/chattab.cpp b/src/gui/widgets/chattab.cpp
index 0594761d..c4563cc9 100644
--- a/src/gui/widgets/chattab.cpp
+++ b/src/gui/widgets/chattab.cpp
@@ -19,40 +19,37 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
-#include <guichan/widgets/label.hpp>
-
#include "chattab.h"
-#include "layouthelper.h"
-#include "../browserbox.h"
-#include "../chatinput.h"
-#include "../itemlinkhandler.h"
-#include "../recorder.h"
-#include "../scrollarea.h"
+#include "commandhandler.h"
+#include "configuration.h"
+#include "localplayer.h"
-#include "../../commandhandler.h"
-#include "../../configuration.h"
-#include "../../localplayer.h"
+#include "gui/browserbox.h"
+#include "gui/itemlinkhandler.h"
+#include "gui/recorder.h"
+#include "gui/scrollarea.h"
#ifdef TMWSERV_SUPPORT
-#include "../../net/tmwserv/chatserver/chatserver.h"
-#include "../../net/tmwserv/gameserver/player.h"
+#include "net/tmwserv/chatserver/chatserver.h"
+#include "net/tmwserv/gameserver/player.h"
#else
-#include "../../net/messageout.h"
-#include "../../net/ea/protocol.h"
+#include "net/messageout.h"
+#include "net/ea/protocol.h"
#endif
-#include "../../resources/iteminfo.h"
-#include "../../resources/itemdb.h"
+#include "resources/iteminfo.h"
+#include "resources/itemdb.h"
-#include "../../utils/strprintf.h"
-#include "../../utils/stringutils.h"
+#include "utils/gettext.h"
+#include "utils/strprintf.h"
+#include "utils/stringutils.h"
ChatTab::ChatTab(const std::string &name) : Tab()
{
setCaption(name);
- mTextOutput = new BrowserBox;
+ mTextOutput = new BrowserBox(BrowserBox::AUTO_WRAP);
mTextOutput->setOpaque(false);
mTextOutput->setMaxRow((int) config.getValue("ChatLogLength", 0));
mTextOutput->setLinkHandler(chatWindow->mItemLinkHandler);
@@ -160,10 +157,9 @@ void ChatTab::chatLog(std::string line, int own, bool ignoreRecord)
break;
#endif
case ACT_WHISPER:
- tmp.nick = strprintf(_("%s whispers:"), tmp.nick.c_str());
- tmp.nick += " ";
- lineColor = "##W";
- break;
+ // Resend whisper through normal mechanism
+ chatWindow->whisper(tmp.nick, tmp.text);
+ return;
case ACT_IS:
tmp.nick += CAT_IS;
lineColor = "##I";
@@ -221,10 +217,11 @@ void ChatTab::chatLog(std::string line, int own, bool ignoreRecord)
void ChatTab::chatLog(std::string &nick, std::string &msg)
{
- chatLog(nick + ": " + msg, nick == player_node->getName() ? BY_PLAYER : BY_OTHER, false);
+ chatLog(nick + CAT_NORMAL + msg, nick == player_node->getName() ?
+ BY_PLAYER : BY_OTHER, false);
}
-void ChatTab::chatSend(std::string &msg)
+void ChatTab::chatInput(std::string &msg)
{
trim(msg);
@@ -242,9 +239,7 @@ void ChatTab::chatSend(std::string &msg)
chatLog(_("Trying to send a blank party message."), BY_SERVER, true);
return;
}
- MessageOut outMsg(chatWindow->mNetwork);
-
- outMsg.writeInt16(CMSG_PARTY_MESSAGE);
+ MessageOut outMsg(CMSG_PARTY_MESSAGE);
outMsg.writeInt16(length + 4);
outMsg.writeString(msg, length);
return;
@@ -282,16 +277,11 @@ void ChatTab::chatSend(std::string &msg)
start = msg.find('[', start + 1);
}
-
// Prepare ordinary message
if (msg[0] != '/')
- {
- sendChat(msg);
- }
+ handleInput(msg);
else
- {
handleCommand(std::string(msg, 1));
- }
}
void ChatTab::scroll(int amount)
@@ -308,22 +298,21 @@ void ChatTab::clearText()
mTextOutput->clearRows();
}
-void ChatTab::sendChat(std::string &msg) {
+void ChatTab::handleInput(const std::string &msg) {
#ifdef TMWSERV_SUPPORT
Net::GameServer::Player::say(msg);
#else
- msg = player_node->getName() + " : " + msg;
+ std::string mes = player_node->getName() + " : " + msg;
- MessageOut outMsg(chatWindow->mNetwork);
- outMsg.writeInt16(CMSG_CHAT_MESSAGE);
+ MessageOut outMsg(CMSG_CHAT_MESSAGE);
// Added + 1 in order to let eAthena parse admin commands correctly
- outMsg.writeInt16(msg.length() + 4 + 1);
- outMsg.writeString(msg, msg.length() + 1);
+ outMsg.writeInt16(mes.length() + 4 + 1);
+ outMsg.writeString(mes, mes.length() + 1);
return;
#endif
}
-void ChatTab::handleCommand(const std::string msg)
+void ChatTab::handleCommand(std::string msg)
{
- commandHandler->handleCommand(msg);
+ commandHandler->handleCommand(msg, this);
}
diff --git a/src/gui/widgets/chattab.h b/src/gui/widgets/chattab.h
index 3e64242c..52449f6f 100644
--- a/src/gui/widgets/chattab.h
+++ b/src/gui/widgets/chattab.h
@@ -22,11 +22,10 @@
#ifndef CHATTAB_H
#define CHATTAB_H
-#include <guichan/widgets/container.hpp>
-
-#include "tab.h"
+#include "gui/widgets/tab.h"
+#include "gui/chat.h"
-#include "../chat.h"
+#include <guichan/widgets/container.hpp>
class BrowserBox;
class Recorder;
@@ -48,6 +47,13 @@ enum
};
/**
+ * gets in between usernick and message text depending on
+ * message type
+ */
+#define CAT_NORMAL ": "
+#define CAT_IS ""
+
+/**
* A tab for the chat window. This is special to ease chat handling.
*/
class ChatTab : public Tab
@@ -90,7 +96,7 @@ class ChatTab : public Tab
* @param msg The message text which is to be sent.
*
*/
- void chatSend(std::string &msg);
+ void chatInput(std::string &msg);
/**
* Scrolls the chat window
@@ -105,10 +111,11 @@ class ChatTab : public Tab
protected:
friend class ChatWindow;
+ friend class WhisperWindow;
- virtual void sendChat(std::string &msg);
+ virtual void handleInput(const std::string &msg);
- virtual void handleCommand(const std::string msg);
+ virtual void handleCommand(std::string msg);
ScrollArea *mScrollArea;
BrowserBox *mTextOutput;
diff --git a/src/gui/widgets/dropdown.cpp b/src/gui/widgets/dropdown.cpp
index d8c66789..68c7e093 100644
--- a/src/gui/widgets/dropdown.cpp
+++ b/src/gui/widgets/dropdown.cpp
@@ -111,9 +111,6 @@ DropDown::~DropDown()
void DropDown::draw(gcn::Graphics* graphics)
{
- if (!isVisible())
- return;
-
int h;
if (mDroppedDown)
diff --git a/src/gui/widgets/whispertab.cpp b/src/gui/widgets/whispertab.cpp
index 1c63d1c9..9e6d9336 100644
--- a/src/gui/widgets/whispertab.cpp
+++ b/src/gui/widgets/whispertab.cpp
@@ -19,38 +19,27 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
-#include <guichan/widgets/label.hpp>
-
#include "whispertab.h"
-#include "../../beingmanager.h"
-#include "../../commandhandler.h"
-#include "../../channel.h"
-#include "../../configuration.h"
-#include "../../game.h"
-#include "../../localplayer.h"
+#include "localplayer.h"
+
+#include "gui/palette.h"
#ifdef TMWSERV_SUPPORT
-#include "../../net/tmwserv/chatserver/chatserver.h"
-#include "../../net/tmwserv/gameserver/player.h"
+#include "net/tmwserv/chatserver/chatserver.h"
#else
-#include "../../party.h"
-#include "../../net/messageout.h"
-#include "../../net/ea/protocol.h"
+#include "net/messageout.h"
+#include "net/ea/protocol.h"
#endif
-#include "../../resources/iteminfo.h"
-#include "../../resources/itemdb.h"
-
-#include "../../utils/dtor.h"
-#include "../../utils/gettext.h"
-#include "../../utils/strprintf.h"
-#include "../../utils/stringutils.h"
+#include "utils/gettext.h"
+#include "utils/strprintf.h"
WhisperTab::WhisperTab(const std::string &nick) :
ChatTab(nick),
mNick(nick)
{
+ setForegroundColor(guiPalette->getColor(Palette::WHISPER));
}
WhisperTab::~WhisperTab()
@@ -58,7 +47,7 @@ WhisperTab::~WhisperTab()
chatWindow->removeWhisper(mNick);
}
-void WhisperTab::sendChat(const std::string &msg) {
+void WhisperTab::handleInput(const std::string &msg) {
if (msg.length() == 0) {
chatLog(_("Cannot send empty chat!"), BY_SERVER, false);
return;
@@ -67,8 +56,7 @@ void WhisperTab::sendChat(const std::string &msg) {
#ifdef TMWSERV_SUPPORT
Net::ChatServer::privMsg(mNick, msg);
#else
- MessageOut outMsg(chatWindow->mNetwork);
- outMsg.writeInt16(CMSG_CHAT_WHISPER);
+ MessageOut outMsg(CMSG_CHAT_WHISPER);
outMsg.writeInt16(msg.length() + 28);
outMsg.writeString(mNick, 24);
outMsg.writeString(msg, msg.length());
@@ -78,7 +66,7 @@ void WhisperTab::sendChat(const std::string &msg) {
msg.c_str()), BY_PLAYER, false);
}
-void WhisperTab::handleCommand(const std::string msg)
+void WhisperTab::handleCommand(std::string msg)
{
if (msg == "close")
delete this;
diff --git a/src/gui/widgets/whispertab.h b/src/gui/widgets/whispertab.h
index 1d2f968d..739ae159 100644
--- a/src/gui/widgets/whispertab.h
+++ b/src/gui/widgets/whispertab.h
@@ -46,9 +46,9 @@ class WhisperTab : public ChatTab
~WhisperTab();
- void sendChat(const std::string &msg);
+ void handleInput(const std::string &msg);
- void handleCommand(const std::string msg);
+ void handleCommand(std::string msg);
private:
std::string mNick;
diff --git a/src/gui/window.cpp b/src/gui/window.cpp
index 3bc03fb8..1f9dab5b 100644
--- a/src/gui/window.cpp
+++ b/src/gui/window.cpp
@@ -48,6 +48,7 @@ Window::Window(const std::string &caption, bool modal, Window *parent, const std
mShowTitle(true),
mModal(modal),
mCloseButton(false),
+ mStickyButton(false),
mSticky(false),
mMinWinWidth(100),
mMinWinHeight(40),
@@ -60,7 +61,7 @@ Window::Window(const std::string &caption, bool modal, Window *parent, const std
throw GCN_EXCEPTION("Window::Window(): no windowContainer set");
if (instances == 0)
- skinLoader = new SkinLoader();
+ skinLoader = new SkinLoader;
instances++;
@@ -118,9 +119,6 @@ void Window::setWindowContainer(WindowContainer *wc)
void Window::draw(gcn::Graphics *graphics)
{
- if (!isVisible())
- return;
-
Graphics *g = static_cast<Graphics*>(graphics);
g->drawImageRect(0, 0, getWidth(), getHeight(), mSkin->getBorder());
@@ -138,8 +136,18 @@ void Window::draw(gcn::Graphics *graphics)
{
g->drawImage(mSkin->getCloseImage(),
getWidth() - mSkin->getCloseImage()->getWidth() - getPadding(),
- getPadding()
- );
+ getPadding());
+ }
+
+ // Draw Sticky Button
+ if (mStickyButton)
+ {
+ Image *button = mSkin->getStickyImage(mSticky);
+ int x = getWidth() - button->getWidth() - getPadding();
+ if (mCloseButton)
+ x -= mSkin->getCloseImage()->getWidth();
+
+ g->drawImage(button, x, getPadding());
}
drawChildren(graphics);
@@ -286,6 +294,11 @@ bool Window::isResizable() const
return mGrip;
}
+void Window::setStickyButton(bool flag)
+{
+ mStickyButton = flag;
+}
+
void Window::setSticky(bool sticky)
{
mSticky = sticky;
@@ -293,7 +306,12 @@ void Window::setSticky(bool sticky)
void Window::setVisible(bool visible)
{
- gcn::Window::setVisible(isSticky() || visible);
+ setVisible(visible, false);
+}
+
+void Window::setVisible(bool visible, bool forceSticky)
+{
+ gcn::Window::setVisible((!forceSticky && isSticky()) || visible);
}
void Window::scheduleDelete()
@@ -326,6 +344,22 @@ void Window::mousePressed(gcn::MouseEvent &event)
}
}
+ // Handle sticky button
+ if (mStickyButton)
+ {
+ Image *button = mSkin->getStickyImage(mSticky);
+ int rx = getWidth() - button->getWidth() - getPadding();
+ if (mCloseButton)
+ rx -= mSkin->getCloseImage()->getWidth();
+ gcn::Rectangle stickyButtonRect(rx, getPadding(),
+ button->getWidth(), button->getHeight());
+
+ if (stickyButtonRect.isPointInRect(x, y))
+ {
+ setSticky(!isSticky());
+ }
+ }
+
// Handle window resizing
mouseResize = getResizeHandles(event);
}
@@ -470,7 +504,12 @@ void Window::loadWindowState()
setPosition((int) config.getValue(name + "WinX", mDefaultX),
(int) config.getValue(name + "WinY", mDefaultY));
- setVisible((bool) config.getValue(name + "Visible", false));
+
+ if (mCloseButton)
+ setVisible((bool) config.getValue(name + "Visible", false));
+
+ if (mStickyButton)
+ setSticky((bool) config.getValue(name + "Sticky", isSticky()));
if (skinName.compare(mSkin->getFilePath()) != 0)
{
@@ -507,7 +546,13 @@ void Window::saveWindowState()
{
config.setValue(mWindowName + "WinX", getX());
config.setValue(mWindowName + "WinY", getY());
- config.setValue(mWindowName + "Visible", isVisible());
+
+ if (mCloseButton)
+ config.setValue(mWindowName + "Visible", isVisible());
+
+ if (mStickyButton)
+ config.setValue(mWindowName + "Sticky", isSticky());
+
config.setValue(mWindowName + "Skin", mSkin->getFilePath());
if (mGrip)
diff --git a/src/gui/window.h b/src/gui/window.h
index c41a4221..18a64532 100644
--- a/src/gui/window.h
+++ b/src/gui/window.h
@@ -145,16 +145,21 @@ class Window : public gcn::Window, gcn::WidgetListener
void setShowTitle(bool flag) { mShowTitle = flag; }
/**
+ * Sets whether or not the window has a sticky button.
+ */
+ void setStickyButton(bool flag);
+
+ /**
* Sets whether the window is sticky. A sticky window will not have
* its visibility set to false on a general setVisible(false) call.
+ * Use this to set the default before you call loadWindowState().
*/
void setSticky(bool sticky);
/**
* Returns whether the window is sticky.
*/
- bool isSticky() const
- { return mSticky; }
+ bool isSticky() const { return mSticky; }
/**
* Overloads window setVisible by Guichan to allow sticky window
@@ -163,6 +168,12 @@ class Window : public gcn::Window, gcn::WidgetListener
void setVisible(bool visible);
/**
+ * Overloads window setVisible by Guichan to allow sticky window
+ * handling, or not, if you force the sticky state.
+ */
+ void setVisible(bool visible, bool forceSticky);
+
+ /**
* Returns the parent window.
*
* @return The parent window or <code>NULL</code> if there is none.
@@ -325,7 +336,8 @@ class Window : public gcn::Window, gcn::WidgetListener
bool mShowTitle; /**< Window has a title bar */
bool mModal; /**< Window is modal */
bool mCloseButton; /**< Window has a close button */
- bool mSticky; /**< Window resists minimization */
+ bool mStickyButton; /**< Window has a sticky button */
+ bool mSticky; /**< Window resists hiding*/
int mMinWinWidth; /**< Minimum window width */
int mMinWinHeight; /**< Minimum window height */
int mMaxWinWidth; /**< Maximum window width */
diff --git a/src/inventory.cpp b/src/inventory.cpp
index 59f51e39..532d9ab6 100644
--- a/src/inventory.cpp
+++ b/src/inventory.cpp
@@ -37,9 +37,8 @@ struct SlotUsed : public std::unary_function<Item*, bool>
}
};
-Inventory::Inventory(int size, int offset):
- mSize(size),
- mOffset(offset)
+Inventory::Inventory(int size):
+ mSize(size)
{
mItems = new Item*[mSize];
std::fill_n(mItems, mSize, (Item*) 0);
@@ -135,7 +134,7 @@ bool Inventory::contains(Item *item) const
int Inventory::getFreeSlot() const
{
- Item **i = std::find_if(mItems + mOffset, mItems + mSize,
+ Item **i = std::find_if(mItems, mItems + mSize,
std::not1(SlotUsed()));
return (i == mItems + mSize) ? -1 : (i - mItems);
}
@@ -153,8 +152,3 @@ int Inventory::getLastUsedSlot() const
return -1;
}
-
-int Inventory::getInventorySize() const
-{
- return mSize - mOffset;
-}
diff --git a/src/inventory.h b/src/inventory.h
index 008b7ec4..07a9276e 100644
--- a/src/inventory.h
+++ b/src/inventory.h
@@ -19,8 +19,8 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
-#ifndef _INVENTORY_H
-#define _INVENTORY_H
+#ifndef INVENTORY_H
+#define INVENTORY_H
class Item;
@@ -37,7 +37,7 @@ class Inventory
/**
* Constructor.
*/
- Inventory(int size, int offset = 0);
+ Inventory(int size);
/**
* Destructor.
@@ -107,16 +107,11 @@ class Inventory
*/
int getLastUsedSlot() const;
- /**
- * Returns the number of slots available in the inventory.
- */
- int getInventorySize() const;
-
static const int NO_SLOT_INDEX = -1; /**< Slot has no index. */
+
protected:
Item **mItems; /**< The holder of items */
int mSize; /**< The max number of inventory items */
- int mOffset; /**< Offset used by the inventory */
};
#endif
diff --git a/src/keyboardconfig.cpp b/src/keyboardconfig.cpp
index 06ce4ac7..e13af147 100644
--- a/src/keyboardconfig.cpp
+++ b/src/keyboardconfig.cpp
@@ -94,6 +94,8 @@ static KeyData const keyData[KeyboardConfig::KEY_TOTAL] = {
{"keyChat", SDLK_RETURN, _("Toggle Chat")},
{"keyChatScrollUp", SDLK_PAGEUP, _("Scroll Chat Up")},
{"keyChatScrollDown", SDLK_PAGEDOWN, _("Scroll Chat Down")},
+ {"keyChatPrevTab", SDLK_LEFTBRACKET, _("Previous Chat Tab")},
+ {"keyChatNextTab", SDLK_RIGHTBRACKET, _("Next Chat Tab")},
{"keyOK", SDLK_RETURN, _("Select OK")},
{"keyQuit", SDLK_ESCAPE, _("Quit")},
{"keyIgnoreInput1", SDLK_LSUPER, _("Ignore input 1")},
diff --git a/src/keyboardconfig.h b/src/keyboardconfig.h
index f7750b30..ecbe5de5 100644
--- a/src/keyboardconfig.h
+++ b/src/keyboardconfig.h
@@ -205,6 +205,8 @@ class KeyboardConfig
KEY_TOGGLE_CHAT,
KEY_SCROLL_CHAT_UP,
KEY_SCROLL_CHAT_DOWN,
+ KEY_PREV_CHAT_TAB,
+ KEY_NEXT_CHAT_TAB,
KEY_OK,
KEY_QUIT,
KEY_IGNORE_INPUT_1,
diff --git a/src/localplayer.cpp b/src/localplayer.cpp
index f8fad1e8..eb54b4b1 100644
--- a/src/localplayer.cpp
+++ b/src/localplayer.cpp
@@ -18,7 +18,8 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
-#include <cassert>
+
+#include "localplayer.h"
#include "configuration.h"
#include "equipment.h"
@@ -27,7 +28,6 @@
#include "graphics.h"
#include "inventory.h"
#include "item.h"
-#include "localplayer.h"
#include "map.h"
#include "monster.h"
#include "particle.h"
@@ -65,6 +65,8 @@
#include "utils/gettext.h"
#include "utils/stringutils.h"
+#include <cassert>
+
#ifdef TMWSERV_SUPPORT
const short walkingKeyboardDelay = 100;
#endif
@@ -96,7 +98,6 @@ LocalPlayer::LocalPlayer(int id, int job, Map *map):
mStatPoint(0), mSkillPoint(0),
mStatsPointsToAttribute(0),
mEquipment(new Equipment),
- mNetwork(0),
mXp(0),
mInStorage(false),
mTargetTime(-1),
@@ -111,13 +112,12 @@ LocalPlayer::LocalPlayer(int id, int job, Map *map):
mLastAction(-1),
mWalkingDir(0),
mDestX(0), mDestY(0),
+ mInventory(new Inventory(INVENTORY_SIZE)),
#ifdef TMWSERV_SUPPORT
mLocalWalkTime(-1),
- mInventory(new Inventory(INVENTORY_SIZE)),
mExpMessageTime(0)
#else
- mInventory(new Inventory(INVENTORY_SIZE, 2)),
- mStorage(new Inventory(STORAGE_SIZE, 1))
+ mStorage(new Inventory(STORAGE_SIZE))
#endif
{
// Variable to keep the local player from doing certain actions before a map
@@ -363,11 +363,6 @@ void LocalPlayer::inviteToGuild(Being *being)
}
}
-void LocalPlayer::inviteToParty(const std::string &name)
-{
- Net::ChatServer::Party::invitePlayer(name);
-}
-
void LocalPlayer::clearInventory()
{
mEquipment->clear();
@@ -381,6 +376,15 @@ void LocalPlayer::setInvItem(int index, int id, int amount)
#endif
+void LocalPlayer::inviteToParty(const std::string &name)
+{
+#ifdef TMWSERV_SUPPORT
+ Net::ChatServer::Party::invitePlayer(name);
+#else
+
+#endif
+}
+
void LocalPlayer::moveInvItem(Item *item, int newIndex)
{
// special case, the old and new cannot copy over each other.
@@ -399,9 +403,8 @@ void LocalPlayer::equipItem(Item *item)
#ifdef TMWSERV_SUPPORT
Net::GameServer::Player::equip(item->getInvIndex());
#else
- MessageOut outMsg(mNetwork);
- outMsg.writeInt16(CMSG_PLAYER_EQUIP);
- outMsg.writeInt16(item->getInvIndex());
+ MessageOut outMsg(CMSG_PLAYER_EQUIP);
+ outMsg.writeInt16(item->getInvIndex() + INVENTORY_OFFSET);
outMsg.writeInt16(0);
#endif
}
@@ -428,9 +431,8 @@ void LocalPlayer::unequipItem(Item *item)
if (!item)
return;
- MessageOut outMsg(mNetwork);
- outMsg.writeInt16(CMSG_PLAYER_UNEQUIP);
- outMsg.writeInt16(item->getInvIndex());
+ MessageOut outMsg(CMSG_PLAYER_UNEQUIP);
+ outMsg.writeInt16(item->getInvIndex() + INVENTORY_OFFSET);
// Tidy equipment directly to avoid weapon still shown bug, for instance
mEquipment->removeEquipment(item->getInvIndex());
@@ -438,9 +440,8 @@ void LocalPlayer::unequipItem(Item *item)
void LocalPlayer::useItem(Item *item)
{
- MessageOut outMsg(mNetwork);
- outMsg.writeInt16(CMSG_PLAYER_INVENTORY_USE);
- outMsg.writeInt16(item->getInvIndex());
+ MessageOut outMsg(CMSG_PLAYER_INVENTORY_USE);
+ outMsg.writeInt16(item->getInvIndex() + INVENTORY_OFFSET);
outMsg.writeInt32(item->getId());
// Note: id is dest of item, usually player_node->account_ID ??
}
@@ -453,9 +454,8 @@ void LocalPlayer::dropItem(Item *item, int quantity)
Net::GameServer::Player::drop(item->getInvIndex(), quantity);
#else
// TODO: Fix wrong coordinates of drops, serverside?
- MessageOut outMsg(mNetwork);
- outMsg.writeInt16(CMSG_PLAYER_INVENTORY_DROP);
- outMsg.writeInt16(item->getInvIndex());
+ MessageOut outMsg(CMSG_PLAYER_INVENTORY_DROP);
+ outMsg.writeInt16(item->getInvIndex() + INVENTORY_OFFSET);
outMsg.writeInt16(quantity);
#endif
}
@@ -488,8 +488,7 @@ void LocalPlayer::pickUp(FloorItem *item)
int id = item->getId();
Net::GameServer::Player::pickUp(id >> 16, id & 0xFFFF);
#else
- MessageOut outMsg(mNetwork);
- outMsg.writeInt16(CMSG_ITEM_PICKUP);
+ MessageOut outMsg(CMSG_ITEM_PICKUP);
outMsg.writeInt32(item->getId());
#endif
mPickUpTarget = NULL;
@@ -689,9 +688,8 @@ void LocalPlayer::setDestination(Uint16 x, Uint16 y)
effectManager->trigger(15,x,y);
#else
char temp[4] = "";
- MessageOut outMsg(mNetwork);
set_coordinates(temp, x, y, mDirection);
- outMsg.writeInt16(0x0085);
+ MessageOut outMsg(0x0085);
outMsg.writeString(temp, 3);
#endif
}
@@ -734,8 +732,7 @@ void LocalPlayer::stopWalking(bool sendToServer)
#ifdef EATHENA_SUPPORT
void LocalPlayer::raiseAttribute(Attribute attr)
{
- MessageOut outMsg(mNetwork);
- outMsg.writeInt16(CMSG_STAT_UPDATE_REQUEST);
+ MessageOut outMsg(CMSG_STAT_UPDATE_REQUEST);
switch (attr)
{
@@ -771,8 +768,7 @@ void LocalPlayer::raiseSkill(Uint16 skillId)
if (mSkillPoint <= 0)
return;
- MessageOut outMsg(mNetwork);
- outMsg.writeInt16(CMSG_SKILL_LEVELUP_REQUEST);
+ MessageOut outMsg(CMSG_SKILL_LEVELUP_REQUEST);
outMsg.writeInt16(skillId);
}
#endif
@@ -795,8 +791,7 @@ void LocalPlayer::toggleSit()
setAction(newAction);
Net::GameServer::Player::changeAction(newAction);
#else
- MessageOut outMsg(mNetwork);
- outMsg.writeInt16(0x0089);
+ MessageOut outMsg(0x0089);
outMsg.writeInt32(0);
outMsg.writeInt8((newAction == SIT) ? 2 : 3);
#endif
@@ -810,8 +805,7 @@ void LocalPlayer::emote(Uint8 emotion)
// XXX Convert for new server
#ifdef EATHENA_SUPPORT
- MessageOut outMsg(mNetwork);
- outMsg.writeInt16(0x00bf);
+ MessageOut outMsg(0x00bf);
outMsg.writeInt8(emotion);
#endif
}
@@ -822,8 +816,7 @@ void LocalPlayer::tradeReply(bool accept)
if (!accept)
mTrading = false;
- MessageOut outMsg(mNetwork);
- outMsg.writeInt16(CMSG_TRADE_RESPONSE);
+ MessageOut outMsg(CMSG_TRADE_RESPONSE);
outMsg.writeInt8(accept ? 3 : 4);
}
#endif
@@ -837,8 +830,7 @@ void LocalPlayer::trade(Being *being) const
tradePartnerID = being->getId();
Net::GameServer::Player::requestTrade(tradePartnerID);
#else
- MessageOut outMsg(mNetwork);
- outMsg.writeInt16(CMSG_TRADE_REQUEST);
+ MessageOut outMsg(CMSG_TRADE_REQUEST);
outMsg.writeInt32(being->getId());
#endif
}
@@ -957,8 +949,7 @@ void LocalPlayer::attack(Being *target, bool keep)
sound.playSfx("sfx/fist-swish.ogg");
}
- MessageOut outMsg(mNetwork);
- outMsg.writeInt16(0x0089);
+ MessageOut outMsg(0x0089);
outMsg.writeInt32(target->getId());
outMsg.writeInt8(0);
@@ -983,8 +974,7 @@ void LocalPlayer::revive()
{
// XXX Convert for new server
#ifdef EATHENA_SUPPORT
- MessageOut outMsg(mNetwork);
- outMsg.writeInt16(0x00b2);
+ MessageOut outMsg(0x00b2);
outMsg.writeInt8(0);
#endif
}
@@ -1209,12 +1199,9 @@ void LocalPlayer::loadTargetCursor(std::string filename, int width, int height,
assert(size > -1);
assert(size < 3);
- ImageSet* currentImageSet;
- SimpleAnimation* currentCursor;
-
ResourceManager *resman = ResourceManager::getInstance();
- currentImageSet = resman->getImageSet(filename, width, height);
+ ImageSet *currentImageSet = resman->getImageSet(filename, width, height);
Animation *anim = new Animation;
for (unsigned int i = 0; i < currentImageSet->size(); ++i)
@@ -1224,7 +1211,7 @@ void LocalPlayer::loadTargetCursor(std::string filename, int width, int height,
(16 - (currentImageSet->getHeight() / 2)));
}
- currentCursor = new SimpleAnimation(anim);
+ SimpleAnimation *currentCursor = new SimpleAnimation(anim);
const int index = outRange ? 1 : 0;
diff --git a/src/localplayer.h b/src/localplayer.h
index 77e9ac02..4fd68d8f 100644
--- a/src/localplayer.h
+++ b/src/localplayer.h
@@ -33,9 +33,6 @@ class ImageSet;
class Inventory;
class Item;
class Map;
-#ifdef EATHENA_SUPPORT
-class Network;
-#endif
#ifdef TMWSERV_SUPPORT
@@ -155,10 +152,6 @@ class LocalPlayer : public Player
virtual void setName(const std::string &name);
-#ifdef EATHENA_SUPPORT
- void setNetwork(Network *network) { mNetwork = network; }
- Network *getNetwork() {return mNetwork; }
-#endif
virtual void logic();
/**
@@ -190,15 +183,15 @@ class LocalPlayer : public Player
*/
void inviteToGuild(Being *being);
+ void clearInventory();
+ void setInvItem(int index, int id, int amount);
+#endif
+
/**
* Invite a player to join their party
*/
void inviteToParty(const std::string &name);
- void clearInventory();
- void setInvItem(int index, int id, int amount);
-#endif
-
/**
* Move the Inventory item from the old slot to the new slot.
*/
@@ -500,7 +493,6 @@ class LocalPlayer : public Player
void walk(unsigned char dir);
#ifdef EATHENA_SUPPORT
- Network *mNetwork;
int mXp; /**< Experience points. */
bool mInStorage; /**< Whether storage is currently accessible */
int mTargetTime; /** How long the being has been targeted **/
@@ -534,14 +526,16 @@ class LocalPlayer : public Player
int mWalkingDir; /**< The direction the player is walking in. */
int mDestX; /**< X coordinate of destination. */
int mDestY; /**< Y coordinate of destination. */
-#ifdef TMWSERV_SUPPORT
- int mLocalWalkTime; /**< Timestamp used to control keyboard walk
- messages flooding */
-#endif
std::vector<int> mStatusEffectIcons;
Inventory *mInventory;
+
+#ifdef TMWSERV_SUPPORT
+ int mLocalWalkTime; /**< Timestamp used to control keyboard walk
+ messages flooding */
+#endif
+
#ifdef EATHENA_SUPPORT
Inventory *mStorage;
#endif
diff --git a/src/log.cpp b/src/log.cpp
index 75b015da..322fcdae 100644
--- a/src/log.cpp
+++ b/src/log.cpp
@@ -32,7 +32,7 @@
#include "log.h"
-#include "gui/chat.h"
+#include "gui/widgets/chattab.h"
Logger::Logger():
mLogToStandardOut(false),
diff --git a/src/main.cpp b/src/main.cpp
index 8f04122c..37ef00a2 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -250,8 +250,7 @@ static void setUpdatesDir()
{
if (pos + 3 < updateHost.length())
{
- updates << "updates/" << updateHost.substr(pos + 3)
- << "/" << loginData.port;
+ updates << "updates/" << updateHost.substr(pos + 3);
updatesDir = updates.str();
}
else
@@ -752,8 +751,7 @@ static void accountLogin(Network *network, LoginData *loginData)
loginData->username,
loginData->password);
#else
- MessageOut outMsg(network);
- outMsg.writeInt16(0x0064);
+ MessageOut outMsg(0x0064);
outMsg.writeInt32(0); // client version
outMsg.writeString(loginData->username, 24);
outMsg.writeString(loginData->password, 24);
@@ -807,8 +805,7 @@ static void charLogin(Network *network, LoginData *loginData)
charServerHandler.setLoginData(loginData);
// Send login infos
- MessageOut outMsg(network);
- outMsg.writeInt16(0x0065);
+ MessageOut outMsg(0x0065);
outMsg.writeInt32(loginData->account_ID);
outMsg.writeInt32(loginData->session_ID1);
outMsg.writeInt32(loginData->session_ID2);
@@ -827,8 +824,6 @@ static void mapLogin(Network *network, LoginData *loginData)
player_node->getName().c_str());
config.setValue("lastCharacter", player_node->getName());
- MessageOut outMsg(network);
-
logger->log("Trying to connect to map server...");
logger->log("Map: %s", map_path.c_str());
@@ -836,7 +831,7 @@ static void mapLogin(Network *network, LoginData *loginData)
network->registerHandler(&mapLoginHandler);
// Send login infos
- outMsg.writeInt16(0x0072);
+ MessageOut outMsg(0x0072);
outMsg.writeInt32(loginData->account_ID);
outMsg.writeInt32(player_node->mCharId);
outMsg.writeInt32(loginData->session_ID1);
@@ -1044,27 +1039,30 @@ int main(int argc, char *argv[])
initXML();
- // load branding information
+ // Load branding information
branding.init("data/branding.xml");
initHomeDir();
+
// Configure logger
- logger = new Logger();
+ logger = new Logger;
logger->setLogFile(homeDir + std::string("/tmw.log"));
- logger->setLogToStandardOut(config.getValue("logToStandardOut", 0));
// Log the tmw version
+ logger->log("The Mana World %s (%s)",
#ifdef PACKAGE_VERSION
-#ifdef TMWSERV_SUPPORT
- logger->log("The Mana World v%s TMWServ", PACKAGE_VERSION);
+ "v" PACKAGE_VERSION,
#else
- logger->log("The Mana World v%s eAthena", PACKAGE_VERSION);
+ "- version not defined",
#endif
+#ifdef TMWSERV_SUPPORT
+ "tmwserv");
#else
- logger->log("The Mana World - version not defined");
+ "eAthena");
#endif
initConfiguration(options);
+ logger->setLogToStandardOut(config.getValue("logToStandardOut", 0));
initEngine(options);
@@ -1082,14 +1080,14 @@ int main(int argc, char *argv[])
gcn::Container *top = static_cast<gcn::Container*>(gui->getTop());
#ifdef PACKAGE_VERSION
#ifdef TMWSERV_SUPPORT
- gcn::Label *versionLabel = new Label(strprintf("%s TMWserv", PACKAGE_VERSION));
+ gcn::Label *versionLabel = new Label(strprintf("%s (tmwserv)", PACKAGE_VERSION));
#else
- gcn::Label *versionLabel = new Label(strprintf("%s eAthena", PACKAGE_VERSION));
+ gcn::Label *versionLabel = new Label(strprintf("%s (eAthena)", PACKAGE_VERSION));
#endif
top->add(versionLabel, 25, 2);
#endif
ProgressBar *progressBar = new ProgressBar(0.0f, 100, 20, 168, 116, 31);
- gcn::Label *progressLabel = new Label();
+ gcn::Label *progressLabel = new Label;
top->add(progressBar, 5, top->getHeight() - 5 - progressBar->getHeight());
top->add(progressLabel, 15 + progressBar->getWidth(),
progressBar->getY() + 4);
@@ -1658,7 +1656,7 @@ int main(int argc, char *argv[])
break;
case STATE_CHAR_SELECT:
logger->log("State: CHAR_SELECT");
- currentDialog = new CharSelectDialog(network, &charInfo,
+ currentDialog = new CharSelectDialog(&charInfo,
(loginData.sex == 0) ?
GENDER_FEMALE : GENDER_MALE);
positionDialog(currentDialog, screenWidth, screenHeight);
diff --git a/src/map.cpp b/src/map.cpp
index 59e6201f..0dc4759e 100644
--- a/src/map.cpp
+++ b/src/map.cpp
@@ -48,7 +48,9 @@ struct Location
/**
* Constructor.
*/
- Location(int px, int py, MetaTile *ptile):x(px),y(py),tile(ptile) {};
+ Location(int px, int py, MetaTile *ptile):
+ x(px), y(py), tile(ptile)
+ {}
/**
* Comparison operator.
@@ -141,11 +143,7 @@ void MapLayer::draw(Graphics *graphics, int startX, int startY,
// tiles have been drawn
if (mIsFringeLayer)
{
-#ifdef TMWSERV_SUPPORT
while (si != sprites.end() && (*si)->getPixelY() <= y * 32)
-#else
- while (si != sprites.end() && (*si)->getPixelY() <= y * 32)
-#endif
{
(*si)->draw(graphics, -scrollX, -scrollY);
si++;
diff --git a/src/monster.cpp b/src/monster.cpp
index c2632028..08a614ea 100644
--- a/src/monster.cpp
+++ b/src/monster.cpp
@@ -201,11 +201,7 @@ Being::TargetCursorSize Monster::getTargetCursorSize() const
const MonsterInfo &Monster::getInfo() const
{
-#ifdef TMWSERV_SUPPORT
return MonsterDB::get(mJob);
-#else
- return MonsterDB::get(mJob - 1002);
-#endif
}
void Monster::setShowName(bool show)
diff --git a/src/net/ea/beinghandler.cpp b/src/net/ea/beinghandler.cpp
index 237c9f1f..0ad15d7d 100644
--- a/src/net/ea/beinghandler.cpp
+++ b/src/net/ea/beinghandler.cpp
@@ -24,6 +24,7 @@
#include "net/ea/protocol.h"
#include "net/messagein.h"
+#include "net/messageout.h"
#include "being.h"
#include "beingmanager.h"
@@ -37,7 +38,6 @@
#include "gui/npc_text.h"
#include <iostream>
-#include <SDL_types.h>
extern NpcTextDialog *npcTextDialog;
@@ -69,10 +69,34 @@ BeingHandler::BeingHandler(bool enableSync):
handledMessages = _messages;
}
+Being *createBeing(int id, short job)
+{
+ Being::Type type = Being::UNKNOWN;
+ if (job <= 25 || (job >= 4001 && job <= 4049))
+ type = Being::PLAYER;
+ else if (job >= 46 && job <= 1000)
+ type = Being::NPC;
+ else if (job > 1000 && job <= 2000)
+ {
+ type = Being::MONSTER;
+ job -= 1002;
+ }
+
+ Being *being = beingManager->createBeing(id, type, job);
+
+ if (type == Being::PLAYER || type == Being::NPC)
+ {
+ MessageOut outMsg(0x0094);
+ outMsg.writeInt32(id);//readLong(2));
+ }
+
+ return being;
+}
+
void BeingHandler::handleMessage(MessageIn &msg)
{
int id;
- Uint16 job, speed;
+ short job, speed;
Uint16 headTop, headMid, headBottom;
Uint16 shoes, gloves;
Uint16 weapon, shield;
@@ -108,9 +132,14 @@ void BeingHandler::handleMessage(MessageIn &msg)
break;
}
- dstBeing = beingManager->createBeing(id, job);
+ dstBeing = createBeing(id, job);
}
- else if (msg.getId() == 0x0078)
+ else if (dstBeing->getType() == Being::MONSTER)
+ {
+ job -= 1002;
+ }
+
+ if (msg.getId() == 0x0078)
{
dstBeing->clearPath();
dstBeing->mFrame = 0;
@@ -399,7 +428,11 @@ void BeingHandler::handleMessage(MessageIn &msg)
if (!dstBeing)
{
- dstBeing = beingManager->createBeing(id, job);
+ dstBeing = createBeing(id, job);
+ }
+ else if (dstBeing->getType() == Being::MONSTER)
+ {
+ job -= 1002;
}
dstBeing->setWalkSpeed(speed);
diff --git a/src/net/ea/buysellhandler.cpp b/src/net/ea/buysellhandler.cpp
index b99db6a4..56d6a986 100644
--- a/src/net/ea/buysellhandler.cpp
+++ b/src/net/ea/buysellhandler.cpp
@@ -33,12 +33,11 @@
#include "gui/buy.h"
#include "gui/buysell.h"
-#include "gui/chat.h"
#include "gui/sell.h"
-#include "utils/gettext.h"
+#include "gui/widgets/chattab.h"
-#include <SDL_types.h>
+#include "utils/gettext.h"
BuySellHandler::BuySellHandler()
{
diff --git a/src/net/ea/chathandler.cpp b/src/net/ea/chathandler.cpp
index 14432b28..6aca58a3 100644
--- a/src/net/ea/chathandler.cpp
+++ b/src/net/ea/chathandler.cpp
@@ -30,7 +30,7 @@
#include "game.h"
#include "player_relations.h"
-#include "gui/chat.h"
+#include "gui/widgets/chattab.h"
#include "utils/gettext.h"
#include "utils/stringutils.h"
diff --git a/src/net/ea/equipmenthandler.cpp b/src/net/ea/equipmenthandler.cpp
index 7a287bea..d30b2681 100644
--- a/src/net/ea/equipmenthandler.cpp
+++ b/src/net/ea/equipmenthandler.cpp
@@ -31,10 +31,12 @@
#include "localplayer.h"
#include "log.h"
-#include "gui/chat.h"
+#include "gui/widgets/chattab.h"
#include "utils/gettext.h"
+enum { debugEquipment = 1 };
+
EquipmentHandler::EquipmentHandler()
{
static const Uint16 _messages[] = {
@@ -65,7 +67,7 @@ void EquipmentHandler::handleMessage(MessageIn &msg)
for (int loop = 0; loop < itemCount; loop++)
{
- index = msg.readInt16();
+ index = msg.readInt16() - INVENTORY_OFFSET;
itemId = msg.readInt16();
msg.readInt8(); // type
msg.readInt8(); // identify flag
@@ -75,6 +77,11 @@ void EquipmentHandler::handleMessage(MessageIn &msg)
msg.readInt8(); // refine
msg.skip(8); // card
+ if (debugEquipment)
+ {
+ logger->log("Index: %d, ID: %d", index, itemId);
+ }
+
inventory->setItem(index, itemId, 1, true);
if (equipPoint)
@@ -93,21 +100,19 @@ void EquipmentHandler::handleMessage(MessageIn &msg)
break;
case SMSG_PLAYER_EQUIP:
- index = msg.readInt16();
+ index = msg.readInt16() - INVENTORY_OFFSET;
equipPoint = msg.readInt16();
type = msg.readInt8();
- logger->log("Equipping: %i %i %i", index, equipPoint, type);
-
- if (!type) {
+ if (!type)
+ {
localChatTab->chatLog(_("Unable to equip."), BY_SERVER);
break;
}
- if (!equipPoint) {
- // No point given, no point in searching
+ // No point in searching when no point given
+ if (!equipPoint)
break;
- }
/*
* An item may occupy more than 1 slot. If so, it's
@@ -119,21 +124,25 @@ void EquipmentHandler::handleMessage(MessageIn &msg)
mask <<= 1;
position++;
}
- logger->log("Position %i", position);
- item = player_node->getInventory()->getItem(player_node->mEquipment->getEquipment(position));
+ if (debugEquipment)
+ {
+ logger->log("Equipping: %i %i %i at position %i",
+ index, equipPoint, type, position);
+ }
+
+ item = inventory->getItem(player_node->mEquipment->getEquipment(position));
// Unequip any existing equipped item in this position
- if (item) {
+ if (item)
item->setEquipped(false);
- }
item = inventory->getItem(index);
player_node->mEquipment->setEquipment(position, index);
break;
case SMSG_PLAYER_UNEQUIP:
- index = msg.readInt16();
+ index = msg.readInt16() - INVENTORY_OFFSET;
equipPoint = msg.readInt16();
type = msg.readInt8();
@@ -166,8 +175,12 @@ void EquipmentHandler::handleMessage(MessageIn &msg)
else {
player_node->mEquipment->removeEquipment(position);
}
- logger->log("Unequipping: %i %i(%i) %i",
- index, equipPoint, type, position);
+
+ if (debugEquipment)
+ {
+ logger->log("Unequipping: %i %i(%i) %i",
+ index, equipPoint, type, position);
+ }
break;
case SMSG_PLAYER_ATTACK_RANGE:
@@ -180,6 +193,8 @@ void EquipmentHandler::handleMessage(MessageIn &msg)
if (index <= 1)
break;
+ index -= INVENTORY_OFFSET;
+
item = inventory->getItem(index);
if (item) {
diff --git a/src/net/ea/gui/partytab.cpp b/src/net/ea/gui/partytab.cpp
new file mode 100644
index 00000000..4e486bf0
--- /dev/null
+++ b/src/net/ea/gui/partytab.cpp
@@ -0,0 +1,53 @@
+/*
+ * The Mana World
+ * Copyright (C) 2008 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 <guichan/widgets/label.hpp>
+
+#include "partytab.h"
+
+#include "net/messageout.h"
+
+#include "net/ea/party.h"
+#include "net/ea/protocol.h"
+
+#include "resources/iteminfo.h"
+#include "resources/itemdb.h"
+
+#include "utils/dtor.h"
+#include "utils/gettext.h"
+#include "utils/strprintf.h"
+#include "utils/stringutils.h"
+
+PartyTab::PartyTab() : ChatTab(_("Party"))
+{
+}
+
+PartyTab::~PartyTab()
+{
+}
+
+void PartyTab::handleInput(const std::string &msg) {
+ // TODO
+}
+
+void PartyTab::handleCommand(std::string msg) {
+ // TODO
+}
diff --git a/src/net/ea/gui/partytab.h b/src/net/ea/gui/partytab.h
new file mode 100644
index 00000000..fce4b515
--- /dev/null
+++ b/src/net/ea/gui/partytab.h
@@ -0,0 +1,51 @@
+/*
+ * The Mana World
+ * Copyright (C) 2009 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 CHANNELTAB_H
+#define CHANNELTAB_H
+
+#include "gui/widgets/chattab.h"
+
+/**
+ * A tab for a chat channel.
+ */
+class PartyTab : public ChatTab
+{
+ public:
+ /**
+ * Constructor.
+ */
+ PartyTab();
+
+ /**
+ * Destructor.
+ */
+ ~PartyTab();
+
+ protected:
+ void handleInput(const std::string &msg);
+
+ void handleCommand(std::string msg);
+};
+
+extern PartyTab *partyTab;
+
+#endif // CHANNELTAB_H
diff --git a/src/net/ea/inventoryhandler.cpp b/src/net/ea/inventoryhandler.cpp
index 21ae6dcb..e1429093 100644
--- a/src/net/ea/inventoryhandler.cpp
+++ b/src/net/ea/inventoryhandler.cpp
@@ -32,9 +32,10 @@
#include "localplayer.h"
#include "log.h"
-#include "gui/chat.h"
#include "gui/storagewindow.h"
+#include "gui/widgets/chattab.h"
+
#include "resources/iteminfo.h"
#include "utils/gettext.h"
@@ -43,6 +44,8 @@
#include <SDL_types.h>
+enum { debugInventory = 1 };
+
InventoryHandler::InventoryHandler()
{
static const Uint16 _messages[] = {
@@ -74,28 +77,26 @@ void InventoryHandler::handleMessage(MessageIn &msg)
{
case SMSG_PLAYER_INVENTORY:
case SMSG_PLAYER_STORAGE_ITEMS:
- switch (msg.getId()) {
- case SMSG_PLAYER_INVENTORY:
- // Clear inventory - this will be a complete refresh
- inventory->clear();
- break;
- case SMSG_PLAYER_STORAGE_ITEMS:
- /*
- * This packet will always be followed by a
- * SMSG_PLAYER_STORAGE_EQUIP packet. The two packets
- * together comprise a complete refresh of storage, so
- * clear storage here
- */
- storage->clear();
- break;
- default:
- logger->log("HOW DID WE GET HERE?");
- return;
+ if (msg.getId() == SMSG_PLAYER_INVENTORY)
+ {
+ // Clear inventory - this will be a complete refresh
+ inventory->clear();
+ }
+ else
+ {
+ /*
+ * This packet will always be followed by a
+ * SMSG_PLAYER_STORAGE_EQUIP packet. The two packets
+ * together comprise a complete refresh of storage, so
+ * clear storage here
+ */
+ storage->clear();
}
msg.readInt16(); // length
number = (msg.getLength() - 4) / 18;
- for (int loop = 0; loop < number; loop++) {
+ for (int loop = 0; loop < number; loop++)
+ {
index = msg.readInt16();
itemId = msg.readInt16();
itemType = msg.readInt8();
@@ -105,6 +106,17 @@ void InventoryHandler::handleMessage(MessageIn &msg)
for (int i = 0; i < 4; i++)
cards[i] = msg.readInt16();
+ index -= (msg.getId() == SMSG_PLAYER_INVENTORY) ?
+ INVENTORY_OFFSET : STORAGE_OFFSET;
+
+ if (debugInventory)
+ {
+ logger->log("Index: %d, ID: %d, Type: %d, Identified: %d, "
+ "Qty: %d, Cards: %d, %d, %d, %d",
+ index, itemId, itemType, identified, amount,
+ cards[0], cards[1], cards[2], cards[3]);
+ }
+
if (msg.getId() == SMSG_PLAYER_INVENTORY) {
inventory->setItem(index, itemId, amount, false);
@@ -114,8 +126,6 @@ void InventoryHandler::handleMessage(MessageIn &msg)
item->setEquipment(true);
}
} else {
- logger->log("Index:%d, ID:%d, Type:%d, Identified:%d, Qty:%d, Cards:%d, %d, %d, %d",
- index, itemId, itemType, identified, amount, cards[0], cards[1], cards[2], cards[3]);
storage->setItem(index, itemId, amount, false);
}
}
@@ -126,7 +136,7 @@ void InventoryHandler::handleMessage(MessageIn &msg)
number = (msg.getLength() - 4) / 20;
for (int loop = 0; loop < number; loop++) {
- index = msg.readInt16();
+ index = msg.readInt16() - STORAGE_OFFSET;
itemId = msg.readInt16();
itemType = msg.readInt8();
identified = msg.readInt8();
@@ -138,14 +148,20 @@ void InventoryHandler::handleMessage(MessageIn &msg)
for (int i = 0; i < 4; i++)
cards[i] = msg.readInt16();
- logger->log("Index:%d, ID:%d, Type:%d, Identified:%d, Qty:%d, Cards:%d, %d, %d, %d",
- index, itemId, itemType, identified, amount, cards[0], cards[1], cards[2], cards[3]);
+ if (debugInventory)
+ {
+ logger->log("Index: %d, ID: %d, Type: %d, Identified: %d, "
+ "Qty: %d, Cards: %d, %d, %d, %d",
+ index, itemId, itemType, identified, amount,
+ cards[0], cards[1], cards[2], cards[3]);
+ }
+
storage->setItem(index, itemId, amount, false);
}
break;
case SMSG_PLAYER_INVENTORY_ADD:
- index = msg.readInt16();
+ index = msg.readInt16() - INVENTORY_OFFSET;
amount = msg.readInt16();
itemId = msg.readInt16();
identified = msg.readInt8();
@@ -156,20 +172,26 @@ void InventoryHandler::handleMessage(MessageIn &msg)
equipType = msg.readInt16();
itemType = msg.readInt8();
- if (msg.readInt8() > 0) {
- if (config.getValue("showpickupchat", true)) {
+ if (msg.readInt8() > 0)
+ {
+ if (config.getValue("showpickupchat", true))
localChatTab->chatLog(_("Unable to pick up item"), BY_SERVER);
- }
- } else {
+ }
+ else
+ {
const ItemInfo &itemInfo = ItemDB::get(itemId);
const std::string amountStr =
(amount > 1) ? toString(amount) : "a";
- if (config.getValue("showpickupchat", true)) {
+
+ if (config.getValue("showpickupchat", true))
+ {
localChatTab->chatLog(strprintf(_("You picked up %s [%s]"),
amountStr.c_str(), itemInfo.getName().c_str()),
BY_SERVER);
}
- if (config.getValue("showpickupparticle", false)) {
+
+ if (config.getValue("showpickupparticle", false))
+ {
player_node->pickedUp(itemInfo.getName());
}
@@ -183,9 +205,10 @@ void InventoryHandler::handleMessage(MessageIn &msg)
break;
case SMSG_PLAYER_INVENTORY_REMOVE:
- index = msg.readInt16();
+ index = msg.readInt16() - INVENTORY_OFFSET;
amount = msg.readInt16();
- if (Item *item = inventory->getItem(index)) {
+ if (Item *item = inventory->getItem(index))
+ {
item->increaseQuantity(-amount);
if (item->getQuantity() == 0)
inventory->removeItemAt(index);
@@ -193,7 +216,7 @@ void InventoryHandler::handleMessage(MessageIn &msg)
break;
case SMSG_PLAYER_INVENTORY_USE:
- index = msg.readInt16();
+ index = msg.readInt16() - INVENTORY_OFFSET;
msg.readInt16(); // item id
msg.readInt32(); // id
amount = msg.readInt16();
@@ -204,7 +227,7 @@ void InventoryHandler::handleMessage(MessageIn &msg)
break;
case SMSG_ITEM_USE_RESPONSE:
- index = msg.readInt16();
+ index = msg.readInt16() - INVENTORY_OFFSET;
amount = msg.readInt16();
if (msg.readInt8() == 0) {
@@ -230,7 +253,7 @@ void InventoryHandler::handleMessage(MessageIn &msg)
/*
* Move an item into storage
*/
- index = msg.readInt16();
+ index = msg.readInt16() - STORAGE_OFFSET;
amount = msg.readInt32();
itemId = msg.readInt16();
identified = msg.readInt8();
@@ -239,10 +262,13 @@ void InventoryHandler::handleMessage(MessageIn &msg)
for (int i = 0; i < 4; i++)
cards[i] = msg.readInt16();
- if (Item *item = storage->getItem(index)) {
+ if (Item *item = storage->getItem(index))
+ {
item->setId(itemId);
item->increaseQuantity(amount);
- } else {
+ }
+ else
+ {
storage->setItem(index, itemId, amount, false);
}
break;
@@ -251,9 +277,10 @@ void InventoryHandler::handleMessage(MessageIn &msg)
/*
* Move an item out of storage
*/
- index = msg.readInt16();
+ index = msg.readInt16() - STORAGE_OFFSET;
amount = msg.readInt16();
- if (Item *item = storage->getItem(index)) {
+ if (Item *item = storage->getItem(index))
+ {
item->increaseQuantity(-amount);
if (item->getQuantity() == 0)
storage->removeItemAt(index);
diff --git a/src/net/ea/network.cpp b/src/net/ea/network.cpp
index e17b8f3b..4aecb268 100644
--- a/src/net/ea/network.cpp
+++ b/src/net/ea/network.cpp
@@ -91,6 +91,8 @@ int networkThread(void *data)
return 0;
}
+Network *Network::mInstance = 0;
+
Network::Network():
mSocket(0),
mAddress(), mPort(0),
@@ -102,6 +104,7 @@ Network::Network():
mWorkerThread(0)
{
mMutex = SDL_CreateMutex();
+ mInstance = this;
}
Network::~Network()
@@ -112,6 +115,7 @@ Network::~Network()
disconnect();
SDL_DestroyMutex(mMutex);
+ mInstance = 0;
delete[] mInBuffer;
delete[] mOutBuffer;
@@ -420,6 +424,11 @@ void Network::receive()
SDLNet_FreeSocketSet(set);
}
+Network *Network::instance()
+{
+ return mInstance;
+}
+
void Network::setError(const std::string &error)
{
logger->log("Network error: %s", error.c_str());
diff --git a/src/net/ea/network.h b/src/net/ea/network.h
index 651b1182..c246ab8e 100644
--- a/src/net/ea/network.h
+++ b/src/net/ea/network.h
@@ -36,8 +36,6 @@
class MessageHandler;
class MessageIn;
-class Network;
-
class Network
{
public:
@@ -85,7 +83,9 @@ class Network
NET_ERROR
};
- protected:
+ private:
+ static Network *instance();
+
void setError(const std::string &error);
Uint16 readWord(int pos);
@@ -113,6 +113,8 @@ class Network
typedef std::map<Uint16, MessageHandler*> MessageHandlers;
typedef MessageHandlers::iterator MessageHandlerIterator;
MessageHandlers mMessageHandlers;
+
+ static Network *mInstance;
};
#endif
diff --git a/src/party.cpp b/src/net/ea/party.cpp
index 51a86360..0fbba2f1 100644
--- a/src/party.cpp
+++ b/src/net/ea/party.cpp
@@ -26,20 +26,16 @@
#include "gui/widgets/chattab.h"
#include "gui/chat.h"
#include "gui/confirm_dialog.h"
+#include "gui/partywindow.h"
#include "net/messageout.h"
#include "net/ea/protocol.h"
+#include "net/ea/gui/partytab.h"
#include "utils/gettext.h"
#include "utils/strprintf.h"
-Party::Party(Network *network) :
- mNetwork(network),
- mInviteListener(network, &mInParty)
-{
-}
-
-void Party::respond(const std::string &command, const std::string &args)
+void eAthena::Party::respond(const std::string &command, const std::string &args)
{
if (command == "new" || command == "create")
{
@@ -53,45 +49,41 @@ void Party::respond(const std::string &command, const std::string &args)
}
if (command == "settings")
{
- localChatTab->chatLog(_("Not yet implemented!"), BY_SERVER);
+ partyTab->chatLog(_("Not yet implemented!"), BY_SERVER);
return;
/*
- MessageOut outMsg(mNetwork);
- outMsg.writeInt16(CMSG_PARTY_SETTINGS);
+ MessageOut outMsg(CMSG_PARTY_SETTINGS);
outMsg.writeInt16(0); // Experience
outMsg.writeInt16(0); // Item
*/
}
- localChatTab->chatLog(_("Party command not known."), BY_SERVER);
+ partyTab->chatLog(_("Party command not known."), BY_SERVER);
}
-void Party::create(const std::string &party)
+void eAthena::Party::create(const std::string &party)
{
if (party.empty())
{
localChatTab->chatLog(_("Party name is missing."), BY_SERVER);
return;
}
- MessageOut outMsg(mNetwork);
- outMsg.writeInt16(CMSG_PARTY_CREATE);
+ MessageOut outMsg(CMSG_PARTY_CREATE);
outMsg.writeString(party.substr(0, 23), 24);
- mCreating = true;
}
-void Party::leave(const std::string &args)
+void eAthena::Party::leave(const std::string &args)
{
- MessageOut outMsg(mNetwork);
- outMsg.writeInt16(CMSG_PARTY_LEAVE);
+ MessageOut outMsg(CMSG_PARTY_LEAVE);
localChatTab->chatLog(_("Left party."), BY_SERVER);
- mInParty = false;
+ player_node->setInParty(false);
}
-void Party::createResponse(bool ok)
+void eAthena::Party::createResponse(bool ok)
{
if (ok)
{
localChatTab->chatLog(_("Party successfully created."), BY_SERVER);
- mInParty = true;
+ player_node->setInParty(true);
}
else
{
@@ -99,59 +91,41 @@ void Party::createResponse(bool ok)
}
}
-void Party::inviteResponse(const std::string &nick, int status)
+void eAthena::Party::inviteResponse(const std::string &nick, int status)
{
switch (status)
{
case 0:
- localChatTab->chatLog(strprintf(_("%s is already a member of a party."),
+ partyTab->chatLog(strprintf(_("%s is already a member of a party."),
nick.c_str()), BY_SERVER);
break;
case 1:
- localChatTab->chatLog(strprintf(_("%s refused your invitation."),
+ partyTab->chatLog(strprintf(_("%s refused your invitation."),
nick.c_str()), BY_SERVER);
break;
case 2:
- localChatTab->chatLog(strprintf(_("%s is now a member of your party."),
+ partyTab->chatLog(strprintf(_("%s is now a member of your party."),
nick.c_str()), BY_SERVER);
break;
}
}
-void Party::invitedAsk(const std::string &nick, int gender,
- const std::string &partyName)
-{
- mPartyName = partyName; /* Quick and nasty - needs redoing */
- if (nick.empty())
- {
- localChatTab->chatLog(_("You can\'t have a blank party name!"), BY_SERVER);
- return;
- }
- mCreating = false;
- ConfirmDialog *dlg = new ConfirmDialog(_("Invite to party"),
- strprintf(_("%s invites you to join"
- " the %s party, do you accept?"),
- nick.c_str(), partyName.c_str()));
- dlg->addActionListener(&mInviteListener);
-}
-
-void Party::InviteListener::action(const gcn::ActionEvent &event)
+void eAthena::Party::respondToInvite(bool accept)
{
- MessageOut outMsg(mNetwork);
- outMsg.writeInt16(CMSG_PARTY_INVITED);
+ MessageOut outMsg(CMSG_PARTY_INVITED);
outMsg.writeInt32(player_node->getId());
- bool accept = event.getId() == "yes";
outMsg.writeInt32(accept ? 1 : 0);
- *mInParty = *mInParty || accept;
+ player_node->setInParty(player_node->getInParty() || accept);
}
-void Party::leftResponse(const std::string &nick)
+void eAthena::Party::leftResponse(const std::string &nick)
{
localChatTab->chatLog(strprintf(_("%s has left your party."), nick.c_str()),
BY_SERVER);
+ partyWindow->removePartyMember(nick);
}
-void Party::receiveChat(Being *being, const std::string &msg)
+void eAthena::Party::receiveChat(Being *being, const std::string &msg)
{
if (!being)
{
@@ -167,7 +141,7 @@ void Party::receiveChat(Being *being, const std::string &msg)
localChatTab->chatLog(being->getName() + " : " + msg, BY_PARTY);
}
-void Party::help(const std::string &args)
+void eAthena::Party::help(const std::string &args)
{
// Strip "party " from the front
std::string msg = args.substr(6, args.length());
diff --git a/src/party.h b/src/net/ea/party.h
index d73b4a0f..6907de47 100644
--- a/src/party.h
+++ b/src/net/ea/party.h
@@ -22,19 +22,14 @@
#ifndef PARTY_H
#define PARTY_H
-#include <string>
-
-#include <guichan/actionlistener.hpp>
+#include "being.h"
-class PartyHandler;
-class Being;
-class ChatWindow;
-class Network;
+#include <string>
-class Party
+namespace eAthena
{
- public:
- Party(Network *network);
+ namespace Party
+ {
void respond(const std::string &command, const std::string &args);
void create(const std::string &party);
@@ -43,35 +38,21 @@ class Party
void createResponse(bool ok);
void inviteResponse(const std::string &nick, int status);
void invitedAsk(const std::string &nick, int gender,
- const std::string &partyName);
+ const std::string &partyName);
+
+ /**
+ * Send invite response to the server
+ */
+ void respondToInvite(bool accept);
+
+ /**
+ * The player has left your party
+ */
void leftResponse(const std::string &nick);
void receiveChat(Being *being, const std::string &msg);
void help(const std::string &args);
-
- private:
- std::string mPartyName;
- Network *mNetwork;
- bool mInParty;
- bool mCreating; /**< Used to give an appropriate response to
- failure */
- PartyHandler *handler;
-
- class InviteListener : public gcn::ActionListener
- {
- public:
- InviteListener(Network *network, bool *inParty) :
- mNetwork(network),
- mInParty(inParty)
- {}
- void action(const gcn::ActionEvent &event);
- Network *mNetwork;
- private:
- bool *mInParty;
- };
- InviteListener mInviteListener;
-};
-
-extern Party *playerParty;
+ }
+}
#endif
diff --git a/src/net/ea/partyhandler.cpp b/src/net/ea/partyhandler.cpp
index d903976e..7ecf0863 100644
--- a/src/net/ea/partyhandler.cpp
+++ b/src/net/ea/partyhandler.cpp
@@ -21,21 +21,29 @@
#include "net/ea/partyhandler.h"
+#include "net/ea/gui/partytab.h"
+
#include "net/ea/protocol.h"
#include "net/messagein.h"
#include "gui/chat.h"
+#include "gui/partywindow.h"
#include "beingmanager.h"
#include "party.h"
-PartyHandler::PartyHandler(Party *party) : mParty(party)
+PartyTab *partyTab;
+
+static void newPartyTab() { partyTab = new PartyTab(); }
+static void deletePartyTab() { delete partyTab ; }
+
+PartyHandler::PartyHandler()
{
static const Uint16 _messages[] = {
SMSG_PARTY_CREATE,
SMSG_PARTY_INFO,
- SMSG_PARTY_INVITE,
+ SMSG_PARTY_INVITE_RESPONSE,
SMSG_PARTY_INVITED,
SMSG_PARTY_SETTINGS,
SMSG_PARTY_MEMBER_INFO,
@@ -46,6 +54,13 @@ PartyHandler::PartyHandler(Party *party) : mParty(party)
0
};
handledMessages = _messages;
+
+ newPartyTab();
+}
+
+PartyHandler::~PartyHandler()
+{
+ deletePartyTab();
}
void PartyHandler::handleMessage(MessageIn &msg)
@@ -53,15 +68,15 @@ void PartyHandler::handleMessage(MessageIn &msg)
switch (msg.getId())
{
case SMSG_PARTY_CREATE:
- mParty->createResponse(msg.readInt8());
+ eAthena::Party::createResponse(msg.readInt8());
break;
case SMSG_PARTY_INFO:
break;
- case SMSG_PARTY_INVITE:
+ case SMSG_PARTY_INVITE_RESPONSE:
{
std::string nick = msg.readString(24);
int status = msg.readInt8();
- mParty->inviteResponse(nick, status);
+ eAthena::Party::inviteResponse(nick, status);
break;
}
case SMSG_PARTY_INVITED:
@@ -85,7 +100,7 @@ void PartyHandler::handleMessage(MessageIn &msg)
gender = being->getGender();
partyName = msg.readString(24);
}
- mParty->invitedAsk(nick, gender, partyName);
+ partyWindow->showPartyInvite(nick, partyName);
break;
}
case SMSG_PARTY_SETTINGS:
@@ -97,7 +112,7 @@ void PartyHandler::handleMessage(MessageIn &msg)
/*int id = */msg.readInt32();
std::string nick = msg.readString(24);
/*int fail = */msg.readInt8();
- mParty->leftResponse(nick);
+ eAthena::Party::leftResponse(nick);
break;
}
case SMSG_PARTY_UPDATE_HP:
@@ -114,7 +129,7 @@ void PartyHandler::handleMessage(MessageIn &msg)
int id = msg.readInt32();
Being *being = beingManager->findBeing(id);
std::string chatMsg = msg.readString(msgLength);
- mParty->receiveChat(being, chatMsg);
+ eAthena::Party::receiveChat(being, chatMsg);
}
break;
}
diff --git a/src/net/ea/partyhandler.h b/src/net/ea/partyhandler.h
index 851c4ae3..c6ee261b 100644
--- a/src/net/ea/partyhandler.h
+++ b/src/net/ea/partyhandler.h
@@ -24,17 +24,14 @@
#include "net/messagehandler.h"
-class Party;
-
class PartyHandler : public MessageHandler
{
public:
- PartyHandler(Party *party);
+ PartyHandler();
- void handleMessage(MessageIn &msg);
+ ~PartyHandler();
- private:
- Party *mParty;
+ void handleMessage(MessageIn &msg);
};
#endif // NET_EA_PARTYHANDLER_H
diff --git a/src/net/ea/playerhandler.cpp b/src/net/ea/playerhandler.cpp
index 00230ea3..534c1b7b 100644
--- a/src/net/ea/playerhandler.cpp
+++ b/src/net/ea/playerhandler.cpp
@@ -24,6 +24,7 @@
#include "net/ea/protocol.h"
#include "net/messagein.h"
+#include "net/messageout.h"
#include "engine.h"
#include "localplayer.h"
@@ -33,7 +34,6 @@
#include "gui/buy.h"
#include "gui/buysell.h"
-#include "gui/chat.h"
#include "gui/gui.h"
#include "gui/npc_text.h"
#include "gui/npcintegerdialog.h"
@@ -45,6 +45,8 @@
#include "gui/storagewindow.h"
#include "gui/viewport.h"
+#include "gui/widgets/chattab.h"
+
#include "utils/stringutils.h"
#include "utils/gettext.h"
@@ -91,7 +93,8 @@ namespace {
sellDialog->setVisible(false);
buySellDialog->setVisible(false);
- if (storageWindow->isVisible()) storageWindow->close();
+ if (storageWindow->isVisible())
+ storageWindow->close();
}
} deathListener;
@@ -192,7 +195,9 @@ void PlayerHandler::handleMessage(MessageIn &msg)
nearby = (engine->getCurrentMapName() == mapPath);
// Switch the actual map, deleting the previous one if necessary
- engine->changeMap(mapPath);
+ mapPath = mapPath.substr(0, mapPath.rfind("."));
+ if (engine->changeMap(mapPath))
+ MessageOut outMsg(CMSG_MAP_LOADED);
float scrollOffsetX = 0.0f;
float scrollOffsetY = 0.0f;
diff --git a/src/net/ea/protocol.h b/src/net/ea/protocol.h
index c96ff7b6..ff13cce9 100644
--- a/src/net/ea/protocol.h
+++ b/src/net/ea/protocol.h
@@ -22,6 +22,9 @@
#ifndef EA_PROTOCOL_H
#define EA_PROTOCOL_H
+static const int INVENTORY_OFFSET = 2;
+static const int STORAGE_OFFSET = 1;
+
/*********************************
* Packets from server to client *
*********************************/
@@ -98,7 +101,7 @@
#define SMSG_PARTY_CREATE 0x00fa
#define SMSG_PARTY_INFO 0x00fb
-#define SMSG_PARTY_INVITE 0x00fd
+#define SMSG_PARTY_INVITE_RESPONSE 0x00fd
#define SMSG_PARTY_INVITED 0x00fe
#define SMSG_PARTY_SETTINGS 0x0102
#define SMSG_PARTY_MEMBER_INFO 0x0104
diff --git a/src/net/ea/skillhandler.cpp b/src/net/ea/skillhandler.cpp
index fcc0f4b2..477f96bf 100644
--- a/src/net/ea/skillhandler.cpp
+++ b/src/net/ea/skillhandler.cpp
@@ -27,9 +27,10 @@
#include "log.h"
-#include "gui/chat.h"
#include "gui/skill.h"
+#include "gui/widgets/chattab.h"
+
#include "utils/gettext.h"
/** job dependend identifiers (?) */
diff --git a/src/net/ea/tradehandler.cpp b/src/net/ea/tradehandler.cpp
index ea41ed70..1df02a1e 100644
--- a/src/net/ea/tradehandler.cpp
+++ b/src/net/ea/tradehandler.cpp
@@ -30,10 +30,11 @@
#include "localplayer.h"
#include "player_relations.h"
-#include "gui/chat.h"
#include "gui/confirm_dialog.h"
#include "gui/trade.h"
+#include "gui/widgets/chattab.h"
+
#include "utils/gettext.h"
std::string tradePartnerName;
diff --git a/src/net/messageout.cpp b/src/net/messageout.cpp
index 4cb4dc36..35e9a425 100644
--- a/src/net/messageout.cpp
+++ b/src/net/messageout.cpp
@@ -33,21 +33,16 @@
#include <cstring>
#include <string>
-#ifdef TMWSERV_SUPPORT
MessageOut::MessageOut(short id):
mData(0),
-#else
-MessageOut::MessageOut(Network *network):
- mNetwork(network),
-#endif
mDataSize(0),
mPos(0)
{
-#ifdef TMWSERV_SUPPORT
- writeInt16(id);
-#else
+#ifdef EATHENA_SUPPORT
+ mNetwork = Network::instance();
mData = mNetwork->mOutBuffer + mNetwork->mOutSize;
#endif
+ writeInt16(id);
}
#ifdef TMWSERV_SUPPORT
diff --git a/src/net/messageout.h b/src/net/messageout.h
index 1ddd040d..9dc31525 100644
--- a/src/net/messageout.h
+++ b/src/net/messageout.h
@@ -43,15 +43,13 @@ class MessageOut
/**
* Constructor.
*/
-#ifdef TMWSERV_SUPPORT
MessageOut(short id);
+#ifdef TMWSERV_SUPPORT
/**
* Destructor.
*/
~MessageOut();
-#else
- MessageOut(Network *network);
#endif
void writeInt8(Sint8 value); /**< Writes a byte. */
diff --git a/src/net/tmwserv/beinghandler.cpp b/src/net/tmwserv/beinghandler.cpp
index 1a1744cc..08847d7d 100644
--- a/src/net/tmwserv/beinghandler.cpp
+++ b/src/net/tmwserv/beinghandler.cpp
@@ -139,7 +139,7 @@ void BeingHandler::handleBeingEnterMessage(MessageIn &msg)
}
else
{
- being = beingManager->createBeing(id, type, 0);
+ being = beingManager->createBeing(id, Being::PLAYER, 0);
being->setName(name);
}
Player *p = static_cast< Player * >(being);
@@ -154,7 +154,8 @@ void BeingHandler::handleBeingEnterMessage(MessageIn &msg)
case OBJECT_NPC:
{
int subtype = msg.readInt16();
- being = beingManager->createBeing(id, type, subtype);
+ being = beingManager->createBeing(id, type == OBJECT_MONSTER ?
+ Being::MONSTER : Being::NPC, subtype);
std::string name = msg.readString();
if (name.length() > 0) being->setName(name);
} break;
diff --git a/src/net/tmwserv/partyhandler.cpp b/src/net/tmwserv/partyhandler.cpp
index dfbcea80..510eb77a 100644
--- a/src/net/tmwserv/partyhandler.cpp
+++ b/src/net/tmwserv/partyhandler.cpp
@@ -26,9 +26,10 @@
#include "net/messagein.h"
-#include "gui/chat.h"
#include "gui/partywindow.h"
+#include "gui/widgets/chattab.h"
+
#include "log.h"
#include "localplayer.h"
diff --git a/src/net/tmwserv/playerhandler.cpp b/src/net/tmwserv/playerhandler.cpp
index f02ed4c1..106894a1 100644
--- a/src/net/tmwserv/playerhandler.cpp
+++ b/src/net/tmwserv/playerhandler.cpp
@@ -85,9 +85,6 @@ namespace {
npcTextDialog->setVisible(false);
buyDialog->setVisible(false);
sellDialog->setVisible(false);
-#ifdef EATHENA_SUPPORT
- buySellDialog->setVisible(false);
-#endif
current_npc = 0;
}
} deathListener;
diff --git a/src/net/tmwserv/tradehandler.cpp b/src/net/tmwserv/tradehandler.cpp
index 85228355..8b3e06c6 100644
--- a/src/net/tmwserv/tradehandler.cpp
+++ b/src/net/tmwserv/tradehandler.cpp
@@ -30,10 +30,11 @@
#include "item.h"
#include "localplayer.h"
-#include "gui/chat.h"
#include "gui/confirm_dialog.h"
#include "gui/trade.h"
+#include "gui/widgets/chattab.h"
+
std::string tradePartnerName;
int tradePartnerID;
diff --git a/src/npc.cpp b/src/npc.cpp
index b75d74b3..359546e2 100644
--- a/src/npc.cpp
+++ b/src/npc.cpp
@@ -40,14 +40,8 @@
bool NPC::isTalking = false;
int current_npc = 0;
-#ifdef TMWSERV_SUPPORT
NPC::NPC(int id, int job, Map *map):
Player(id, job, map)
-#else
-NPC::NPC(int id, int job, Map *map, Network *network):
- Player(id, job, map),
- mNetwork(network)
-#endif
{
NPCInfo info = NPCDB::get(job);
@@ -126,11 +120,7 @@ void NPC::talk()
#ifdef TMWSERV_SUPPORT
Net::GameServer::Player::talkToNPC(mId, true);
#else
- if (!mNetwork)
- return;
-
- MessageOut outMsg(mNetwork);
- outMsg.writeInt16(CMSG_NPC_TALK);
+ MessageOut outMsg(CMSG_NPC_TALK);
outMsg.writeInt32(mId);
outMsg.writeInt8(0);
#endif
diff --git a/src/npc.h b/src/npc.h
index c2cab6f0..57e6d5a8 100644
--- a/src/npc.h
+++ b/src/npc.h
@@ -24,20 +24,13 @@
#include "player.h"
-#ifdef EATHENA_SUPPORT
-class Network;
-#endif
class Graphics;
class Text;
class NPC : public Player
{
public:
-#ifdef TMWSERV_SUPPORT
- NPC(int id, int sprite, Map *map);
-#else
- NPC(int id, int job, Map *map, Network *network);
-#endif
+ NPC(int id, int job, Map *map);
~NPC();
@@ -56,6 +49,7 @@ class NPC : public Player
{ return 0x83; } // blocked like a monster by walls, monsters and characters ( bin 1000 0011)
static bool isTalking;
+
protected:
/**
* Gets the way a monster blocks pathfinding for other objects
@@ -63,10 +57,8 @@ class NPC : public Player
virtual Map::BlockType getBlockType() const
{ return Map::BLOCKTYPE_CHARACTER; } //blocks like a player character
-#ifdef EATHENA_SUPPORT
- Network *mNetwork;
-#endif
void updateCoords();
+
private:
Text *mName;
};
diff --git a/src/player.cpp b/src/player.cpp
index a75d4e35..839959b0 100644
--- a/src/player.cpp
+++ b/src/player.cpp
@@ -283,9 +283,9 @@ short Player::getNumberOfGuilds()
return mGuilds.size();
}
+#endif
+
void Player::setInParty(bool value)
{
mInParty = value;
}
-
-#endif
diff --git a/src/player.h b/src/player.h
index 1904c6d9..d1155f4b 100644
--- a/src/player.h
+++ b/src/player.h
@@ -107,6 +107,8 @@ class Player : public Being
*/
short getNumberOfGuilds();
+#endif
+
/**
* Set the player in party
*/
@@ -116,7 +118,6 @@ class Player : public Being
* Returns whether player is in the party
*/
bool getInParty() const { return mInParty; }
-#endif
/**
* Gets the way the character is blocked by other objects.
@@ -140,10 +141,8 @@ class Player : public Being
FlashText *mName;
-#ifdef TMWSERV_SUPPORT
private:
bool mInParty;
-#endif
};
#endif
diff --git a/src/statuseffect.cpp b/src/statuseffect.cpp
index 077fbb63..fe076a55 100644
--- a/src/statuseffect.cpp
+++ b/src/statuseffect.cpp
@@ -21,10 +21,12 @@
#include <map>
-#include "gui/chat.h"
#include "statuseffect.h"
#include "log.h"
+
+#include "gui/widgets/chattab.h"
+
#include "utils/xml.h"