#include "hud.h"
#include "gamedef.h"
#include "serialization.h" // For SER_FMT_VER_INVALID
-#include "mods.h"
+#include "content/mods.h"
#include "inventorymanager.h"
-#include "subgame.h"
+#include "content/subgames.h"
#include "tileanimation.h" // struct TileAnimationParams
#include "network/peerhandler.h"
#include "network/address.h"
~Server();
DISABLE_CLASS_COPY(Server);
+ void init();
void start();
void stop();
// This is mainly a way to pass the time to the server.
inline double getUptime() const { return m_uptime.m_value; }
// read shutdown state
- inline bool getShutdownRequested() const { return m_shutdown_requested; }
+ inline bool isShutdownRequested() const { return m_shutdown_state.is_requested; }
// request server to shutdown
void requestShutdown(const std::string &msg, bool reconnect, float delay = 0.0f);
void spawnParticle(const std::string &playername,
v3f pos, v3f velocity, v3f acceleration,
float expirationtime, float size,
- bool collisiondetection, bool collision_removal,
+ bool collisiondetection, bool collision_removal, bool object_collision,
bool vertical, const std::string &texture,
const struct TileAnimationParams &animation, u8 glow);
v3f minacc, v3f maxacc,
float minexptime, float maxexptime,
float minsize, float maxsize,
- bool collisiondetection, bool collision_removal,
+ bool collisiondetection, bool collision_removal, bool object_collision,
ServerActiveObject *attached,
bool vertical, const std::string &texture,
const std::string &playername, const struct TileAnimationParams &animation,
void deleteParticleSpawner(const std::string &playername, u32 id);
// Creates or resets inventory
- Inventory* createDetachedInventory(const std::string &name, const std::string &player="");
+ Inventory *createDetachedInventory(const std::string &name,
+ const std::string &player = "");
+ bool removeDetachedInventory(const std::string &name);
// Envlock and conlock should be locked when using scriptapi
ServerScripting *getScriptIface(){ return m_script; }
virtual const NodeDefManager* getNodeDefManager();
virtual ICraftDefManager* getCraftDefManager();
virtual u16 allocateUnknownNodeId(const std::string &name);
- virtual MtEventManager* getEventManager();
IRollbackManager *getRollbackManager() { return m_rollback; }
virtual EmergeManager *getEmergeManager() { return m_emerge; }
std::mutex m_env_mutex;
private:
-
friend class EmergeThread;
friend class RemoteClient;
+ friend class TestServerShutdownState;
+
+ struct ShutdownState {
+ friend class TestServerShutdownState;
+ public:
+ bool is_requested = false;
+ bool should_reconnect = false;
+ std::string message;
+
+ void reset();
+ void trigger(float delay, const std::string &msg, bool reconnect);
+ void tick(float dtime, Server *server);
+ std::wstring getShutdownTimerMessage() const;
+ bool isTimerRunning() const { return m_timer > 0.0f; }
+ private:
+ float m_timer = 0.0f;
+ };
void SendMovement(session_t peer_id);
void SendHP(session_t peer_id, u16 hp);
void SetBlocksNotSent(std::map<v3s16, MapBlock *>& block);
- void SendChatMessage(session_t peer_id, const ChatMessage &message);
+ virtual 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);
far_d_nodes are ignored and their peer_ids are added to far_players
*/
// Envlock and conlock should be locked when calling these
- void sendRemoveNode(v3s16 p, u16 ignore_id=0,
- std::vector<u16> *far_players=NULL, float far_d_nodes=100);
- void sendAddNode(v3s16 p, MapNode n, u16 ignore_id=0,
- std::vector<u16> *far_players=NULL, float far_d_nodes=100,
- bool remove_metadata=true);
+ void sendRemoveNode(v3s16 p, std::unordered_set<u16> *far_players = nullptr,
+ float far_d_nodes = 100);
+ void sendAddNode(v3s16 p, MapNode n,
+ std::unordered_set<u16> *far_players = nullptr,
+ float far_d_nodes = 100, bool remove_metadata = true);
+
+ void sendMetadataChanged(const std::list<v3s16> &meta_updates,
+ float far_d_nodes = 100);
// Environment and Connection must be locked when called
void SendBlockNoLock(session_t peer_id, MapBlock *block, u8 ver, u16 net_proto_version);
v3f minacc, v3f maxacc,
float minexptime, float maxexptime,
float minsize, float maxsize,
- bool collisiondetection, bool collision_removal,
+ bool collisiondetection, bool collision_removal, bool object_collision,
u16 attached_id,
bool vertical, const std::string &texture, u32 id,
const struct TileAnimationParams &animation, u8 glow);
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 collisiondetection, bool collision_removal, bool object_collision,
bool vertical, const std::string &texture,
const struct TileAnimationParams &animation, u8 glow);
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);
+ void SendCSMRestrictionFlags(session_t peer_id);
/*
Something random
Random stuff
*/
- bool m_shutdown_requested = false;
- std::string m_shutdown_msg;
- bool m_shutdown_ask_reconnect = false;
- float m_shutdown_timer = 0.0f;
+ ShutdownState m_shutdown_state;
ChatInterface *m_admin_chat;
std::string m_admin_nick;
This is behind m_env_mutex
*/
std::queue<MapEditEvent*> m_unsent_map_edit_queue;
- /*
- Set to true when the server itself is modifying the map and does
- all sending of information by itself.
- This is behind m_env_mutex
- */
- bool m_ignore_map_edit_events = false;
/*
If a non-empty area, map edit events contained within are left
unsent. Done at map generation time to speed up editing of the
std::unordered_map<std::string, ModMetadata *> m_mod_storages;
float m_mod_storage_save_timer = 10.0f;
- // CSM flavour limits byteflag
- u64 m_csm_flavour_limits = CSMFlavourLimit::CSM_FL_NONE;
- u32 m_csm_noderange_limit = 8;
+ // CSM restrictions byteflag
+ u64 m_csm_restriction_flags = CSMRestrictionFlags::CSM_RF_NONE;
+ u32 m_csm_restriction_noderange = 8;
// ModChannel manager
std::unique_ptr<ModChannelMgr> m_modchannel_mgr;