diff options
author | Perttu Ahola <celeron55@gmail.com> | 2011-10-15 02:28:57 +0300 |
---|---|---|
committer | Perttu Ahola <celeron55@gmail.com> | 2011-10-15 02:28:57 +0300 |
commit | 43a28f04fa3ddf4b612f58c25a896293a01567e3 (patch) | |
tree | 58ca2cac232c28ffd59609ad3998b97628f13e33 /src/game.cpp | |
parent | 080002f8ed1af6d34cdc6f5abff0f51586ca831c (diff) | |
download | minetest-43a28f04fa3ddf4b612f58c25a896293a01567e3.tar.gz minetest-43a28f04fa3ddf4b612f58c25a896293a01567e3.tar.bz2 minetest-43a28f04fa3ddf4b612f58c25a896293a01567e3.zip |
mobv2
Diffstat (limited to 'src/game.cpp')
-rw-r--r-- | src/game.cpp | 185 |
1 files changed, 69 insertions, 116 deletions
diff --git a/src/game.cpp b/src/game.cpp index 9e54e6ad3..e8d0238a3 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -89,27 +89,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: " - <<ntext<<std::endl; - m_client->sendSignText(m_blockpos, m_id, ntext); - } - - v3s16 m_blockpos; - s16 m_id; - Client *m_client; -}; - struct TextDestChat : public TextDest { TextDestChat(Client *client) @@ -298,7 +277,7 @@ void getPointedNode(Client *client, v3f player_position, v3s16 pos_i = floatToInt(player_position, BS); - /*std::cout<<"pos_i=("<<pos_i.X<<","<<pos_i.Y<<","<<pos_i.Z<<")" + /*dstream<<"pos_i=("<<pos_i.X<<","<<pos_i.Y<<","<<pos_i.Z<<")" <<std::endl;*/ s16 a = d; @@ -705,7 +684,7 @@ void the_game( SharedPtr<Server> server; if(address == ""){ draw_load_screen(L"Creating server...", driver, font); - std::cout<<DTIME<<"Creating server"<<std::endl; + dstream<<DTIME<<"Creating server"<<std::endl; server = new Server(map_dir, configpath); server->start(port); } @@ -715,7 +694,7 @@ void the_game( */ draw_load_screen(L"Creating client...", driver, font); - std::cout<<DTIME<<"Creating client"<<std::endl; + dstream<<DTIME<<"Creating client"<<std::endl; MapDrawControl draw_control; Client client(device, playername.c_str(), password, draw_control); @@ -730,7 +709,7 @@ void the_game( } catch(ResolveError &e) { - std::cout<<DTIME<<"Couldn't resolve address"<<std::endl; + dstream<<DTIME<<"Couldn't resolve address"<<std::endl; //return 0; error_message = L"Couldn't resolve address"; //gui_loadingtext->remove(); @@ -799,12 +778,12 @@ void the_game( { error_message = L"Access denied. Reason: " +client.accessDeniedReason(); - std::cout<<DTIME<<wide_to_narrow(error_message)<<std::endl; + dstream<<DTIME<<wide_to_narrow(error_message)<<std::endl; } else { error_message = L"Connection timed out."; - std::cout<<DTIME<<"Timed out."<<std::endl; + dstream<<DTIME<<"Timed out."<<std::endl; } //gui_loadingtext->remove(); return; @@ -924,8 +903,16 @@ void the_game( core::list<float> 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"); @@ -952,7 +939,7 @@ void the_game( { error_message = L"Access denied. Reason: " +client.accessDeniedReason(); - std::cout<<DTIME<<wide_to_narrow(error_message)<<std::endl; + dstream<<DTIME<<wide_to_narrow(error_message)<<std::endl; break; } @@ -1018,7 +1005,7 @@ void the_game( busytime = busytime_u32 / 1000.0; } - //std::cout<<"busytime_u32="<<busytime_u32<<std::endl; + //dstream<<"busytime_u32="<<busytime_u32<<std::endl; // Necessary for device->getTimer()->getTime() device->run(); @@ -1053,6 +1040,10 @@ void the_game( dtime = 0; lasttime = time; + /* Run timers */ + + object_hit_delay_timer -= dtime; + /* Log frametime for visualization */ @@ -1067,8 +1058,8 @@ void the_game( Visualize frametime in terminal */ /*for(u32 i=0; i<dtime*400; i++) - std::cout<<"X"; - std::cout<<std::endl;*/ + dstream<<"X"; + dstream<<std::endl;*/ /* Time average and jitter calculation @@ -1133,7 +1124,7 @@ void the_game( if(counter < 0) { counter = 30.0; - client.printDebugInfo(std::cout); + client.printDebugInfo(dstream); } } @@ -1359,7 +1350,7 @@ void the_game( } if(first_loop_after_window_activation){ - //std::cout<<"window active, first loop"<<std::endl; + //dstream<<"window active, first loop"<<std::endl; first_loop_after_window_activation = false; } else{ @@ -1367,7 +1358,7 @@ void the_game( s32 dy = input->getMousePos().Y - displaycenter.Y; if(invert_mouse) dy = -dy; - //std::cout<<"window active, pos difference "<<dx<<","<<dy<<std::endl; + //dstream<<"window active, pos difference "<<dx<<","<<dy<<std::endl; /*const float keyspeed = 500; if(input->isKeyDown(irr::KEY_UP)) @@ -1391,7 +1382,7 @@ void the_game( if(device->getCursorControl()->isVisible() == false) device->getCursorControl()->setVisible(true); - //std::cout<<"window inactive"<<std::endl; + //dstream<<"window inactive"<<std::endl; first_loop_after_window_activation = true; } @@ -1500,71 +1491,23 @@ void the_game( core::line3d<f32> 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"<<std::endl; - - core::aabbox3d<f32> 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<<DTIME<<"Left-clicked object"<<std::endl; - client.clickObject(0, selected_object->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<<DTIME<<"Right-clicked object"<<std::endl; - /* - Check if we want to modify the object ourselves - */ - if(selected_object->getTypeId() == MAPBLOCKOBJECT_TYPE_SIGN) - { - dstream<<"Sign object right-clicked"<<std::endl; - - if(random_input == false) - { - // Get a new text for it - - TextDest *dest = new TextDestSign( - selected_object->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"<<std::endl; core::aabbox3d<f32> *selection_box @@ -1579,21 +1522,31 @@ 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<<DTIME<<"Left-clicked object"<<std::endl; - client.clickActiveObject(0, - selected_active_object->getId(), g_selected_item); + if(object_hit_delay_timer <= 0.0){ + dstream<<DTIME<<"Left-clicked object"<<std::endl; + client.clickActiveObject(0, + selected_active_object->getId(), g_selected_item); + object_hit_delay_timer = object_hit_delay; + left_punch = true; + } else { + dstream<<DTIME<<"Left-clicked object faster than allowed" + <<std::endl; + left_punch_muted = true; + } } else if(input->getRightClicked()) { - std::cout<<DTIME<<"Right-clicked object"<<std::endl; + dstream<<DTIME<<"Right-clicked object"<<std::endl; client.clickActiveObject(1, selected_active_object->getId(), g_selected_item); } @@ -1616,15 +1569,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 */ @@ -1661,13 +1613,14 @@ void the_game( { if(nodepos != nodepos_old) { - std::cout<<DTIME<<"Pointing at ("<<nodepos.X<<"," + dstream<<DTIME<<"Pointing at ("<<nodepos.X<<"," <<nodepos.Y<<","<<nodepos.Z<<")"<<std::endl; if(nodepos_old != v3s16(-32768,-32768,-32768)) { client.clearTempMod(nodepos_old); dig_time = 0.0; + nodepos_old = v3s16(-32768,-32768,-32768); } } @@ -1771,7 +1724,7 @@ void the_game( if(input->getRightClicked()) { - std::cout<<DTIME<<"Ground right-clicked"<<std::endl; + dstream<<DTIME<<"Ground right-clicked"<<std::endl; // If metadata provides an inventory view, activate it if(meta && meta->getInventoryDrawSpecString() != "" && !random_input) @@ -1836,7 +1789,7 @@ void the_game( } // selected_object == NULL - if(input->getLeftClicked()) + if(left_punch || (input->getLeftClicked() && !left_punch_muted)) { camera.setDigging(0); // left click animation } @@ -1846,13 +1799,13 @@ void the_game( if(input->getLeftReleased()) { - std::cout<<DTIME<<"Left button released (stopped digging)" + dstream<<DTIME<<"Left button released (stopped digging)" <<std::endl; client.groundAction(2, v3s16(0,0,0), v3s16(0,0,0), 0); } if(input->getRightReleased()) { - //std::cout<<DTIME<<"Right released"<<std::endl; + //dstream<<DTIME<<"Right released"<<std::endl; // Nothing here } @@ -2097,7 +2050,7 @@ void the_game( { client.selectPlayerItem(g_selected_item); old_selected_item = g_selected_item; - //std::cout<<"Updating local inventory"<<std::endl; + //dstream<<"Updating local inventory"<<std::endl; client.getLocalInventory(local_inventory); // Update wielded tool @@ -2136,7 +2089,7 @@ void the_game( //timer3.stop(); - //std::cout<<DTIME<<"smgr->drawAll()"<<std::endl; + //dstream<<DTIME<<"smgr->drawAll()"<<std::endl; { TimeTaker timer("smgr"); @@ -2162,7 +2115,7 @@ void the_game( for(core::list< core::aabbox3d<f32> >::Iterator i=hilightboxes.begin(); i != hilightboxes.end(); i++) { - /*std::cout<<"hilightbox min=" + /*dstream<<"hilightbox min=" <<"("<<i->MinEdge.X<<","<<i->MinEdge.Y<<","<<i->MinEdge.Z<<")" <<" max=" <<"("<<i->MaxEdge.X<<","<<i->MaxEdge.Y<<","<<i->MaxEdge.Z<<")" |