X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Fgame.cpp;h=a7e1ccd8200cdbb71dcc113bf4bd070dc4f140f0;hb=cebc8c78a4f5c4a2d7bb246e44f7bd2599de9c9b;hp=13b06db6c23c8fb7e636b41fb2780682bd224fc8;hpb=a7833cca22bbb923efbc01fd0f820318a613eca6;p=dragonfireclient.git diff --git a/src/game.cpp b/src/game.cpp index 13b06db6c..a7e1ccd82 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -17,27 +17,38 @@ with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#include "common_irrlicht.h" #include "game.h" +#include "common_irrlicht.h" +#include +#include +#include +#include +#include #include "client.h" #include "server.h" #include "guiPauseMenu.h" #include "guiPasswordChange.h" #include "guiInventoryMenu.h" #include "guiTextInputMenu.h" +#include "guiDeathScreen.h" #include "materials.h" #include "config.h" #include "clouds.h" #include "camera.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" +#include "settings.h" +#include "profiler.h" +#include "mainmenumanager.h" +#include "gettext.h" +#include "log.h" +#include "filesys.h" +// Needed for determining pointing to nodes +#include "nodedef.h" +#include "nodemetadata.h" +#include "main.h" // For g_settings +#include "tooldef.h" +#include "tile.h" // For TextureSource /* Setting this to 1 enables a special camera mode that forces @@ -81,27 +92,6 @@ u16 g_selected_item = 0; Text input system */ -struct TextDestSign : public TextDest -{ - TextDestSign(v3s16 blockpos, s16 id, Client *client) - { - m_blockpos = blockpos; - m_id = id; - m_client = client; - } - void gotText(std::wstring text) - { - std::string ntext = wide_to_narrow(text); - dstream<<"Changing text of a sign object: " - <sendSignText(m_blockpos, m_id, ntext); - } - - v3s16 m_blockpos; - s16 m_id; - Client *m_client; -}; - struct TextDestChat : public TextDest { TextDestChat(Client *client) @@ -123,9 +113,9 @@ struct TextDestChat : public TextDest Client *m_client; }; -struct TextDestSignNode : public TextDest +struct TextDestNodeMetadata : public TextDest { - TextDestSignNode(v3s16 p, Client *client) + TextDestNodeMetadata(v3s16 p, Client *client) { m_p = p; m_client = client; @@ -133,7 +123,7 @@ struct TextDestSignNode : public TextDest void gotText(std::wstring text) { std::string ntext = wide_to_narrow(text); - dstream<<"Changing text of a sign node: " + infostream<<"Changing text of a sign node: " <sendSignNodeText(m_p, ntext); } @@ -142,17 +132,38 @@ struct TextDestSignNode : public TextDest Client *m_client; }; +/* Respawn menu callback */ + +class MainRespawnInitiator: public IRespawnInitiator +{ +public: + MainRespawnInitiator(bool *active, Client *client): + m_active(active), m_client(client) + { + *m_active = true; + } + void respawn() + { + *m_active = false; + m_client->sendRespawn(); + } +private: + bool *m_active; + Client *m_client; +}; + /* Hotbar draw routine */ void draw_hotbar(video::IVideoDriver *driver, gui::IGUIFont *font, + ITextureSource *tsrc, v2s32 centerlowerpos, s32 imgsize, s32 itemcount, Inventory *inventory, s32 halfheartcount) { InventoryList *mainlist = inventory->getList("main"); if(mainlist == NULL) { - dstream<<"WARNING: draw_hotbar(): mainlist == NULL"<getTextureRaw("heart.png"); + if(heart_texture) { - video::ITexture *heart_texture = - driver->getTexture(getTexturePath("heart.png").c_str()); v2s32 p = pos + v2s32(0, -20); for(s32 i=0; igetNode(v3s16(x,y,z)); - if(content_pointable(n.getContent()) == false) + if(client->getNodeDefManager()->get(n).pointable == false) continue; } catch(InvalidPositionException &e) @@ -331,57 +342,73 @@ void getPointedNode(Client *client, v3f player_position, v3s16(-1,0,0), // left }; - /* - Meta-objects - */ - if(n.getContent() == CONTENT_TORCH) - { - v3s16 dir = unpackDir(n.param2); - 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(); + const ContentFeatures &f = client->getNodeDefManager()->get(n); + + if(f.selection_box.type == NODEBOX_FIXED) + { + core::aabbox3d box = f.selection_box.fixed; + box.MinEdge += npf; + box.MaxEdge += npf; + + v3s16 facedirs[6] = { + v3s16(-1,0,0), + v3s16(1,0,0), + v3s16(0,-1,0), + v3s16(0,1,0), + v3s16(0,0,-1), + v3s16(0,0,1), + }; - core::aabbox3d box; - - // bottom - if(dir == v3s16(0,-1,0)) - { - box = core::aabbox3d( - npf - v3f(BS/6, BS/2, BS/6), - npf + v3f(BS/6, -BS/2+BS/3*2, BS/6) - ); - } - // top - else if(dir == v3s16(0,1,0)) - { - box = core::aabbox3d( - npf - v3f(BS/6, -BS/2+BS/3*2, BS/6), - npf + v3f(BS/6, BS/2, BS/6) - ); - } - // side - else - { - box = core::aabbox3d( - cpf - v3f(BS/6, BS/3, BS/6), - cpf + v3f(BS/6, BS/3, BS/6) - ); - } + core::aabbox3d faceboxes[6] = { + // X- + core::aabbox3d( + box.MinEdge.X, box.MinEdge.Y, box.MinEdge.Z, + box.MinEdge.X+d, box.MaxEdge.Y, box.MaxEdge.Z + ), + // X+ + core::aabbox3d( + box.MaxEdge.X-d, box.MinEdge.Y, box.MinEdge.Z, + box.MaxEdge.X, box.MaxEdge.Y, box.MaxEdge.Z + ), + // Y- + core::aabbox3d( + box.MinEdge.X, box.MinEdge.Y, box.MinEdge.Z, + box.MaxEdge.X, box.MinEdge.Y+d, box.MaxEdge.Z + ), + // Y+ + core::aabbox3d( + box.MinEdge.X, box.MaxEdge.Y-d, box.MinEdge.Z, + box.MaxEdge.X, box.MaxEdge.Y, box.MaxEdge.Z + ), + // Z- + core::aabbox3d( + box.MinEdge.X, box.MinEdge.Y, box.MinEdge.Z, + box.MaxEdge.X, box.MaxEdge.Y, box.MinEdge.Z+d + ), + // Z+ + core::aabbox3d( + box.MinEdge.X, box.MinEdge.Y, box.MaxEdge.Z-d, + box.MaxEdge.X, box.MaxEdge.Y, box.MaxEdge.Z + ), + }; - if(distance < mindistance) + for(u16 i=0; i<6; i++) { - if(box.intersectsWithLine(shootline)) - { - nodefound = true; - nodepos = np; - neighbourpos = np; - mindistance = distance; - nodehilightbox = box; - } + v3f facedir_f(facedirs[i].X, facedirs[i].Y, facedirs[i].Z); + v3f centerpoint = npf + facedir_f * BS/2; + f32 distance = (centerpoint - camera_position).getLength(); + if(distance >= mindistance) + continue; + if(!faceboxes[i].intersectsWithLine(shootline)) + continue; + nodefound = true; + nodepos = np; + neighbourpos = np+facedirs[i]; + mindistance = distance; + nodehilightbox = box; } } - else if(n.getContent() == CONTENT_SIGN_WALL) + else if(f.selection_box.type == NODEBOX_WALLMOUNTED) { v3s16 dir = unpackDir(n.param2); v3f dir_f = v3f(dir.X, dir.Y, dir.Z); @@ -389,122 +416,43 @@ void getPointedNode(Client *client, v3f player_position, v3f cpf = npf + dir_f; f32 distance = (cpf - camera_position).getLength(); - v3f vertices[4] = - { - v3f(BS*0.42,-BS*0.35,-BS*0.4), - v3f(BS*0.49, BS*0.35, BS*0.4), - }; - - for(s32 i=0; i<2; i++) - { - if(dir == v3s16(1,0,0)) - vertices[i].rotateXZBy(0); - if(dir == v3s16(-1,0,0)) - vertices[i].rotateXZBy(180); - if(dir == v3s16(0,0,1)) - vertices[i].rotateXZBy(90); - if(dir == v3s16(0,0,-1)) - vertices[i].rotateXZBy(-90); - if(dir == v3s16(0,-1,0)) - vertices[i].rotateXYBy(-90); - if(dir == v3s16(0,1,0)) - vertices[i].rotateXYBy(90); - - vertices[i] += npf; - } - core::aabbox3d box; - - box = core::aabbox3d(vertices[0]); - box.addInternalPoint(vertices[1]); - - if(distance < mindistance) - { - if(box.intersectsWithLine(shootline)) - { - nodefound = true; - nodepos = np; - neighbourpos = np; - mindistance = distance; - nodehilightbox = box; - } + + // top + if(dir == v3s16(0,1,0)){ + box = f.selection_box.wall_top; } - } - - else if(n.getContent() == CONTENT_LADDER) - { - v3s16 dir = unpackDir(n.param2); - 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(); - - v3f vertices[4] = - { - v3f(BS*0.42,-BS/2,-BS/2), - v3f(BS*0.49, BS/2, BS/2), - }; - - for(s32 i=0; i<2; i++) - { - if(dir == v3s16(1,0,0)) - vertices[i].rotateXZBy(0); - if(dir == v3s16(-1,0,0)) - vertices[i].rotateXZBy(180); - if(dir == v3s16(0,0,1)) - vertices[i].rotateXZBy(90); - if(dir == v3s16(0,0,-1)) - vertices[i].rotateXZBy(-90); - if(dir == v3s16(0,-1,0)) - vertices[i].rotateXYBy(-90); - if(dir == v3s16(0,1,0)) - vertices[i].rotateXYBy(90); - - vertices[i] += npf; + // bottom + else if(dir == v3s16(0,-1,0)){ + box = f.selection_box.wall_bottom; } + // side + else{ + v3f vertices[2] = + { + f.selection_box.wall_side.MinEdge, + f.selection_box.wall_side.MaxEdge + }; - core::aabbox3d box; - - box = core::aabbox3d(vertices[0]); - box.addInternalPoint(vertices[1]); - - if(distance < mindistance) - { - if(box.intersectsWithLine(shootline)) + for(s32 i=0; i<2; i++) { - nodefound = true; - nodepos = np; - neighbourpos = np; - mindistance = distance; - nodehilightbox = box; + if(dir == v3s16(-1,0,0)) + vertices[i].rotateXZBy(0); + if(dir == v3s16(1,0,0)) + vertices[i].rotateXZBy(180); + if(dir == v3s16(0,0,-1)) + vertices[i].rotateXZBy(90); + if(dir == v3s16(0,0,1)) + vertices[i].rotateXZBy(-90); } - } - } - else if(n.getContent() == CONTENT_RAIL) - { - v3s16 dir = unpackDir(n.param0); - 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; + box = core::aabbox3d(vertices[0]); + box.addInternalPoint(vertices[1]); } - core::aabbox3d box; - - box = core::aabbox3d(vertices[0]); - box.addInternalPoint(vertices[1]); - + box.MinEdge += npf; + box.MaxEdge += npf; + if(distance < mindistance) { if(box.intersectsWithLine(shootline)) @@ -517,10 +465,7 @@ void getPointedNode(Client *client, v3f player_position, } } } - /* - Regular blocks - */ - else + else // NODEBOX_REGULAR { for(u16 i=0; i<6; i++) { @@ -573,7 +518,7 @@ void getPointedNode(Client *client, v3f player_position, } // for coords } -void update_skybox(video::IVideoDriver* driver, +void update_skybox(video::IVideoDriver* driver, ITextureSource *tsrc, scene::ISceneManager* smgr, scene::ISceneNode* &skybox, float brightness) { @@ -583,38 +528,38 @@ void update_skybox(video::IVideoDriver* driver, } /*// Disable skybox if FarMesh is enabled - if(g_settings.getBool("enable_farmesh")) + if(g_settings->getBool("enable_farmesh")) return;*/ if(brightness >= 0.5) { skybox = smgr->addSkyBoxSceneNode( - driver->getTexture(getTexturePath("skybox2.png").c_str()), - driver->getTexture(getTexturePath("skybox3.png").c_str()), - driver->getTexture(getTexturePath("skybox1.png").c_str()), - driver->getTexture(getTexturePath("skybox1.png").c_str()), - driver->getTexture(getTexturePath("skybox1.png").c_str()), - driver->getTexture(getTexturePath("skybox1.png").c_str())); + tsrc->getTextureRaw("skybox2.png"), + tsrc->getTextureRaw("skybox3.png"), + tsrc->getTextureRaw("skybox1.png"), + tsrc->getTextureRaw("skybox1.png"), + tsrc->getTextureRaw("skybox1.png"), + tsrc->getTextureRaw("skybox1.png")); } else if(brightness >= 0.2) { skybox = smgr->addSkyBoxSceneNode( - driver->getTexture(getTexturePath("skybox2_dawn.png").c_str()), - driver->getTexture(getTexturePath("skybox3_dawn.png").c_str()), - driver->getTexture(getTexturePath("skybox1_dawn.png").c_str()), - driver->getTexture(getTexturePath("skybox1_dawn.png").c_str()), - driver->getTexture(getTexturePath("skybox1_dawn.png").c_str()), - driver->getTexture(getTexturePath("skybox1_dawn.png").c_str())); + tsrc->getTextureRaw("skybox2_dawn.png"), + tsrc->getTextureRaw("skybox3_dawn.png"), + tsrc->getTextureRaw("skybox1_dawn.png"), + tsrc->getTextureRaw("skybox1_dawn.png"), + tsrc->getTextureRaw("skybox1_dawn.png"), + tsrc->getTextureRaw("skybox1_dawn.png")); } else { skybox = smgr->addSkyBoxSceneNode( - driver->getTexture(getTexturePath("skybox2_night.png").c_str()), - driver->getTexture(getTexturePath("skybox3_night.png").c_str()), - driver->getTexture(getTexturePath("skybox1_night.png").c_str()), - driver->getTexture(getTexturePath("skybox1_night.png").c_str()), - driver->getTexture(getTexturePath("skybox1_night.png").c_str()), - driver->getTexture(getTexturePath("skybox1_night.png").c_str())); + tsrc->getTextureRaw("skybox2_night.png"), + tsrc->getTextureRaw("skybox3_night.png"), + tsrc->getTextureRaw("skybox1_night.png"), + tsrc->getTextureRaw("skybox1_night.png"), + tsrc->getTextureRaw("skybox1_night.png"), + tsrc->getTextureRaw("skybox1_night.png")); } } @@ -685,11 +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 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(); + /* Create server. SharedPtr will delete it when it goes out of scope. @@ -697,19 +649,27 @@ void the_game( SharedPtr server; if(address == ""){ draw_load_screen(L"Creating server...", driver, font); - std::cout<start(port); } + + { // Client scope /* Create client */ draw_load_screen(L"Creating client...", driver, font); - std::cout<remove(); @@ -733,81 +693,128 @@ void the_game( Attempt to connect to the server */ - dstream<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<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()) { error_message = L"Access denied. Reason: " +client.accessDeniedReason(); - std::cout<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<getBool("enable_clouds")) { clouds = new Clouds(smgr->getRootSceneNode(), smgr, -1, cloud_height, time(0)); @@ -836,7 +843,7 @@ void the_game( */ FarMesh *farmesh = NULL; - if(g_settings.getBool("enable_farmesh")) + if(g_settings->getBool("enable_farmesh")) { farmesh = new FarMesh(smgr->getRootSceneNode(), smgr, -1, client.getMapSeed(), &client); } @@ -861,7 +868,6 @@ void the_game( L"", core::rect(5, 5+(text_height+5)*1, 795, (5+text_height)*2), false, false); - // At the middle of the screen // Object infos are shown in this gui::IGUIStaticText *guitext_info = guienv->addStaticText( @@ -878,6 +884,15 @@ void the_game( //guitext_chat->setBackgroundColor(video::SColor(96,0,0,0)); core::list chat_lines; + // Profiler text (size is updated when text is updated) + gui::IGUIStaticText *guitext_profiler = guienv->addStaticText( + L"", + core::rect(6, 4+(text_height+5)*2, 400, + (text_height+5)*2 + text_height*35), + false, false); + guitext_profiler->setBackgroundColor(video::SColor(80,0,0,0)); + guitext_profiler->setVisible(false); + /*GUIQuickInventory *quick_inventory = new GUIQuickInventory (guienv, NULL, v2s32(10, 70), 5, &local_inventory);*/ /*GUIQuickInventory *quick_inventory = new GUIQuickInventory @@ -914,12 +929,29 @@ void the_game( // A test //throw con::PeerNotFoundException("lol"); + float brightness = 1.0; + core::list frametime_log; + float nodig_delay_counter = 0.0; + 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.2; + float object_hit_delay_timer = 0.0; - bool invert_mouse = g_settings.getBool("invert_mouse"); + bool invert_mouse = g_settings->getBool("invert_mouse"); + + bool respawn_menu_active = false; + + bool show_profiler = false; + bool force_fog_off = false; + bool disable_camera_update = false; /* Main loop @@ -944,7 +976,7 @@ void the_game( { error_message = L"Access denied. Reason: " +client.accessDeniedReason(); - std::cout<processQueue(); + tsrc->processQueue(); /* Random calculations @@ -1010,7 +1042,7 @@ void the_game( busytime = busytime_u32 / 1000.0; } - //std::cout<<"busytime_u32="<getFloat("fps_max"); u32 frametime_min = 1000./fps_max; if(busytime_u32 < frametime_min) @@ -1045,6 +1077,13 @@ void the_game( dtime = 0; lasttime = time; + /* Run timers */ + + object_hit_delay_timer -= dtime; + + g_profiler->add("Elapsed time", dtime); + g_profiler->avg("FPS", 1./dtime); + /* Log frametime for visualization */ @@ -1059,8 +1098,8 @@ void the_game( Visualize frametime in terminal */ /*for(u32 i=0; igetFloat("profiler_print_interval"); + bool print_to_log = true; + if(profiler_print_interval == 0){ + print_to_log = false; + profiler_print_interval = 5; + } + if(m_profiler_interval.step(dtime, profiler_print_interval)) { - if(m_profiler_interval.step(0.030, profiler_print_interval)) - { - dstream<<"Profiler:"<print(infostream); } + + std::ostringstream os(std::ios_base::binary); + g_profiler->print(os); + std::wstring text = narrow_to_wide(os.str()); + guitext_profiler->setText(text.c_str()); + + g_profiler->clear(); + + s32 w = font->getDimension(text.c_str()).Width; + if(w < 400) + w = 400; + core::rect rect(6, 4+(text_height+5)*2, 12+w, + 8+(text_height+5)*2 + + font->getDimension(text.c_str()).Height); + guitext_profiler->setRelativePosition(rect); } /* @@ -1162,14 +1219,14 @@ void the_game( */ if(input->wasKeyDown(getKeySetting("keymap_inventory"))) { - dstream< draw_spec; draw_spec.push_back(GUIInventoryMenu::DrawSpec( @@ -1188,7 +1245,7 @@ void the_game( } else if(input->wasKeyDown(EscapeKey)) { - dstream<wasKeyDown(getKeySetting("keymap_freemove"))) { - if(g_settings.getBool("free_move")) + if(g_settings->getBool("free_move")) { - g_settings.set("free_move","false"); + g_settings->set("free_move","false"); chat_lines.push_back(ChatLine(L"free_move disabled")); } else { - g_settings.set("free_move","true"); + 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")) + if(g_settings->getBool("fast_move")) { - g_settings.set("fast_move","false"); + g_settings->set("fast_move","false"); chat_lines.push_back(ChatLine(L"fast_move disabled")); } else { - g_settings.set("fast_move","true"); + 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")) + if(g_settings->getBool("frametime_graph")) { - g_settings.set("frametime_graph","false"); + g_settings->set("frametime_graph","false"); chat_lines.push_back(ChatLine(L"frametime_graph disabled")); } else { - g_settings.set("frametime_graph","true"); + g_settings->set("frametime_graph","true"); chat_lines.push_back(ChatLine(L"frametime_graph enabled")); } } @@ -1257,20 +1314,45 @@ void the_game( 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(), + snprintf(filename, 256, "%s" DIR_DELIM "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 '"<drop(); } } + else if(input->wasKeyDown(getKeySetting("keymap_toggle_profiler"))) + { + show_profiler = !show_profiler; + guitext_profiler->setVisible(show_profiler); + if(show_profiler) + chat_lines.push_back(ChatLine(L"Profiler disabled")); + else + chat_lines.push_back(ChatLine(L"Profiler enabled")); + } + else if(input->wasKeyDown(getKeySetting("keymap_toggle_force_fog_off"))) + { + force_fog_off = !force_fog_off; + if(force_fog_off) + chat_lines.push_back(ChatLine(L"Fog disabled")); + else + chat_lines.push_back(ChatLine(L"Fog enabled")); + } + else if(input->wasKeyDown(getKeySetting("keymap_toggle_update_camera"))) + { + disable_camera_update = !disable_camera_update; + if(disable_camera_update) + chat_lines.push_back(ChatLine(L"Camera update disabled")); + else + chat_lines.push_back(ChatLine(L"Camera update enabled")); + } // Item selection with mouse wheel { @@ -1304,7 +1386,7 @@ void the_game( { g_selected_item = i; - dstream<getMousePos().Y - displaycenter.Y; if(invert_mouse) dy = -dy; - //std::cout<<"window active, pos difference "<isKeyDown(irr::KEY_UP)) @@ -1383,15 +1465,30 @@ void the_game( if(device->getCursorControl()->isVisible() == false) device->getCursorControl()->setVisible(true); - //std::cout<<"window inactive"<isWindowActive()) + { + PlayerControl control( + false, + false, + false, + false, + false, + false, + false, + camera_pitch, + camera_yaw + ); + client.setPlayerControl(control); + } + else { /*bool a_up, bool a_down, @@ -1436,24 +1533,60 @@ void the_game( //client.step(dtime_avg1); } - // Read client events - for(;;) { - ClientEvent event = client.getClientEvent(); - if(event.type == CE_NONE) - { - break; - } - else if(event.type == CE_PLAYER_DAMAGE) + // Read client events + for(;;) { - //u16 damage = event.player_damage.amount; - //dstream<<"Player damage: "<= 2){ + damage_flash_timer += 0.05 * event.player_damage.amount; + } + } + else if(event.type == CE_PLAYER_FORCE_MOVE) + { + camera_yaw = event.player_force_move.yaw; + camera_pitch = event.player_force_move.pitch; + } + else if(event.type == CE_DEATHSCREEN) + { + if(respawn_menu_active) + continue; + + /*bool set_camera_point_target = + event.deathscreen.set_camera_point_target; + v3f camera_point_target; + camera_point_target.X = event.deathscreen.camera_point_target_x; + camera_point_target.Y = event.deathscreen.camera_point_target_y; + camera_point_target.Z = event.deathscreen.camera_point_target_z;*/ + MainRespawnInitiator *respawner = + new MainRespawnInitiator( + &respawn_menu_active, &client); + GUIDeathScreen *menu = + new GUIDeathScreen(guienv, guiroot, -1, + &g_menumgr, respawner); + menu->drop(); + + /* Handle visualization */ + + damage_flash_timer = 0; + + /*LocalPlayer* player = client.getLocalPlayer(); + player->setPosition(player->getPosition() + v3f(0,-BS,0)); + camera.update(player, busytime, screensize);*/ + } + else if(event.type == CE_TEXTURES_UPDATED) + { + update_skybox(driver, tsrc, smgr, skybox, brightness); + } } } @@ -1467,13 +1600,8 @@ void the_game( v3f camera_position = camera.getPosition(); v3f camera_direction = camera.getDirection(); f32 camera_fov = camera.getFovMax(); - - if(FIELD_OF_VIEW_TEST) - { - client.updateCamera(v3f(0,0,0), v3f(0,0,1), camera_fov); - } - else - { + + if(!disable_camera_update){ client.updateCamera(camera_position, camera_direction, camera_fov); } @@ -1492,72 +1620,24 @@ void the_game( core::line3d shootline(camera_position, camera_position + camera_direction * BS * (d+1)); - MapBlockObject *selected_object = client.getSelectedObject - (d*BS, camera_position, shootline); - ClientActiveObject *selected_active_object = client.getSelectedActiveObject (d*BS, camera_position, shootline); + + bool left_punch = false; + bool left_punch_muted = false; - if(selected_object != NULL) + if(selected_active_object != NULL && !ldown_for_dig) { - //dstream<<"Client returned selected_object != NULL"< box_on_map - = selected_object->getSelectionBoxOnMap(); - - hilightboxes.push_back(box_on_map); - - infotext = narrow_to_wide(selected_object->infoText()); - - if(input->getLeftClicked()) + /* Clear possible cracking animation */ + if(nodepos_old != v3s16(-32768,-32768,-32768)) { - std::cout<getBlock()->getPos(), - selected_object->getId(), g_selected_item); + client.clearTempMod(nodepos_old); + dig_time = 0.0; + nodepos_old = v3s16(-32768,-32768,-32768); } - else if(input->getRightClicked()) - { - std::cout<getTypeId() == MAPBLOCKOBJECT_TYPE_SIGN) - { - dstream<<"Sign object right-clicked"<getBlock()->getPos(), - selected_object->getId(), - &client); - - SignObject *sign_object = (SignObject*)selected_object; - std::wstring wtext = - narrow_to_wide(sign_object->getText()); - - (new GUITextInputMenu(guienv, guiroot, -1, - &g_menumgr, dest, - wtext))->drop(); - } - } - /* - Otherwise pass the event to the server as-is - */ - else - { - client.clickObject(1, selected_object->getBlock()->getPos(), - selected_object->getId(), g_selected_item); - } - } - } - else if(selected_active_object != NULL) - { - //dstream<<"Client returned selected_active_object != NULL"< *selection_box = selected_active_object->getSelectionBox(); @@ -1571,21 +1651,38 @@ void the_game( selection_box->MinEdge + pos, selection_box->MaxEdge + pos ); - - hilightboxes.push_back(box_on_map); + + if(selected_active_object->doShowSelectionBox()) + hilightboxes.push_back(box_on_map); //infotext = narrow_to_wide("A ClientActiveObject"); infotext = narrow_to_wide(selected_active_object->infoText()); - if(input->getLeftClicked()) + //if(input->getLeftClicked()) + if(input->getLeftState()) { - std::cout<getId(), g_selected_item); + bool do_punch = false; + bool do_punch_damage = false; + if(object_hit_delay_timer <= 0.0){ + do_punch = true; + do_punch_damage = true; + object_hit_delay_timer = object_hit_delay; + } + if(input->getLeftClicked()){ + do_punch = true; + } + if(do_punch){ + infostream<<"Left-clicked object"<getId(), g_selected_item); + } } else if(input->getRightClicked()) { - std::cout<getId(), g_selected_item); } @@ -1608,15 +1705,15 @@ void the_game( nodepos, neighbourpos, nodehilightbox, d); - static float nodig_delay_counter = 0.0; - - if(nodefound) - { - static v3s16 nodepos_old(-32768,-32768,-32768); - - static float dig_time = 0.0; - static u16 dig_index = 0; - + if(!nodefound){ + if(nodepos_old != v3s16(-32768,-32768,-32768)) + { + client.clearTempMod(nodepos_old); + dig_time = 0.0; + nodepos_old = v3s16(-32768,-32768,-32768); + ldown_for_dig = false; + } + } else { /* Visualize selection */ @@ -1643,6 +1740,7 @@ void the_game( { client.clearTempMod(nodepos); dig_time = 0.0; + ldown_for_dig = false; } if(nodig_delay_counter > 0.0) @@ -1653,25 +1751,27 @@ void the_game( { if(nodepos != nodepos_old) { - std::cout<getLeftClicked() || (input->getLeftState() && nodepos != nodepos_old)) { - dstream<getLeftClicked()) { client.setTempMod(nodepos, NodeMod(NODEMOD_CRACK, 0)); + ldown_for_dig = true; } if(input->getLeftState()) { @@ -1692,14 +1792,16 @@ void the_game( // Get digging properties for material and tool content_t material = n.getContent(); + ToolDiggingProperties tp = + tooldef->getDiggingProperties(toolname); DiggingProperties prop = - getDiggingProperties(material, toolname); + getDiggingProperties(material, &tp, nodedef); float dig_time_complete = 0.0; if(prop.diggable == false) { - /*dstream<<"Material "<<(int)material + /*infostream<<"Material "<<(int)material <<" not diggable with \"" <getRightClicked()) { - std::cout<getInventoryDrawSpecString() != "" && !random_input) { - dstream<setDrawSpec(draw_spec); menu->drop(); } - else if(meta && meta->typeId() == CONTENT_SIGN_WALL && !random_input) + // If metadata provides text input, activate text input + else if(meta && meta->allowsTextInput() && !random_input) { - dstream<<"Sign node right-clicked"<getText()); + std::wstring wtext = narrow_to_wide(meta->getText()); (new GUITextInputMenu(guienv, guiroot, -1, &g_menumgr, dest, wtext))->drop(); } + // Otherwise report right click to server else { client.groundAction(1, nodepos, neighbourpos, g_selected_item); @@ -1828,7 +1929,7 @@ void the_game( } // selected_object == NULL - if(input->getLeftClicked()) + if(left_punch || (input->getLeftClicked() && !left_punch_muted)) { camera.setDigging(0); // left click animation } @@ -1838,13 +1939,14 @@ void the_game( if(input->getLeftReleased()) { - std::cout<getRightReleased()) { - //std::cout< 0.01) - update_skybox(driver, smgr, skybox, brightness); + update_skybox(driver, tsrc, smgr, skybox, brightness); /* Update clouds @@ -1907,7 +2011,7 @@ void the_game( Fog */ - if(g_settings.getBool("enable_fog") == true) + if(g_settings->getBool("enable_fog") == true && !force_fog_off) { f32 range; if(farmesh) @@ -1917,10 +2021,11 @@ void the_game( else { range = draw_control.wanted_range*BS + MAP_BLOCKSIZE*BS*1.5; + range *= 0.9; if(draw_control.range_all) range = 100000*BS; - if(range < 50*BS) - range = range * 0.5 + 25*BS; + /*if(range < 50*BS) + range = range * 0.5 + 25*BS;*/ } driver->setFog( @@ -1985,14 +2090,15 @@ void the_game( "(% .1f, % .1f, % .1f)" " (% .3f < btime_jitter < % .3f" ", dtime_jitter = % .1f %%" - ", v_range = %.1f)", + ", v_range = %.1f, RTT = %.3f)", player_position.X/BS, player_position.Y/BS, player_position.Z/BS, busytime_jitter1_min_sample, busytime_jitter1_max_sample, dtime_jitter1_max_fraction * 100.0, - draw_control.wanted_range + draw_control.wanted_range, + client.getRTT() ); guitext2->setText(narrow_to_wide(temptext).c_str()); @@ -2073,7 +2179,8 @@ void the_game( guitext_chat->setRelativePosition(rect); - if(chat_lines.size() == 0) + // Don't show chat if empty or profiler is enabled + if(chat_lines.size() == 0 || show_profiler) guitext_chat->setVisible(false); else guitext_chat->setVisible(true); @@ -2089,7 +2196,7 @@ void the_game( { client.selectPlayerItem(g_selected_item); old_selected_item = g_selected_item; - //std::cout<<"Updating local inventory"<getItem(g_selected_item); - camera.wield(item); + camera.wield(item, gamedef); } /* @@ -2128,7 +2235,7 @@ void the_game( //timer3.stop(); - //std::cout<drawAll()"<drawAll()"< >::Iterator i=hilightboxes.begin(); i != hilightboxes.end(); i++) { - /*std::cout<<"hilightbox min=" + /*infostream<<"hilightbox min=" <<"("<MinEdge.X<<","<MinEdge.Y<<","<MinEdge.Z<<")" <<" max=" <<"("<MaxEdge.X<<","<MaxEdge.Y<<","<MaxEdge.Z<<")" @@ -2180,7 +2287,7 @@ void the_game( /* Frametime log */ - if(g_settings.getBool("frametime_graph") == true) + if(g_settings->getBool("frametime_graph") == true) { s32 x = 10; for(core::list::Iterator @@ -2220,7 +2327,8 @@ void the_game( Draw hotbar */ { - draw_hotbar(driver, font, v2s32(displaycenter.X, screensize.Y), + draw_hotbar(driver, font, tsrc, + v2s32(displaycenter.X, screensize.Y), hotbar_imagesize, hotbar_itemcount, &local_inventory, client.getHP()); } @@ -2287,6 +2395,12 @@ void the_game( driver->endScene(); gui_shuttingdowntext->remove();*/ } + + } // Client scope (must be destructed before destructing *def and tsrc + + delete tooldef; + delete tsrc; + delete nodedef; }