51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
-#ifndef SERVER_HEADER
-#define SERVER_HEADER
+#pragma once
-#include "network/connection.h"
#include "irr_v3d.h"
#include "map.h"
#include "hud.h"
#include "inventorymanager.h"
#include "subgame.h"
#include "tileanimation.h" // struct TileAnimationParams
+#include "network/peerhandler.h"
+#include "network/address.h"
#include "util/numeric.h"
#include "util/thread.h"
#include "util/basic_macros.h"
#include "serverenvironment.h"
-#include "chat_interface.h"
#include "clientiface.h"
-#include "remoteplayer.h"
-#include "network/networkpacket.h"
#include "chatmessage.h"
#include <string>
#include <list>
#include <map>
#include <vector>
+class ChatEvent;
+struct ChatEventChat;
+struct ChatInterface;
class IWritableItemDefManager;
class IWritableNodeDefManager;
class IWritableCraftDefManager;
class BanManager;
class EventManager;
class Inventory;
+class ModChannelMgr;
+class RemotePlayer;
class PlayerSAO;
class IRollbackManager;
struct RollbackAction;
{
ServerSoundParams params;
SimpleSoundSpec spec;
- std::unordered_set<u16> clients; // peer ids
+ std::unordered_set<session_t> clients; // peer ids
};
class Server : public con::PeerHandler, public MapEventReceiver,
// This is run by ServerThread and does the actual processing
void AsyncRunStep(bool initial_step=false);
void Receive();
- PlayerSAO* StageTwoClientInit(u16 peer_id);
+ PlayerSAO* StageTwoClientInit(session_t peer_id);
/*
* Command Handlers
void handleCommand_Null(NetworkPacket* pkt) {};
void handleCommand_Deprecated(NetworkPacket* pkt);
void handleCommand_Init(NetworkPacket* pkt);
- void handleCommand_Init_Legacy(NetworkPacket* pkt);
void handleCommand_Init2(NetworkPacket* pkt);
+ void handleCommand_ModChannelJoin(NetworkPacket *pkt);
+ void handleCommand_ModChannelLeave(NetworkPacket *pkt);
+ void handleCommand_ModChannelMsg(NetworkPacket *pkt);
void handleCommand_RequestMedia(NetworkPacket* pkt);
void handleCommand_ClientReady(NetworkPacket* pkt);
void handleCommand_GotBlocks(NetworkPacket* pkt);
void ProcessData(NetworkPacket *pkt);
- void Send(NetworkPacket* pkt);
+ void Send(NetworkPacket *pkt);
+ void Send(session_t peer_id, NetworkPacket *pkt);
// Helper for handleCommand_PlayerPos and handleCommand_Interact
void process_PlayerPos(RemotePlayer *player, PlayerSAO *playersao,
bool hudChange(RemotePlayer *player, u32 id, HudElementStat stat, void *value);
bool hudSetFlags(RemotePlayer *player, u32 flags, u32 mask);
bool hudSetHotbarItemcount(RemotePlayer *player, s32 hotbar_itemcount);
- s32 hudGetHotbarItemcount(RemotePlayer *player) const
- { return player->getHotbarItemcount(); }
+ s32 hudGetHotbarItemcount(RemotePlayer *player) const;
void hudSetHotbarImage(RemotePlayer *player, std::string name);
std::string hudGetHotbarImage(RemotePlayer *player);
void hudSetHotbarSelectedImage(RemotePlayer *player, std::string name);
- const std::string &hudGetHotbarSelectedImage(RemotePlayer *player) const
- {
- return player->getHotbarSelectedImage();
- }
+ const std::string &hudGetHotbarSelectedImage(RemotePlayer *player) const;
- inline Address getPeerAddress(u16 peer_id)
- { return m_con.GetPeerAddress(peer_id); }
+ Address getPeerAddress(session_t peer_id);
bool setLocalPlayerAnimations(RemotePlayer *player, v2s32 animation_frames[4],
f32 frame_speed);
void peerAdded(con::Peer *peer);
void deletingPeer(con::Peer *peer, bool timeout);
- void DenySudoAccess(u16 peer_id);
- void DenyAccessVerCompliant(u16 peer_id, u16 proto_ver, AccessDeniedCode reason,
+ void DenySudoAccess(session_t peer_id);
+ void DenyAccessVerCompliant(session_t peer_id, u16 proto_ver, AccessDeniedCode reason,
const std::string &str_reason = "", bool reconnect = false);
- void DenyAccess(u16 peer_id, AccessDeniedCode reason, const std::string &custom_reason="");
- void acceptAuth(u16 peer_id, bool forSudoMode);
- void DenyAccess_Legacy(u16 peer_id, const std::wstring &reason);
- bool getClientConInfo(u16 peer_id, con::rtt_stat_type type,float* retval);
- bool getClientInfo(u16 peer_id,ClientState* state, u32* uptime,
+ void DenyAccess(session_t peer_id, AccessDeniedCode reason,
+ const std::string &custom_reason = "");
+ void acceptAuth(session_t peer_id, bool forSudoMode);
+ void DenyAccess_Legacy(session_t peer_id, const std::wstring &reason);
+ void DisconnectPeer(session_t peer_id);
+ bool getClientConInfo(session_t peer_id, con::rtt_stat_type type, float *retval);
+ bool getClientInfo(session_t peer_id, ClientState *state, u32 *uptime,
u8* ser_vers, u16* prot_vers, u8* major, u8* minor, u8* patch,
std::string* vers_string);
void SendPlayerHPOrDie(PlayerSAO *player);
void SendPlayerBreath(PlayerSAO *sao);
void SendInventory(PlayerSAO* playerSAO);
- void SendMovePlayer(u16 peer_id);
+ void SendMovePlayer(session_t peer_id);
virtual bool registerModStorage(ModMetadata *storage);
virtual void unregisterModStorage(const std::string &name);
+ bool joinModChannel(const std::string &channel);
+ bool leaveModChannel(const std::string &channel);
+ bool sendModChannelMessage(const std::string &channel, const std::string &message);
+ ModChannel *getModChannel(const std::string &channel);
+
// Bind address
Address m_bind_addr;
friend class EmergeThread;
friend class RemoteClient;
- void SendMovement(u16 peer_id);
- void SendHP(u16 peer_id, u8 hp);
- void SendBreath(u16 peer_id, u16 breath);
- void SendAccessDenied(u16 peer_id, AccessDeniedCode reason,
+ void SendMovement(session_t peer_id);
+ void SendHP(session_t peer_id, u16 hp);
+ void SendBreath(session_t peer_id, u16 breath);
+ void SendAccessDenied(session_t peer_id, AccessDeniedCode reason,
const std::string &custom_reason, bool reconnect = false);
- void SendAccessDenied_Legacy(u16 peer_id, const std::wstring &reason);
- void SendDeathscreen(u16 peer_id,bool set_camera_point_target, v3f camera_point_target);
- void SendItemDef(u16 peer_id,IItemDefManager *itemdef, u16 protocol_version);
- void SendNodeDef(u16 peer_id,INodeDefManager *nodedef, u16 protocol_version);
+ void SendAccessDenied_Legacy(session_t peer_id, const std::wstring &reason);
+ void SendDeathscreen(session_t peer_id, bool set_camera_point_target,
+ v3f camera_point_target);
+ void SendItemDef(session_t peer_id, IItemDefManager *itemdef, u16 protocol_version);
+ void SendNodeDef(session_t peer_id, INodeDefManager *nodedef, u16 protocol_version);
/* mark blocks not sent for all clients */
void SetBlocksNotSent(std::map<v3s16, MapBlock *>& block);
- void SendChatMessage(u16 peer_id, const ChatMessage &message);
- void SendTimeOfDay(u16 peer_id, u16 time, f32 time_speed);
- void SendPlayerHP(u16 peer_id);
-
- void SendLocalPlayerAnimations(u16 peer_id, v2s32 animation_frames[4], f32 animation_speed);
- void SendEyeOffset(u16 peer_id, v3f first, v3f third);
- void SendPlayerPrivileges(u16 peer_id);
- void SendPlayerInventoryFormspec(u16 peer_id);
- void SendShowFormspecMessage(u16 peer_id, const std::string &formspec, const std::string &formname);
- void SendHUDAdd(u16 peer_id, u32 id, HudElement *form);
- void SendHUDRemove(u16 peer_id, u32 id);
- void SendHUDChange(u16 peer_id, u32 id, HudElementStat stat, void *value);
- void SendHUDSetFlags(u16 peer_id, u32 flags, u32 mask);
- void SendHUDSetParam(u16 peer_id, u16 param, const std::string &value);
- void SendSetSky(u16 peer_id, const video::SColor &bgcolor,
+ void SendChatMessage(session_t peer_id, const ChatMessage &message);
+ void SendTimeOfDay(session_t peer_id, u16 time, f32 time_speed);
+ void SendPlayerHP(session_t peer_id);
+
+ void SendLocalPlayerAnimations(session_t peer_id, v2s32 animation_frames[4],
+ f32 animation_speed);
+ void SendEyeOffset(session_t peer_id, v3f first, v3f third);
+ void SendPlayerPrivileges(session_t peer_id);
+ void SendPlayerInventoryFormspec(session_t peer_id);
+ void SendShowFormspecMessage(session_t peer_id, const std::string &formspec,
+ const std::string &formname);
+ void SendHUDAdd(session_t peer_id, u32 id, HudElement *form);
+ void SendHUDRemove(session_t peer_id, u32 id);
+ void SendHUDChange(session_t peer_id, u32 id, HudElementStat stat, void *value);
+ void SendHUDSetFlags(session_t peer_id, u32 flags, u32 mask);
+ void SendHUDSetParam(session_t peer_id, u16 param, const std::string &value);
+ void SendSetSky(session_t peer_id, const video::SColor &bgcolor,
const std::string &type, const std::vector<std::string> ¶ms,
bool &clouds);
- void SendCloudParams(u16 peer_id, float density,
+ void SendCloudParams(session_t peer_id, float density,
const video::SColor &color_bright,
const video::SColor &color_ambient,
float height,
float thickness,
const v2f &speed);
- void SendOverrideDayNightRatio(u16 peer_id, bool do_override, float ratio);
+ void SendOverrideDayNightRatio(session_t peer_id, bool do_override, float ratio);
+ void broadcastModChannelMessage(const std::string &channel,
+ const std::string &message, session_t from_peer);
/*
Send a node removal/addition event to all clients except ignore_id.
void setBlockNotSent(v3s16 p);
// Environment and Connection must be locked when called
- void SendBlockNoLock(u16 peer_id, MapBlock *block, u8 ver, u16 net_proto_version);
+ void SendBlockNoLock(session_t peer_id, MapBlock *block, u8 ver, u16 net_proto_version);
// Sends blocks to clients (locks env and con on its own)
void SendBlocks(float dtime);
void fillMediaCache();
- void sendMediaAnnouncement(u16 peer_id);
- void sendRequestedMedia(u16 peer_id,
+ void sendMediaAnnouncement(session_t peer_id, const std::string &lang_code);
+ void sendRequestedMedia(session_t peer_id,
const std::vector<std::string> &tosend);
- void sendDetachedInventory(const std::string &name, u16 peer_id);
- void sendDetachedInventories(u16 peer_id);
+ void sendDetachedInventory(const std::string &name, session_t peer_id);
+ void sendDetachedInventories(session_t peer_id);
// Adds a ParticleSpawner on peer with peer_id (PEER_ID_INEXISTENT == all)
- void SendAddParticleSpawner(u16 peer_id, u16 protocol_version,
+ void SendAddParticleSpawner(session_t peer_id, u16 protocol_version,
u16 amount, float spawntime,
v3f minpos, v3f maxpos,
v3f minvel, v3f maxvel,
bool vertical, const std::string &texture, u32 id,
const struct TileAnimationParams &animation, u8 glow);
- void SendDeleteParticleSpawner(u16 peer_id, u32 id);
+ void SendDeleteParticleSpawner(session_t peer_id, u32 id);
// Spawns particle on peer with peer_id (PEER_ID_INEXISTENT == all)
- void SendSpawnParticle(u16 peer_id, u16 protocol_version,
+ void SendSpawnParticle(session_t peer_id, u16 protocol_version,
v3f pos, v3f velocity, v3f acceleration,
float expirationtime, float size,
bool collisiondetection, bool collision_removal,
bool vertical, const std::string &texture,
const struct TileAnimationParams &animation, u8 glow);
- u32 SendActiveObjectRemoveAdd(u16 peer_id, const std::string &datas);
- void SendActiveObjectMessages(u16 peer_id, const std::string &datas, bool reliable = true);
- void SendCSMFlavourLimits(u16 peer_id);
+ u32 SendActiveObjectRemoveAdd(session_t peer_id, const std::string &datas);
+ void SendActiveObjectMessages(session_t peer_id, const std::string &datas,
+ bool reliable = true);
+ void SendCSMFlavourLimits(session_t peer_id);
/*
Something random
*/
- void DiePlayer(u16 peer_id);
- void RespawnPlayer(u16 peer_id);
- void DeleteClient(u16 peer_id, ClientDeletionReason reason);
+ void DiePlayer(session_t peer_id);
+ void RespawnPlayer(session_t peer_id);
+ void DeleteClient(session_t peer_id, ClientDeletionReason reason);
void UpdateCrafting(RemotePlayer *player);
void handleChatInterfaceEvent(ChatEvent *evt);
void handleAdminChat(const ChatEventChat *evt);
// When called, connection mutex should be locked
- RemoteClient* getClient(u16 peer_id,ClientState state_min=CS_Active);
- RemoteClient* getClientNoEx(u16 peer_id,ClientState state_min=CS_Active);
+ RemoteClient* getClient(session_t peer_id, ClientState state_min = CS_Active);
+ RemoteClient* getClientNoEx(session_t peer_id, ClientState state_min = CS_Active);
// When called, environment mutex should be locked
- std::string getPlayerName(u16 peer_id);
- PlayerSAO* getPlayerSAO(u16 peer_id);
+ std::string getPlayerName(session_t peer_id);
+ PlayerSAO *getPlayerSAO(session_t peer_id);
/*
Get a player from memory or creates one.
Call with env and con locked.
*/
- PlayerSAO *emergePlayer(const char *name, u16 peer_id, u16 proto_version);
+ PlayerSAO *emergePlayer(const char *name, session_t peer_id, u16 proto_version);
void handlePeerChanges();
ServerEnvironment *m_env = nullptr;
// server connection
- con::Connection m_con;
+ std::shared_ptr<con::Connection> m_con;
// Ban checking
BanManager *m_banmanager = nullptr;
this peed id as the disabled recipient
This is behind m_env_mutex
*/
- u16 m_ignore_map_edit_events_peer_id = 0;
+ session_t m_ignore_map_edit_events_peer_id = 0;
// media files known to server
std::unordered_map<std::string, MediaInfo> m_media;
// CSM flavour limits byteflag
u64 m_csm_flavour_limits = CSMFlavourLimit::CSM_FL_NONE;
u32 m_csm_noderange_limit = 8;
+
+ // ModChannel manager
+ std::unique_ptr<ModChannelMgr> m_modchannel_mgr;
};
/*
Shuts down when kill is set to true.
*/
void dedicated_server_loop(Server &server, bool &kill);
-
-#endif