]> git.lizzy.rs Git - minetest.git/blobdiff - src/game.cpp
Make sure none of the irrlicht member objects of GenericCAO are deleted prior deletio...
[minetest.git] / src / game.cpp
index 6076ac4a0aeb5d83c7cd90bf9a466cfb0f69c8ac..3acc93828817f1bc7629abb37abb80ee08b1e13a 100644 (file)
@@ -31,7 +31,6 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "guiPasswordChange.h"
 #include "guiVolumeChange.h"
 #include "guiFormSpecMenu.h"
-#include "guiTextInputMenu.h"
 #include "tool.h"
 #include "guiChatConsole.h"
 #include "config.h"
@@ -319,7 +318,7 @@ PointedThing getPointedThing(Client *client, v3f player_position,
 
        // That didn't work, try to find a pointed at node
 
-       
+
        v3s16 pos_i = floatToInt(player_position, BS);
 
        /*infostream<<"pos_i=("<<pos_i.X<<","<<pos_i.Y<<","<<pos_i.Z<<")"
@@ -332,7 +331,7 @@ PointedThing getPointedThing(Client *client, v3f player_position,
        s16 yend = pos_i.Y + 1 + (camera_direction.Y>0 ? a : 1);
        s16 zend = pos_i.Z + (camera_direction.Z>0 ? a : 1);
        s16 xend = pos_i.X + (camera_direction.X>0 ? a : 1);
-       
+
        // Prevent signed number overflow
        if(yend==32767)
                yend=32766;
@@ -483,7 +482,7 @@ class ProfilerGraph
                while(m_log.size() > m_log_max_size)
                        m_log.erase(m_log.begin());
        }
-       
+
        void draw(s32 x_left, s32 y_bottom, video::IVideoDriver *driver,
                        gui::IGUIFont* font) const
        {
@@ -532,7 +531,7 @@ class ProfilerGraph
                s32 graphh = 50;
                s32 textx = x_left + m_log_max_size + 15;
                s32 textx2 = textx + 200 - 15;
-               
+
                // Draw background
                /*{
                        u32 num_graphs = m_meta.size();
@@ -541,7 +540,7 @@ class ProfilerGraph
                        video::SColor bgcolor(120,0,0,0);
                        driver->draw2DRectangle(bgcolor, rect, NULL);
                }*/
-               
+
                s32 meta_i = 0;
                for(std::map<std::string, Meta>::const_iterator i = m_meta.begin();
                                i != m_meta.end(); i++){
@@ -627,7 +626,7 @@ class NodeDugEvent: public MtEvent
 public:
        v3s16 p;
        MapNode n;
-       
+
        NodeDugEvent(v3s16 p, MapNode n):
                p(p),
                n(n)
@@ -800,7 +799,7 @@ class GameGlobalShaderConstantSetter : public IShaderConstantSetter
                u32 daynight_ratio = m_client->getEnv().getDayNightRatio();
                float daynight_ratio_f = (float)daynight_ratio / 1000.0;
                services->setPixelShaderConstant("dayNightRatio", &daynight_ratio_f, 1);
-               
+
                u32 animation_timer = porting::getTimeMs() % 100000;
                float animation_timer_f = (float)animation_timer / 100000.0;
                services->setPixelShaderConstant("animationTimer", &animation_timer_f, 1);
@@ -1034,7 +1033,7 @@ static void show_pause_menu(GUIFormSpecMenu** cur_formspec,
        LocalFormspecHandler* txt_dst = new LocalFormspecHandler("MT_PAUSE_MENU");
 
        create_formspec_menu(cur_formspec, invmgr, gamedef, tsrc, device,  fs_src, txt_dst);
-       
+
        if (singleplayermode) {
                (*cur_formspec)->doPause = true;
        }
@@ -1052,7 +1051,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input,
        GUIFormSpecMenu* current_formspec = 0;
        video::IVideoDriver* driver = device->getVideoDriver();
        scene::ISceneManager* smgr = device->getSceneManager();
-       
+
        // Calculate text height using the font
        u32 text_height = font->getDimension(L"Random test string").Height;
 
@@ -1065,19 +1064,19 @@ void the_game(bool &kill, bool random_input, InputHandler *input,
                draw_load_screen(text, device, guienv, font, 0, 0);
                delete[] text;
        }
-       
+
        // Create texture source
        IWritableTextureSource *tsrc = createTextureSource(device);
-       
+
        // Create shader source
        IWritableShaderSource *shsrc = createShaderSource(device);
-       
+
        // These will be filled by data received from the server
        // Create item definition manager
        IWritableItemDefManager *itemdef = createItemDefManager();
        // Create node definition manager
        IWritableNodeDefManager *nodedef = createNodeDefManager();
-       
+
        // Sound fetcher (useful when testing)
        GameOnDemandSoundFetcher soundfetcher;
 
@@ -1109,7 +1108,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input,
        // Sound maker
        SoundMaker soundmaker(sound, nodedef);
        soundmaker.registerReceiver(&eventmgr);
-       
+
        // Add chat log output for errors to be shown in chat
        LogOutputBuffer chat_log_error_buf(LMT_ERROR);
 
@@ -1158,7 +1157,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input,
        }
 
        do{ // Client scope (breakable do-while(0))
-       
+
        /*
                Create client
        */
@@ -1169,9 +1168,9 @@ void the_game(bool &kill, bool random_input, InputHandler *input,
                delete[] text;
        }
        infostream<<"Creating client"<<std::endl;
-       
+
        MapDrawControl draw_control;
-       
+
        {
                wchar_t* text = wgettext("Resolving address...");
                draw_load_screen(text, device, guienv, font, 0, 75);
@@ -1205,26 +1204,26 @@ void the_game(bool &kill, bool random_input, InputHandler *input,
                // Break out of client scope
                break;
        }
-       
+
        /*
                Create client
        */
        Client client(device, playername.c_str(), password, draw_control,
                tsrc, shsrc, itemdef, nodedef, sound, &eventmgr,
                connect_address.isIPv6());
-       
+
        // Client acts as our GameDef
        IGameDef *gamedef = &client;
 
        /*
                Attempt to connect to the server
        */
-       
+
        infostream<<"Connecting to server at ";
        connect_address.print(&infostream);
        infostream<<std::endl;
        client.connect(connect_address);
-       
+
        /*
                Wait for server to accept connection
        */
@@ -1251,7 +1250,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input,
                        client.step(dtime);
                        if(server != NULL)
                                server->step(dtime);
-                       
+
                        // End condition
                        if(client.getState() == LC_Init){
                                could_connect = true;
@@ -1269,14 +1268,14 @@ void the_game(bool &kill, bool random_input, InputHandler *input,
                                infostream<<"Connect aborted [Escape]"<<std::endl;
                                break;
                        }
-                       
+
                        // Display status
                        {
                                wchar_t* text = wgettext("Connecting to server...");
                                draw_load_screen(text, device, guienv, font, dtime, 100);
                                delete[] text;
                        }
-                       
+
                        // On some computers framerate doesn't seem to be
                        // automatically limited
                        if (cloud_menu_background) {
@@ -1306,7 +1305,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input,
        }
        catch(con::PeerNotFoundException &e)
        {}
-       
+
        /*
                Handle failure to connect
        */
@@ -1318,7 +1317,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input,
                // Break out of client scope
                break;
        }
-       
+
        /*
                Wait until content has been received
        */
@@ -1345,7 +1344,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input,
                        client.step(dtime);
                        if(server != NULL)
                                server->step(dtime);
-                       
+
                        // End condition
                        if(client.mediaReceived() &&
                                        client.itemdefReceived() &&
@@ -1370,7 +1369,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input,
                                infostream<<"Connect aborted [Escape]"<<std::endl;
                                break;
                        }
-                       
+
                        // Display status
                        int progress=0;
                        if (!client.itemdefReceived())
@@ -1409,7 +1408,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input,
                                draw_load_screen(narrow_to_wide(message.str().c_str()), device,
                                                guienv, font, dtime, progress);
                        }
-                       
+
                        // On some computers framerate doesn't seem to be
                        // automatically limited
                        if (cloud_menu_background) {
@@ -1466,7 +1465,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input,
        /*
                Clouds
        */
-       
+
        Clouds *clouds = NULL;
        if(g_settings->getBool("enable_clouds"))
        {
@@ -1481,7 +1480,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input,
        sky = new Sky(smgr->getRootSceneNode(), smgr, -1);
 
        scene::ISceneNode* skybox = NULL;
-       
+
        /*
                A copy of the local inventory
        */
@@ -1517,17 +1516,17 @@ void the_game(bool &kill, bool random_input, InputHandler *input,
                        L"",
                        core::rect<s32>(0,0,400,text_height*5+5) + v2s32(100,200),
                        false, true);
-       
+
        // Status text (displays info when showing and hiding GUI stuff, etc.)
        gui::IGUIStaticText *guitext_status = guienv->addStaticText(
                        L"<Status>",
                        core::rect<s32>(0,0,0,0),
                        false, false);
        guitext_status->setVisible(false);
-       
+
        std::wstring statustext;
        float statustext_time = 0;
-       
+
        // Chat text
        gui::IGUIStaticText *guitext_chat = guienv->addStaticText(
                        L"",
@@ -1538,7 +1537,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input,
        chat_backend.clearRecentChat();
        // Chat backend and console
        GUIChatConsole *gui_chat_console = new GUIChatConsole(guienv, guienv->getRootGUIElement(), -1, &chat_backend, &client);
-       
+
        // Profiler text (size is updated when text is updated)
        gui::IGUIStaticText *guitext_profiler = guienv->addStaticText(
                        L"<Profiler>",
@@ -1547,16 +1546,16 @@ void the_game(bool &kill, bool random_input, InputHandler *input,
        guitext_profiler->setBackgroundColor(video::SColor(120,0,0,0));
        guitext_profiler->setVisible(false);
        guitext_profiler->setWordWrap(true);
-       
+
        /*
                Some statistics are collected in these
        */
        u32 drawtime = 0;
        u32 beginscenetime = 0;
        u32 endscenetime = 0;
-       
+
        float recent_turn_speed = 0.0;
-       
+
        ProfilerGraph graph;
        // Initially clear the profiler
        Profiler::GraphValues dummyvalues;
@@ -1624,7 +1623,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input,
        LocalPlayer* player = client.getEnv().getLocalPlayer();
        player->hurt_tilt_timer = 0;
        player->hurt_tilt_strength = 0;
-       
+
        /*
                HUD object
        */
@@ -1658,7 +1657,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input,
                                busytime_u32 = 0;
                        busytime = busytime_u32 / 1000.0;
                }
-               
+
                g_profiler->graphAdd("mainloop_other", busytime - (float)drawtime/1000.0f);
 
                // Necessary for device->getTimer()->getTime()
@@ -1673,7 +1672,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input,
                                        g_settings->getFloat("pause_fps_max") :
                                        g_settings->getFloat("fps_max");
                        u32 frametime_min = 1000./fps_max;
-                       
+
                        if(busytime_u32 < frametime_min)
                        {
                                u32 sleeptime = frametime_min - busytime_u32;
@@ -1689,7 +1688,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input,
                        Time difference calculation
                */
                f32 dtime; // in seconds
-               
+
                u32 time = device->getTimer()->getTime();
                if(time > lasttime)
                        dtime = (time - lasttime) / 1000.0;
@@ -1706,7 +1705,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input,
                if(object_hit_delay_timer >= 0)
                        object_hit_delay_timer -= dtime;
                time_from_last_punch += dtime;
-               
+
                g_profiler->add("Elapsed time", dtime);
                g_profiler->avg("FPS", 1./dtime);
 
@@ -1735,7 +1734,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input,
                                jitter1_max = 0.0;
                        }
                }
-               
+
                /*
                        Busytime average and jitter calculation
                */
@@ -1743,7 +1742,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input,
                static f32 busytime_avg1 = 0.0;
                busytime_avg1 = busytime_avg1 * 0.98 + busytime * 0.02;
                f32 busytime_jitter1 = busytime - busytime_avg1;
-               
+
                static f32 busytime_jitter1_max_sample = 0.0;
                static f32 busytime_jitter1_min_sample = 0.0;
                {
@@ -1767,7 +1766,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input,
                /*
                        Handle miscellaneous stuff
                */
-               
+
                if(client.accessDenied())
                {
                        error_message = L"Access denied. Reason: "
@@ -1811,7 +1810,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input,
                        Random calculations
                */
                hud.resizeHotbar();
-               
+
                // Hilight boxes collected during the loop and displayed
                std::vector<aabb3f> hilightboxes;
 
@@ -1843,7 +1842,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input,
                /*
                        Direct handling of user input
                */
-               
+
                // Reset input if window not active or some menu is active
                if(device->isWindowActive() == false
                                || noMenuActive() == false
@@ -1880,7 +1879,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input,
                {
                        infostream<<"the_game: "
                                        <<"Launching inventory"<<std::endl;
-                       
+
                        PlayerInventoryFormSource* fs_src = new PlayerInventoryFormSource(&client);
                        TextDest* txt_dst = new TextDestPlayerInventory(&client);
 
@@ -2113,7 +2112,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input,
                                        + itos(range_new));
                        statustext_time = 0;
                }
-               
+
                // Reset jump_timer
                if(!input->isKeyDown(getKeySetting("keymap_jump")) && reset_jump_timer)
                {
@@ -2160,7 +2159,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input,
                                        new_playeritem = max_item;
                        }
                }
-               
+
                // Item selection
                for(u16 i=0; i<10; i++)
                {
@@ -2210,7 +2209,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input,
                        Mouse and camera control
                        NOTE: Do this before client.setPlayerControl() to not cause a camera lag of one frame
                */
-               
+
                float turn_amount = 0;
                if((device->isWindowActive() && noMenuActive()) || random_input)
                {
@@ -2232,7 +2231,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input,
                                        dy = -dy;
                                }
                                //infostream<<"window active, pos difference "<<dx<<","<<dy<<std::endl;
-                               
+
                                /*const float keyspeed = 500;
                                if(input->isKeyDown(irr::KEY_UP))
                                        dy -= dtime * keyspeed;
@@ -2242,14 +2241,14 @@ void the_game(bool &kill, bool random_input, InputHandler *input,
                                        dx -= dtime * keyspeed;
                                if(input->isKeyDown(irr::KEY_RIGHT))
                                        dx += dtime * keyspeed;*/
-                               
+
                                float d = g_settings->getFloat("mouse_sensitivity");
                                d = rangelim(d, 0.01, 100.0);
                                camera_yaw -= dx*d;
                                camera_pitch += dy*d;
                                if(camera_pitch < -89.5) camera_pitch = -89.5;
                                if(camera_pitch > 89.5) camera_pitch = 89.5;
-                               
+
                                turn_amount = v2f(dx, dy).getLength() * d;
                        }
                        input->setMousePos((driver->getScreenSize().Width/2),
@@ -2442,7 +2441,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input,
                                                delete event.hudadd.size;
                                                continue;
                                        }
-                                       
+
                                        e = new HudElement;
                                        e->type   = (HudElementType)event.hudadd.type;
                                        e->pos    = *event.hudadd.pos;
@@ -2456,7 +2455,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input,
                                        e->offset = *event.hudadd.offset;
                                        e->world_pos = *event.hudadd.world_pos;
                                        e->size = *event.hudadd.size;
-                                       
+
                                        u32 new_id = player->addHud(e);
                                        //if this isn't true our huds aren't consistent
                                        assert(new_id == id);
@@ -2487,7 +2486,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input,
                                                delete event.hudchange.v2s32data;
                                                continue;
                                        }
-                                               
+
                                        switch (event.hudchange.stat) {
                                                case HUD_STAT_POS:
                                                        e->pos = *event.hudchange.v2fdata;
@@ -2523,7 +2522,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input,
                                                        e->size = *event.hudchange.v2s32data;
                                                        break;
                                        }
-                                       
+
                                        delete event.hudchange.v3fdata;
                                        delete event.hudchange.v2fdata;
                                        delete event.hudchange.sdata;
@@ -2569,7 +2568,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input,
                                }
                        }
                }
-               
+
                //TimeTaker //timer2("//timer2");
 
                /*
@@ -2581,16 +2580,14 @@ void the_game(bool &kill, bool random_input, InputHandler *input,
                ItemStack playeritem;
                {
                        InventoryList *mlist = local_inventory.getList("main");
-                       if(mlist != NULL)
-                       {
+                       if((mlist != NULL) && (client.getPlayerItem() < mlist->getSize()))
                                playeritem = mlist->getItem(client.getPlayerItem());
-                       }
                }
                const ItemDefinition &playeritem_def =
                                playeritem.getDefinition(itemdef);
                ToolCapabilities playeritem_toolcap =
                                playeritem.getToolCapabilities(itemdef);
-               
+
                /*
                        Update camera
                */
@@ -2625,7 +2622,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input,
                v3s16 camera_offset = camera.getOffset();
 
                bool camera_offset_changed = (camera_offset != old_camera_offset);
-               
+
                if(!disable_camera_update){
                        client.getEnv().getClientMap().updateCamera(camera_position,
                                camera_direction, camera_fov, camera_offset);
@@ -2636,7 +2633,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input,
                                        clouds->updateCameraOffset(camera_offset);
                        }
                }
-               
+
                // Update sound listener
                sound->updateListener(camera.getCameraNode()->getPosition()+intToFloat(camera_offset, BS),
                                v3f(0,0,0), // velocity
@@ -2649,7 +2646,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input,
                */
                {
                        soundmaker.step(dtime);
-                       
+
                        ClientMap &map = client.getEnv().getClientMap();
                        MapNode n = map.getNodeNoEx(player->getStandingNodePos());
                        soundmaker.m_player_step_sound = nodedef->get(n).sound_footstep;
@@ -2658,9 +2655,9 @@ void the_game(bool &kill, bool random_input, InputHandler *input,
                /*
                        Calculate what block is the crosshair pointing to
                */
-               
+
                //u32 t1 = device->getTimer()->getRealTime();
-               
+
                f32 d = playeritem_def.range; // max. distance
                f32 d_hand = itemdef->get("").range;
                if(d < 0 && d_hand >= 0)
@@ -2754,7 +2751,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input,
                        /*
                                Check information text of node
                        */
-                       
+
                        ClientMap &map = client.getEnv().getClientMap();
                        NodeMetadata *meta = map.getNodeMetadata(nodepos);
                        if(meta){
@@ -2766,11 +2763,11 @@ void the_game(bool &kill, bool random_input, InputHandler *input,
                                        infotext += narrow_to_wide(nodedef->get(n).name);
                                }
                        }
-                       
+
                        /*
                                Handle digging
                        */
-                       
+
                        if(nodig_delay_timer <= 0.0 && input->getLeftState()
                                        && client.checkPrivilege("interact"))
                        {
@@ -2782,7 +2779,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input,
                                        ldown_for_dig = true;
                                }
                                MapNode n = client.getEnv().getClientMap().getNode(nodepos);
-                               
+
                                // NOTE: Similar piece of code exists on the server side for
                                // cheat detection.
                                // Get digging parameters
@@ -2883,7 +2880,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input,
                                        float mindelay = 0.15;
                                        if(nodig_delay_timer < mindelay)
                                                nodig_delay_timer = mindelay;
-                                       
+
                                        // Send event to trigger sound
                                        MtEvent *e = new NodeDugEvent(nodepos, wasnode);
                                        gamedef->event()->put(e);
@@ -2906,34 +2903,15 @@ void the_game(bool &kill, bool random_input, InputHandler *input,
                        {
                                repeat_rightclick_timer = 0;
                                infostream<<"Ground right-clicked"<<std::endl;
-                               
-                               // Sign special case, at least until formspec is properly implemented.
-                               // Deprecated?
-                               if(meta && meta->getString("formspec") == "hack:sign_text_input"
-                                               && !random_input
-                                               && !input->isKeyDown(getKeySetting("keymap_sneak")))
-                               {
-                                       infostream<<"Launching metadata text input"<<std::endl;
-                                       
-                                       // Get a new text for it
 
-                                       TextDest *dest = new TextDestNodeMetadata(nodepos, &client);
-
-                                       std::wstring wtext = narrow_to_wide(meta->getString("text"));
-
-                                       (new GUITextInputMenu(guienv, guiroot, -1,
-                                                       &g_menumgr, dest,
-                                                       wtext))->drop();
-                               }
-                               // If metadata provides an inventory view, activate it
-                               else if(meta && meta->getString("formspec") != "" && !random_input
+                               if(meta && meta->getString("formspec") != "" && !random_input
                                                && !input->isKeyDown(getKeySetting("keymap_sneak")))
                                {
                                        infostream<<"Launching custom inventory view"<<std::endl;
 
                                        InventoryLocation inventoryloc;
                                        inventoryloc.setNodeMeta(nodepos);
-                                       
+
                                        NodeMetadataFormSource* fs_src = new NodeMetadataFormSource(
                                                        &client.getEnv().getClientMap(), nodepos);
                                        TextDest* txt_dst = new TextDestNodeMetadata(nodepos, &client);
@@ -3000,7 +2978,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input,
                                        // Report direct punch
                                        v3f objpos = selected_object->getPosition();
                                        v3f dir = (objpos - player_position).normalize();
-                                       
+
                                        bool disable_send = selected_object->directReportPunch(
                                                        dir, &playeritem, time_from_last_punch);
                                        time_from_last_punch = 0;
@@ -3021,7 +2999,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input,
                }
 
                pointed_old = pointed;
-               
+
                if(left_punch || input->getLeftClicked())
                {
                        camera.setDigging(0); // left click animation
@@ -3032,7 +3010,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input,
 
                input->resetLeftReleased();
                input->resetRightReleased();
-               
+
                /*
                        Calculate stuff for drawing
                */
@@ -3040,7 +3018,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input,
                /*
                        Fog range
                */
-       
+
                if(draw_control.range_all)
                        fog_range = 100000*BS;
                else {
@@ -3067,7 +3045,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input,
                                        daynight_ratio, (int)(old_brightness*255.5), &sunlight_seen)
                                        / 255.0;
                }
-               
+
                time_of_day = client.getEnv().getTimeOfDayF();
                float maxsm = 0.05;
                if(fabs(time_of_day - time_of_day_smooth) > maxsm &&
@@ -3081,11 +3059,11 @@ void the_game(bool &kill, bool random_input, InputHandler *input,
                else
                        time_of_day_smooth = time_of_day_smooth * (1.0-todsm)
                                        + time_of_day * todsm;
-                       
+
                sky->update(time_of_day_smooth, time_brightness, direct_brightness,
                                sunlight_seen,camera.getCameraMode(), player->getYaw(),
                                player->getPitch());
-               
+
                video::SColor bgcolor = sky->getBgColor();
                video::SColor skycolor = sky->getSkyColor();
 
@@ -3102,18 +3080,18 @@ void the_game(bool &kill, bool random_input, InputHandler *input,
                                clouds->setVisible(false);
                        }
                }
-               
+
                /*
                        Update particles
                */
 
                allparticles_step(dtime);
                allparticlespawners_step(dtime, client.getEnv());
-               
+
                /*
                        Fog
                */
-               
+
                if(g_settings->getBool("enable_fog") && !force_fog_off)
                {
                        driver->setFog(
@@ -3144,7 +3122,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input,
                */
 
                //TimeTaker guiupdatetimer("Gui updating");
-               
+
                if(show_debug)
                {
                        static float drawtime_avg = 0;
@@ -3223,7 +3201,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input,
                {
                        guitext2->setVisible(false);
                }
-               
+
                {
                        guitext_info->setText(infotext.c_str());
                        guitext_info->setVisible(show_hud && g_menumgr.menuCount() == 0);
@@ -3249,7 +3227,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input,
                                core::rect<s32> rect(
                                                10,
                                                status_y - guitext_status->getTextHeight(),
-                                               screensize.X - 10,
+                                               10 + guitext_status->getTextWidth(),
                                                status_y
                                );
                                guitext_status->setRelativePosition(rect);
@@ -3269,7 +3247,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input,
                                guitext_status->enableOverrideColor(true);
                        }
                }
-               
+
                /*
                        Get chat messages from client
                */
@@ -3314,7 +3292,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input,
                /*
                        Inventory
                */
-               
+
                if(client.getPlayerItem() != new_playeritem)
                {
                        client.selectPlayerItem(new_playeritem);
@@ -3323,7 +3301,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input,
                {
                        //infostream<<"Updating local inventory"<<std::endl;
                        client.getLocalInventory(local_inventory);
-                       
+
                        update_wielded_item_trigger = true;
                }
                if(update_wielded_item_trigger)
@@ -3332,7 +3310,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input,
                        // Update wielded tool
                        InventoryList *mlist = local_inventory.getList("main");
                        ItemStack item;
-                       if(mlist != NULL)
+                       if((mlist != NULL) && (client.getPlayerItem() < mlist->getSize()))
                                item = mlist->getItem(client.getPlayerItem());
                        camera.wield(item, client.getPlayerItem());
                }
@@ -3360,17 +3338,10 @@ void the_game(bool &kill, bool random_input, InputHandler *input,
                        beginscenetime = timer.stop(true);
                }
 
-               
+
                draw_scene(driver, smgr, camera, client, player, hud, guienv,
                                hilightboxes, screensize, skycolor, show_hud);
 
-               /*
-                       Post effects
-               */
-               {
-                       client.getEnv().getClientMap().renderPostFx(camera.getCameraMode());
-               }
-
                /*
                        Profiler graph
                */
@@ -3388,7 +3359,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input,
                        driver->draw2DRectangle(color,
                                        core::rect<s32>(0,0,screensize.X,screensize.Y),
                                        NULL);
-                       
+
                        damage_flash -= 100.0*dtime;
                }
 
@@ -3436,7 +3407,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input,
        if (sky)
                sky->drop();
        clear_particles();
-       
+
        /* cleanup menus */
        while (g_menumgr.menuCount() > 0)
        {
@@ -3486,7 +3457,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input,
        }
 
 
-       
+
        if(!sound_is_dummy)
                delete sound;