]> git.lizzy.rs Git - dragonfireclient.git/blobdiff - src/game.cpp
Check the data path before usage
[dragonfireclient.git] / src / game.cpp
index 99e08b7bfb5999d6dadfd9642f78efe19b943b98..0f858e879694cc3404a896e207ec0223d91e8afe 100644 (file)
@@ -22,13 +22,22 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "client.h"
 #include "server.h"
 #include "guiPauseMenu.h"
+#include "guiPasswordChange.h"
 #include "guiInventoryMenu.h"
 #include "guiTextInputMenu.h"
-#include "guiFurnaceMenu.h"
 #include "materials.h"
 #include "config.h"
 #include "clouds.h"
 #include "keycode.h"
+#include "farmesh.h"
+#include "mapblock.h"
+
+/*
+       TODO: Move content-aware stuff to separate file by adding properties
+             and virtual interfaces
+*/
+#include "content_mapnode.h"
+#include "content_nodemeta.h"
 
 /*
        Setting this to 1 enables a special camera mode that forces
@@ -357,7 +366,7 @@ void draw_hotbar(video::IVideoDriver *driver, gui::IGUIFont *font,
                                core::rect<s32>(core::position2d<s32>(0,0),
                                core::dimension2di(heart_texture->getOriginalSize())),
                                NULL, colors, true);
-                       p += v2s32(20,0);
+                       p += v2s32(16,0);
                }
                if(halfheartcount % 2 == 1)
                {
@@ -370,7 +379,7 @@ void draw_hotbar(video::IVideoDriver *driver, gui::IGUIFont *font,
                        driver->draw2DImage(heart_texture, rect,
                                core::rect<s32>(core::position2d<s32>(0,0), srcd),
                                NULL, colors, true);
-                       p += v2s32(20,0);
+                       p += v2s32(16,0);
                }
        }
 }
@@ -529,6 +538,43 @@ void getPointedNode(Client *client, v3f player_position,
                                }
                        }
                }
+               else if(n.d == CONTENT_RAIL)
+               {
+                       v3s16 dir = unpackDir(n.dir);
+                       v3f dir_f = v3f(dir.X, dir.Y, dir.Z);
+                       dir_f *= BS/2 - BS/6 - BS/20;
+                       v3f cpf = npf + dir_f;
+                       f32 distance = (cpf - camera_position).getLength();
+
+                       float d = (float)BS/16;
+                       v3f vertices[4] =
+                       {
+                               v3f(BS/2, -BS/2+d, -BS/2),
+                               v3f(-BS/2, -BS/2, BS/2),
+                       };
+
+                       for(s32 i=0; i<2; i++)
+                       {
+                               vertices[i] += npf;
+                       }
+
+                       core::aabbox3d<f32> box;
+
+                       box = core::aabbox3d<f32>(vertices[0]);
+                       box.addInternalPoint(vertices[1]);
+
+                       if(distance < mindistance)
+                       {
+                               if(box.intersectsWithLine(shootline))
+                               {
+                                       nodefound = true;
+                                       nodepos = np;
+                                       neighbourpos = np;
+                                       mindistance = distance;
+                                       nodehilightbox = box;
+                               }
+                       }
+               }
                /*
                        Regular blocks
                */
@@ -594,6 +640,10 @@ void update_skybox(video::IVideoDriver* driver,
                skybox->remove();
        }
        
