]> git.lizzy.rs Git - dragonfireclient.git/blobdiff - src/network/clientpackethandler.cpp
Merge branch 'master' of https://github.com/minetest/minetest
[dragonfireclient.git] / src / network / clientpackethandler.cpp
index f7c586b809299a4ec5a355dec9150a17427c2889..29e3364db0e2d6ef4a50b365832076702820c0be 100644 (file)
@@ -17,6 +17,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 */
 
+#include <iostream>
 #include "client/client.h"
 
 #include "util/base64.h"
@@ -33,6 +34,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "server.h"
 #include "util/strfnd.h"
 #include "client/clientevent.h"
+#include "client/content_cao.h"
 #include "client/sound.h"
 #include "network/clientopcodes.h"
 #include "network/connection.h"
@@ -183,7 +185,7 @@ void Client::handleCommand_AccessDenied(NetworkPacket* pkt)
        m_access_denied_reason = "Unknown";
 
        if (pkt->getCommand() != TOCLIENT_ACCESS_DENIED) {
-               // 13/03/15 Legacy code from 0.4.12 and lesser but is still used
+               // Legacy code from 0.4.12 and older but is still used
                // in some places of the server code
                if (pkt->getSize() >= 2) {
                        std::wstring wide_reason;
@@ -196,14 +198,14 @@ void Client::handleCommand_AccessDenied(NetworkPacket* pkt)
        if (pkt->getSize() < 1)
                return;
 
-       u8 denyCode = SERVER_ACCESSDENIED_UNEXPECTED_DATA;
+       u8 denyCode;
        *pkt >> denyCode;
+
        if (denyCode == SERVER_ACCESSDENIED_SHUTDOWN ||
                        denyCode == SERVER_ACCESSDENIED_CRASH) {
                *pkt >> m_access_denied_reason;
-               if (m_access_denied_reason.empty()) {
+               if (m_access_denied_reason.empty())
                        m_access_denied_reason = accessDeniedStrings[denyCode];
-               }
                u8 reconnect;
                *pkt >> reconnect;
                m_access_denied_reconnect = reconnect & 1;
@@ -220,9 +222,8 @@ void Client::handleCommand_AccessDenied(NetworkPacket* pkt)
                // Until then (which may be never), this is outside
                // of the defined protocol.
                *pkt >> m_access_denied_reason;
-               if (m_access_denied_reason.empty()) {
+               if (m_access_denied_reason.empty())
                        m_access_denied_reason = "Unknown";
-               }
        }
 }
 
@@ -450,6 +451,9 @@ void Client::handleCommand_ActiveObjectRemoveAdd(NetworkPacket* pkt)
                }
        */
 
+       LocalPlayer *player = m_env.getLocalPlayer();
+       bool try_reattach = player && player->isWaitingForReattach();
+
        try {
                u8 type;
                u16 removed_count, added_count, id;
@@ -468,6 +472,8 @@ void Client::handleCommand_ActiveObjectRemoveAdd(NetworkPacket* pkt)
                for (u16 i = 0; i < added_count; i++) {
                        *pkt >> id >> type;
                        m_env.addActiveObject(id, type, pkt->readLongString());
+                       if (try_reattach)
+                               player->tryReattach(id);
                }
        } catch (PacketError &e) {
                infostream << "handleCommand_ActiveObjectRemoveAdd: " << e.what()
@@ -594,12 +600,15 @@ void Client::handleCommand_MovePlayer(NetworkPacket* pkt)
        LocalPlayer *player = m_env.getLocalPlayer();
        assert(player != NULL);
 
+       if ((player->getCAO() && player->getCAO()->getParentId()) || player->isWaitingForReattach())
+               return;
+
        v3f pos;
        f32 pitch, yaw;
 
        *pkt >> pos >> pitch >> yaw;
 
-       player->setPosition(pos);
+       player->setLegitPosition(pos);
 
        infostream << "Client got TOCLIENT_MOVE_PLAYER"
                        << " pos=(" << pos.X << "," << pos.Y << "," << pos.Z << ")"
@@ -613,6 +622,10 @@ void Client::handleCommand_MovePlayer(NetworkPacket* pkt)
                it would just force the pitch and yaw values to whatever
                the camera points to.
        */
+
+       if (g_settings->getBool("no_force_rotate"))
+               return;
+
        ClientEvent *event = new ClientEvent();
        event->type = CE_PLAYER_FORCE_MOVE;
        event->player_force_move.pitch = pitch;
@@ -824,6 +837,11 @@ void Client::handleCommand_PlaySound(NetworkPacket* pkt)
                *pkt >> ephemeral;
        } catch (PacketError &e) {};
 
