Fix my name.
[oweals/minetest.git] / src / game.cpp
index 8331179593fc33d56bce265430340018a5c062c2..7954c8d8003ab6c7e12f9a51bfbb0aaf32e0980b 100644 (file)
@@ -40,7 +40,6 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "clouds.h"
 #include "particles.h"
 #include "camera.h"
-#include "farmesh.h"
 #include "mapblock.h"
 #include "settings.h"
 #include "profiler.h"
@@ -208,33 +207,6 @@ public:
        Client *m_client;
 };
 
-class FormspecFormSource: public IFormSource
-{
-public:
-       FormspecFormSource(std::string formspec,FormspecFormSource** game_formspec)
-       {
-               m_formspec = formspec;
-               m_game_formspec = game_formspec;
-       }
-
-       ~FormspecFormSource()
-       {
-               *m_game_formspec = 0;
-       }
-
-       void setForm(std::string formspec) {
-               m_formspec = formspec;
-       }
-
-       std::string getForm()
-       {
-               return m_formspec;
-       }
-
-       std::string m_formspec;
-       FormspecFormSource** m_game_formspec;
-};
-
 /*
        Check if a node is pointable
 */
@@ -831,6 +803,15 @@ public:
                u32 daynight_ratio = m_client->getEnv().getDayNightRatio();
                float daynight_ratio_f = (float)daynight_ratio / 1000.0;
                services->setPixelShaderConstant("dayNightRatio", &daynight_ratio_f, 1);
+               
+               // Normal map texture layer
+               int layer = 1;
+               // before 1.8 there isn't a "integer interface", only float
+#if (IRRLICHT_VERSION_MAJOR == 1 && IRRLICHT_VERSION_MINOR < 8)
+               services->setPixelShaderConstant("normalTexture" , (irr::f32*)&layer, 1);
+#else
+               services->setPixelShaderConstant("normalTexture" , (irr::s32*)&layer, 1);
+#endif
        }
 };
 
