#include <iomanip>
#include <list>
#include "util/directiontables.h"
+#include "util/pointedthing.h"
/*
Text input system
INodeDefManager *nodedef = client->getNodeDefManager();
ClientMap &map = client->getEnv().getClientMap();
+ f32 mindistance = BS * 1001;
+
// First try to find a pointed at active object
if(look_for_object)
{
selection_box->MaxEdge + pos));
}
+ mindistance = (selected_object->getPosition() - camera_position).getLength();
result.type = POINTEDTHING_OBJECT;
result.object_id = selected_object->getId();
- return result;
}
}
// That didn't work, try to find a pointed at node
- f32 mindistance = BS * 1001;
v3s16 pos_i = floatToInt(player_position, BS);
services->setVertexShaderConstant("animationTimer", &animation_timer_f, 1);
LocalPlayer* player = m_client->getEnv().getLocalPlayer();
- v3f eye_position = player->getEyePosition();
+ v3f eye_position = player->getEyePosition();
services->setPixelShaderConstant("eyePosition", (irr::f32*)&eye_position, 3);
services->setVertexShaderConstant("eyePosition", (irr::f32*)&eye_position, 3);
- float enable_bumpmapping = 0;
- if (g_settings->getBool("enable_bumpmapping"))
- enable_bumpmapping = 1;
- services->setPixelShaderConstant("enableBumpmapping", &enable_bumpmapping, 1);
-
- float enable_parallax_occlusion = 0;
- if (g_settings->getBool("enable_parallax_occlusion"));{
- enable_parallax_occlusion = 1;
- float parallax_occlusion_scale = g_settings->getFloat("parallax_occlusion_scale");
- services->setPixelShaderConstant("parallaxOcclusionScale", ¶llax_occlusion_scale, 1);
- float parallax_occlusion_bias = g_settings->getFloat("parallax_occlusion_bias");
- services->setPixelShaderConstant("parallaxOcclusionBias", ¶llax_occlusion_bias, 1);
- }
- services->setPixelShaderConstant("enableParallaxOcclusion", &enable_parallax_occlusion, 1);
-
- float enable_waving_water = 0;
- if (g_settings->getBool("enable_waving_water")){
- enable_waving_water = 1;
- float water_wave_height_f = g_settings->getFloat("water_wave_height");
- services->setVertexShaderConstant("waterWaveHeight", &water_wave_height_f, 1);
- float water_wave_length_f = g_settings->getFloat("water_wave_length");
- services->setVertexShaderConstant("waterWaveLength", &water_wave_length_f, 1);
- float water_wave_speed_f = g_settings->getFloat("water_wave_speed");
- services->setVertexShaderConstant("waterWaveSpeed", &water_wave_speed_f, 1);
- }
- services->setVertexShaderConstant("enableWavingWater", &enable_waving_water, 1);
-
- float enable_waving_leaves = 0;
- if (g_settings->getBool("enable_waving_leaves"))
- enable_waving_leaves = 1;
- services->setVertexShaderConstant("enableWavingLeaves", &enable_waving_leaves, 1);
-
- float enable_waving_plants = 0;
- if (g_settings->getBool("enable_waving_plants"))
- enable_waving_plants = 1;
- services->setVertexShaderConstant("enableWavingPlants", &enable_waving_plants, 1);
-
-
// Normal map texture layer
int layer1 = 1;
int layer2 = 2;
// Add node to client map
MapNode n(id, 0, param2);
try{
- // This triggers the required mesh update too
- client.addNode(p, n);
- return true;
+ LocalPlayer* player = client.getEnv().getLocalPlayer();
+
+ // Dont place node when player would be inside new node
+ // NOTE: This is to be eventually implemented by a mod as client-side Lua
+ if (!nodedef->get(n).walkable ||
+ (client.checkPrivilege("noclip") && g_settings->getBool("noclip")) ||
+ (nodedef->get(n).walkable &&
+ neighbourpos != player->getStandingNodePos() + v3s16(0,1,0) &&
+ neighbourpos != player->getStandingNodePos() + v3s16(0,2,0))) {
+
+ // This triggers the required mesh update too
+ client.addNode(p, n);
+ return true;
+ }
}catch(InvalidPositionException &e){
errorstream<<"Node placement prediction failed for "
<<playeritem_def.name<<" (places "
server->step(dtime);
// End condition
- if(client.texturesReceived() &&
+ if(client.mediaReceived() &&
client.itemdefReceived() &&
client.nodedefReceived()){
got_content = true;
break;
}
// Break conditions
+ if(client.accessDenied()){
+ error_message = L"Access denied. Reason: "
+ +client.accessDeniedReason();
+ errorstream<<wide_to_narrow(error_message)<<std::endl;
+ break;
+ }
if(!client.connectedAndInitialized()){
error_message = L"Client disconnected";
errorstream<<wide_to_narrow(error_message)<<std::endl;
*/
Sky *sky = NULL;
- sky = new Sky(smgr->getRootSceneNode(), smgr, -1);
+ sky = new Sky(smgr->getRootSceneNode(), smgr, -1, client.getEnv().getLocalPlayer());
+
+ scene::ISceneNode* skybox = NULL;
/*
A copy of the local inventory
bool invert_mouse = g_settings->getBool("invert_mouse");
bool respawn_menu_active = false;
- bool update_wielded_item_trigger = false;
+ bool update_wielded_item_trigger = true;
bool show_hud = true;
bool show_chat = true;
/*
HUD object
*/
- Hud hud(driver, guienv, font, text_height,
+ Hud hud(driver, smgr, guienv, font, text_height,
gamedef, player, &local_inventory);
bool use_weather = g_settings->getBool("weather");
+ core::stringw str = L"Minetest [";
+ str += driver->getName();
+ str += "]";
+ device->setWindowCaption(str.c_str());
+
for(;;)
{
if(device->run() == false || kill == true)
*/
{
- float fps_max = g_settings->getFloat("fps_max");
+ float fps_max = g_menumgr.pausesGame() ?
+ g_settings->getFloat("pause_fps_max") :
+ g_settings->getFloat("fps_max");
u32 frametime_min = 1000./fps_max;
if(busytime_u32 < frametime_min)
}
else if(input->wasKeyDown(getKeySetting("keymap_screenshot")))
{
- irr::video::IImage* const image = driver->createScreenShot();
- if (image) {
- irr::c8 filename[256];
- snprintf(filename, 256, "%s" DIR_DELIM "screenshot_%u.png",
+ irr::video::IImage* const image = driver->createScreenShot();
+ if (image) {
+ irr::c8 filename[256];
+ snprintf(filename, 256, "%s" DIR_DELIM "screenshot_%u.png",
g_settings->get("screenshot_path").c_str(),
- device->getTimer()->getRealTime());
+ device->getTimer()->getRealTime());
if (driver->writeImageToFile(image, filename)) {
std::wstringstream sstr;
sstr<<"Saved screenshot to '"<<filename<<"'";
} else{
infostream<<"Failed to save screenshot '"<<filename<<"'"<<std::endl;
}
- image->drop();
- }
+ image->drop();
+ }
}
else if(input->wasKeyDown(getKeySetting("keymap_toggle_hud")))
{
LocalPlayer* player = client.getEnv().getLocalPlayer();
player->keyPressed=keyPressed;
}
-
+
/*
- Run server
+ Run server, client (and process environments)
*/
-
- if(server != NULL)
+ bool can_be_and_is_paused =
+ (simple_singleplayer_mode && g_menumgr.pausesGame());
+ if(can_be_and_is_paused)
{
- //TimeTaker timer("server->step(dtime)");
- server->step(dtime);
+ // No time passes
+ dtime = 0;
}
-
- /*
- Process environment
- */
-
+ else
{
- //TimeTaker timer("client.step(dtime)");
- client.step(dtime);
- //client.step(dtime_avg1);
+ if(server != NULL)
+ {
+ //TimeTaker timer("server->step(dtime)");
+ server->step(dtime);
+ }
+ {
+ //TimeTaker timer("client.step(dtime)");
+ client.step(dtime);
+ }
}
{
new MainRespawnInitiator(
&respawn_menu_active, &client);
GUIDeathScreen *menu =
- new GUIDeathScreen(guienv, guiroot, -1,
+ new GUIDeathScreen(guienv, guiroot, -1,
&g_menumgr, respawner);
menu->drop();
delete(event.show_formspec.formspec);
delete(event.show_formspec.formname);
}
- else if(event.type == CE_TEXTURES_UPDATED)
- {
- update_wielded_item_trigger = true;
- }
else if(event.type == CE_SPAWN_PARTICLE)
{
LocalPlayer* player = client.getEnv().getLocalPlayer();
event.spawn_particle.expirationtime,
event.spawn_particle.size,
event.spawn_particle.collisiondetection,
+ event.spawn_particle.vertical,
texture,
v2f(0.0, 0.0),
v2f(1.0, 1.0));
event.add_particlespawner.minsize,
event.add_particlespawner.maxsize,
event.add_particlespawner.collisiondetection,
+ event.add_particlespawner.vertical,
texture,
event.add_particlespawner.id);
}
delete event.hudadd.text;
delete event.hudadd.align;
delete event.hudadd.offset;
+ delete event.hudadd.world_pos;
continue;
}
e->dir = event.hudadd.dir;
e->align = *event.hudadd.align;
e->offset = *event.hudadd.offset;
+ e->world_pos = *event.hudadd.world_pos;
if (id == nhudelem)
player->hud.push_back(e);
delete event.hudadd.text;
delete event.hudadd.align;
delete event.hudadd.offset;
+ delete event.hudadd.world_pos;
}
else if (event.type == CE_HUDRM)
{
{
u32 id = event.hudchange.id;
if (id >= player->hud.size() || !player->hud[id]) {
+ delete event.hudchange.v3fdata;
delete event.hudchange.v2fdata;
delete event.hudchange.sdata;
continue;
case HUD_STAT_OFFSET:
e->offset = *event.hudchange.v2fdata;
break;
+ case HUD_STAT_WORLD_POS:
+ e->world_pos = *event.hudchange.v3fdata;
+ break;
}
+ delete event.hudchange.v3fdata;
delete event.hudchange.v2fdata;
delete event.hudchange.sdata;
}
+ else if (event.type == CE_SET_SKY)
+ {
+ sky->setVisible(false);
+ if(skybox){
+ skybox->drop();
+ skybox = NULL;
+ }
+ // Handle according to type
+ if(*event.set_sky.type == "regular"){
+ sky->setVisible(true);
+ }
+ else if(*event.set_sky.type == "skybox" &&
+ event.set_sky.params->size() == 6){
+ sky->setFallbackBgColor(*event.set_sky.bgcolor);
+ skybox = smgr->addSkyBoxSceneNode(
+ tsrc->getTexture((*event.set_sky.params)[0]),
+ tsrc->getTexture((*event.set_sky.params)[1]),
+ tsrc->getTexture((*event.set_sky.params)[2]),
+ tsrc->getTexture((*event.set_sky.params)[3]),
+ tsrc->getTexture((*event.set_sky.params)[4]),
+ tsrc->getTexture((*event.set_sky.params)[5]));
+ }
+ // Handle everything else as plain color
+ else {
+ if(*event.set_sky.type != "plain")
+ infostream<<"Unknown sky type: "
+ <<(*event.set_sky.type)<<std::endl;
+ sky->setFallbackBgColor(*event.set_sky.bgcolor);
+ }
+
+ delete event.set_sky.bgcolor;
+ delete event.set_sky.type;
+ delete event.set_sky.params;
+ }
+ else if (event.type == CE_OVERRIDE_DAY_NIGHT_RATIO)
+ {
+ bool enable = event.override_day_night_ratio.do_override;
+ u32 value = event.override_day_night_ratio.ratio_f * 1000;
+ client.getEnv().setDayNightRatioOverride(enable, value);
+ }
}
}
// Sign special case, at least until formspec is properly implemented.
// Deprecated?
- if(meta && meta->getString("formspec") == "hack:sign_text_input"
+ if(meta && meta->getString("formspec") == "hack:sign_text_input"
&& !random_input
&& !input->isKeyDown(getKeySetting("keymap_sneak")))
{
// Otherwise report right click to server
else
{
- // Report to server
- client.interact(3, pointed);
- camera.setDigging(1); // right click animation
-
+ camera.setDigging(1); // right click animation (always shown for feedback)
+
// If the wielded item has node placement prediction,
// make that happen
bool placed = nodePlacementPrediction(client,
- playeritem_def,
- nodepos, neighbourpos);
-
- // Read the sound
- if(placed)
+ playeritem_def,
+ nodepos, neighbourpos);
+
+ if(placed) {
+ // Report to server
+ client.interact(3, pointed);
+ // Read the sound
soundmaker.m_player_rightpunch_sound =
- playeritem_def.sound_place;
- else
+ playeritem_def.sound_place;
+ } else {
soundmaker.m_player_rightpunch_sound =
- SimpleSoundSpec();
+ SimpleSoundSpec();
+ }
+
+ if (playeritem_def.node_placement_prediction == "" ||
+ nodedef->get(map.getNode(nodepos)).rightclickable)
+ client.interact(3, pointed); // Report to server
}
}
}
scenetime_avg = scenetime_avg * 0.95 + (float)scenetime*0.05;
static float endscenetime_avg = 0;
endscenetime_avg = endscenetime_avg * 0.95 + (float)endscenetime*0.05;*/
-
+
+ u16 fps = (1.0/dtime_avg1);
+
std::ostringstream os(std::ios_base::binary);
os<<std::fixed
<<"Minetest "<<minetest_version_hash
+ <<" FPS = "<<fps
<<" (R: range_all="<<draw_control.range_all<<")"
<<std::setprecision(0)
<<" drawtime = "<<drawtime_avg
driver->getOverrideMaterial().Material.ColorMask = irr::video::ECP_RED;
driver->getOverrideMaterial().EnableFlags = irr::video::EMF_COLOR_MASK;
- driver->getOverrideMaterial().EnablePasses = irr::scene::ESNRP_SKY_BOX +
+ driver->getOverrideMaterial().EnablePasses = irr::scene::ESNRP_SKY_BOX +
irr::scene::ESNRP_SOLID +
irr::scene::ESNRP_TRANSPARENT +
irr::scene::ESNRP_TRANSPARENT_EFFECT +
End of drawing
*/
- static s16 lastFPS = 0;
- //u16 fps = driver->getFPS();
- u16 fps = (1.0/dtime_avg1);
-
- if (lastFPS != fps)
- {
- core::stringw str = L"Minetest [";
- str += driver->getName();
- str += "] FPS=";
- str += fps;
-
- device->setWindowCaption(str.c_str());
- lastFPS = fps;
- }
-
/*
Log times and stuff for visualization
*/
chat_backend.addMessage(L"", L"# Disconnected.");
chat_backend.addMessage(L"", L"");
+ client.Stop();
+
+ //force answer all texture and shader jobs (TODO return empty values)
+
+ while(!client.isShutdown()) {
+ tsrc->processQueue();
+ shsrc->processQueue();
+ sleep_ms(100);
+ }
+
// Client scope (client is destructed before destructing *def and tsrc)
}while(0);
} // try-catch
L" running a different version of Minetest.";
errorstream<<wide_to_narrow(error_message)<<std::endl;
}
- catch(ServerError &e)
- {
+ catch(ServerError &e) {
error_message = narrow_to_wide(e.what());
- errorstream<<wide_to_narrow(error_message)<<std::endl;
+ errorstream << "ServerError: " << e.what() << std::endl;
}
- catch(ModError &e)
- {
- errorstream<<e.what()<<std::endl;
+ catch(ModError &e) {
+ errorstream << "ModError: " << e.what() << std::endl;
error_message = narrow_to_wide(e.what()) + wgettext("\nCheck debug.txt for details.");
}