#include "guiPasswordChange.h"
#include "guiVolumeChange.h"
#include "guiFormSpecMenu.h"
-#include "guiTextInputMenu.h"
#include "tool.h"
#include "guiChatConsole.h"
#include "config.h"
#include "drawscene.h"
#include "content_cao.h"
+#ifdef HAVE_TOUCHSCREENGUI
+#include "touchscreengui.h"
+#endif
+
/*
Text input system
*/
// That didn't work, try to find a pointed at node
-
+
v3s16 pos_i = floatToInt(player_position, BS);
/*infostream<<"pos_i=("<<pos_i.X<<","<<pos_i.Y<<","<<pos_i.Z<<")"
s16 yend = pos_i.Y + 1 + (camera_direction.Y>0 ? a : 1);
s16 zend = pos_i.Z + (camera_direction.Z>0 ? a : 1);
s16 xend = pos_i.X + (camera_direction.X>0 ? a : 1);
-
+
// Prevent signed number overflow
if(yend==32767)
yend=32766;
while(m_log.size() > m_log_max_size)
m_log.erase(m_log.begin());
}
-
+
void draw(s32 x_left, s32 y_bottom, video::IVideoDriver *driver,
gui::IGUIFont* font) const
{
s32 graphh = 50;
s32 textx = x_left + m_log_max_size + 15;
s32 textx2 = textx + 200 - 15;
-
+
// Draw background
/*{
u32 num_graphs = m_meta.size();
video::SColor bgcolor(120,0,0,0);
driver->draw2DRectangle(bgcolor, rect, NULL);
}*/
-
+
s32 meta_i = 0;
for(std::map<std::string, Meta>::const_iterator i = m_meta.begin();
i != m_meta.end(); i++){
public:
v3s16 p;
MapNode n;
-
+
NodeDugEvent(v3s16 p, MapNode n):
p(p),
n(n)
u32 daynight_ratio = m_client->getEnv().getDayNightRatio();
float daynight_ratio_f = (float)daynight_ratio / 1000.0;
services->setPixelShaderConstant("dayNightRatio", &daynight_ratio_f, 1);
-
+
u32 animation_timer = porting::getTimeMs() % 100000;
float animation_timer_f = (float)animation_timer / 100000.0;
services->setPixelShaderConstant("animationTimer", &animation_timer_f, 1);
}
}
+#ifdef __ANDROID__
+#define SIZE_TAG "size[11,5.5]"
+#else
+#define SIZE_TAG "size[11,5.5,true]"
+#endif
+
static void show_chat_menu(GUIFormSpecMenu** cur_formspec,
InventoryManager *invmgr, IGameDef *gamedef,
IWritableTextureSource* tsrc, IrrlichtDevice * device,
Client* client, std::string text)
{
std::string formspec =
- "size[11,5.5,true]"
+ FORMSPEC_VERSION_STRING
+ SIZE_TAG
"field[3,2.35;6,0.5;f_text;;" + text + "]"
"button_exit[4,3;3,0.5;btn_send;" + wide_to_narrow(wstrgettext("Proceed")) + "]"
;
IWritableTextureSource* tsrc, IrrlichtDevice * device, Client* client)
{
std::string formspec =
- std::string("") +
- "size[11,5.5,true]"
+ std::string(FORMSPEC_VERSION_STRING) +
+ SIZE_TAG
"bgcolor[#320000b4;true]"
"label[4.85,1.35;You died.]"
"button_exit[4,3;3,0.5;btn_respawn;" + gettext("Respawn") + "]"
IWritableTextureSource* tsrc, IrrlichtDevice * device,
bool singleplayermode)
{
+#ifdef __ANDROID__
+ std::string control_text = wide_to_narrow(wstrgettext("Default Controls:\n"
+ "No menu visible:\n"
+ "- single tap: button activate\n"
+ "- double tap: place/use\n"
+ "- slide finger: look around\n"
+ "Menu/Inventory visible:\n"
+ "- double tap (outside):\n"
+ " -->close\n"
+ "- touch stack, touch slot:\n"
+ " --> move stack\n"
+ "- touch&drag, tap 2nd finger\n"
+ " --> place single item to slot\n"
+ ));
+#else
std::string control_text = wide_to_narrow(wstrgettext("Default Controls:\n"
"- WASD: move\n"
"- Space: jump/climb\n"
"- Mouse wheel: select item\n"
"- T: chat\n"
));
-
+#endif
float ypos = singleplayermode ? 1.0 : 0.5;
std::ostringstream os;
- os << "size[11,5.5,true]"
+ os << FORMSPEC_VERSION_STRING << SIZE_TAG
<< "button_exit[4," << (ypos++) << ";3,0.5;btn_continue;"
<< wide_to_narrow(wstrgettext("Continue")) << "]";
<< wide_to_narrow(wstrgettext("Exit to Menu")) << "]";
os << "button_exit[4," << (ypos++) << ";3,0.5;btn_exit_os;"
<< wide_to_narrow(wstrgettext("Exit to OS")) << "]"
- << "textarea[7.5,0.25;3.75,6;;" << control_text << ";]"
+ << "textarea[7.5,0.25;3.9,6.25;;" << control_text << ";]"
<< "textarea[0.4,0.25;3.5,6;;" << "Minetest\n"
<< minetest_build_info << "\n"
<< "path_user = " << wrap_rows(porting::path_user, 20)
LocalFormspecHandler* txt_dst = new LocalFormspecHandler("MT_PAUSE_MENU");
create_formspec_menu(cur_formspec, invmgr, gamedef, tsrc, device, fs_src, txt_dst);
-
+
if (singleplayermode) {
(*cur_formspec)->doPause = true;
}
GUIFormSpecMenu* current_formspec = 0;
video::IVideoDriver* driver = device->getVideoDriver();
scene::ISceneManager* smgr = device->getSceneManager();
-
+
// Calculate text height using the font
u32 text_height = font->getDimension(L"Random test string").Height;
draw_load_screen(text, device, guienv, font, 0, 0);
delete[] text;
}
-
+
// Create texture source
IWritableTextureSource *tsrc = createTextureSource(device);
-
+
// Create shader source
IWritableShaderSource *shsrc = createShaderSource(device);
-
+
// These will be filled by data received from the server
// Create item definition manager
IWritableItemDefManager *itemdef = createItemDefManager();
// Create node definition manager
IWritableNodeDefManager *nodedef = createNodeDefManager();
-
+
// Sound fetcher (useful when testing)
GameOnDemandSoundFetcher soundfetcher;
// Sound maker
SoundMaker soundmaker(sound, nodedef);
soundmaker.registerReceiver(&eventmgr);
-
+
// Add chat log output for errors to be shown in chat
LogOutputBuffer chat_log_error_buf(LMT_ERROR);
}
do{ // Client scope (breakable do-while(0))
-
+
/*
Create client
*/
delete[] text;
}
infostream<<"Creating client"<<std::endl;
-
+
MapDrawControl draw_control;
-
+
{
wchar_t* text = wgettext("Resolving address...");
draw_load_screen(text, device, guienv, font, 0, 75);
// Break out of client scope
break;
}
-
+
/*
Create client
*/
Client client(device, playername.c_str(), password, draw_control,
tsrc, shsrc, itemdef, nodedef, sound, &eventmgr,
connect_address.isIPv6());
-
+
// Client acts as our GameDef
IGameDef *gamedef = &client;
/*
Attempt to connect to the server
*/
-
+
infostream<<"Connecting to server at ";
connect_address.print(&infostream);
infostream<<std::endl;
client.connect(connect_address);
-
+
/*
Wait for server to accept connection
*/
client.step(dtime);
if(server != NULL)
server->step(dtime);
-
+
// End condition
- if(client.getState() == LC_Init){
+ if(client.getState() == LC_Init) {
could_connect = true;
break;
}
// Break conditions
- if(client.accessDenied()){
+ if(client.accessDenied()) {
error_message = L"Access denied. Reason: "
+client.accessDeniedReason();
errorstream<<wide_to_narrow(error_message)<<std::endl;
break;
}
- if(input->wasKeyDown(EscapeKey)){
+ if(input->wasKeyDown(EscapeKey) || input->wasKeyDown(CancelKey)) {
connect_aborted = true;
infostream<<"Connect aborted [Escape]"<<std::endl;
break;
}
-
+
// Display status
{
wchar_t* text = wgettext("Connecting to server...");
draw_load_screen(text, device, guienv, font, dtime, 100);
delete[] text;
}
-
+
// On some computers framerate doesn't seem to be
// automatically limited
if (cloud_menu_background) {
}
catch(con::PeerNotFoundException &e)
{}
-
+
/*
Handle failure to connect
*/
- if(!could_connect){
- if(error_message == L"" && !connect_aborted){
+ if(!could_connect) {
+ if(error_message == L"" && !connect_aborted) {
error_message = L"Connection failed";
errorstream<<wide_to_narrow(error_message)<<std::endl;
}
// Break out of client scope
break;
}
-
+
/*
Wait until content has been received
*/
float fps_max = g_settings->getFloat("fps_max");
bool cloud_menu_background = g_settings->getBool("menu_clouds");
u32 lasttime = device->getTimer()->getTime();
- while(device->run())
- {
+ while (device->run()) {
f32 dtime = 0.033; // in seconds
if (cloud_menu_background) {
u32 time = device->getTimer()->getTime();
}
// Update client and server
client.step(dtime);
- if(server != NULL)
+ if (server != NULL)
server->step(dtime);
-
+
// End condition
- if(client.mediaReceived() &&
+ if (client.mediaReceived() &&
client.itemdefReceived() &&
- client.nodedefReceived()){
+ client.nodedefReceived()) {
got_content = true;
break;
}
// Break conditions
- if(client.accessDenied()){
+ if (client.accessDenied()) {
error_message = L"Access denied. Reason: "
+client.accessDeniedReason();
errorstream<<wide_to_narrow(error_message)<<std::endl;
break;
}
- if(client.getState() < LC_Init){
+ if (client.getState() < LC_Init) {
error_message = L"Client disconnected";
errorstream<<wide_to_narrow(error_message)<<std::endl;
break;
}
- if(input->wasKeyDown(EscapeKey)){
+ if (input->wasKeyDown(EscapeKey) || input->wasKeyDown(CancelKey)) {
content_aborted = true;
infostream<<"Connect aborted [Escape]"<<std::endl;
break;
}
-
+
// Display status
int progress=0;
if (!client.itemdefReceived())
draw_load_screen(narrow_to_wide(message.str().c_str()), device,
guienv, font, dtime, progress);
}
-
+
// On some computers framerate doesn't seem to be
// automatically limited
if (cloud_menu_background) {
/*
Clouds
*/
-
+
Clouds *clouds = NULL;
if(g_settings->getBool("enable_clouds"))
{
sky = new Sky(smgr->getRootSceneNode(), smgr, -1);
scene::ISceneNode* skybox = NULL;
-
+
/*
A copy of the local inventory
*/
L"",
core::rect<s32>(0,0,400,text_height*5+5) + v2s32(100,200),
false, true);
-
+
// Status text (displays info when showing and hiding GUI stuff, etc.)
gui::IGUIStaticText *guitext_status = guienv->addStaticText(
L"<Status>",
core::rect<s32>(0,0,0,0),
false, false);
guitext_status->setVisible(false);
-
+
std::wstring statustext;
float statustext_time = 0;
-
+
// Chat text
gui::IGUIStaticText *guitext_chat = guienv->addStaticText(
L"",
chat_backend.clearRecentChat();
// Chat backend and console
GUIChatConsole *gui_chat_console = new GUIChatConsole(guienv, guienv->getRootGUIElement(), -1, &chat_backend, &client);
-
+
// Profiler text (size is updated when text is updated)
gui::IGUIStaticText *guitext_profiler = guienv->addStaticText(
L"<Profiler>",
guitext_profiler->setBackgroundColor(video::SColor(120,0,0,0));
guitext_profiler->setVisible(false);
guitext_profiler->setWordWrap(true);
-
+
+#ifdef HAVE_TOUCHSCREENGUI
+ if (g_touchscreengui)
+ g_touchscreengui->init(tsrc,porting::getDisplayDensity());
+#endif
+
/*
Some statistics are collected in these
*/
u32 drawtime = 0;
u32 beginscenetime = 0;
u32 endscenetime = 0;
-
+
float recent_turn_speed = 0.0;
-
+
ProfilerGraph graph;
// Initially clear the profiler
Profiler::GraphValues dummyvalues;
LocalPlayer* player = client.getEnv().getLocalPlayer();
player->hurt_tilt_timer = 0;
player->hurt_tilt_strength = 0;
-
+
/*
HUD object
*/
for(;;)
{
- if(device->run() == false || kill == true)
+ if(device->run() == false || kill == true ||
+ g_gamecallback->shutdown_requested)
break;
v2u32 screensize = driver->getScreenSize();
busytime_u32 = 0;
busytime = busytime_u32 / 1000.0;
}
-
+
g_profiler->graphAdd("mainloop_other", busytime - (float)drawtime/1000.0f);
// Necessary for device->getTimer()->getTime()
g_settings->getFloat("pause_fps_max") :
g_settings->getFloat("fps_max");
u32 frametime_min = 1000./fps_max;
-
+
if(busytime_u32 < frametime_min)
{
u32 sleeptime = frametime_min - busytime_u32;
Time difference calculation
*/
f32 dtime; // in seconds
-
+
u32 time = device->getTimer()->getTime();
if(time > lasttime)
dtime = (time - lasttime) / 1000.0;
if(object_hit_delay_timer >= 0)
object_hit_delay_timer -= dtime;
time_from_last_punch += dtime;
-
+
g_profiler->add("Elapsed time", dtime);
g_profiler->avg("FPS", 1./dtime);
jitter1_max = 0.0;
}
}
-
+
/*
Busytime average and jitter calculation
*/
static f32 busytime_avg1 = 0.0;
busytime_avg1 = busytime_avg1 * 0.98 + busytime * 0.02;
f32 busytime_jitter1 = busytime - busytime_avg1;
-
+
static f32 busytime_jitter1_max_sample = 0.0;
static f32 busytime_jitter1_min_sample = 0.0;
{
/*
Handle miscellaneous stuff
*/
-
+
if(client.accessDenied())
{
error_message = L"Access denied. Reason: "
Random calculations
*/
hud.resizeHotbar();
-
+
// Hilight boxes collected during the loop and displayed
std::vector<aabb3f> hilightboxes;
/*
Direct handling of user input
*/
-
+
// Reset input if window not active or some menu is active
if(device->isWindowActive() == false
|| noMenuActive() == false
// Input handler step() (used by the random input generator)
input->step(dtime);
+#ifdef HAVE_TOUCHSCREENGUI
+ if (g_touchscreengui) {
+ g_touchscreengui->step(dtime);
+ }
+#endif
+#ifdef __ANDROID__
+ if (current_formspec != 0)
+ current_formspec->getAndroidUIInput();
+#endif
// Increase timer for doubleclick of "jump"
if(g_settings->getBool("doubletap_jump") && jump_timer <= 0.2)
{
infostream<<"the_game: "
<<"Launching inventory"<<std::endl;
-
+
PlayerInventoryFormSource* fs_src = new PlayerInventoryFormSource(&client);
TextDest* txt_dst = new TextDestPlayerInventory(&client);
inventoryloc.setCurrentPlayer();
current_formspec->setFormSpec(fs_src->getForm(), inventoryloc);
}
- else if(input->wasKeyDown(EscapeKey))
+ else if(input->wasKeyDown(EscapeKey) || input->wasKeyDown(CancelKey))
{
show_pause_menu(¤t_formspec, &client, gamedef, tsrc, device,
simple_singleplayer_mode);
+ itos(range_new));
statustext_time = 0;
}
-
+
// Reset jump_timer
if(!input->isKeyDown(getKeySetting("keymap_jump")) && reset_jump_timer)
{
new_playeritem = max_item;
}
}
-
+
// Item selection
for(u16 i=0; i<10; i++)
{
Mouse and camera control
NOTE: Do this before client.setPlayerControl() to not cause a camera lag of one frame
*/
-
+
float turn_amount = 0;
if((device->isWindowActive() && noMenuActive()) || random_input)
{
+#ifndef __ANDROID__
if(!random_input)
{
// Mac OSX gets upset if this is set every frame
if(device->getCursorControl()->isVisible())
device->getCursorControl()->setVisible(false);
}
+#endif
if(first_loop_after_window_activation){
//infostream<<"window active, first loop"<<std::endl;
first_loop_after_window_activation = false;
- }
- else{
- s32 dx = input->getMousePos().X - (driver->getScreenSize().Width/2);
- s32 dy = input->getMousePos().Y - (driver->getScreenSize().Height/2);
- if(invert_mouse || camera.getCameraMode() == CAMERA_MODE_THIRD_FRONT) {
+ } else {
+#ifdef HAVE_TOUCHSCREENGUI
+ if (g_touchscreengui) {
+ camera_yaw = g_touchscreengui->getYaw();
+ camera_pitch = g_touchscreengui->getPitch();
+ } else {
+#endif
+ s32 dx = input->getMousePos().X - (driver->getScreenSize().Width/2);
+ s32 dy = input->getMousePos().Y - (driver->getScreenSize().Height/2);
+ if ((invert_mouse)
+ || (camera.getCameraMode() == CAMERA_MODE_THIRD_FRONT)) {
dy = -dy;
}
//infostream<<"window active, pos difference "<<dx<<","<<dy<<std::endl;
-
+
/*const float keyspeed = 500;
if(input->isKeyDown(irr::KEY_UP))
dy -= dtime * keyspeed;
dx -= dtime * keyspeed;
if(input->isKeyDown(irr::KEY_RIGHT))
dx += dtime * keyspeed;*/
-
+
float d = g_settings->getFloat("mouse_sensitivity");
d = rangelim(d, 0.01, 100.0);
camera_yaw -= dx*d;
camera_pitch += dy*d;
+ turn_amount = v2f(dx, dy).getLength() * d;
+
+#ifdef HAVE_TOUCHSCREENGUI
+ }
+#endif
if(camera_pitch < -89.5) camera_pitch = -89.5;
if(camera_pitch > 89.5) camera_pitch = 89.5;
-
- turn_amount = v2f(dx, dy).getLength() * d;
}
input->setMousePos((driver->getScreenSize().Width/2),
(driver->getScreenSize().Height/2));
}
else{
+#ifndef ANDROID
// Mac OSX gets upset if this is set every frame
if(device->getCursorControl()->isVisible() == false)
device->getCursorControl()->setVisible(true);
+#endif
//infostream<<"window inactive"<<std::endl;
first_loop_after_window_activation = true;
{
// Read client events
- for(;;)
- {
+ for(;;) {
ClientEvent event = client.getClientEvent();
- if(event.type == CE_NONE)
- {
+ if(event.type == CE_NONE) {
break;
}
else if(event.type == CE_PLAYER_DAMAGE &&
- client.getHP() != 0)
- {
+ client.getHP() != 0) {
//u16 damage = event.player_damage.amount;
//infostream<<"Player damage: "<<damage<<std::endl;
MtEvent *e = new SimpleTriggerEvent("PlayerDamage");
gamedef->event()->put(e);
}
- else if(event.type == CE_PLAYER_FORCE_MOVE)
- {
+ 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)
- {
+ else if(event.type == CE_DEATHSCREEN) {
show_deathscreen(¤t_formspec, &client, gamedef, tsrc,
device, &client);
player->hurt_tilt_strength = 0;
}
- else if (event.type == CE_SHOW_FORMSPEC)
- {
+ else if (event.type == CE_SHOW_FORMSPEC) {
FormspecFormSource* fs_src =
new FormspecFormSource(*(event.show_formspec.formspec));
TextDestPlayerInventory* txt_dst =
delete(event.show_formspec.formspec);
delete(event.show_formspec.formname);
}
- else if(event.type == CE_SPAWN_PARTICLE)
- {
+ else if(event.type == CE_SPAWN_PARTICLE) {
LocalPlayer* player = client.getEnv().getLocalPlayer();
video::ITexture *texture =
gamedef->tsrc()->getTexture(*(event.spawn_particle.texture));
v2f(0.0, 0.0),
v2f(1.0, 1.0));
}
- else if(event.type == CE_ADD_PARTICLESPAWNER)
- {
+ else if(event.type == CE_ADD_PARTICLESPAWNER) {
LocalPlayer* player = client.getEnv().getLocalPlayer();
video::ITexture *texture =
gamedef->tsrc()->getTexture(*(event.add_particlespawner.texture));
texture,
event.add_particlespawner.id);
}
- else if(event.type == CE_DELETE_PARTICLESPAWNER)
- {
+ else if(event.type == CE_DELETE_PARTICLESPAWNER) {
delete_particlespawner (event.delete_particlespawner.id);
}
- else if (event.type == CE_HUDADD)
- {
+ else if (event.type == CE_HUDADD) {
u32 id = event.hudadd.id;
- size_t nhudelem = player->hud.size();
- if (id > nhudelem || (id < nhudelem && player->hud[id])) {
+
+ HudElement *e = player->getHud(id);
+
+ if (e != NULL) {
delete event.hudadd.pos;
delete event.hudadd.name;
delete event.hudadd.scale;
delete event.hudadd.size;
continue;
}
-
- HudElement *e = new HudElement;
+
+ e = new HudElement;
e->type = (HudElementType)event.hudadd.type;
e->pos = *event.hudadd.pos;
e->name = *event.hudadd.name;
e->offset = *event.hudadd.offset;
e->world_pos = *event.hudadd.world_pos;
e->size = *event.hudadd.size;
-
- if (id == nhudelem)
- player->hud.push_back(e);
- else
- player->hud[id] = e;
+
+ u32 new_id = player->addHud(e);
+ //if this isn't true our huds aren't consistent
+ assert(new_id == id);
delete event.hudadd.pos;
delete event.hudadd.name;
delete event.hudadd.world_pos;
delete event.hudadd.size;
}
- else if (event.type == CE_HUDRM)
- {
- u32 id = event.hudrm.id;
- if (id < player->hud.size() && player->hud[id]) {
- delete player->hud[id];
- player->hud[id] = NULL;
- }
+ else if (event.type == CE_HUDRM) {
+ HudElement* e = player->removeHud(event.hudrm.id);
+
+ if (e != NULL)
+ delete (e);
}
- else if (event.type == CE_HUDCHANGE)
- {
+ else if (event.type == CE_HUDCHANGE) {
u32 id = event.hudchange.id;
- if (id >= player->hud.size() || !player->hud[id]) {
+ HudElement* e = player->getHud(id);
+ if (e == NULL)
+ {
delete event.hudchange.v3fdata;
delete event.hudchange.v2fdata;
delete event.hudchange.sdata;
delete event.hudchange.v2s32data;
continue;
}
-
- HudElement* e = player->hud[id];
+
switch (event.hudchange.stat) {
case HUD_STAT_POS:
e->pos = *event.hudchange.v2fdata;
e->size = *event.hudchange.v2s32data;
break;
}
-
+
delete event.hudchange.v3fdata;
delete event.hudchange.v2fdata;
delete event.hudchange.sdata;
delete event.hudchange.v2s32data;
}
- else if (event.type == CE_SET_SKY)
- {
+ else if (event.type == CE_SET_SKY) {
sky->setVisible(false);
if(skybox){
- skybox->drop();
+ skybox->remove();
skybox = NULL;
}
// Handle according to type
- if(*event.set_sky.type == "regular"){
+ if(*event.set_sky.type == "regular") {
sky->setVisible(true);
}
else if(*event.set_sky.type == "skybox" &&
- event.set_sky.params->size() == 6){
+ event.set_sky.params->size() == 6) {
sky->setFallbackBgColor(*event.set_sky.bgcolor);
skybox = smgr->addSkyBoxSceneNode(
tsrc->getTexture((*event.set_sky.params)[0]),
delete event.set_sky.type;
delete event.set_sky.params;
}
- else if (event.type == CE_OVERRIDE_DAY_NIGHT_RATIO)
- {
+ 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);
}
}
}
-
+
//TimeTaker //timer2("//timer2");
/*
ItemStack playeritem;
{
InventoryList *mlist = local_inventory.getList("main");
- if(mlist != NULL)
- {
+ if((mlist != NULL) && (client.getPlayerItem() < mlist->getSize()))
playeritem = mlist->getItem(client.getPlayerItem());
- }
}
const ItemDefinition &playeritem_def =
playeritem.getDefinition(itemdef);
ToolCapabilities playeritem_toolcap =
playeritem.getToolCapabilities(itemdef);
-
+
/*
Update camera
*/
v3s16 camera_offset = camera.getOffset();
bool camera_offset_changed = (camera_offset != old_camera_offset);
-
+
if(!disable_camera_update){
client.getEnv().getClientMap().updateCamera(camera_position,
camera_direction, camera_fov, camera_offset);
clouds->updateCameraOffset(camera_offset);
}
}
-
+
// Update sound listener
sound->updateListener(camera.getCameraNode()->getPosition()+intToFloat(camera_offset, BS),
v3f(0,0,0), // velocity
*/
{
soundmaker.step(dtime);
-
+
ClientMap &map = client.getEnv().getClientMap();
MapNode n = map.getNodeNoEx(player->getStandingNodePos());
soundmaker.m_player_step_sound = nodedef->get(n).sound_footstep;
/*
Calculate what block is the crosshair pointing to
*/
-
+
//u32 t1 = device->getTimer()->getRealTime();
-
+
f32 d = playeritem_def.range; // max. distance
f32 d_hand = itemdef->get("").range;
if(d < 0 && d_hand >= 0)
core::line3d<f32> shootline(camera_position,
camera_position + camera_direction * BS * (d+1));
+
// prevent player pointing anything in front-view
if (camera.getCameraMode() == CAMERA_MODE_THIRD_FRONT)
shootline = core::line3d<f32>(0,0,0,0,0,0);
+#ifdef HAVE_TOUCHSCREENGUI
+ if ((g_settings->getBool("touchtarget")) && (g_touchscreengui)) {
+ shootline = g_touchscreengui->getShootline();
+ shootline.start += intToFloat(camera_offset,BS);
+ shootline.end += intToFloat(camera_offset,BS);
+ }
+#endif
+
ClientActiveObject *selected_object = NULL;
PointedThing pointed = getPointedThing(
/*
Check information text of node
*/
-
+
ClientMap &map = client.getEnv().getClientMap();
NodeMetadata *meta = map.getNodeMetadata(nodepos);
if(meta){
infotext += narrow_to_wide(nodedef->get(n).name);
}
}
-
+
/*
Handle digging
*/
-
+
if(nodig_delay_timer <= 0.0 && input->getLeftState()
&& client.checkPrivilege("interact"))
{
ldown_for_dig = true;
}
MapNode n = client.getEnv().getClientMap().getNode(nodepos);
-
+
// NOTE: Similar piece of code exists on the server side for
// cheat detection.
// Get digging parameters
float mindelay = 0.15;
if(nodig_delay_timer < mindelay)
nodig_delay_timer = mindelay;
-
+
// Send event to trigger sound
MtEvent *e = new NodeDugEvent(nodepos, wasnode);
gamedef->event()->put(e);
{
repeat_rightclick_timer = 0;
infostream<<"Ground right-clicked"<<std::endl;
-
- // Sign special case, at least until formspec is properly implemented.
- // Deprecated?
- if(meta && meta->getString("formspec") == "hack:sign_text_input"
- && !random_input
- && !input->isKeyDown(getKeySetting("keymap_sneak")))
- {
- infostream<<"Launching metadata text input"<<std::endl;
-
- // Get a new text for it
-
- TextDest *dest = new TextDestNodeMetadata(nodepos, &client);
-
- std::wstring wtext = narrow_to_wide(meta->getString("text"));
- (new GUITextInputMenu(guienv, guiroot, -1,
- &g_menumgr, dest,
- wtext))->drop();
- }
- // If metadata provides an inventory view, activate it
- else if(meta && meta->getString("formspec") != "" && !random_input
+ if(meta && meta->getString("formspec") != "" && !random_input
&& !input->isKeyDown(getKeySetting("keymap_sneak")))
{
infostream<<"Launching custom inventory view"<<std::endl;
InventoryLocation inventoryloc;
inventoryloc.setNodeMeta(nodepos);
-
+
NodeMetadataFormSource* fs_src = new NodeMetadataFormSource(
&client.getEnv().getClientMap(), nodepos);
TextDest* txt_dst = new TextDestNodeMetadata(nodepos, &client);
// Report direct punch
v3f objpos = selected_object->getPosition();
v3f dir = (objpos - player_position).normalize();
-
+
bool disable_send = selected_object->directReportPunch(
dir, &playeritem, time_from_last_punch);
time_from_last_punch = 0;
}
pointed_old = pointed;
-
+
if(left_punch || input->getLeftClicked())
{
camera.setDigging(0); // left click animation
input->resetLeftReleased();
input->resetRightReleased();
-
+
/*
Calculate stuff for drawing
*/
/*
Fog range
*/
-
+
if(draw_control.range_all)
fog_range = 100000*BS;
else {
daynight_ratio, (int)(old_brightness*255.5), &sunlight_seen)
/ 255.0;
}
-
+
time_of_day = client.getEnv().getTimeOfDayF();
float maxsm = 0.05;
if(fabs(time_of_day - time_of_day_smooth) > maxsm &&
else
time_of_day_smooth = time_of_day_smooth * (1.0-todsm)
+ time_of_day * todsm;
-
+
sky->update(time_of_day_smooth, time_brightness, direct_brightness,
sunlight_seen,camera.getCameraMode(), player->getYaw(),
player->getPitch());
-
+
video::SColor bgcolor = sky->getBgColor();
video::SColor skycolor = sky->getSkyColor();
clouds->setVisible(false);
}
}
-
+
/*
Update particles
*/
allparticles_step(dtime);
allparticlespawners_step(dtime, client.getEnv());
-
+
/*
Fog
*/
-
+
if(g_settings->getBool("enable_fog") && !force_fog_off)
{
driver->setFog(
*/
//TimeTaker guiupdatetimer("Gui updating");
-
+
if(show_debug)
{
static float drawtime_avg = 0;
{
guitext2->setVisible(false);
}
-
+
{
guitext_info->setText(infotext.c_str());
guitext_info->setVisible(show_hud && g_menumgr.menuCount() == 0);
core::rect<s32> rect(
10,
status_y - guitext_status->getTextHeight(),
- screensize.X - 10,
+ 10 + guitext_status->getTextWidth(),
status_y
);
guitext_status->setRelativePosition(rect);
guitext_status->enableOverrideColor(true);
}
}
-
+
/*
Get chat messages from client
*/
/*
Inventory
*/
-
+
if(client.getPlayerItem() != new_playeritem)
{
client.selectPlayerItem(new_playeritem);
{
//infostream<<"Updating local inventory"<<std::endl;
client.getLocalInventory(local_inventory);
-
+
update_wielded_item_trigger = true;
}
if(update_wielded_item_trigger)
// Update wielded tool
InventoryList *mlist = local_inventory.getList("main");
ItemStack item;
- if(mlist != NULL)
+ if((mlist != NULL) && (client.getPlayerItem() < mlist->getSize()))
item = mlist->getItem(client.getPlayerItem());
camera.wield(item, client.getPlayerItem());
}
beginscenetime = timer.stop(true);
}
-
+
draw_scene(driver, smgr, camera, client, player, hud, guienv,
hilightboxes, screensize, skycolor, show_hud);
- /*
- Post effects
- */
- {
- client.getEnv().getClientMap().renderPostFx(camera.getCameraMode());
- }
-
/*
Profiler graph
*/
driver->draw2DRectangle(color,
core::rect<s32>(0,0,screensize.X,screensize.Y),
NULL);
-
+
damage_flash -= 100.0*dtime;
}
if (sky)
sky->drop();
clear_particles();
-
+
+ /* cleanup menus */
+ while (g_menumgr.menuCount() > 0)
+ {
+ g_menumgr.m_stack.front()->setVisible(false);
+ g_menumgr.deletingMenu(g_menumgr.m_stack.front());
+ }
/*
Draw a "shutting down" screen, which will be shown while the map
generator and other stuff quits
*/
{
- /*gui::IGUIStaticText *gui_shuttingdowntext = */
wchar_t* text = wgettext("Shutting down stuff...");
draw_load_screen(text, device, guienv, font, 0, -1, false);
delete[] text;
- /*driver->beginScene(true, true, video::SColor(255,0,0,0));
- guienv->drawAll();
- driver->endScene();
- gui_shuttingdowntext->remove();*/
}
chat_backend.addMessage(L"", L"# Disconnected.");
}
-
+
if(!sound_is_dummy)
delete sound;