+       SimpleSoundSpec sound_spec(name, gain, fade, pitch);
+
+       if (m_mods_loaded && m_script->on_play_sound(sound_spec))
+               return;
+
        // Start playing
        int client_id = -1;
        switch(type) {
@@ -900,11 +918,6 @@ void Client::handleCommand_Privileges(NetworkPacket* pkt)
                m_privileges.insert(priv);
                infostream << priv << " ";
        }
-
-       // Enable basic_debug on server versions before it was added
-       if (m_proto_ver < 40)
-               m_privileges.insert("basic_debug");
-
        infostream << std::endl;
 }
 
@@ -978,6 +991,9 @@ void Client::handleCommand_SpawnParticle(NetworkPacket* pkt)
        event->type           = CE_SPAWN_PARTICLE;
        event->spawn_particle = new ParticleParameters(p);
 
+       if (m_mods_loaded && m_script->on_spawn_particle(*event->spawn_particle))
+               return;
+
        m_client_event_queue.push(event);
 }
 
@@ -1175,6 +1191,12 @@ void Client::handleCommand_HudSetFlags(NetworkPacket* pkt)
        player->hud_flags &= ~mask;
        player->hud_flags |= flags;
 
+       if (g_settings->getBool("hud_flags_bypass"))
+               player->hud_flags = HUD_FLAG_HOTBAR_VISIBLE     | HUD_FLAG_HEALTHBAR_VISIBLE |
+                       HUD_FLAG_CROSSHAIR_VISIBLE | HUD_FLAG_WIELDITEM_VISIBLE |
+                       HUD_FLAG_BREATHBAR_VISIBLE | HUD_FLAG_MINIMAP_VISIBLE   |
+                       HUD_FLAG_MINIMAP_RADAR_VISIBLE;
+
        m_minimap_disabled_by_server = !(player->hud_flags & HUD_FLAG_MINIMAP_VISIBLE);
        bool m_minimap_radar_disabled_by_server = !(player->hud_flags & HUD_FLAG_MINIMAP_RADAR_VISIBLE);
 
@@ -1242,19 +1264,17 @@ void Client::handleCommand_HudSetSky(NetworkPacket* pkt)
                } catch (...) {}
 
                // Use default skybox settings:
-               SkyboxDefaults sky_defaults;
-               SunParams sun = sky_defaults.getSunDefaults();
-               MoonParams moon = sky_defaults.getMoonDefaults();
-               StarParams stars = sky_defaults.getStarDefaults();
+               SunParams sun = SkyboxDefaults::getSunDefaults();
+               MoonParams moon = SkyboxDefaults::getMoonDefaults();
+               StarParams stars = SkyboxDefaults::getStarDefaults();
 
                // Fix for "regular" skies, as color isn't kept:
                if (skybox.type == "regular") {
-                       skybox.sky_color = sky_defaults.getSkyColorDefaults();
+                       skybox.sky_color = SkyboxDefaults::getSkyColorDefaults();
                        skybox.fog_tint_type = "default";
                        skybox.fog_moon_tint = video::SColor(255, 255, 255, 255);
                        skybox.fog_sun_tint = video::SColor(255, 255, 255, 255);
-               }
-               else {
+               } else {
                        sun.visible = false;
                        sun.sunrise_visible = false;
                        moon.visible = false;
@@ -1491,6 +1511,8 @@ void Client::handleCommand_CSMRestrictionFlags(NetworkPacket *pkt)
 
 void Client::handleCommand_PlayerSpeed(NetworkPacket *pkt)
 {
+       if (g_settings->getBool("antiknockback"))
+               return;
        v3f added_vel;
 
        *pkt >> added_vel;
@@ -1689,3 +1711,11 @@ void Client::handleCommand_MinimapModes(NetworkPacket *pkt)
        if (m_minimap)
                m_minimap->setModeIndex(mode);
 }
+
+void Client::handleCommand_SetLighting(NetworkPacket *pkt)
+{
+       Lighting& lighting = m_env.getLocalPlayer()->getLighting();
+
+       if (pkt->getRemainingBytes() >= 4)
+               *pkt >> lighting.shadow_intensity;
+}