PostgreSQL: Fix listAllLoadableBlocks returning the same block
[oweals/minetest.git] / src / server.h
index 8ac61aaad56ac407abf6a49373681cad6786cea9..680de57b540f51027ad2fc13d66b5a8318ec329a 100644 (file)
@@ -61,6 +61,10 @@ class ServerScripting;
 class ServerEnvironment;
 struct SimpleSoundSpec;
 struct CloudParams;
+struct SkyboxParams;
+struct SunParams;
+struct MoonParams;
+struct StarParams;
 class ServerThread;
 class ServerModManager;
 
@@ -98,6 +102,7 @@ struct ServerSoundParams
        v3f pos;
        u16 object = 0;
        std::string to_player = "";
+       std::string exclude_player = "";
 
        v3f getPos(ServerEnvironment *env, bool *pos_exists) const;
 };
@@ -189,13 +194,13 @@ public:
                This is accessed by the map, which is inside the environment,
                so it shouldn't be a problem.
        */
-       void onMapEditEvent(MapEditEvent *event);
+       void onMapEditEvent(const MapEditEvent &event);
 
        /*
                Shall be called with the environment and the connection locked.
        */
        Inventory* getInventory(const InventoryLocation &loc);
-       void setInventoryModified(const InventoryLocation &loc, bool playerSend = true);
+       void setInventoryModified(const InventoryLocation &loc);
 
        // Connection must be locked when called
        std::wstring getStatusString();
@@ -209,7 +214,8 @@ public:
 
        // Returns -1 if failed, sound handle on success
        // Envlock
-       s32 playSound(const SimpleSoundSpec &spec, const ServerSoundParams &params);
+       s32 playSound(const SimpleSoundSpec &spec, const ServerSoundParams &params,
+                       bool ephemeral=false);
        void stopSound(s32 handle);
        void fadeSound(s32 handle, float step, float gain);
 
@@ -229,7 +235,7 @@ public:
        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);
 
@@ -239,7 +245,7 @@ public:
                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,
@@ -248,7 +254,9 @@ public:
        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; }
@@ -294,8 +302,8 @@ public:
        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);
-       void hudSetHotbarImage(RemotePlayer *player, std::string name);
-       void hudSetHotbarSelectedImage(RemotePlayer *player, std::string name);
+       void hudSetHotbarImage(RemotePlayer *player, const std::string &name);
+       void hudSetHotbarSelectedImage(RemotePlayer *player, const std::string &name);
 
        Address getPeerAddress(session_t peer_id);
 
@@ -303,9 +311,11 @@ public:
                        f32 frame_speed);
        void setPlayerEyeOffset(RemotePlayer *player, const v3f &first, const v3f &third);
 
-       void setSky(RemotePlayer *player, const video::SColor &bgcolor,
-                       const std::string &type, const std::vector<std::string> &params,
-                       bool &clouds);
+       void setSky(RemotePlayer *player, const SkyboxParams &params);
+       void setSun(RemotePlayer *player, const SunParams &params);
+       void setMoon(RemotePlayer *player, const MoonParams &params);
+       void setStars(RemotePlayer *player, const StarParams &params);
+
        void setClouds(RemotePlayer *player, const CloudParams &params);
 
        bool overrideDayNightRatio(RemotePlayer *player, bool do_override, float brightness);
@@ -331,8 +341,12 @@ public:
 
        void SendPlayerHPOrDie(PlayerSAO *player, const PlayerHPChangeReason &reason);
        void SendPlayerBreath(PlayerSAO *sao);
-       void SendInventory(PlayerSAO* playerSAO);
+       void SendInventory(PlayerSAO *playerSAO, bool incremental);
        void SendMovePlayer(session_t peer_id);
+       void SendPlayerSpeed(session_t peer_id, const v3f &added_vel);
+       void SendPlayerFov(session_t peer_id);
+
+       void sendDetachedInventories(session_t peer_id, bool incremental);
 
        virtual bool registerModStorage(ModMetadata *storage);
        virtual void unregisterModStorage(const std::string &name);
@@ -342,6 +356,9 @@ public:
        bool sendModChannelMessage(const std::string &channel, const std::string &message);
        ModChannel *getModChannel(const std::string &channel);
 
+       // Send block to specific player only
+       bool SendBlock(session_t peer_id, const v3s16 &blockpos);
+
        // Bind address
        Address m_bind_addr;
 
@@ -402,9 +419,10 @@ private:
        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> &params,
-                       bool &clouds);
+       void SendSetSky(session_t peer_id, const SkyboxParams &params);
+       void SendSetSun(session_t peer_id, const SunParams &params);
+       void SendSetMoon(session_t peer_id, const MoonParams &params);
+       void SendSetStars(session_t peer_id, const StarParams &params);
        void SendCloudParams(session_t peer_id, const CloudParams &params);
        void SendOverrideDayNightRatio(session_t peer_id, bool do_override, float ratio);
        void broadcastModChannelMessage(const std::string &channel,
@@ -416,11 +434,14 @@ private:
                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);
@@ -434,7 +455,6 @@ private:
                        const std::vector<std::string> &tosend);
 
        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(session_t peer_id, u16 protocol_version,
@@ -444,7 +464,7 @@ private:
                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);
@@ -455,11 +475,11 @@ private:
        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 SendActiveObjectRemoveAdd(RemoteClient *client, PlayerSAO *playersao);
        void SendActiveObjectMessages(session_t peer_id, const std::string &datas,
                bool reliable = true);
        void SendCSMRestrictionFlags(session_t peer_id);
@@ -472,7 +492,7 @@ private:
        void RespawnPlayer(session_t peer_id);
        void DeleteClient(session_t peer_id, ClientDeletionReason reason);
        void UpdateCrafting(RemotePlayer *player);
-       bool checkInteractDistance(RemotePlayer *player, const f32 d, const std::string what);
+       bool checkInteractDistance(RemotePlayer *player, const f32 d, const std::string &what);
 
        void handleChatInterfaceEvent(ChatEvent *evt);
 
@@ -505,7 +525,6 @@ private:
        /*
                Variables
        */
-
        // World directory
        std::string m_path_world;
        // Subgame specification
@@ -565,7 +584,6 @@ private:
        /*
                Threads
        */
-
        // A buffer for time steps
        // step() increments and AsyncRunStep() run by m_thread reads it.
        float m_step_dtime = 0.0f;
@@ -580,14 +598,14 @@ private:
        /*
                Time related stuff
        */
-
        // Timer for sending time of day over network
        float m_time_of_day_send_timer = 0.0f;
        // Uptime of server in seconds
        MutexedVariable<double> m_uptime;
+
        /*
-        Client interface
-        */
+               Client interface
+       */
        ClientInterface m_clients;
 
        /*
@@ -637,7 +655,8 @@ private:
                Sounds
        */
        std::unordered_map<s32, ServerPlayingSound> m_playing_sounds;
-       s32 m_next_sound_id = 0;
+       s32 m_next_sound_id = 0; // positive values only
+       s32 nextSoundId();
 
        /*
                Detached inventories (behind m_env_mutex)