X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Fgame.cpp;h=92d4a2ae490601d1b101e729763a75e21a311786;hb=22b07bdb30f602d9c469d97b138cf09ee131de62;hp=c4a9aba00050fb306b63db026b72ae1e02a446d3;hpb=64a6da3e45838a6f764777728736dfa0f6678778;p=minetest.git diff --git a/src/game.cpp b/src/game.cpp index c4a9aba00..92d4a2ae4 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -17,20 +17,32 @@ 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 "keycode.h" +#include "camera.h" #include "farmesh.h" #include "mapblock.h" +#include "settings.h" +#include "profiler.h" +#include "mainmenumanager.h" +#include "gettext.h" +#include "log.h" +#include "filesys.h" /* TODO: Move content-aware stuff to separate file by adding properties @@ -50,8 +62,6 @@ with this program; if not, write to the Free Software Foundation, Inc., #define FIELD_OF_VIEW_TEST 0 -MapDrawControl draw_control; - // Chat data struct ChatLine { @@ -83,27 +93,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) @@ -115,18 +104,6 @@ struct TextDestChat : public TextDest // Discard empty line if(text == L"") return; - - // Parse command (server command starts with "/#") - if(text[0] == L'/' && text[1] != L'#') - { - std::wstring reply = L"Local: "; - - reply += L"Local commands not yet supported. " - L"Server prefix is \"/#\"."; - - m_client->addChatMessage(reply); - return; - } // Send to others m_client->sendChatMessage(text); @@ -147,7 +124,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); } @@ -156,143 +133,25 @@ struct TextDestSignNode : public TextDest Client *m_client; }; -/* - Render distance feedback loop -*/ -void updateViewingRange(f32 frametime_in, Client *client) -{ - if(draw_control.range_all == true) - return; - - static f32 added_frametime = 0; - static s16 added_frames = 0; - - added_frametime += frametime_in; - added_frames += 1; - - // Actually this counter kind of sucks because frametime is busytime - static f32 counter = 0; - counter -= frametime_in; - if(counter > 0) - return; - //counter = 0.1; - counter = 0.2; - - /*dstream<<__FUNCTION_NAME - <<": Collected "<sendRespawn(); } - - new_range += wanted_range_change; - - //float new_range_unclamped = new_range; - if(new_range < range_min) - new_range = range_min; - if(new_range > range_max) - new_range = range_max; - - /*dstream<<"new_range="<getList("main"); if(mainlist == NULL) { - dstream<<"WARNING: draw_hotbar(): mainlist == NULL"<draw2DRectangle(video::SColor(255,255,0,0), - core::rect(rect.UpperLeftCorner - v2s32(1,1)*padding, - rect.LowerRightCorner + v2s32(1,1)*padding), - NULL); - } - else - { - video::SColor bgcolor2(128,0,0,0); - driver->draw2DRectangle(bgcolor2, rect, NULL); + video::SColor c_outside(255,255,0,0); + //video::SColor c_outside(255,0,0,0); + //video::SColor c_inside(255,192,192,192); + s32 x1 = rect.UpperLeftCorner.X; + s32 y1 = rect.UpperLeftCorner.Y; + s32 x2 = rect.LowerRightCorner.X; + s32 y2 = rect.LowerRightCorner.Y; + // Black base borders + driver->draw2DRectangle(c_outside, + core::rect( + v2s32(x1 - padding, y1 - padding), + v2s32(x2 + padding, y1) + ), NULL); + driver->draw2DRectangle(c_outside, + core::rect( + v2s32(x1 - padding, y2), + v2s32(x2 + padding, y2 + padding) + ), NULL); + driver->draw2DRectangle(c_outside, + core::rect( + v2s32(x1 - padding, y1), + v2s32(x1, y2) + ), NULL); + driver->draw2DRectangle(c_outside, + core::rect( + v2s32(x2, y1), + v2s32(x2 + padding, y2) + ), NULL); + /*// Light inside borders + driver->draw2DRectangle(c_inside, + core::rect( + v2s32(x1 - padding/2, y1 - padding/2), + v2s32(x2 + padding/2, y1) + ), NULL); + driver->draw2DRectangle(c_inside, + core::rect( + v2s32(x1 - padding/2, y2), + v2s32(x2 + padding/2, y2 + padding/2) + ), NULL); + driver->draw2DRectangle(c_inside, + core::rect( + v2s32(x1 - padding/2, y1), + v2s32(x1, y2) + ), NULL); + driver->draw2DRectangle(c_inside, + core::rect( + v2s32(x2, y1), + v2s32(x2 + padding/2, y2) + ), NULL); + */ } + video::SColor bgcolor2(128,0,0,0); + driver->draw2DRectangle(bgcolor2, rect, NULL); + if(item != NULL) { drawInventoryItem(driver, font, item, rect, NULL); @@ -398,7 +301,7 @@ void getPointedNode(Client *client, v3f player_position, v3s16 pos_i = floatToInt(player_position, BS); - /*std::cout<<"pos_i=("<getBool("enable_farmesh")) return;*/ if(brightness >= 0.5) @@ -805,7 +708,7 @@ void the_game( SharedPtr server; if(address == ""){ draw_load_screen(L"Creating server...", driver, font); - std::cout<start(port); } @@ -815,7 +718,8 @@ void the_game( */ draw_load_screen(L"Creating client...", driver, font); - std::cout<remove(); @@ -840,9 +744,9 @@ void the_game( Attempt to connect to the server */ - dstream<remove(); return; @@ -919,25 +823,10 @@ void the_game( /* Create the camera node */ - - scene::ICameraSceneNode* camera = smgr->addCameraSceneNode( - 0, // Camera parent - v3f(BS*100, BS*2, BS*100), // Look from - v3f(BS*100+1, BS*2, BS*100), // Look to - -1 // Camera ID - ); - - if(camera == NULL) - { - error_message = L"Failed to create the camera node"; + Camera camera(smgr, draw_control); + if (!camera.successfullyCreated(error_message)) return; - } - camera->setFOV(FOV_ANGLE); - - // Just so big a value that everything rendered is visible - camera->setFarValue(100000*BS); - f32 camera_yaw = 0; // "right/left" f32 camera_pitch = 0; // "up/down" @@ -947,7 +836,7 @@ void the_game( float cloud_height = BS*100; Clouds *clouds = NULL; - if(g_settings.getBool("enable_clouds")) + if(g_settings->getBool("enable_clouds")) { clouds = new Clouds(smgr->getRootSceneNode(), smgr, -1, cloud_height, time(0)); @@ -958,7 +847,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); } @@ -983,7 +872,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( @@ -1000,6 +888,15 @@ void the_game( //guitext_chat->setBackgroundColor(video::SColor(96,0,0,0)); core::list chat_lines; + // Profiler text + gui::IGUIStaticText *guitext_profiler = guienv->addStaticText( + L"", + core::rect(6, 4+(text_height+5)*3, 400, + (text_height+5)*3 + 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 @@ -1038,10 +935,22 @@ void the_game( 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); + float damage_flash_timer = 0; s16 farmesh_range = 20*MAP_BLOCKSIZE; + + const float object_hit_delay = 0.5; + 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; /* Main loop @@ -1062,6 +971,14 @@ void the_game( { //std::cerr<<"frame"<disconnect_requested) { g_gamecallback->disconnect_requested = false; @@ -1124,23 +1041,17 @@ 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) @@ -1165,6 +1076,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 */ @@ -1179,8 +1097,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(0.030, 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); + guitext_profiler->setText(narrow_to_wide(os.str()).c_str()); + + g_profiler->clear(); } /* @@ -1282,7 +1209,7 @@ void the_game( */ if(input->wasKeyDown(getKeySetting("keymap_inventory"))) { - dstream<drop(); } - else if(input->wasKeyDown(KEY_ESCAPE)) + else if(input->wasKeyDown(EscapeKey)) { - dstream<drop(); } + else if(input->wasKeyDown(getKeySetting("keymap_cmd"))) + { + TextDest *dest = new TextDestChat(&client); + + (new GUITextInputMenu(guienv, guiroot, -1, + &g_menumgr, dest, + L"/"))->drop(); + } else if(input->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")); } } @@ -1369,20 +1304,25 @@ 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); + } // Item selection with mouse wheel { @@ -1409,16 +1349,14 @@ void the_game( // Item selection for(u16 i=0; i<10; i++) { - s32 keycode = irr::KEY_KEY_1 + i; - if(i == 9) - keycode = irr::KEY_KEY_0; - if(input->wasKeyDown((irr::EKEY_CODE)keycode)) + const KeyPress *kp = NumberKey + (i + 1) % 10; + if(input->wasKeyDown(*kp)) { if(i < PLAYER_INVENTORY_SIZE && i < hotbar_itemcount) { g_selected_item = i; - dstream<isWindowActive() && noMenuActive()) || random_input) + { + if(!random_input) + { + // Mac OSX gets upset if this is set every frame + if(device->getCursorControl()->isVisible()) + device->getCursorControl()->setVisible(false); + } + + if(first_loop_after_window_activation){ + //infostream<<"window active, first loop"<getMousePos().X - displaycenter.X; + s32 dy = input->getMousePos().Y - displaycenter.Y; + if(invert_mouse) + dy = -dy; + //infostream<<"window active, pos difference "<isKeyDown(irr::KEY_UP)) + dy -= dtime * keyspeed; + if(input->isKeyDown(irr::KEY_DOWN)) + dy += dtime * keyspeed; + if(input->isKeyDown(irr::KEY_LEFT)) + dx -= dtime * keyspeed; + if(input->isKeyDown(irr::KEY_RIGHT)) + dx += dtime * keyspeed;*/ + + camera_yaw -= dx*0.2; + camera_pitch += dy*0.2; + if(camera_pitch < -89.5) camera_pitch = -89.5; + if(camera_pitch > 89.5) camera_pitch = 89.5; + } + input->setMousePos(displaycenter.X, displaycenter.Y); + } + else{ + // Mac OSX gets upset if this is set every frame + if(device->getCursorControl()->isVisible() == false) + device->getCursorControl()->setVisible(true); + + //infostream<<"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, @@ -1499,106 +1503,76 @@ 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) - { - //u16 damage = event.player_damage.amount; - //dstream<<"Player damage: "<isWindowActive() && noMenuActive()) || random_input) - { - if(!random_input) - { - // Mac OSX gets upset if this is set every frame - if(device->getCursorControl()->isVisible()) - device->getCursorControl()->setVisible(false); - } + ClientEvent event = client.getClientEvent(); + if(event.type == CE_NONE) + { + break; + } + else if(event.type == CE_PLAYER_DAMAGE) + { + //u16 damage = event.player_damage.amount; + //infostream<<"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 */ - if(first_loop_after_window_activation){ - //std::cout<<"window active, first loop"<getMousePos().X - displaycenter.X; - s32 dy = input->getMousePos().Y - displaycenter.Y; - if(invert_mouse) - dy = -dy; - //std::cout<<"window active, pos difference "<isKeyDown(irr::KEY_UP)) - dy -= dtime * keyspeed; - if(input->isKeyDown(irr::KEY_DOWN)) - dy += dtime * keyspeed; - if(input->isKeyDown(irr::KEY_LEFT)) - dx -= dtime * keyspeed; - if(input->isKeyDown(irr::KEY_RIGHT)) - dx += dtime * keyspeed;*/ + damage_flash_timer = 0; - camera_yaw -= dx*0.2; - camera_pitch += dy*0.2; - if(camera_pitch < -89.5) camera_pitch = -89.5; - if(camera_pitch > 89.5) camera_pitch = 89.5; + /*LocalPlayer* player = client.getLocalPlayer(); + player->setPosition(player->getPosition() + v3f(0,-BS,0)); + camera.update(player, busytime, screensize);*/ + } } - input->setMousePos(displaycenter.X, displaycenter.Y); } - else{ - // Mac OSX gets upset if this is set every frame - if(device->getCursorControl()->isVisible() == false) - device->getCursorControl()->setVisible(true); - - //std::cout<<"window inactive"<setPosition(camera_position); - // *100.0 helps in large map coordinates - camera->setTarget(camera_position + camera_direction * 100.0); + LocalPlayer* player = client.getLocalPlayer(); + camera.update(player, busytime, screensize); + camera.step(dtime); - if(FIELD_OF_VIEW_TEST){ - client.updateCamera(v3f(0,0,0), v3f(0,0,1)); - } - else{ - //TimeTaker timer("client.updateCamera"); - client.updateCamera(camera_position, camera_direction); - } + v3f player_position = player->getPosition(); + 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 + client.updateCamera(camera_position, + camera_direction, camera_fov); + //timer2.stop(); //TimeTaker //timer3("//timer3"); @@ -1613,72 +1587,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) { - //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(); @@ -1692,21 +1618,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); } @@ -1729,15 +1672,14 @@ 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); + } + } else { /* Visualize selection */ @@ -1774,20 +1716,21 @@ void the_game( { if(nodepos != nodepos_old) { - std::cout<getLeftClicked() || (input->getLeftState() && nodepos != nodepos_old)) { - dstream<getLeftClicked()) @@ -1820,7 +1763,7 @@ void the_game( if(prop.diggable == false) { - /*dstream<<"Material "<<(int)material + /*infostream<<"Material "<<(int)material <<" not diggable with \"" <getRightClicked()) { - std::cout<getInventoryDrawSpecString() != "" && !random_input) { - dstream<typeId() == CONTENT_SIGN_WALL && !random_input) { - dstream<<"Sign node right-clicked"<getLeftClicked() && !left_punch_muted)) + { + camera.setDigging(0); // left click animation + } + input->resetLeftClicked(); input->resetRightClicked(); if(input->getLeftReleased()) { - std::cout<getRightReleased()) { - //std::cout<setAspectRatio((f32)screensize.X / (f32)screensize.Y); - u32 daynight_ratio = client.getDayNightRatio(); u8 l = decode_light((daynight_ratio * LIGHT_SUN) / 1000); video::SColor bgcolor = video::SColor( @@ -1991,7 +1939,7 @@ void the_game( update_skybox(driver, smgr, skybox, brightness); /* - Update coulds + Update clouds */ if(clouds) { @@ -2023,7 +1971,7 @@ void the_game( Fog */ - if(g_settings.getBool("enable_fog") == true) + if(g_settings->getBool("enable_fog") == true) { f32 range; if(farmesh) @@ -2062,7 +2010,6 @@ void the_game( ); } - /* Update gui stuff (0ms) */ @@ -2102,14 +2049,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()); @@ -2190,7 +2138,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); @@ -2204,9 +2153,17 @@ void the_game( if(client.getLocalInventoryUpdated() || g_selected_item != old_selected_item) { + client.selectPlayerItem(g_selected_item); old_selected_item = g_selected_item; - //std::cout<<"Updating local inventory"<getItem(g_selected_item); + camera.wield(item); } /* @@ -2237,7 +2194,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<<")" @@ -2271,10 +2228,25 @@ void the_game( driver->draw3DBox(*i, video::SColor(255,0,0,0)); } + /* + Wielded tool + */ + { + // Warning: This clears the Z buffer. + camera.drawWieldedTool(); + } + + /* + Post effects + */ + { + client.renderPostFx(); + } + /* Frametime log */ - if(g_settings.getBool("frametime_graph") == true) + if(g_settings->getBool("frametime_graph") == true) { s32 x = 10; for(core::list::Iterator @@ -2332,13 +2304,6 @@ void the_game( NULL); } - /* - Environment post fx - */ - { - client.getEnv()->drawPostFx(driver, camera_position); - } - /* End scene */