diff options
Diffstat (limited to 'src/game.cpp')
-rw-r--r-- | src/game.cpp | 200 |
1 files changed, 135 insertions, 65 deletions
diff --git a/src/game.cpp b/src/game.cpp index bbd0a22ef..5632c1805 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -25,11 +25,15 @@ with this program; if not, write to the Free Software Foundation, Inc., #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" + +// TODO: Move content-aware stuff to separate file +#include "content_mapnode.h" +#include "content_nodemeta.h" /* Setting this to 1 enables a special camera mode that forces @@ -358,7 +362,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) { @@ -371,7 +375,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); } } } @@ -632,6 +636,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( @@ -801,8 +809,9 @@ 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 { @@ -851,8 +860,21 @@ 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 @@ -886,8 +908,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; @@ -930,6 +952,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 @@ -937,6 +962,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 @@ -1124,6 +1153,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 */ @@ -1189,10 +1233,12 @@ void the_game( 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"))) @@ -1200,10 +1246,12 @@ void the_game( 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")); } } @@ -1355,7 +1403,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; @@ -1364,6 +1416,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; @@ -1384,7 +1438,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; @@ -1696,67 +1752,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; + + SignNodeMetadata *signmeta = (SignNodeMetadata*)meta; - GUIFurnaceMenu *menu = - new GUIFurnaceMenu(guienv, guiroot, -1, - &g_menumgr, nodepos, &client); + // 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 { @@ -1824,6 +1869,22 @@ void the_game( 0.05+brightness*0.95); } + /* + 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), + 0.05+brightness*0.95, farmesh_range); + } + // Store brightness value old_brightness = brightness; @@ -1833,11 +1894,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, @@ -1985,7 +2054,7 @@ void the_game( 10, 50, screensize.X - 10, - 50 + text_height*chat_lines.size() + 50 + guitext_chat->getTextHeight() ); guitext_chat->setRelativePosition(rect); @@ -2034,7 +2103,7 @@ void the_game( //driver->beginScene(false, true, bgcolor); beginscenetime = timer.stop(true); } - + //timer3.stop(); //std::cout<<DTIME<<"smgr->drawAll()"<<std::endl; @@ -2166,7 +2235,8 @@ void the_game( /* Drop stuff */ - clouds->drop(); + if(clouds) + clouds->drop(); /* Draw a "shutting down" screen, which will be shown while the map |