diff options
Diffstat (limited to 'src/core')
-rw-r--r-- | src/core/Makefile.am | 2 | ||||
-rw-r--r-- | src/core/application.cc | 22 | ||||
-rw-r--r-- | src/core/application.h | 3 | ||||
-rw-r--r-- | src/core/gameinterface.cc | 2 | ||||
-rw-r--r-- | src/core/gameserver.cc | 60 | ||||
-rw-r--r-- | src/core/gameserver.h | 7 | ||||
-rw-r--r-- | src/core/message.h | 3 | ||||
-rw-r--r-- | src/core/net.h | 18 | ||||
-rw-r--r-- | src/core/netclient.cc | 2 | ||||
-rw-r--r-- | src/core/netclient.h | 24 | ||||
-rw-r--r-- | src/core/netconnection.cc | 4 | ||||
-rw-r--r-- | src/core/netplayer.cc | 77 | ||||
-rw-r--r-- | src/core/netplayer.h | 42 | ||||
-rw-r--r-- | src/core/netserver.cc | 49 | ||||
-rw-r--r-- | src/core/netserver.h | 5 | ||||
-rw-r--r-- | src/core/player.cc | 20 | ||||
-rw-r--r-- | src/core/player.h | 45 |
17 files changed, 161 insertions, 224 deletions
diff --git a/src/core/Makefile.am b/src/core/Makefile.am index c1f4632..4f5011c 100644 --- a/src/core/Makefile.am +++ b/src/core/Makefile.am @@ -25,7 +25,6 @@ noinst_HEADERS = \ netclient.h \ netconnection.h \ net.h \ - netplayer.h \ netserver.h \ parser.h \ physics.h \ @@ -55,7 +54,6 @@ libcore_la_SOURCES = \ module.cc \ netclient.cc \ netconnection.cc \ - netplayer.cc \ netserver.cc \ parser.cc \ physics.cc \ diff --git a/src/core/application.cc b/src/core/application.cc index 38c39a1..2455f85 100644 --- a/src/core/application.cc +++ b/src/core/application.cc @@ -452,7 +452,21 @@ void Application::load_commandline(int count, char **arguments) void Application::notify_message(const core::Message::Channel channel, const std::string &message) { - con_print << message << std::endl; + switch (channel) { + case core::Message::Info: // Info message + case core::Message::Local: // Chat message in the local zone + case core::Message::Public: // Public chat message + case core::Message::Private: // Private chat message + case core::Message::RCon: // RCon message + con_print << message << std::endl; + break; + + case core::Message::Sound: // Sound event + break; + + default: + break; + } } void Application::notify_loader(const std::string &message) @@ -461,12 +475,6 @@ void Application::notify_loader(const std::string &message) // used by the client to udpate the loader screen } -void Application::notify_sound(const char *name) -{ - // the default implementation does nothing. - // Dedicated servers don't need sounds -} - void Application::notify_zonechange() { // the default implementation does nothing. diff --git a/src/core/application.h b/src/core/application.h index 3f71b4c..e846b1f 100644 --- a/src/core/application.h +++ b/src/core/application.h @@ -77,9 +77,6 @@ public: /*----- notifications --------------------------------------------- */ - /// sound notifications from the core to the application - virtual void notify_sound(const char * name); - /// text notifications from the core to the application virtual void notify_message(const core::Message::Channel channel, const std::string &message); diff --git a/src/core/gameinterface.cc b/src/core/gameinterface.cc index 3505e2c..898d97f 100644 --- a/src/core/gameinterface.cc +++ b/src/core/gameinterface.cc @@ -41,7 +41,7 @@ void func_list_players(std::string const &args) const float MIN_DELTA = 10e-10; -Player GameInterface::game_localplayer; +Player GameInterface::game_localplayer(0); EntityControlable *localcontrol() { diff --git a/src/core/gameserver.cc b/src/core/gameserver.cc index b4b3322..a1102bd 100644 --- a/src/core/gameserver.cc +++ b/src/core/gameserver.cc @@ -281,7 +281,7 @@ Inventory *GameServer::request_inventory(Entity *entity) } -// global chat message +// a player sends a global chat message void GameServer::shout(Player *player, std::string const &message) { if (!message.size()) @@ -301,7 +301,7 @@ void GameServer::shout(Player *player, std::string const &message) broadcast(Message::Public, notification); } -// local chat message +// a player sends a local chat message void GameServer::say(Player *player, std::string const &message) { if (!message.size()) @@ -324,7 +324,7 @@ void GameServer::say(Player *player, std::string const &message) broadcast(player->zone(), notification); } -// player-to-player chat messages +// a player send a prvate mesage to another player void GameServer::private_message(Player *player, std::string const &args) { if (!args.size()) @@ -347,10 +347,9 @@ void GameServer::private_message(Player *player, std::string const &args) return; } - - std::string message(args.substr(target.size())); - player->message(Message::Private, "^FTo ^B" + targetplayer->name() + "^F:" + message); - targetplayer->message(Message::Private, "^FFrom ^B" + player->name() + "^F:" + message); + std::string text(args.substr(target.size())); + message(player, Message::Private, "^FTo ^B" + targetplayer->name() + "^F:" + text); + message(targetplayer, Message::Private, "^FFrom ^B" + player->name() + "^F:" + text); } // FIXME kicked by @@ -361,24 +360,35 @@ void GameServer::kick(Player *player, std::string const &reason) return; } - NetClient *client = server_network->find_client(player); + NetClient *client = player->client(); if (client) { broadcast("^B" + player->name() + "^B has been kicked: " + reason, player); - player->send("^WYou have been kicked: " + reason); + server_network->send_message(client, Message::Info, "^WYou have been kicked: " + reason); server_network->send_disconnect(client); } else { con_print << "Network client not found" << std::endl; } } -// broadcast an "info" message to all players -void GameServer::broadcast(const std::string text, Player *ignore_player) +// server sends a message on a specified channel to a single player +void GameServer::message(Player *player, const Message::Channel channel, const std::string text) { - broadcast(Message::Info, text, ignore_player); -} + if (!text.size()) + return; + + NetClient *client = player->client(); + if (client) { + // this player is a network client, send message over network + server_network->send_message(client, channel, text); + + } else if (player == localplayer()) { + // local player, send message to the local application + application()->notify_message(channel, text); + } +} -// broadcast a message on a specified channel to all players +// server broadcasts a message on a specified channel to all players void GameServer::broadcast(const Message::Channel channel, const std::string text, Player *ignore_player) { if (!text.size()) @@ -386,9 +396,16 @@ void GameServer::broadcast(const Message::Channel channel, const std::string tex for (Players::iterator it = players().begin(); it != players().end(); it++) { Player *player = (*it); + NetClient *client = player->client(); if (player != ignore_player) { - Player *player = (*it); - player->message(channel, text); + if (client) { + // this player is a network client, send message over network + server_network->send_message(client, channel, text); + + } else if (player == localplayer()) { + // local player, send message to the local application + application()->notify_message(channel, text); + } } } @@ -398,7 +415,14 @@ void GameServer::broadcast(const Message::Channel channel, const std::string tex } } -// broadcast a message to all players in a particular zone +// server broadcasts an "info" message to all players +void GameServer::broadcast(const std::string text, Player *ignore_player) +{ + broadcast(Message::Info, text, ignore_player); +} + + +// server broadcasts a message to all players in a particular zone void GameServer::broadcast(Zone *zone, std::string const text, Player *ignore_player) { if (!text.size()) @@ -421,7 +445,7 @@ void GameServer::broadcast(Zone *zone, std::string const text, Player *ignore_pl } } -// broadcast a sound event to all players +// server broadcasts a sound event to all players void GameServer::broadcast_sound(const std::string name, Player *ignore_player) { if (!name.size()) diff --git a/src/core/gameserver.h b/src/core/gameserver.h index 2e1aa2a..56d0361 100644 --- a/src/core/gameserver.h +++ b/src/core/gameserver.h @@ -60,6 +60,11 @@ public: /// kick a player from the server void kick(Player *player, std::string const &reason); + + /*----- messages -------------------------------------------------- */ + + /// send a message to a single player + void message(Player *player, core::Message::Channel channel, const std::string text); /// broadcast an Info message to all players void broadcast(std::string const message, Player *ignore_player = 0); @@ -72,6 +77,8 @@ public: /// broadcast a sound to all players void broadcast_sound(std::string const sound, Player *ignore_player = 0); + + /// a player sends a command to the game server void exec(Player *player, std::string const &cmdline); diff --git a/src/core/message.h b/src/core/message.h index bab095d..581dd11 100644 --- a/src/core/message.h +++ b/src/core/message.h @@ -21,8 +21,9 @@ public: * Local public local (zone) chat * Private player to player private messages * RCon rcon messages + * Sound sound event */ - enum Channel {Info = 0, Public = 1, Local = 2, Private = 3, RCon = 4}; + enum Channel {Info = 0, Public = 1, Local = 2, Private = 3, RCon = 4, Sound = 5}; }; } diff --git a/src/core/net.h b/src/core/net.h index 4607797..2dbebfd 100644 --- a/src/core/net.h +++ b/src/core/net.h @@ -28,16 +28,26 @@ const float NETTIMEOUT = 15; } +#include <unistd.h> +#include <errno.h> + #ifndef _WIN32 + +#include <sys/types.h> +#include <sys/socket.h> +#include <sys/wait.h> + +#include <netinet/in.h> +#include <arpa/inet.h> + #include <sys/select.h> + #else + #include <winsock2.h> #include <windows.h> -#endif -#include "core/netserver.h" -#include "core/netclient.h" -#include "core/netconnection.h" +#endif #endif // __INCLUDED_CORE_NET_H__ diff --git a/src/core/netclient.cc b/src/core/netclient.cc index 01de8b8..76112e1 100644 --- a/src/core/netclient.cc +++ b/src/core/netclient.cc @@ -27,7 +27,7 @@ NetClient::NetClient(std::string host, int port, int fd) : client_host = host; client_port = port; - client_player = new NetPlayer(this); + client_player = new Player(this); if (!fd) { con_warn << "Network invalid client file descriptor!" << std::endl; diff --git a/src/core/netclient.h b/src/core/netclient.h index cca9529..f52aae6 100644 --- a/src/core/netclient.h +++ b/src/core/netclient.h @@ -7,32 +7,12 @@ #ifndef __INCLUDED_CORE_NETCLIENT_H__ #define __INCLUDED_CORE_NETCLIENT_H__ -#include "core/net.h" - -#include <unistd.h> -#include <errno.h> - -#ifndef _WIN32 - -#include <sys/types.h> -#include <sys/socket.h> -#include <sys/wait.h> - -#include <netinet/in.h> -#include <arpa/inet.h> - -#endif - -#include <string> -#include <deque> -#include <map> - namespace core { class NetClient; } -#include "core/netplayer.h" +#include "core/net.h" namespace core { @@ -96,7 +76,7 @@ private: int client_fd; bool client_error; - NetPlayer *client_player; + Player *client_player; std::string messageblock; std::deque<std::string> recvq; diff --git a/src/core/netconnection.cc b/src/core/netconnection.cc index 262c956..fd844aa 100644 --- a/src/core/netconnection.cc +++ b/src/core/netconnection.cc @@ -631,7 +631,7 @@ void NetConnection::parse_incoming_message(const std::string & message) } } else if (level == "snd") { if (message.size() > 8) { - application()->notify_sound(message.substr(8).c_str()); + application()->notify_message(Message::Sound, message.substr(8)); } } } @@ -768,7 +768,7 @@ void NetConnection::parse_incoming_message(const std::string & message) } if (!player) { - player = new Player(); + player = new Player(0); game()->players().push_back(player); game()->set_playerlist_timestamp(game()->timestamp()); } diff --git a/src/core/netplayer.cc b/src/core/netplayer.cc deleted file mode 100644 index 9d3e677..0000000 --- a/src/core/netplayer.cc +++ /dev/null @@ -1,77 +0,0 @@ -/* - net/netplayer.cc - This file is part of the Osirion project and is distributed under - the terms of the GNU General Public License version 2 -*/ - -#include <string> - -#include "core/net.h" -#include "core/netplayer.h" -#include "sys/sys.h" - -namespace core -{ - -NetPlayer::NetPlayer(NetClient *client) : Player() -{ - - player_client = client; -} - -NetPlayer::~NetPlayer() -{ -} - -void NetPlayer::sound(const std::string name) -{ - std::string msg("msg snd "); - msg.append(name); - msg += '\n'; - - player_client->send_raw(msg); -} - -void NetPlayer::message(const Message::Channel channel, const std::string text) -{ - if (!text.size()) - return; - - std::string msg_channel; - switch (channel) { - case core::Message::Info: // Info message - msg_channel.assign("info"); - break; - - case core::Message::Local: // Chat message in the local zone - msg_channel.assign("local"); - break; - - case core::Message::Public: // Public chat message - msg_channel.assign("public"); - break; - - case core::Message::Private: // Private chat message - msg_channel.assign("private"); - break; - - case core::Message::RCon: // RCon message - msg_channel.assign("rcon"); - break; - - default: - con_warn << "message on unknown channel " << channel << "!" << std::endl; - return; - break; - } - - std::string msg("msg "); - msg.append(msg_channel); - msg += ' '; - msg.append(text); - msg += '\n'; - - player_client->send_raw(msg); -} - -} diff --git a/src/core/netplayer.h b/src/core/netplayer.h deleted file mode 100644 index ada1bd0..0000000 --- a/src/core/netplayer.h +++ /dev/null @@ -1,42 +0,0 @@ -/* - core/netplayer.h - This file is part of the Osirion project and is distributed under - the terms of the GNU General Public License version 2 -*/ - -#ifndef __INCLUDED_CORE_NETPLAYER_H__ -#define __INCLUDED_CORE_NETPLAYER_H__ - -namespace core -{ -class NetPlayer; -} - -#include "core/player.h" -#include "core/netclient.h" -#include "core/message.h" - -namespace core -{ - -class NetPlayer : public Player -{ -public: - NetPlayer(NetClient *client); - virtual ~NetPlayer(); - - NetClient *client() { - return player_client; - } - - virtual void message(const Message::Channel channel, const std::string text); - virtual void sound(const std::string name); - -private: - NetClient *player_client; -}; - -} - -#endif // __INCLUDED_CORE_NETCLIENT_H__ - diff --git a/src/core/netserver.cc b/src/core/netserver.cc index 37adfc1..12210a5 100644 --- a/src/core/netserver.cc +++ b/src/core/netserver.cc @@ -476,14 +476,46 @@ void NetServer::frame(unsigned long timestamp) * zone <id> <zone create/update data> */ -// send a "msg <channel>" message to one client -void NetServer::send_message(NetClient *client, const char *channel, std::string const & message) +// send a message on a specified channel to a single client +void NetServer::send_message(NetClient *client, const Message::Channel channel, const std::string & message) { - if (!channel) + if (!message.size()) return; + std::string msg_channel; + switch (channel) { + case core::Message::Info: // Info message + msg_channel.assign("info"); + break; + + case core::Message::Local: // Chat message in the local zone + msg_channel.assign("local"); + break; + + case core::Message::Public: // Public chat message + msg_channel.assign("public"); + break; + + case core::Message::Private: // Private chat message + msg_channel.assign("private"); + break; + + case core::Message::RCon: // RCon message + msg_channel.assign("rcon"); + break; + + case core::Message::Sound: // Sound event + msg_channel.assign("snd"); + break; + + default: + con_warn << "message on unknown channel " << channel << "!" << std::endl; + return; + break; + } + std::string msg("msg "); - msg.append(channel); + msg.append(msg_channel); msg += ' '; msg.append(message); msg += '\n'; @@ -491,6 +523,7 @@ void NetServer::send_message(NetClient *client, const char *channel, std::string client->send_raw(msg); } + // disconnect a client void NetServer::send_disconnect(NetClient *client) { @@ -700,7 +733,7 @@ void NetServer::parse_incoming_message(NetClient *client, const std::string & me netmsgstream << "client " << protover << " server " << PROTOCOLVERSION << "!\n"; con_print << client->host() << ":" << client->port() << " " << netmsgstream.str() << std::endl; - send_message(client, "info", netmsgstream.str()); + send_message(client, Message::Info, netmsgstream.str()); send_disconnect(client); } else { @@ -710,7 +743,7 @@ void NetServer::parse_incoming_message(NetClient *client, const std::string & me std::string message("Unknown client protocol version!"); con_print << client->host() << ":" << client->port() << " " << message << std::endl; - send_message(client, "info", message); + send_message(client, Message::Info, message); send_disconnect(client); } @@ -865,7 +898,7 @@ void NetServer::parse_incoming_message(NetClient *client, const std::string & me core::CommandBuffer::exec(); while (console()->rconbuf().size()) { - send_message(client, "rcon", (*console()->rconbuf().begin())); + send_message(client, Message::RCon, (*console()->rconbuf().begin())); core::console()->rconbuf().pop_front(); } @@ -873,7 +906,7 @@ void NetServer::parse_incoming_message(NetClient *client, const std::string & me console()->set_rcon(false); } else { - send_message(client, "info", "rcon access denied"); + send_message(client, Message::Info, "rcon access denied"); con_warn << "^B" << client->player()->name() << "^W rcon access denied" << std::endl; } } diff --git a/src/core/netserver.h b/src/core/netserver.h index d8635e4..a739e28 100644 --- a/src/core/netserver.h +++ b/src/core/netserver.h @@ -70,9 +70,10 @@ public: /// find the client corresponding to a player NetClient *find_client(Player const *player); + /// send a message on a specified channel + void send_message(NetClient *client, const Message::Channel channel, const std::string & message); + protected: - /// send a message - void send_message(NetClient *client, const char *channel, std::string const & message); /// send a server frame marker void send_frame_marker(NetClient *client, unsigned long timestamp); diff --git a/src/core/player.cc b/src/core/player.cc index f183a4c..d07b258 100644 --- a/src/core/player.cc +++ b/src/core/player.cc @@ -11,12 +11,15 @@ #include "core/player.h" #include "core/cvar.h" #include "core/application.h" +#include "core/gameserver.h" namespace core { -Player::Player() +Player::Player(NetClient *client) { + player_client = client; + clear(); } @@ -61,26 +64,21 @@ void Player::print() const } -void Player::send(const std::string text) +void Player::message(Message::Channel channel, const std::string text) { - message(core::Message::Info, text); + server()->message(this, channel, text); } -void Player::send_warning(const std::string text) +void Player::send(const std::string text) { - message(core::Message::Info, text); - player_warningtime = application()->time(); + server()->message(this, core::Message::Info, text); } void Player::sound(const std::string name) { - application()->notify_sound(name.c_str()); + server()->message(this, core::Message::Sound, name); } -void Player::message(Message::Channel channel, const std::string text) -{ - application()->notify_message(channel, text); -} void Player::set_control(EntityControlable *entitycontrolable) { diff --git a/src/core/player.h b/src/core/player.h index dbcc161..afd1bc9 100644 --- a/src/core/player.h +++ b/src/core/player.h @@ -15,6 +15,7 @@ class Player; #include "core/entity.h" #include "core/message.h" #include "core/zone.h" +#include "core/netclient.h" #include "math/mathlib.h" #include <string> @@ -28,9 +29,10 @@ class Player { public: /// default constructor - Player(); + Player(NetClient *client); + /// default destructor - virtual ~Player(); + ~Player(); /*----- inspectors ------------------------------------------------ */ @@ -111,7 +113,7 @@ public: } /// print player info to console - virtual void print() const; + void print() const; /// player level const int level() const { @@ -128,27 +130,21 @@ public: return player_guid; } - /*----- messages -------------------------------------------------- */ + /// network client associated with this player + NetClient *client() { + return player_client; + } + + /*----- server-side mesage functions ------------------------------ */ + /// send a message to the player on one of the message channels + void message(core::Message::Channel channel, const std::string text); + /// send a text message void send(const std::string text); - /** - * @brief send a warning message - * Send the player a warning message abd set the warning - * message timestamp to the current application time - * @see last_warning() - */ - void send_warning(const std::string text); - - virtual void sound(const std::string name); - - virtual void message(core::Message::Channel channel, const std::string text); - - /// time of the last warning message - float last_warning() const { - return player_warningtime; - } + /// send a sound for the client to play + void sound(const std::string name); /*----- mutators -------------------------------------------------- */ @@ -253,14 +249,17 @@ public: std::list<EntityControlable *> assets; private: + // associated network client + NetClient *player_client; + // entity the Player is currently controling - EntityControlable *player_control; + EntityControlable *player_control; // entity the Player is currently looking at - Entity *player_view; + Entity *player_view; // current mission target - Entity *player_mission_target; + Entity *player_mission_target; // the zone the player is currently in Zone *player_zone; |