X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;ds=sidebyside;f=src%2Fgame.cpp;h=5e8db9b1d1d0b1b6e75ca6c2a2f9d83cad6cccd6;hb=36bcbca9acabbc47976d3d7625ffb1c9396b8fdc;hp=faadd0fe70a8be168f6b0651a4164519a47b6aa1;hpb=7b290660ead5e9cfc7ee2762217212ff995a6c85;p=dragonfireclient.git diff --git a/src/game.cpp b/src/game.cpp index faadd0fe7..5e8db9b1d 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -28,7 +28,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "materials.h" #include "config.h" #include "clouds.h" -#include "keycode.h" +#include "camera.h" #include "farmesh.h" #include "mapblock.h" @@ -50,8 +50,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 { @@ -115,18 +113,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); @@ -156,144 +142,6 @@ 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 "< range_max) - new_range = range_max; - - /*dstream<<"new_range="<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); @@ -417,7 +309,7 @@ void getPointedNode(Client *client, v3f player_position, try { n = client->getNode(v3s16(x,y,z)); - if(content_pointable(n.d) == false) + if(content_pointable(n.getContent()) == false) continue; } catch(InvalidPositionException &e) @@ -442,9 +334,9 @@ void getPointedNode(Client *client, v3f player_position, /* Meta-objects */ - if(n.d == CONTENT_TORCH) + if(n.getContent() == CONTENT_TORCH) { - v3s16 dir = unpackDir(n.dir); + 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; @@ -489,9 +381,9 @@ void getPointedNode(Client *client, v3f player_position, } } } - else if(n.d == CONTENT_SIGN_WALL) + else if(n.getContent() == CONTENT_SIGN_WALL) { - v3s16 dir = unpackDir(n.dir); + 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; @@ -538,6 +430,93 @@ void getPointedNode(Client *client, v3f player_position, } } } + + 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; + } + + 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; + } + } + } + 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; + } + + 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; + } + } + } /* Regular blocks */ @@ -678,7 +657,8 @@ void the_game( std::string password, std::string address, u16 port, - std::wstring &error_message + std::wstring &error_message, + std::string configpath ) { video::IVideoDriver* driver = device->getVideoDriver(); @@ -718,7 +698,7 @@ void the_game( if(address == ""){ draw_load_screen(L"Creating server...", driver, font); std::cout<start(port); } @@ -728,6 +708,7 @@ void the_game( draw_load_screen(L"Creating client...", driver, font); std::cout<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" @@ -974,6 +940,14 @@ void the_game( { //std::cerr<<"frame"<disconnect_requested) { g_gamecallback->disconnect_requested = false; @@ -1001,9 +975,9 @@ void the_game( //bool screensize_changed = screensize != last_screensize; // Resize hotbar - if(screensize.Y <= 600) + if(screensize.Y <= 800) hotbar_imagesize = 32; - else if(screensize.Y <= 1024) + else if(screensize.Y <= 1280) hotbar_imagesize = 48; else hotbar_imagesize = 64; @@ -1041,12 +1015,6 @@ void the_game( // Necessary for device->getTimer()->getTime() device->run(); - /* - Viewing range - */ - - updateViewingRange(busytime, &client); - /* FPS limiter */ @@ -1218,7 +1186,7 @@ void the_game( menu->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")) @@ -1321,10 +1297,8 @@ 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) { @@ -1432,9 +1406,6 @@ void the_game( } } - // Get player position - v3f player_position = client.getPlayerPosition(); - //TimeTaker //timer2("//timer2"); /* @@ -1487,30 +1458,25 @@ void the_game( first_loop_after_window_activation = true; } - camera_yaw = wrapDegrees(camera_yaw); - camera_pitch = wrapDegrees(camera_pitch); - - v3f camera_direction = v3f(0,0,1); - camera_direction.rotateYZBy(camera_pitch); - camera_direction.rotateXZBy(camera_yaw); - - // This is at the height of the eyes of the current figure - //v3f camera_position = player_position + v3f(0, BS+BS/2, 0); - // This is more like in minecraft - v3f camera_position = player_position + v3f(0, BS+BS*0.625, 0); + LocalPlayer* player = client.getLocalPlayer(); + camera.update(player, busytime, screensize); + camera.step(dtime); - camera->setPosition(camera_position); - // *100.0 helps in large map coordinates - camera->setTarget(camera_position + camera_direction * 100.0); + 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)); + if(FIELD_OF_VIEW_TEST) + { + client.updateCamera(v3f(0,0,0), v3f(0,0,1), camera_fov); } - else{ - //TimeTaker timer("client.updateCamera"); - client.updateCamera(camera_position, camera_direction); + else + { + client.updateCamera(camera_position, + camera_direction, camera_fov); } - + //timer2.stop(); //TimeTaker //timer3("//timer3"); @@ -1548,6 +1514,7 @@ void the_game( std::cout<getBlock()->getPos(), selected_object->getId(), g_selected_item); + camera.setDigging(true); } else if(input->getRightClicked()) { @@ -1615,10 +1582,13 @@ void the_game( std::cout<getId(), g_selected_item); + camera.setDigging(true); } else if(input->getRightClicked()) { std::cout<getId(), g_selected_item); } } else // selected_object == NULL @@ -1722,7 +1692,7 @@ void the_game( } // Get digging properties for material and tool - u8 material = n.d; + content_t material = n.getContent(); DiggingProperties prop = getDiggingProperties(material, toolname); @@ -1786,9 +1756,12 @@ void the_game( } dig_time += dtime; + + camera.setDigging(true); } } + if(input->getRightClicked()) { std::cout<getRightReleased()) { @@ -1879,8 +1851,6 @@ void the_game( Calculate stuff for drawing */ - camera->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( @@ -1901,7 +1871,7 @@ void the_game( update_skybox(driver, smgr, skybox, brightness); /* - Update coulds + Update clouds */ if(clouds) { @@ -1972,7 +1942,6 @@ void the_game( ); } - /* Update gui stuff (0ms) */ @@ -2114,9 +2083,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); } /* @@ -2181,6 +2158,13 @@ void the_game( driver->draw3DBox(*i, video::SColor(255,0,0,0)); } + /* + Post effects + */ + { + client.renderPostFx(); + } + /* Frametime log */ @@ -2242,13 +2226,6 @@ void the_game( NULL); } - /* - Environment post fx - */ - { - client.getEnv()->drawPostFx(driver, camera_position); - } - /* End scene */