+       /*// Disable skybox if FarMesh is enabled
+       if(g_settings.getBool("enable_farmesh"))
+               return;*/
+       
        if(brightness >= 0.5)
        {
                skybox = smgr->addSkyBoxSceneNode(
@@ -626,6 +676,34 @@ void update_skybox(video::IVideoDriver* driver,
        }
 }
 
+/*
+       Draws a screen with a single text on it.
+       Text will be removed when the screen is drawn the next time.
+*/
+/*gui::IGUIStaticText **/
+void draw_load_screen(const std::wstring &text,
+               video::IVideoDriver* driver, gui::IGUIFont* font)
+{
+       v2u32 screensize = driver->getScreenSize();
+       const wchar_t *loadingtext = text.c_str();
+       core::vector2d<u32> textsize_u = font->getDimension(loadingtext);
+       core::vector2d<s32> textsize(textsize_u.X,textsize_u.Y);
+       core::vector2d<s32> center(screensize.X/2, screensize.Y/2);
+       core::rect<s32> textrect(center - textsize/2, center + textsize/2);
+
+       gui::IGUIStaticText *guitext = guienv->addStaticText(
+                       loadingtext, textrect, false, false);
+       guitext->setTextAlignment(gui::EGUIA_CENTER, gui::EGUIA_UPPERLEFT);
+
+       driver->beginScene(true, true, video::SColor(255,0,0,0));
+       guienv->drawAll();
+       driver->endScene();
+       
+       guitext->remove();
+       
+       //return guitext;
+}
+
 void the_game(
        bool &kill,
        bool random_input,
@@ -642,13 +720,18 @@ void the_game(
 {
        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;
 
        v2u32 screensize(0,0);
        v2u32 last_screensize(0,0);
        screensize = driver->getScreenSize();
 
        const s32 hotbar_itemcount = 8;
-       const s32 hotbar_imagesize = 36;
+       //const s32 hotbar_imagesize = 36;
+       //const s32 hotbar_imagesize = 64;
+       s32 hotbar_imagesize = 48;
        
        // The color of the sky
 
@@ -659,20 +742,10 @@ void the_game(
        /*
                Draw "Loading" screen
        */
-       const wchar_t *loadingtext = L"Loading and connecting...";
-       u32 text_height = font->getDimension(loadingtext).Height;
-       core::vector2d<s32> center(screensize.X/2, screensize.Y/2);
-       core::vector2d<s32> textsize(300, text_height);
-       core::rect<s32> textrect(center - textsize/2, center + textsize/2);
-
-       gui::IGUIStaticText *gui_loadingtext = guienv->addStaticText(
-                       loadingtext, textrect, false, false);
-       gui_loadingtext->setTextAlignment(gui::EGUIA_CENTER, gui::EGUIA_UPPERLEFT);
-
-       driver->beginScene(true, true, video::SColor(255,0,0,0));
-       guienv->drawAll();
-       driver->endScene();
+       /*gui::IGUIStaticText *gui_loadingtext = */
+       //draw_load_screen(L"Loading and connecting...", driver, font);
 
+       draw_load_screen(L"Loading...", driver, font);
        
        /*
                Create server.
@@ -680,6 +753,7 @@ void the_game(
        */
        SharedPtr<Server> server;
        if(address == ""){
+               draw_load_screen(L"Creating server...", driver, font);
                std::cout<<DTIME<<"Creating server"<<std::endl;
                server = new Server(map_dir);
                server->start(port);
@@ -689,9 +763,11 @@ void the_game(
                Create client
        */
 
+       draw_load_screen(L"Creating client...", driver, font);
        std::cout<<DTIME<<"Creating client"<<std::endl;
        Client client(device, playername.c_str(), password, draw_control);
                        
+       draw_load_screen(L"Resolving address...", driver, font);
        Address connect_address(0,0,0,0, port);
        try{
                if(address == "")
@@ -705,7 +781,7 @@ void the_game(
                std::cout<<DTIME<<"Couldn't resolve address"<<std::endl;
                //return 0;
                error_message = L"Couldn't resolve address";
-               gui_loadingtext->remove();
+               //gui_loadingtext->remove();
                return;
        }
 
@@ -738,11 +814,17 @@ void the_game(
                        {
                                break;
                        }
+                       
+                       std::wostringstream ss;
+                       ss<<L"Connecting to server... (timeout in ";
+                       ss<<(int)(10.0 - time_counter + 1.0);
+                       ss<<L" seconds)";
+                       draw_load_screen(ss.str(), driver, font);
 
-                       // Update screen
+                       /*// Update screen
                        driver->beginScene(true, true, video::SColor(255,0,0,0));
                        guienv->drawAll();
-                       driver->endScene();
+                       driver->endScene();*/
 
                        // Update client and server
 
@@ -763,15 +845,16 @@ void the_game(
        {
                if(client.accessDenied())
                {
-                       error_message = L"Access denied. Check your password and try again.";
-                       std::cout<<DTIME<<"Access denied."<<std::endl;
+                       error_message = L"Access denied. Reason: "
+                                       +client.accessDeniedReason();
+                       std::cout<<DTIME<<wide_to_narrow(error_message)<<std::endl;
                }
                else
                {
                        error_message = L"Connection timed out.";
                        std::cout<<DTIME<<"Timed out."<<std::endl;
                }
-               gui_loadingtext->remove();
+               //gui_loadingtext->remove();
                return;
        }
 
@@ -813,14 +896,27 @@ void the_game(
        
        float cloud_height = BS*100;
        Clouds *clouds = NULL;
-       clouds = new Clouds(smgr->getRootSceneNode(), smgr, -1,
-                       cloud_height, time(0));
+       if(g_settings.getBool("enable_clouds"))
+       {
+               clouds = new Clouds(smgr->getRootSceneNode(), smgr, -1,
+                               cloud_height, time(0));
+       }
+       
+       /*
+               FarMesh
+       */
+
+       FarMesh *farmesh = NULL;
+       if(g_settings.getBool("enable_farmesh"))
+       {
+               farmesh = new FarMesh(smgr->getRootSceneNode(), smgr, -1, client.getMapSeed(), &client);
+       }
 
        /*
                Move into game
        */
        
-       gui_loadingtext->remove();
+       //gui_loadingtext->remove();
 
        /*
                Add some gui stuff
@@ -848,8 +944,8 @@ void the_game(
        gui::IGUIStaticText *guitext_chat = guienv->addStaticText(
                        L"",
                        core::rect<s32>(0,0,0,0),
-                       false, false); // Disable word wrap as of now
-                       //false, true);
+                       //false, false); // Disable word wrap as of now
+                       false, true);
        //guitext_chat->setBackgroundColor(video::SColor(96,0,0,0));
        core::list<ChatLine> chat_lines;
        
@@ -892,6 +988,9 @@ void the_game(
        core::list<float> frametime_log;
 
        float damage_flash_timer = 0;
+       s16 farmesh_range = 20*MAP_BLOCKSIZE;
+       
+       bool invert_mouse = g_settings.getBool("invert_mouse");
 
        /*
                Main loop
@@ -899,6 +998,10 @@ void the_game(
 
        bool first_loop_after_window_activation = true;
 
+       // TODO: Convert the static interval timers to these
+       // Interval limiter for profiler
+       IntervalLimiter m_profiler_interval;
+
        // Time is in milliseconds
        // NOTE: getRealTime() causes strange problems in wine (imprecision?)
        // NOTE: So we have to use getTime() and call run()s between them
@@ -906,12 +1009,21 @@ void the_game(
 
        while(device->run() && kill == false)
        {
+               //std::cerr<<"frame"<<std::endl;
+
                if(g_gamecallback->disconnect_requested)
                {
                        g_gamecallback->disconnect_requested = false;
                        break;
                }
 
+               if(g_gamecallback->changepassword_requested)
+               {
+                       (new GUIPasswordChange(guienv, guiroot, -1,
+                               &g_menumgr, &client))->drop();
+                       g_gamecallback->changepassword_requested = false;
+               }
+
                /*
                        Process TextureSource's queue
                */
@@ -924,6 +1036,14 @@ void the_game(
                screensize = driver->getScreenSize();
                v2s32 displaycenter(screensize.X/2,screensize.Y/2);
                //bool screensize_changed = screensize != last_screensize;
+
+               // Resize hotbar
+               if(screensize.Y <= 600)
+                       hotbar_imagesize = 32;
+               else if(screensize.Y <= 1024)
+                       hotbar_imagesize = 48;
+               else
+                       hotbar_imagesize = 64;
                
                // Hilight boxes collected during the loop and displayed
                core::list< core::aabbox3d<f32> > hilightboxes;
@@ -1016,7 +1136,7 @@ void the_game(
                */
 
                static f32 dtime_avg1 = 0.0;
-               dtime_avg1 = dtime_avg1 * 0.98 + dtime * 0.02;
+               dtime_avg1 = dtime_avg1 * 0.96 + dtime * 0.04;
                f32 dtime_jitter1 = dtime - dtime_avg1;
 
                static f32 dtime_jitter1_max_sample = 0.0;
@@ -1078,6 +1198,21 @@ void the_game(
                        }
                }
 
+               /*
+                       Profiler
+               */
+               float profiler_print_interval =
+                               g_settings.getFloat("profiler_print_interval");
+               if(profiler_print_interval != 0)
+               {
+                       if(m_profiler_interval.step(0.030, profiler_print_interval))
+                       {
+                               dstream<<"Profiler:"<<std::endl;
+                               g_profiler.print(dstream);
+                               g_profiler.clear();
+                       }
+               }
+
                /*
                        Direct handling of user input
                */
@@ -1127,6 +1262,9 @@ void the_game(
                        // It will delete itself by itself
                        (new GUIPauseMenu(guienv, guiroot, -1, g_gamecallback,
                                        &g_menumgr))->drop();
+
+                       // Move mouse cursor on top of the disconnect button
+                       input->setMousePos(displaycenter.X, displaycenter.Y+25);
                }
                else if(input->wasKeyDown(getKeySetting("keymap_chat")))
                {
@@ -1136,6 +1274,64 @@ void the_game(
                                        &g_menumgr, dest,
                                        L""))->drop();
                }
+               else if(input->wasKeyDown(getKeySetting("keymap_freemove")))
+               {
+                       if(g_settings.getBool("free_move"))
+                       {
+                               g_settings.set("free_move","false");
+                               chat_lines.push_back(ChatLine(L"free_move disabled"));
+                       }
+                       else
+                       {
+                               g_settings.set("free_move","true");
+                               chat_lines.push_back(ChatLine(L"free_move enabled"));
+                       }
+               }
+               else if(input->wasKeyDown(getKeySetting("keymap_fastmove")))
+               {
+                       if(g_settings.getBool("fast_move"))
+                       {
+                               g_settings.set("fast_move","false");
+                               chat_lines.push_back(ChatLine(L"fast_move disabled"));
+                       }
+                       else
+                       {
+                               g_settings.set("fast_move","true");
+                               chat_lines.push_back(ChatLine(L"fast_move enabled"));
+                       }
+               }
+               else if(input->wasKeyDown(getKeySetting("keymap_frametime_graph")))
+               {
+                       if(g_settings.getBool("frametime_graph"))
+                       {
+                               g_settings.set("frametime_graph","false");
+                               chat_lines.push_back(ChatLine(L"frametime_graph disabled"));
+                       }
+                       else
+                       {
+                               g_settings.set("frametime_graph","true");
+                               chat_lines.push_back(ChatLine(L"frametime_graph enabled"));
+                       }
+               }
+               else if(input->wasKeyDown(getKeySetting("keymap_screenshot")))
+               {
+                       irr::video::IImage* const image = driver->createScreenShot(); 
+                       if (image) { 
+                               irr::c8 filename[256]; 
+                               snprintf(filename, 256, "%s/screenshot_%u.png", 
+                                                g_settings.get("screenshot_path").c_str(),
+                                                device->getTimer()->getRealTime()); 
+                               if (driver->writeImageToFile(image, filename)) {
+                                       std::wstringstream sstr;
+                                       sstr<<"Saved screenshot to '"<<filename<<"'";
+                                       dstream<<"Saved screenshot to '"<<filename<<"'"<<std::endl;
+                                       chat_lines.push_back(ChatLine(sstr.str()));
+                               } else{
+                                       dstream<<"Failed to save screenshot '"<<filename<<"'"<<std::endl;
+                               }
+                               image->drop(); 
+                       }                        
+               }
 
                // Item selection with mouse wheel
                {
@@ -1285,7 +1481,11 @@ void the_game(
                if((device->isWindowActive() && noMenuActive()) || random_input)
                {
                        if(!random_input)
-                               device->getCursorControl()->setVisible(false);
+                       {
+                               // Mac OSX gets upset if this is set every frame
+                               if(device->getCursorControl()->isVisible())
+                                       device->getCursorControl()->setVisible(false);
+                       }
 
                        if(first_loop_after_window_activation){
                                //std::cout<<"window active, first loop"<<std::endl;
@@ -1294,6 +1494,8 @@ void the_game(
                        else{
                                s32 dx = input->getMousePos().X - displaycenter.X;
                                s32 dy = input->getMousePos().Y - displaycenter.Y;
+                               if(invert_mouse)
+                                       dy = -dy;
                                //std::cout<<"window active, pos difference "<<dx<<","<<dy<<std::endl;
                                
                                /*const float keyspeed = 500;
@@ -1314,7 +1516,9 @@ void the_game(
                        input->setMousePos(displaycenter.X, displaycenter.Y);
                }
                else{
-                       device->getCursorControl()->setVisible(true);
+                       // Mac OSX gets upset if this is set every frame
+                       if(device->getCursorControl()->isVisible() == false)
+                               device->getCursorControl()->setVisible(true);
 
                        //std::cout<<"window inactive"<<std::endl;
                        first_loop_after_window_activation = true;
@@ -1626,67 +1830,56 @@ void the_game(
                        {
                                std::cout<<DTIME<<"Ground right-clicked"<<std::endl;
                                
-                               if(meta && meta->typeId() == CONTENT_SIGN_WALL && !random_input)
+                               // If metadata provides an inventory view, activate it
+                               if(meta && meta->getInventoryDrawSpecString() != "" && !random_input)
                                {
-                                       dstream<<"Sign node right-clicked"<<std::endl;
+                                       dstream<<DTIME<<"Launching custom inventory view"<<std::endl;
+                                       /*
+                                               Construct the unique identification string of the node
+                                       */
+                                       std::string current_name;
+                                       current_name += "nodemeta:";
+                                       current_name += itos(nodepos.X);
+                                       current_name += ",";
+                                       current_name += itos(nodepos.Y);
+                                       current_name += ",";
+                                       current_name += itos(nodepos.Z);
                                        
-                                       SignNodeMetadata *signmeta = (SignNodeMetadata*)meta;
-                                       
-                                       // Get a new text for it
+                                       /*
+                                               Create menu
+                                       */
 
-                                       TextDest *dest = new TextDestSignNode(nodepos, &client);
-
-                                       std::wstring wtext =
-                                                       narrow_to_wide(signmeta->getText());
+                                       core::array<GUIInventoryMenu::DrawSpec> draw_spec;
+                                       v2s16 invsize =
+                                               GUIInventoryMenu::makeDrawSpecArrayFromString(
+                                                       draw_spec,
+                                                       meta->getInventoryDrawSpecString(),
+                                                       current_name);
 
-                                       (new GUITextInputMenu(guienv, guiroot, -1,
-                                                       &g_menumgr, dest,
-                                                       wtext))->drop();
-                               }
-                               else if(meta && meta->typeId() == CONTENT_CHEST && !random_input)
-                               {
-                                       dstream<<"Chest node right-clicked"<<std::endl;
-                                       
-                                       //ChestNodeMetadata *chestmeta = (ChestNodeMetadata*)meta;
-
-                                       std::string chest_inv_id;
-                                       chest_inv_id += "nodemeta:";
-                                       chest_inv_id += itos(nodepos.X);
-                                       chest_inv_id += ",";
-                                       chest_inv_id += itos(nodepos.Y);
-                                       chest_inv_id += ",";
-                                       chest_inv_id += itos(nodepos.Z);
-                                       
                                        GUIInventoryMenu *menu =
                                                new GUIInventoryMenu(guienv, guiroot, -1,
-                                                       &g_menumgr, v2s16(8,9),
+                                                       &g_menumgr, invsize,
                                                        client.getInventoryContext(),
                                                        &client);
-
-                                       core::array<GUIInventoryMenu::DrawSpec> draw_spec;
-                                       
-                                       draw_spec.push_back(GUIInventoryMenu::DrawSpec(
-                                                       "list", chest_inv_id, "0",
-                                                       v2s32(0, 0), v2s32(8, 4)));
-                                       draw_spec.push_back(GUIInventoryMenu::DrawSpec(
-                                                       "list", "current_player", "main",
-                                                       v2s32(0, 5), v2s32(8, 4)));
-
                                        menu->setDrawSpec(draw_spec);
-
                                        menu->drop();
-
                                }
-                               else if(meta && meta->typeId() == CONTENT_FURNACE && !random_input)
+                               else if(meta && meta->typeId() == CONTENT_SIGN_WALL && !random_input)
                                {
-                                       dstream<<"Furnace node right-clicked"<<std::endl;
+                                       dstream<<"Sign node right-clicked"<<std::endl;
                                        
-                                       GUIFurnaceMenu *menu =
-                                               new GUIFurnaceMenu(guienv, guiroot, -1,
-                                                       &g_menumgr, nodepos, &client);
+                                       SignNodeMetadata *signmeta = (SignNodeMetadata*)meta;
+                                       
+                                       // Get a new text for it
 
-                                       menu->drop();
+                                       TextDest *dest = new TextDestSignNode(nodepos, &client);
 
+                                       std::wstring wtext =
+                                                       narrow_to_wide(signmeta->getText());
+
+                                       (new GUITextInputMenu(guienv, guiroot, -1,
+                                                       &g_menumgr, dest,
+                                                       wtext))->drop();
                                }
                                else
                                {
@@ -1754,6 +1947,16 @@ void the_game(
                                        0.05+brightness*0.95);
                }
                
+               /*
+                       Update farmesh
+               */
+               if(farmesh)
+               {
+                       farmesh->step(dtime);
+                       farmesh->update(v2f(player_position.X, player_position.Z),
+                                       0.05+brightness*0.95);
+               }
+               
                // Store brightness value
                old_brightness = brightness;
 
@@ -1763,11 +1966,19 @@ void the_game(
                
                if(g_settings.getBool("enable_fog") == true)
                {
-                       f32 range = draw_control.wanted_range*BS + MAP_BLOCKSIZE*BS*1.5;
-                       if(draw_control.range_all)
-                               range = 100000*BS;
-                       if(range < 50*BS)
-                               range = range * 0.5 + 25*BS;
+                       f32 range;
+                       if(farmesh)
+                       {
+                               range = BS*farmesh_range;
+                       }
+                       else
+                       {
+                               range = draw_control.wanted_range*BS + MAP_BLOCKSIZE*BS*1.5;
+                               if(draw_control.range_all)
+                                       range = 100000*BS;
+                               if(range < 50*BS)
+                                       range = range * 0.5 + 25*BS;
+                       }
 
                        driver->setFog(
                                bgcolor,
@@ -1810,7 +2021,7 @@ void the_game(
                        endscenetime_avg = endscenetime_avg * 0.95 + (float)endscenetime*0.05;
                        
                        char temptext[300];
-                       snprintf(temptext, 300, "Minetest-c55 %s ("
+                       snprintf(temptext, 300, "Minetest-delta %s ("
                                        "R: range_all=%i"
                                        ")"
                                        " drawtime=%.0f, beginscenetime=%.0f"
@@ -1915,7 +2126,7 @@ void the_game(
                                        10,
                                        50,
                                        screensize.X - 10,
-                                       50 + text_height*chat_lines.size()
+                                       50 + guitext_chat->getTextHeight()
                        );
 
                        guitext_chat->setRelativePosition(rect);
@@ -1964,7 +2175,7 @@ void the_game(
                        //driver->beginScene(false, true, bgcolor);
                        beginscenetime = timer.stop(true);
                }
-
+               
                //timer3.stop();
                
                //std::cout<<DTIME<<"smgr->drawAll()"<<std::endl;
@@ -2061,6 +2272,13 @@ void the_game(
                                        core::rect<s32>(0,0,screensize.X,screensize.Y),
                                        NULL);
                }
+
+               /*
+                       Environment post fx
+               */
+               {
+                       client.getEnv()->drawPostFx(driver, camera_position);
+               }
                
                /*
                        End scene
@@ -2096,22 +2314,20 @@ void the_game(
        /*
                Drop stuff
        */
-       clouds->drop();
+       if(clouds)
+               clouds->drop();
        
        /*
                Draw a "shutting down" screen, which will be shown while the map
                generator and other stuff quits
        */
        {
-               const wchar_t *shuttingdowntext = L"Shutting down stuff...";
-               gui::IGUIStaticText *gui_shuttingdowntext = guienv->addStaticText(
-                               shuttingdowntext, textrect, false, false);
-               gui_shuttingdowntext->setTextAlignment(gui::EGUIA_CENTER,
-                               gui::EGUIA_UPPERLEFT);
-               driver->beginScene(true, true, video::SColor(255,0,0,0));
+               /*gui::IGUIStaticText *gui_shuttingdowntext = */
+               draw_load_screen(L"Shutting down stuff...", driver, font);
+               /*driver->beginScene(true, true, video::SColor(255,0,0,0));
                guienv->drawAll();
                driver->endScene();
-               gui_shuttingdowntext->remove();
+               gui_shuttingdowntext->remove();*/
        }
 }