Fix alpha for liquid nodes (#5494)
[oweals/minetest.git] / src / server.cpp
index 190a1baf2dbc569d622bbb04a7ed4c3a7d5c45b5..6889451d9f623ddf2f4ff946cec0719e84d7e1a1 100644 (file)
@@ -283,7 +283,7 @@ Server::Server(
                if (!string_allowed(mod.name, MODNAME_ALLOWED_CHARS)) {
                        throw ModError("Error loading mod \"" + mod.name +
                                "\": Mod name does not follow naming conventions: "
-                               "Only chararacters [a-z0-9_] are allowed.");
+                               "Only characters [a-z0-9_] are allowed.");
                }
                std::string script_path = mod.path + DIR_DELIM + "init.lua";
                infostream << "  [" << padStringRight(mod.name, 12) << "] [\""
@@ -1707,13 +1707,25 @@ void Server::SendSpawnParticle(u16 peer_id, u16 protocol_version,
                                const struct TileAnimationParams &animation, u8 glow)
 {
        DSTACK(FUNCTION_NAME);
+       static const float radius =
+                       g_settings->getS16("max_block_send_distance") * MAP_BLOCKSIZE * BS;
+
        if (peer_id == PEER_ID_INEXISTENT) {
-               // This sucks and should be replaced by a better solution in a refactor:
                std::vector<u16> clients = m_clients.getClientIDs();
+
                for (std::vector<u16>::iterator i = clients.begin(); i != clients.end(); ++i) {
                        RemotePlayer *player = m_env->getPlayer(*i);
                        if (!player)
                                continue;
+
+                       PlayerSAO *sao = player->getPlayerSAO();
+                       if (!sao)
+                               continue;
+
+                       // Do not send to distant clients
+                       if (sao->getBasePosition().getDistanceFrom(pos * BS) > radius)
+                               continue;
+
                        SendSpawnParticle(*i, player->protocol_version,
                                        pos, velocity, acceleration,
                                        expirationtime, size, collisiondetection,
@@ -1871,7 +1883,8 @@ void Server::SendHUDSetParam(u16 peer_id, u16 param, const std::string &value)
 }
 
 void Server::SendSetSky(u16 peer_id, const video::SColor &bgcolor,
-               const std::string &type, const std::vector<std::string> &params)
+               const std::string &type, const std::vector<std::string> &params,
+               bool &clouds)
 {
        NetworkPacket pkt(TOCLIENT_SET_SKY, 0, peer_id);
        pkt << bgcolor << type << (u16) params.size();
@@ -1879,6 +1892,8 @@ void Server::SendSetSky(u16 peer_id, const video::SColor &bgcolor,
        for(size_t i=0; i<params.size(); i++)
                pkt << params[i];
 
+       pkt << clouds;
+
        Send(&pkt);
 }
 
@@ -3254,13 +3269,14 @@ bool Server::setPlayerEyeOffset(RemotePlayer *player, v3f first, v3f third)
 }
 
 bool Server::setSky(RemotePlayer *player, const video::SColor &bgcolor,
-       const std::string &type, const std::vector<std::string> &params)
+       const std::string &type, const std::vector<std::string> &params,
+       bool &clouds)
 {
        if (!player)
                return false;
 
-       player->setSky(bgcolor, type, params);
-       SendSetSky(player->peer_id, bgcolor, type, params);
+       player->setSky(bgcolor, type, params, clouds);
+       SendSetSky(player->peer_id, bgcolor, type, params, clouds);
        return true;
 }