@@ -1039,12 +1020,6 @@ void the_game(
        infostream<<"Creating client"<<std::endl;
        
        MapDrawControl draw_control;
-
-       Client client(device, playername.c_str(), password, draw_control,
-                       tsrc, shsrc, itemdef, nodedef, sound, &eventmgr);
-       
-       // Client acts as our GameDef
-       IGameDef *gamedef = &client;
        
        {
                wchar_t* text = wgettext("Resolving address...");
@@ -1054,18 +1029,39 @@ void the_game(
        Address connect_address(0,0,0,0, port);
        try{
                if(address == "")
+               {
                        //connect_address.Resolve("localhost");
-                       connect_address.setAddress(127,0,0,1);
+                       if(g_settings->getBool("enable_ipv6") && g_settings->getBool("ipv6_server"))
+                       {
+                               IPv6AddressBytes addr_bytes;
+                               addr_bytes.bytes[15] = 1;
+                               connect_address.setAddress(&addr_bytes);
+                       }
+                       else
+                       {
+                               connect_address.setAddress(127,0,0,1);
+                       }
+               }
                else
                        connect_address.Resolve(address.c_str());
        }
        catch(ResolveError &e)
        {
-               error_message = L"Couldn't resolve address";
+               error_message = L"Couldn't resolve address: " + narrow_to_wide(e.what());
                errorstream<<wide_to_narrow(error_message)<<std::endl;
                // 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
@@ -1217,26 +1213,28 @@ void the_game(
                        }
                        
                        // Display status
-                       std::ostringstream ss;
                        int progress=0;
                        if (!client.itemdefReceived())
                        {
-                               ss << "Item definitions...";
+                               wchar_t* text = wgettext("Item definitions...");
                                progress = 0;
+                               draw_load_screen(text, device, font, dtime, progress);
+                               delete[] text;
                        }
                        else if (!client.nodedefReceived())
                        {
-                               ss << "Node definitions...";
+                               wchar_t* text = wgettext("Node definitions...");
                                progress = 25;
+                               draw_load_screen(text, device, font, dtime, progress);
+                               delete[] text;
                        }
                        else
                        {
-                               ss << "Media...";
+                               wchar_t* text = wgettext("Media...");
                                progress = 50+client.mediaReceiveProgress()*50+0.5;
+                               draw_load_screen(text, device, font, dtime, progress);
+                               delete[] text;
                        }
-                       wchar_t* text = wgettext(ss.str().c_str());
-                       draw_load_screen(text, device, font, dtime, progress);
-                       delete[] text;
                        
                        // On some computers framerate doesn't seem to be
                        // automatically limited
@@ -1308,16 +1306,6 @@ void the_game(
        Sky *sky = NULL;
        sky = new Sky(smgr->getRootSceneNode(), smgr, -1);
        
-       /*
-               FarMesh
-       */
-
-       FarMesh *farmesh = NULL;
-       if(g_settings->getBool("enable_farmesh"))
-       {
-               farmesh = new FarMesh(smgr->getRootSceneNode(), smgr, -1, client.getMapSeed(), &client);
-       }
-
        /*
                A copy of the local inventory
        */
@@ -1328,7 +1316,7 @@ void the_game(
        */
        int crack_animation_length = 5;
        {
-               video::ITexture *t = tsrc->getTextureRaw("crack_anylength.png");
+               video::ITexture *t = tsrc->getTexture("crack_anylength.png");
                v2u32 size = t->getOriginalSize();
                crack_animation_length = size.Y / size.X;
        }
@@ -1407,7 +1395,6 @@ void the_game(
        bool ldown_for_dig = false;
 
        float damage_flash = 0;
-       s16 farmesh_range = 20*MAP_BLOCKSIZE;
 
        float jump_timer = 0;
        bool reset_jump_timer = false;
@@ -2295,7 +2282,7 @@ void the_game(
                                else if(event.type == CE_SPAWN_PARTICLE)
                                {
                                        LocalPlayer* player = client.getEnv().getLocalPlayer();
-                                       AtlasPointer ap =
+                                       video::ITexture *texture =
                                                gamedef->tsrc()->getTexture(*(event.spawn_particle.texture));
 
                                        new Particle(gamedef, smgr, player, client.getEnv(),
@@ -2304,12 +2291,15 @@ void the_game(
                                                *event.spawn_particle.acc,
                                                 event.spawn_particle.expirationtime,
                                                 event.spawn_particle.size,
-                                                event.spawn_particle.collisiondetection, ap);
+                                                event.spawn_particle.collisiondetection,
+                                                texture,
+                                                v2f(0.0, 0.0),
+                                                v2f(1.0, 1.0));
                                }
                                else if(event.type == CE_ADD_PARTICLESPAWNER)
                                {
                                        LocalPlayer* player = client.getEnv().getLocalPlayer();
-                                       AtlasPointer ap =
+                                       video::ITexture *texture =
                                                gamedef->tsrc()->getTexture(*(event.add_particlespawner.texture));
 
                                        new ParticleSpawner(gamedef, smgr, player,
@@ -2326,7 +2316,7 @@ void the_game(
                                                 event.add_particlespawner.minsize,
                                                 event.add_particlespawner.maxsize,
                                                 event.add_particlespawner.collisiondetection,
-                                                ap,
+                                                texture,
                                                 event.add_particlespawner.id);
                                }
                                else if(event.type == CE_DELETE_PARTICLESPAWNER)
@@ -2454,10 +2444,12 @@ void the_game(
                float full_punch_interval = playeritem_toolcap.full_punch_interval;
                float tool_reload_ratio = time_from_last_punch / full_punch_interval;
                tool_reload_ratio = MYMIN(tool_reload_ratio, 1.0);
-               camera.update(player, busytime, screensize, tool_reload_ratio);
+               camera.update(player, dtime, busytime, screensize,
+                               tool_reload_ratio);
                camera.step(dtime);
 
                v3f player_position = player->getPosition();
+               v3s16 pos_i = floatToInt(player_position, BS);
                v3f camera_position = camera.getPosition();
                v3f camera_direction = camera.getDirection();
                f32 camera_fov = camera.getFovMax();
@@ -2491,7 +2483,12 @@ void the_game(
                
                //u32 t1 = device->getTimer()->getRealTime();
                
-               f32 d = 4; // max. distance
+               f32 d = playeritem_def.range; // max. distance
+               f32 d_hand = itemdef->get("").range;
+               if(d < 0 && d_hand >= 0)
+                       d = d_hand;
+               else if(d < 0)
+                       d = 4.0;
                core::line3d<f32> shootline(camera_position,
                                camera_position + camera_direction * BS * (d+1));
 
@@ -2615,20 +2612,6 @@ void the_game(
                                        if(tp)
                                                params = getDigParams(nodedef->get(n).groups, tp);
                                }
-                               
-                               SimpleSoundSpec sound_dig = nodedef->get(n).sound_dig;
-                               if(sound_dig.exists()){
-                                       if(sound_dig.name == "__group"){
-                                               if(params.main_group != ""){
-                                                       soundmaker.m_player_leftpunch_sound.gain = 0.5;
-                                                       soundmaker.m_player_leftpunch_sound.name =
-                                                                       std::string("default_dig_") +
-                                                                                       params.main_group;
-                                               }
-                                       } else{
-                                               soundmaker.m_player_leftpunch_sound = sound_dig;
-                                       }
-                               }
 
                                float dig_time_complete = 0.0;
 
@@ -2661,6 +2644,20 @@ void the_game(
                                        dig_index = crack_animation_length;
                                }
 
+                               SimpleSoundSpec sound_dig = nodedef->get(n).sound_dig;
+                               if(sound_dig.exists() && params.diggable){
+                                       if(sound_dig.name == "__group"){
+                                               if(params.main_group != ""){
+                                                       soundmaker.m_player_leftpunch_sound.gain = 0.5;
+                                                       soundmaker.m_player_leftpunch_sound.name =
+                                                                       std::string("default_dig_") +
+                                                                                       params.main_group;
+                                               }
+                                       } else{
+                                               soundmaker.m_player_leftpunch_sound = sound_dig;
+                                       }
+                               }
+
                                // Don't show cracks if not diggable
                                if(dig_time_complete >= 100000.0)
                                {
@@ -2860,16 +2857,12 @@ void the_game(
                        Fog range
                */
        
-               if(farmesh)
-               {
-                       fog_range = BS*farmesh_range;
-               }
-               else
-               {
+               if(draw_control.range_all)
+                       fog_range = 100000*BS;
+               else {
                        fog_range = draw_control.wanted_range*BS + 0.0*MAP_BLOCKSIZE*BS;
+                       fog_range = MYMIN(fog_range, (draw_control.farthest_drawn+20)*BS);
                        fog_range *= 0.9;
-                       if(draw_control.range_all)
-                               fog_range = 100000*BS;
                }
 
                /*
@@ -2908,7 +2901,6 @@ void the_game(
                sky->update(time_of_day_smooth, time_brightness, direct_brightness,
                                sunlight_seen);
                
-               float brightness = sky->getBrightness();
                video::SColor bgcolor = sky->getBgColor();
                video::SColor skycolor = sky->getSkyColor();
 
@@ -2926,22 +2918,6 @@ void the_game(
                        }
                }
                
-               /*
-                       Update farmesh
-               */
-               if(farmesh)
-               {
-                       farmesh_range = draw_control.wanted_range * 10;
-                       if(draw_control.range_all && farmesh_range < 500)
-                               farmesh_range = 500;
-                       if(farmesh_range > 1000)
-                               farmesh_range = 1000;
-
-                       farmesh->step(dtime);
-                       farmesh->update(v2f(player_position.X, player_position.Z),
-                                       brightness, farmesh_range);
-               }
-
                /*
                        Update particles
                */
@@ -3032,7 +3008,9 @@ void the_game(
                                <<", "<<(player_position.Y/BS)
                                <<", "<<(player_position.Z/BS)
                                <<") (yaw="<<(wrapDegrees_0_360(camera_yaw))
-                               <<") (seed = "<<((unsigned long long)client.getMapSeed())
+                               <<") (t="<<client.getEnv().getClientMap().getHeat(pos_i)
+                               <<"C, h="<<client.getEnv().getClientMap().getHumidity(pos_i)
+                               <<"%) (seed = "<<((unsigned long long)client.getMapSeed())
                                <<")";
                        guitext2->setText(narrow_to_wide(os.str()).c_str());
                        guitext2->setVisible(true);
@@ -3470,6 +3448,7 @@ void the_game(
                infostream << "\t\t" << i << ":" << texture->getName().getPath().c_str()
                                << std::endl;
        }
+       clearTextureNameCache();
        infostream << "\tRemaining materials: "
                << driver-> getMaterialRendererCount ()
                << " (note: irrlicht doesn't support removing renderers)"<< std::endl;