X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Fgame.cpp;h=12fe6a6e9480b6ecfb73ec25755379ed7de2cf2f;hb=9762650f978cc7bae78861b70a051b26cc5e2dc6;hp=7d7da35e889e1cfee881ff2abe5f10c91b7d6aa3;hpb=3c4ac70348db5375118d1e714a6d4681c3cfcd05;p=minetest.git diff --git a/src/game.cpp b/src/game.cpp index 7d7da35e8..12fe6a6e9 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -60,7 +60,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "version.h" #include "minimap.h" #include "mapblock_mesh.h" -#include "script/clientscripting.h" +#include "script/scripting_client.h" #include "sound.h" @@ -79,14 +79,15 @@ extern Profiler *g_profiler; Text input system */ -struct TextDestNodeMetadata : public TextDest { +struct TextDestNodeMetadata : public TextDest +{ TextDestNodeMetadata(v3s16 p, Client *client) { m_p = p; m_client = client; } // This is deprecated I guess? -celeron55 - void gotText(std::wstring text) + void gotText(const std::wstring &text) { std::string ntext = wide_to_utf8(text); infostream << "Submitting 'text' field of node at (" << m_p.X << "," @@ -104,13 +105,14 @@ struct TextDestNodeMetadata : public TextDest { Client *m_client; }; -struct TextDestPlayerInventory : public TextDest { +struct TextDestPlayerInventory : public TextDest +{ TextDestPlayerInventory(Client *client) { m_client = client; m_formname = ""; } - TextDestPlayerInventory(Client *client, std::string formname) + TextDestPlayerInventory(Client *client, const std::string &formname) { m_client = client; m_formname = formname; @@ -125,23 +127,18 @@ struct TextDestPlayerInventory : public TextDest { struct LocalFormspecHandler : public TextDest { - LocalFormspecHandler(std::string formname): - m_client(0) + LocalFormspecHandler(const std::string &formname): + m_client(NULL) { m_formname = formname; } - LocalFormspecHandler(std::string formname, Client *client): + LocalFormspecHandler(const std::string &formname, Client *client): m_client(client) { m_formname = formname; } - void gotText(std::wstring message) - { - errorstream << "LocalFormspecHandler::gotText old style message received" << std::endl; - } - void gotText(const StringMap &fields) { if (m_formname == "MT_PAUSE_MENU") { @@ -205,7 +202,8 @@ class NodeMetadataFormSource: public IFormSource return meta->getString("formspec"); } - std::string resolveText(std::string str) + + virtual std::string resolveText(const std::string &str) { NodeMetadata *meta = m_map->getNodeMetadata(m_p); @@ -569,27 +567,35 @@ class SoundMaker class GameOnDemandSoundFetcher: public OnDemandSoundFetcher { std::set m_fetched; +private: + void paths_insert(std::set &dst_paths, + const std::string &base, + const std::string &name) + { + dst_paths.insert(base + DIR_DELIM + "sounds" + DIR_DELIM + name + ".ogg"); + dst_paths.insert(base + DIR_DELIM + "sounds" + DIR_DELIM + name + ".0.ogg"); + dst_paths.insert(base + DIR_DELIM + "sounds" + DIR_DELIM + name + ".1.ogg"); + dst_paths.insert(base + DIR_DELIM + "sounds" + DIR_DELIM + name + ".2.ogg"); + dst_paths.insert(base + DIR_DELIM + "sounds" + DIR_DELIM + name + ".3.ogg"); + dst_paths.insert(base + DIR_DELIM + "sounds" + DIR_DELIM + name + ".4.ogg"); + dst_paths.insert(base + DIR_DELIM + "sounds" + DIR_DELIM + name + ".5.ogg"); + dst_paths.insert(base + DIR_DELIM + "sounds" + DIR_DELIM + name + ".6.ogg"); + dst_paths.insert(base + DIR_DELIM + "sounds" + DIR_DELIM + name + ".7.ogg"); + dst_paths.insert(base + DIR_DELIM + "sounds" + DIR_DELIM + name + ".8.ogg"); + dst_paths.insert(base + DIR_DELIM + "sounds" + DIR_DELIM + name + ".9.ogg"); + } public: void fetchSounds(const std::string &name, - std::set &dst_paths, - std::set &dst_datas) + std::set &dst_paths, + std::set &dst_datas) { if (m_fetched.count(name)) return; m_fetched.insert(name); - std::string base = porting::path_share + DIR_DELIM + "sounds"; - dst_paths.insert(base + DIR_DELIM + name + ".ogg"); - dst_paths.insert(base + DIR_DELIM + name + ".0.ogg"); - dst_paths.insert(base + DIR_DELIM + name + ".1.ogg"); - dst_paths.insert(base + DIR_DELIM + name + ".2.ogg"); - dst_paths.insert(base + DIR_DELIM + name + ".3.ogg"); - dst_paths.insert(base + DIR_DELIM + name + ".4.ogg"); - dst_paths.insert(base + DIR_DELIM + name + ".5.ogg"); - dst_paths.insert(base + DIR_DELIM + name + ".6.ogg"); - dst_paths.insert(base + DIR_DELIM + name + ".7.ogg"); - dst_paths.insert(base + DIR_DELIM + name + ".8.ogg"); - dst_paths.insert(base + DIR_DELIM + name + ".9.ogg"); + + paths_insert(dst_paths, porting::path_share, name); + paths_insert(dst_paths, porting::path_user, name); } }; @@ -1034,6 +1040,7 @@ void KeyCache::populate() key[KeyType::INVENTORY] = getKeySetting("keymap_inventory"); key[KeyType::CHAT] = getKeySetting("keymap_chat"); key[KeyType::CMD] = getKeySetting("keymap_cmd"); + key[KeyType::CMD_LOCAL] = getKeySetting("keymap_cmd_local"); key[KeyType::CONSOLE] = getKeySetting("keymap_console"); key[KeyType::MINIMAP] = getKeySetting("keymap_minimap"); key[KeyType::FREEMOVE] = getKeySetting("keymap_freemove"); @@ -1110,6 +1117,7 @@ struct GameRunData { PointedThing pointed_old; bool digging; bool ldown_for_dig; + bool dig_instantly; bool left_punch; bool update_wielded_item_trigger; bool reset_jump_timer; @@ -1189,7 +1197,7 @@ class Game { u16 port, const SubgameSpec &gamespec); bool initSound(); - bool createSingleplayerServer(const std::string map_dir, + bool createSingleplayerServer(const std::string &map_dir, const SubgameSpec &gamespec, u16 port, std::string *address); // Client creation @@ -1724,9 +1732,10 @@ bool Game::init( u16 port, const SubgameSpec &gamespec) { + texture_src = createTextureSource(device); + showOverlayMessage(wgettext("Loading..."), 0, 0); - texture_src = createTextureSource(device); shader_src = createShaderSource(device); itemdef_manager = createItemDefManager(); @@ -1778,7 +1787,7 @@ bool Game::initSound() return true; } -bool Game::createSingleplayerServer(const std::string map_dir, +bool Game::createSingleplayerServer(const std::string &map_dir, const SubgameSpec &gamespec, u16 port, std::string *address) { showOverlayMessage(wgettext("Creating server..."), 0, 5); @@ -2182,17 +2191,21 @@ bool Game::getServerContent(bool *aborted) if (!client->itemdefReceived()) { const wchar_t *text = wgettext("Item definitions..."); progress = 25; - draw_load_screen(text, device, guienv, dtime, progress); + draw_load_screen(text, device, guienv, texture_src, + dtime, progress); delete[] text; } else if (!client->nodedefReceived()) { const wchar_t *text = wgettext("Node definitions..."); progress = 30; - draw_load_screen(text, device, guienv, dtime, progress); + draw_load_screen(text, device, guienv, texture_src, + dtime, progress); delete[] text; } else { std::stringstream message; - message.precision(3); - message << gettext("Media..."); + std::fixed(message); + message.precision(0); + message << gettext("Media...") << " " << (client->mediaReceiveProgress()*100) << "%"; + message.precision(2); if ((USE_CURL == 0) || (!g_settings->getBool("enable_remote_media_server"))) { @@ -2209,7 +2222,7 @@ bool Game::getServerContent(bool *aborted) progress = 30 + client->mediaReceiveProgress() * 35 + 0.5; draw_load_screen(utf8_to_wide(message.str()), device, - guienv, dtime, progress); + guienv, texture_src, dtime, progress); } } @@ -2449,6 +2462,8 @@ void Game::processKeyInput() openConsole(0.2, L""); } else if (wasKeyDown(KeyType::CMD)) { openConsole(0.2, L"/"); + } else if (wasKeyDown(KeyType::CMD_LOCAL)) { + openConsole(0.2, L"."); } else if (wasKeyDown(KeyType::CONSOLE)) { openConsole(core::clamp(g_settings->getFloat("console_height"), 0.1f, 1.0f)); } else if (wasKeyDown(KeyType::FREEMOVE)) { @@ -3046,7 +3061,10 @@ void Game::processClientEvents(CameraOrientation *cam) for ( ; event.type != CE_NONE; event = client->getClientEvent()) { - if (event.type == CE_PLAYER_DAMAGE && client->getHP() != 0) { + switch (event.type) { + case CE_PLAYER_DAMAGE: + if (client->getHP() == 0) + break; if (client->moddingEnabled()) { client->getScript()->on_damage_taken(event.player_damage.amount); } @@ -3058,12 +3076,15 @@ void Game::processClientEvents(CameraOrientation *cam) player->hurt_tilt_strength = rangelim(event.player_damage.amount / 4, 1.0, 4.0); - MtEvent *e = new SimpleTriggerEvent("PlayerDamage"); - client->event()->put(e); - } else if (event.type == CE_PLAYER_FORCE_MOVE) { + client->event()->put(new SimpleTriggerEvent("PlayerDamage")); + break; + + case CE_PLAYER_FORCE_MOVE: cam->camera_yaw = event.player_force_move.yaw; cam->camera_pitch = event.player_force_move.pitch; - } else if (event.type == CE_DEATHSCREEN) { + break; + + case CE_DEATHSCREEN: // This should be enabled for death formspec in builtin client->getScript()->on_death(); @@ -3071,8 +3092,9 @@ void Game::processClientEvents(CameraOrientation *cam) runData.damage_flash = 0; player->hurt_tilt_timer = 0; player->hurt_tilt_strength = 0; + break; - } else if (event.type == CE_SHOW_FORMSPEC) { + case CE_SHOW_FORMSPEC: if (*(event.show_formspec.formspec) == "") { if (current_formspec && ( *(event.show_formspec.formname) == "" || *(event.show_formspec.formname) == cur_formname) ){ current_formspec->quitMenu(); @@ -3088,53 +3110,64 @@ void Game::processClientEvents(CameraOrientation *cam) cur_formname = *(event.show_formspec.formname); } - delete(event.show_formspec.formspec); - delete(event.show_formspec.formname); - } else if (event.type == CE_SHOW_LOCAL_FORMSPEC) { - FormspecFormSource *fs_src = new FormspecFormSource(*event.show_formspec.formspec); - LocalFormspecHandler *txt_dst = new LocalFormspecHandler(*event.show_formspec.formname, client); - create_formspec_menu(¤t_formspec, client, device, &input->joystick, - fs_src, txt_dst); delete event.show_formspec.formspec; delete event.show_formspec.formname; - } else if ((event.type == CE_SPAWN_PARTICLE) || - (event.type == CE_ADD_PARTICLESPAWNER) || - (event.type == CE_DELETE_PARTICLESPAWNER)) { + break; + + case CE_SHOW_LOCAL_FORMSPEC: + { + FormspecFormSource *fs_src = new FormspecFormSource(*event.show_formspec.formspec); + LocalFormspecHandler *txt_dst = new LocalFormspecHandler(*event.show_formspec.formname, client); + create_formspec_menu(¤t_formspec, client, device, &input->joystick, + fs_src, txt_dst); + } + delete event.show_formspec.formspec; + delete event.show_formspec.formname; + break; + + case CE_SPAWN_PARTICLE: + case CE_ADD_PARTICLESPAWNER: + case CE_DELETE_PARTICLESPAWNER: client->getParticleManager()->handleParticleEvent(&event, client, smgr, player); - } else if (event.type == CE_HUDADD) { - u32 id = event.hudadd.id; - HudElement *e = player->getHud(id); - - if (e != NULL) { - delete event.hudadd.pos; - delete event.hudadd.name; - delete event.hudadd.scale; - delete event.hudadd.text; - delete event.hudadd.align; - delete event.hudadd.offset; - delete event.hudadd.world_pos; - delete event.hudadd.size; - continue; - } + break; - e = new HudElement; - e->type = (HudElementType)event.hudadd.type; - e->pos = *event.hudadd.pos; - e->name = *event.hudadd.name; - e->scale = *event.hudadd.scale; - e->text = *event.hudadd.text; - e->number = event.hudadd.number; - e->item = event.hudadd.item; - e->dir = event.hudadd.dir; - e->align = *event.hudadd.align; - e->offset = *event.hudadd.offset; - e->world_pos = *event.hudadd.world_pos; - e->size = *event.hudadd.size; - - u32 new_id = player->addHud(e); - //if this isn't true our huds aren't consistent - sanity_check(new_id == id); + case CE_HUDADD: + { + u32 id = event.hudadd.id; + + HudElement *e = player->getHud(id); + + if (e != NULL) { + delete event.hudadd.pos; + delete event.hudadd.name; + delete event.hudadd.scale; + delete event.hudadd.text; + delete event.hudadd.align; + delete event.hudadd.offset; + delete event.hudadd.world_pos; + delete event.hudadd.size; + continue; + } + + e = new HudElement; + e->type = (HudElementType)event.hudadd.type; + e->pos = *event.hudadd.pos; + e->name = *event.hudadd.name; + e->scale = *event.hudadd.scale; + e->text = *event.hudadd.text; + e->number = event.hudadd.number; + e->item = event.hudadd.item; + e->dir = event.hudadd.dir; + e->align = *event.hudadd.align; + e->offset = *event.hudadd.offset; + e->world_pos = *event.hudadd.world_pos; + e->size = *event.hudadd.size; + + u32 new_id = player->addHud(e); + //if this isn't true our huds aren't consistent + sanity_check(new_id == id); + } delete event.hudadd.pos; delete event.hudadd.name; @@ -3144,74 +3177,84 @@ void Game::processClientEvents(CameraOrientation *cam) delete event.hudadd.offset; delete event.hudadd.world_pos; delete event.hudadd.size; - } else if (event.type == CE_HUDRM) { - HudElement *e = player->removeHud(event.hudrm.id); - - if (e != NULL) - delete(e); - } else if (event.type == CE_HUDCHANGE) { - u32 id = event.hudchange.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; + break; + + case CE_HUDRM: + { + HudElement *e = player->removeHud(event.hudrm.id); + + if (e != NULL) + delete e; } + break; - switch (event.hudchange.stat) { - case HUD_STAT_POS: - e->pos = *event.hudchange.v2fdata; - break; + case CE_HUDCHANGE: + { + u32 id = event.hudchange.id; + HudElement *e = player->getHud(id); - case HUD_STAT_NAME: - e->name = *event.hudchange.sdata; - break; + if (e == NULL) { + delete event.hudchange.v3fdata; + delete event.hudchange.v2fdata; + delete event.hudchange.sdata; + delete event.hudchange.v2s32data; + continue; + } - case HUD_STAT_SCALE: - e->scale = *event.hudchange.v2fdata; - break; + switch (event.hudchange.stat) { + case HUD_STAT_POS: + e->pos = *event.hudchange.v2fdata; + break; - case HUD_STAT_TEXT: - e->text = *event.hudchange.sdata; - break; + case HUD_STAT_NAME: + e->name = *event.hudchange.sdata; + break; - case HUD_STAT_NUMBER: - e->number = event.hudchange.data; - break; + case HUD_STAT_SCALE: + e->scale = *event.hudchange.v2fdata; + break; - case HUD_STAT_ITEM: - e->item = event.hudchange.data; - break; + case HUD_STAT_TEXT: + e->text = *event.hudchange.sdata; + break; - case HUD_STAT_DIR: - e->dir = event.hudchange.data; - break; + case HUD_STAT_NUMBER: + e->number = event.hudchange.data; + break; - case HUD_STAT_ALIGN: - e->align = *event.hudchange.v2fdata; - break; + case HUD_STAT_ITEM: + e->item = event.hudchange.data; + break; - case HUD_STAT_OFFSET: - e->offset = *event.hudchange.v2fdata; - break; + case HUD_STAT_DIR: + e->dir = event.hudchange.data; + break; - case HUD_STAT_WORLD_POS: - e->world_pos = *event.hudchange.v3fdata; - break; + case HUD_STAT_ALIGN: + e->align = *event.hudchange.v2fdata; + break; - case HUD_STAT_SIZE: - e->size = *event.hudchange.v2s32data; - break; + case HUD_STAT_OFFSET: + e->offset = *event.hudchange.v2fdata; + break; + + case HUD_STAT_WORLD_POS: + e->world_pos = *event.hudchange.v3fdata; + break; + + case HUD_STAT_SIZE: + 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) { + break; + + case CE_SET_SKY: sky->setVisible(false); if (skybox) { @@ -3245,10 +3288,18 @@ void Game::processClientEvents(CameraOrientation *cam) 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); + break; + + case CE_OVERRIDE_DAY_NIGHT_RATIO: + client->getEnv().setDayNightRatioOverride( + event.override_day_night_ratio.do_override, + event.override_day_night_ratio.ratio_f * 1000); + break; + + default: + // unknown or unhandled type + break; + } } } @@ -3361,13 +3412,11 @@ void Game::processPlayerInteraction(f32 dtime, bool show_hud, bool show_debug) playeritem = mlist->getItem(client->getPlayerItem()); } - if (playeritem.getDefinition(itemdef_manager).name.empty()) { // override the hand - InventoryList *hlist = local_inventory->getList("hand"); - if (hlist) - playeritem = hlist->getItem(0); - } const ItemDefinition &playeritem_def = playeritem.getDefinition(itemdef_manager); + InventoryList *hlist = local_inventory->getList("hand"); + const ItemDefinition &hand_def = + hlist ? hlist->getItem(0).getDefinition(itemdef_manager) : itemdef_manager->get(""); v3f player_position = player->getPosition(); v3f camera_position = camera->getPosition(); @@ -3380,7 +3429,7 @@ void Game::processPlayerInteraction(f32 dtime, bool show_hud, bool show_debug) */ f32 d = playeritem_def.range; // max. distance - f32 d_hand = itemdef_manager->get("").range; + f32 d_hand = hand_def.range; if (d < 0 && d_hand >= 0) d = d_hand; @@ -3447,6 +3496,10 @@ void Game::processPlayerInteraction(f32 dtime, bool show_hud, bool show_debug) client->setCrack(-1, v3s16(0, 0, 0)); runData.dig_time = 0.0; } + } else if (runData.dig_instantly && getLeftReleased()) { + // Remove e.g. torches faster when clicking instead of holding LMB + runData.nodig_delay_timer = 0; + runData.dig_instantly = false; } if (!runData.digging && runData.ldown_for_dig && !isLeftPressed()) { @@ -3468,6 +3521,9 @@ void Game::processPlayerInteraction(f32 dtime, bool show_hud, bool show_debug) } else if (pointed.type == POINTEDTHING_NODE) { ToolCapabilities playeritem_toolcap = playeritem.getToolCapabilities(itemdef_manager); + if (playeritem.name.empty()) { + playeritem_toolcap = *hand_def.tool_capabilities; + } handlePointingAtNode(pointed, playeritem_def, playeritem_toolcap, dtime); } else if (pointed.type == POINTEDTHING_OBJECT) { handlePointingAtObject(pointed, playeritem, player_position, show_debug); @@ -3674,6 +3730,9 @@ void Game::handlePointingAtNode(const PointedThing &pointed, const ItemDefinitio // Read the sound soundmaker->m_player_rightpunch_sound = playeritem_def.sound_place; + + if (client->moddingEnabled()) + client->getScript()->on_placenode(pointed, playeritem_def); } else { soundmaker->m_player_rightpunch_sound = SimpleSoundSpec(); @@ -3727,9 +3786,16 @@ void Game::handlePointingAtObject(const PointedThing &pointed, const ItemStack & // Report direct punch v3f objpos = runData.selected_object->getPosition(); v3f dir = (objpos - player_position).normalize(); + ItemStack item = playeritem; + if (playeritem.name.empty()) { + InventoryList *hlist = local_inventory->getList("hand"); + if (hlist) { + item = hlist->getItem(0); + } + } bool disable_send = runData.selected_object->directReportPunch( - dir, &playeritem, runData.time_from_last_punch); + dir, &item, runData.time_from_last_punch); runData.time_from_last_punch = 0; if (!disable_send) @@ -3749,15 +3815,6 @@ void Game::handleDigging(const PointedThing &pointed, const v3s16 &nodepos, ClientMap &map = client->getEnv().getClientMap(); MapNode n = client->getEnv().getClientMap().getNodeNoEx(nodepos); - if (!runData.digging) { - infostream << "Started digging" << std::endl; - if (client->moddingEnabled() && client->getScript()->on_punchnode(nodepos, n)) - return; - client->interact(0, pointed); - runData.digging = true; - runData.ldown_for_dig = true; - } - // NOTE: Similar piece of code exists on the server side for // cheat detection. // Get digging parameters @@ -3766,13 +3823,25 @@ void Game::handleDigging(const PointedThing &pointed, const v3s16 &nodepos, // If can't dig, try hand if (!params.diggable) { - const ItemDefinition &hand = itemdef_manager->get(""); + InventoryList *hlist = local_inventory->getList("hand"); + const ItemDefinition &hand = + hlist ? hlist->getItem(0).getDefinition(itemdef_manager) : itemdef_manager->get(""); const ToolCapabilities *tp = hand.tool_capabilities; if (tp) params = getDigParams(nodedef_manager->get(n).groups, tp); } + if (!runData.digging) { + infostream << "Started digging" << std::endl; + runData.dig_instantly = params.time == 0; + if (client->moddingEnabled() && client->getScript()->on_punchnode(nodepos, n)) + return; + client->interact(0, pointed); + runData.digging = true; + runData.ldown_for_dig = true; + } + if (!params.diggable) { // I guess nobody will wait for this long runData.dig_time_complete = 10000000.0; @@ -3787,12 +3856,12 @@ void Game::handleDigging(const PointedThing &pointed, const v3s16 &nodepos, } } - if (runData.dig_time_complete >= 0.001) { + if (!runData.dig_instantly) { runData.dig_index = (float)crack_animation_length * runData.dig_time / runData.dig_time_complete; } else { - // This is for torches + // This is for e.g. torches runData.dig_index = crack_animation_length; } @@ -3827,17 +3896,12 @@ void Game::handleDigging(const PointedThing &pointed, const v3s16 &nodepos, runData.nodig_delay_timer = runData.dig_time_complete / (float)crack_animation_length; - // We don't want a corresponding delay to - // very time consuming nodes + // We don't want a corresponding delay to very time consuming nodes + // and nodes without digging time (e.g. torches) get a fixed delay. if (runData.nodig_delay_timer > 0.3) runData.nodig_delay_timer = 0.3; - - // We want a slight delay to very little - // time consuming nodes - const float mindelay = 0.15; - - if (runData.nodig_delay_timer < mindelay) - runData.nodig_delay_timer = mindelay; + else if (runData.dig_instantly) + runData.nodig_delay_timer = 0.15; bool is_valid_position; MapNode wasnode = map.getNodeNoEx(nodepos, &is_valid_position); @@ -4058,7 +4122,7 @@ void Game::updateFrame(ProfilerGraph *graph, RunStats *stats, f32 dtime, Drawing begins */ - video::SColor skycolor = sky->getSkyColor(); + const video::SColor &skycolor = sky->getSkyColor(); TimeTaker tt_draw("mainloop: draw"); driver->beginScene(true, true, skycolor); @@ -4306,7 +4370,8 @@ inline void Game::limitFps(FpsControl *fps_timings, f32 *dtime) void Game::showOverlayMessage(const wchar_t *msg, float dtime, int percent, bool draw_clouds) { - draw_load_screen(msg, device, guienv, dtime, percent, draw_clouds); + draw_load_screen(msg, device, guienv, texture_src, dtime, percent, + draw_clouds); delete[] msg; }