]> git.lizzy.rs Git - dragonfireclient.git/blobdiff - src/game.cpp
Make object hit delay smaller for fun; actually it should be roughly zero and hit...
[dragonfireclient.git] / src / game.cpp
index bb1998066b5e9bdd0c246767a2e28a996c524ed2..a7e1ccd8200cdbb71dcc113bf4bd070dc4f140f0 100644 (file)
@@ -47,9 +47,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "nodedef.h"
 #include "nodemetadata.h"
 #include "main.h" // For g_settings
-#include "content_mapnode.h" // For content_mapnode_init
 #include "tooldef.h"
-#include "content_mapnode.h" // Default nodes
 #include "tile.h" // For TextureSource
 
 /*
@@ -632,21 +630,18 @@ void the_game(
        /*
                Draw "Loading" screen
        */
-       /*gui::IGUIStaticText *gui_loadingtext = */
-       //draw_load_screen(L"Loading and connecting...", driver, font);
 
        draw_load_screen(L"Loading...", driver, font);
        
-       // Create tool definition manager
-       IWritableToolDefManager *tooldef = createToolDefManager();
        // Create texture source
        IWritableTextureSource *tsrc = createTextureSource(device);
+       
+       // These will be filled by data received from the server
+       // Create tool definition manager
+       IWritableToolDefManager *tooldef = createToolDefManager();
        // Create node definition manager
        IWritableNodeDefManager *nodedef = createNodeDefManager();
 
-       // Fill node feature table with default definitions
-       //content_mapnode_init(nodedef);
-
        /*
                Create server.
                SharedPtr will delete it when it goes out of scope.
@@ -702,54 +697,51 @@ void the_game(
        connect_address.print(&infostream);
        infostream<<std::endl;
        client.connect(connect_address);
-
-       bool could_connect = false;
        
+       /*
+               Wait for server to accept connection
+       */
+       bool could_connect = false;
        try{
+               float frametime = 0.033;
+               const float timeout = 10.0;
                float time_counter = 0.0;
                for(;;)
                {
-                       if(client.connectedAndInitialized())
-                       {
+                       // Update client and server
+                       client.step(frametime);
+                       if(server != NULL)
+                               server->step(frametime);
+                       
+                       // End condition
+                       if(client.connectedAndInitialized()){
                                could_connect = true;
                                break;
                        }
+                       // Break conditions
                        if(client.accessDenied())
-                       {
                                break;
-                       }
-                       // Wait for 10 seconds
-                       if(time_counter >= 10.0)
-                       {
+                       if(time_counter >= timeout)
                                break;
-                       }
                        
+                       // Display status
                        std::wostringstream ss;
                        ss<<L"Connecting to server... (timeout in ";
-                       ss<<(int)(10.0 - time_counter + 1.0);
+                       ss<<(int)(timeout - time_counter + 1.0);
                        ss<<L" seconds)";
                        draw_load_screen(ss.str(), driver, font);
-
-                       /*// Update screen
-                       driver->beginScene(true, true, video::SColor(255,0,0,0));
-                       guienv->drawAll();
-                       driver->endScene();*/
-
-                       // Update client and server
-
-                       client.step(0.1);
-
-                       if(server != NULL)
-                               server->step(0.1);
                        
                        // Delay a bit
-                       sleep_ms(100);
-                       time_counter += 0.1;
+                       sleep_ms(1000*frametime);
+                       time_counter += frametime;
                }
        }
        catch(con::PeerNotFoundException &e)
        {}
-
+       
+       /*
+               Handle failure to connect
+       */
        if(could_connect == false)
        {
                if(client.accessDenied())
@@ -766,6 +758,56 @@ void the_game(
                //gui_loadingtext->remove();
                return;
        }
+       
+       /*
+               Wait until content has been received
+       */
+       bool got_content = false;
+       {
+               float frametime = 0.033;
+               const float timeout = 5.0;
+               float time_counter = 0.0;
+               for(;;)
+               {
+                       // Update client and server
+                       client.step(frametime);
+                       if(server != NULL)
+                               server->step(frametime);
+                       
+                       // End condition
+                       if(client.texturesReceived() &&
+                                       client.tooldefReceived() &&
+                                       client.nodedefReceived()){
+                               got_content = true;
+                               break;
+                       }
+                       // Break conditions
+                       if(!client.connectedAndInitialized())
+                               break;
+                       if(time_counter >= timeout)
+                               break;
+                       
+                       // Display status
+                       std::wostringstream ss;
+                       ss<<L"Waiting content... (continuing anyway in ";
+                       ss<<(int)(timeout - time_counter + 1.0);
+                       ss<<L" seconds)\n";
+
+                       ss<<(client.tooldefReceived()?L"[X]":L"[  ]");
+                       ss<<L" Tool definitions\n";
+                       ss<<(client.nodedefReceived()?L"[X]":L"[  ]");
+                       ss<<L" Node definitions\n";
+                       //ss<<(client.texturesReceived()?L"[X]":L"[  ]");
+                       ss<<L"["<<(int)(client.textureReceiveProgress()*100+0.5)<<L"%] ";
+                       ss<<L" Textures\n";
+
+                       draw_load_screen(ss.str(), driver, font);
+                       
+                       // Delay a bit
+                       sleep_ms(1000*frametime);
+                       time_counter += frametime;
+               }
+       }
 
        /*
                Create skybox
@@ -895,11 +937,12 @@ void the_game(
        float dig_time = 0.0;
        u16 dig_index = 0;
        v3s16 nodepos_old(-32768,-32768,-32768);
+       bool ldown_for_dig = false;
 
        float damage_flash_timer = 0;
        s16 farmesh_range = 20*MAP_BLOCKSIZE;
 
-       const float object_hit_delay = 0.5;
+       const float object_hit_delay = 0.2;
        float object_hit_delay_timer = 0.0;
        
        bool invert_mouse = g_settings->getBool("invert_mouse");
@@ -1584,7 +1627,7 @@ void the_game(
                bool left_punch = false;
                bool left_punch_muted = false;
 
-               if(selected_active_object != NULL)
+               if(selected_active_object != NULL && !ldown_for_dig)
                {
                        /* Clear possible cracking animation */
                        if(nodepos_old != v3s16(-32768,-32768,-32768))
@@ -1668,6 +1711,7 @@ void the_game(
                                client.clearTempMod(nodepos_old);
                                dig_time = 0.0;
                                nodepos_old = v3s16(-32768,-32768,-32768);
+                               ldown_for_dig = false;
                        }
                } else {
                        /*
@@ -1696,6 +1740,7 @@ void the_game(
                        {
                                client.clearTempMod(nodepos);
                                dig_time = 0.0;
+                               ldown_for_dig = false;
                        }
                        
                        if(nodig_delay_counter > 0.0)
@@ -1726,6 +1771,7 @@ void the_game(
                                if(input->getLeftClicked())
                                {
                                        client.setTempMod(nodepos, NodeMod(NODEMOD_CRACK, 0));
+                                       ldown_for_dig = true;
                                }
                                if(input->getLeftState())
                                {
@@ -1896,6 +1942,7 @@ void the_game(
                        infostream<<"Left button released (stopped digging)"
                                        <<std::endl;
                        client.groundAction(2, v3s16(0,0,0), v3s16(0,0,0), 0);
+                       ldown_for_dig = false;
                }
                if(input->getRightReleased())
                {