Luanti 5.18.0-dev
Loading...
Searching...
No Matches
game_internal.h
Go to the documentation of this file.
1// Luanti
2// SPDX-License-Identifier: LGPL-2.1-or-later
3// Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com>
4
5#pragma once
6
7#include "game.h"
8
9#include <AnimatedMeshSceneNode.h>
10#include <optional>
11#include <vector>
12#include "camera.h"
13#include "client.h"
14#include "client/clientevent.h"
17#include "clientdynamicinfo.h"
18#include "clouds.h"
19#include "gui/touchcontrols.h"
20#include "irr_ptr.h"
22#include "log_internal.h"
23#include "sky.h"
24#include "util/pointedthing.h"
25
26/* DO NOT INCLUDE THIS FROM OUTSIDE GAME.CPP */
27
28class Game;
29class GameUI;
30class SoundMaker;
31class Server;
32class NodeMetadata;
33class ProfilerGraph;
34class EventManager;
35class GUIChatConsole;
37struct GameErrorData;
38
39const static float object_hit_delay = 0.2;
40
41const static u16 bbox_debug_flag = scene::EDS_BBOX_ALL;
42
43/* The reason the following structs are not anonymous structs within the
44 * class is that they are not used by the majority of member functions and
45 * many functions that do require objects of thse types do not modify them
46 * (so they can be passed as a const qualified parameter)
47 */
48
81
86
87// Animations are paused by setting their FPS to 0.
88// We need to remember the original FPS for each track to allow resumption.
89struct PausedNode {
90 irr_ptr<scene::AnimatedMeshSceneNode> node;
91 struct Track {
92 u16 id;
93 f32 fps;
94 };
95 std::vector<Track> tracks;
96};
97
98using PausedNodesList = std::vector<PausedNode>;
99
100/* This is not intended to be a public class. If a public class becomes
101 * desirable then it may be better to create another 'wrapper' class that
102 * hides most of the stuff in this class (nothing in this class is required
103 * by any other file) but exposes the public methods/data only.
104 */
105class Game {
106public:
107 Game();
108 ~Game();
109
110 bool startup(volatile std::sig_atomic_t *kill,
112 RenderingEngine *rendering_engine,
113 GameStartData &game_params,
116
117 void run();
118 void shutdown();
119
120 Client *getClient() { return client; }
121
122 // Pre-calculated value
124
125protected:
126
127 // Basic initialisation
128 bool init(GameStartData &start_data);
129 bool initSound();
130 bool createServer(GameStartData &start_data);
132
133 // Client creation
134 bool createClient(const GameStartData &start_data);
135 bool initGui();
136
137 // Client connection
138 bool connectToServer(const GameStartData &start_data,
139 bool *connect_ok, bool *aborted);
140 bool getServerContent(bool *aborted);
141
142 // Main loop
143
144 void updateInteractTimers(f32 dtime);
145 bool checkConnection();
146 void processQueues();
147 void updateProfilers(const RunStats &stats, const FpsControl &draw_times, f32 dtime);
148 void updateDebugState();
149 void updateStats(RunStats *stats, const FpsControl &draw_times, f32 dtime);
151
152 // Input related
153 void processUserInput(f32 dtime);
154 void processKeyInput();
155 void processItemSelection(u16 *new_playeritem);
157
158 void dropSelectedItem(bool single_item = false);
159 void openConsole(float scale, const wchar_t *line=NULL);
160 void toggleFreeMove();
161 void toggleFreeMoveAlt();
162 void togglePitchMove();
163 void toggleFast();
164 void toggleNoClip();
165 void toggleCinematic();
166 void toggleBlockBounds();
167 void toggleAutoforward();
168
169 void toggleMinimap(bool shift_pressed);
170 void toggleFog();
171 void toggleDebug();
172 void toggleUpdateCamera();
173
174 void increaseViewRange();
175 void decreaseViewRange();
176 void toggleFullViewRange();
177 void checkZoomEnabled();
178
179 void updateCameraDirection(CameraOrientation *cam, float dtime);
180 void updateCameraOrientation(CameraOrientation *cam, float dtime);
181 bool getTogglableKeyState(GameKeyType key, bool toggling_enabled, bool prev_key_state);
182 void updatePlayerControl(const CameraOrientation &cam);
183 void updatePauseState();
184 void step(f32 dtime);
186 void updateCameraMode(); // call after changing it
187 void updateCameraOffset();
188 void updateCamera(f32 dtime);
189 void updateSound(f32 dtime);
190 void processPlayerInteraction(f32 dtime, bool show_hud);
206 const core::line3d<f32> &shootline, bool liquids_pointable,
207 const std::optional<Pointabilities> &pointabilities,
208 bool look_for_object, const v3s16 &camera_offset);
209 void handlePointingAtNothing(const ItemStack &playerItem);
210 void handlePointingAtNode(const PointedThing &pointed,
211 const ItemStack &selected_item, const ItemStack &hand_item, f32 dtime);
212 void handlePointingAtObject(const PointedThing &pointed, const ItemStack &playeritem,
213 const ItemStack &hand_item, const v3f &player_position, bool show_debug);
214 void handleDigging(const PointedThing &pointed, const v3s16 &nodepos,
215 const ItemStack &selected_item, const ItemStack &hand_item, f32 dtime);
216 void updateFrame(ProfilerGraph *graph, RunStats *stats, f32 dtime,
217 const CameraOrientation &cam);
218 void updateClouds(float dtime);
219 void updateShadows();
220 void drawScene(ProfilerGraph *graph, RunStats *stats);
221
222 // Misc
223 void showOverlayMessage(const char *msg, float dtime, int percent,
224 float *indef_pos = nullptr);
225
226 inline bool fogEnabled()
227 {
228 // Client setting only takes effect if fog distance unlimited or debug priv
229 if (sky->getFogDistance() < 0 || client->checkPrivilege("debug"))
230 return m_cache_enable_fog;
231 return true;
232 }
233
234 static void settingChangedCallback(const std::string &setting_name, void *data);
235 void readSettings();
236
237 inline float getAxisValue(GameKeyType k)
238 {
239 return input->getAxisValue(k);
240 }
241 inline bool isKeyDown(GameKeyType k)
242 {
243 return input->isKeyDown(k);
244 }
245 inline bool wasKeyDown(GameKeyType k)
246 {
247 return input->wasKeyDown(k);
248 }
250 {
251 return input->wasKeyPressed(k);
252 }
254 {
255 return input->wasKeyReleased(k);
256 }
257
258#ifdef __ANDROID__
259 void handleAndroidChatInput();
260#endif
261
262private:
263 struct Flags {
266 int debug_state = 0;
267 };
268
269 void pauseAnimation();
270 void resumeAnimation();
271
272 // ClientEvent handlers
281 CameraOrientation *cam);
290 CameraOrientation *cam);
293
294 void updateChat(f32 dtime);
295
296 bool nodePlacement(const ItemDefinition &selected_def, const ItemStack &selected_item,
297 const v3s16 &nodepos, const v3s16 &neighborpos, const PointedThing &pointed,
298 const NodeMetadata *meta);
300
301 f32 getSensitivityScaleFactor() const;
302
303 InputHandler *input = nullptr;
304
305 Client *client = nullptr;
306 Server *server = nullptr;
307
310
313
314 // When created, these will be filled with data received from the server
317 std::unique_ptr<ItemVisualsManager> m_item_visuals_manager;
318
319 std::unique_ptr<ISoundManager> sound_manager;
320 std::unique_ptr<SoundMaker> soundmaker;
321
324
327
328 std::unique_ptr<GameUI> m_game_ui;
329 irr_ptr<GUIChatConsole> gui_chat_console;
331 Camera *camera = nullptr;
332 irr_ptr<Clouds> clouds;
333 irr_ptr<Sky> sky;
334 Hud *hud = nullptr;
335 Minimap *mapper = nullptr;
337
338 // Map server hud ids to client hud ids
339 std::unordered_map<u32, u32> m_hud_server_to_client;
340
343
344 /* 'cache'
345 This class does take ownership/responsibily for cleaning up etc of any of
346 these items (e.g. device)
347 */
348 IrrlichtDevice *device;
350 video::IVideoDriver *driver;
351 scene::ISceneManager *smgr;
352 volatile std::sig_atomic_t *kill;
355
357 /* End 'cache' */
358
360
361 /*
362 * TODO: Local caching of settings is not optimal and should at some stage
363 * be updated to use a global settings object for getting thse values
364 * (as opposed to the this local caching). This can be addressed in
365 * a later release.
366 */
377
381
384 bool m_game_focused = false;
385
387
388 // if true, (almost) the whole game is paused
389 // this happens in pause menu in singleplayer
390 bool m_is_paused = false;
391
393 bool isTouchShootlineUsed() const;
394#ifdef __ANDROID__
395 bool m_android_chat_open;
396#endif
397
399};
Definition camera.h:61
Definition log_internal.h:141
Definition chat.h:270
Definition clientobject.h:27
Definition client.h:107
Definition event_manager.h:12
Definition guiChatConsole.h:16
Definition gameui.h:30
Definition game_internal.h:105
void updateDebugState()
Definition game.cpp:1243
void updateChat(f32 dtime)
Definition game.cpp:2529
void toggleFast()
Definition game.cpp:1688
bool wasKeyReleased(GameKeyType k)
Definition game_internal.h:253
InputHandler * input
Definition game_internal.h:303
bool isTouchShootlineUsed() const
Definition game.cpp:1993
f32 m_repeat_place_time
Definition game_internal.h:374
PointedThing updatePointedThing(const core::line3d< f32 > &shootline, bool liquids_pointable, const std::optional< Pointabilities > &pointabilities, bool look_for_object, const v3s16 &camera_offset)
Definition game.cpp:2828
void handleClientEvent_CloudParams(ClientEvent *event, CameraOrientation *cam)
Definition game.cpp:2501
void handleClientEvent_HudAdd(ClientEvent *event, CameraOrientation *cam)
Definition game.cpp:2283
void pauseAnimation()
Definition game.cpp:2159
void processPlayerInteraction(f32 dtime, bool show_hud)
Definition game.cpp:2670
void run()
Definition game.cpp:473
IntervalLimiter profiler_interval
Definition game_internal.h:359
void decreaseViewRange()
Definition game.cpp:1893
void handleClientEvent_ShowCSMFormSpec(ClientEvent *event, CameraOrientation *cam)
Definition game.cpp:2258
void handleClientEvent_PlayerDamage(ClientEvent *event, CameraOrientation *cam)
Definition game.cpp:2203
void handleClientEvent_UpdateCamera(ClientEvent *event, CameraOrientation *cam)
Definition game.cpp:2512
bool m_game_focused
Definition game_internal.h:384
int crack_animation_length
Definition game_internal.h:123
bool getServerContent(bool *aborted)
Definition game.cpp:1107
Hud * hud
Definition game_internal.h:334
bool m_cache_enable_noclip
Definition game_internal.h:371
void updateProfilerGraphs(ProfilerGraph *graph)
Definition game.cpp:3602
bool isKeyDown(GameKeyType k)
Definition game_internal.h:241
void updateCameraOffset()
Definition game.cpp:2615
bool m_invert_mouse
Definition game_internal.h:378
bool wasKeyPressed(GameKeyType k)
Definition game_internal.h:249
bool connectToServer(const GameStartData &start_data, bool *connect_ok, bool *aborted)
Definition game.cpp:961
MapDrawControl * draw_control
Definition game_internal.h:330
ChatBackend * chat_backend
Definition game_internal.h:322
void toggleUpdateCamera()
Definition game.cpp:1860
void processClientEvents(CameraOrientation *cam)
Definition game.cpp:2519
void toggleCinematic()
Definition game.cpp:1724
GameRunData runData
Definition game_internal.h:341
void updateStats(RunStats *stats, const FpsControl &draw_times, f32 dtime)
Definition game.cpp:1315
bool shouldShowTouchControls()
Definition game.cpp:930
Minimap * mapper
Definition game_internal.h:335
void updateSound(f32 dtime)
Definition game.cpp:2647
IWritableTextureSource * texture_src
Definition game_internal.h:311
IrrlichtDevice * device
Definition game_internal.h:348
Flags m_flags
Definition game_internal.h:342
bool simple_singleplayer_mode
Definition game_internal.h:356
bool m_first_loop_after_window_activation
Definition game_internal.h:382
void handleClientEvent_SetSky(ClientEvent *event, CameraOrientation *cam)
Definition game.cpp:2390
bool startup(volatile std::sig_atomic_t *kill, InputHandler *input, RenderingEngine *rendering_engine, GameStartData &game_params, GameErrorData &errordata, ChatBackend *chat_backend)
Definition game.cpp:421
EventManager * eventmgr
Definition game_internal.h:325
irr_ptr< Clouds > clouds
Definition game_internal.h:332
bool getTogglableKeyState(GameKeyType key, bool toggling_enabled, bool prev_key_state)
Definition game.cpp:2042
void toggleNoClip()
Definition game.cpp:1708
bool m_cache_enable_free_move
Definition game_internal.h:372
bool m_does_lost_focus_pause_game
Definition game_internal.h:386
void handleClientEvent_SetStars(ClientEvent *event, CameraOrientation *cam)
Definition game.cpp:2482
void handleClientEvent_DeathscreenLegacy(ClientEvent *event, CameraOrientation *cam)
Definition game.cpp:2239
void handleClientEvent_OverrideDayNightRatio(ClientEvent *event, CameraOrientation *cam)
Definition game.cpp:2493
void increaseViewRange()
Definition game.cpp:1871
IWritableShaderSource * shader_src
Definition game_internal.h:312
void handleDigging(const PointedThing &pointed, const v3s16 &nodepos, const ItemStack &selected_item, const ItemStack &hand_item, f32 dtime)
Definition game.cpp:3264
void updateCameraOrientation(CameraOrientation *cam, float dtime)
Definition game.cpp:1999
bool checkConnection()
Definition game.cpp:1220
void updatePlayerControl(const CameraOrientation &cam)
Definition game.cpp:2051
void handleClientEvent_ShowFormSpec(ClientEvent *event, CameraOrientation *cam)
Definition game.cpp:2244
irr_ptr< GUIChatConsole > gui_chat_console
Definition game_internal.h:329
f32 getSensitivityScaleFactor() const
Definition game.cpp:1983
void processKeyInput()
Definition game.cpp:1430
bool nodePlacement(const ItemDefinition &selected_def, const ItemStack &selected_item, const v3s16 &nodepos, const v3s16 &neighborpos, const PointedThing &pointed, const NodeMetadata *meta)
Definition game.cpp:2991
void toggleAutoforward()
Definition game.cpp:1759
PausedNodesList paused_animated_nodes
Definition game_internal.h:354
f32 m_cache_cam_smoothing
Definition game_internal.h:376
void handleClientEvent_SetSun(ClientEvent *event, CameraOrientation *cam)
Definition game.cpp:2462
void togglePitchMove()
Definition game.cpp:1675
GameFormSpec m_game_formspec
Definition game_internal.h:336
float dynamic_info_send_timer
Definition game_internal.h:309
void readSettings()
Definition game.cpp:3743
std::unique_ptr< SoundMaker > soundmaker
Definition game_internal.h:320
CaptureLogOutput m_chat_log_buf
Definition game_internal.h:323
GameErrorData * errordata
Definition game_internal.h:353
void updateFrame(ProfilerGraph *graph, RunStats *stats, f32 dtime, const CameraOrientation &cam)
Definition game.cpp:3397
float getAxisValue(GameKeyType k)
Definition game_internal.h:237
bool createServer(GameStartData &start_data)
Definition game.cpp:742
bool initGui()
Definition game.cpp:941
bool init(GameStartData &start_data)
Definition game.cpp:685
f32 m_repeat_dig_time
Definition game_internal.h:375
ClientDynamicInfo client_display_info
Definition game_internal.h:308
irr_ptr< Sky > sky
Definition game_internal.h:333
QuicktuneShortcutter * quicktune
Definition game_internal.h:326
bool fogEnabled()
Definition game_internal.h:226
video::IVideoDriver * driver
Definition game_internal.h:350
void toggleMinimap(bool shift_pressed)
Definition game.cpp:1770
std::unordered_map< u32, u32 > m_hud_server_to_client
Definition game_internal.h:339
void processItemSelection(u16 *new_playeritem)
Definition game.cpp:1543
RenderingEngine * m_rendering_engine
Definition game_internal.h:349
bool m_invert_hotbar_mouse_wheel
Definition game_internal.h:380
bool createClient(const GameStartData &start_data)
Definition game.cpp:828
void handlePointingAtNothing(const ItemStack &playerItem)
Definition game.cpp:2926
void copyServerClientCache()
Definition game.cpp:808
bool m_is_paused
Definition game_internal.h:390
void handleClientEvent_PlayerForceMove(ClientEvent *event, CameraOrientation *cam)
Definition game.cpp:2233
void processQueues()
Definition game.cpp:1237
void handlePointingAtNode(const PointedThing &pointed, const ItemStack &selected_item, const ItemStack &hand_item, f32 dtime)
Definition game.cpp:2935
NodeDefManager * nodedef_manager
Definition game_internal.h:316
void handleClientEvent_HudRemove(ClientEvent *event, CameraOrientation *cam)
Definition game.cpp:2317
bool wasKeyDown(GameKeyType k)
Definition game_internal.h:245
bool m_cache_enable_fog
Definition game_internal.h:370
void handlePointingAtObject(const PointedThing &pointed, const ItemStack &playeritem, const ItemStack &hand_item, const v3f &player_position, bool show_debug)
Definition game.cpp:3211
void updateInteractTimers(f32 dtime)
Definition game.cpp:1206
void toggleFreeMoveAlt()
Definition game.cpp:1659
void toggleDebug()
Definition game.cpp:1813
std::unique_ptr< ISoundManager > sound_manager
Definition game_internal.h:319
void updateProfilers(const RunStats &stats, const FpsControl &draw_times, f32 dtime)
Definition game.cpp:1271
static void settingChangedCallback(const std::string &setting_name, void *data)
Definition game.cpp:3738
void showOverlayMessage(const char *msg, float dtime, int percent, float *indef_pos=nullptr)
Definition game.cpp:3732
void handleClientEvent_HudChange(ClientEvent *event, CameraOrientation *cam)
Definition game.cpp:2329
static const ClientEventHandler clientEventHandler[CLIENTEVENT_MAX]
Definition game_internal.h:2175
void updatePauseState()
Definition game.cpp:2099
void handleClientEvent_None(ClientEvent *event, CameraOrientation *cam)
Definition game.cpp:2198
void handleClientEvent_SetMoon(ClientEvent *event, CameraOrientation *cam)
Definition game.cpp:2473
void toggleBlockBounds()
Definition game.cpp:1735
void checkZoomEnabled()
Definition game.cpp:1930
bool m_camera_offset_changed
Definition game_internal.h:383
bool m_cache_toggle_sneak_key
Definition game_internal.h:368
IWritableItemDefManager * itemdef_manager
Definition game_internal.h:315
bool m_cache_toggle_aux1_key
Definition game_internal.h:369
bool initSound()
Definition game.cpp:717
void updateClouds(float dtime)
Definition game.cpp:3574
Client * getClient()
Definition game_internal.h:120
void toggleFullViewRange()
Definition game.cpp:1915
void step(f32 dtime)
Definition game.cpp:2114
void updateCameraMode()
Definition game.cpp:2599
void resumeAnimation()
Definition game.cpp:2164
void handleClientEvent_ShowPauseMenuFormSpec(ClientEvent *event, CameraOrientation *cam)
Definition game.cpp:2267
Camera * camera
Definition game_internal.h:331
Game()
Definition game.cpp:375
void handleClientEvent_HandleParticleEvent(ClientEvent *event, CameraOrientation *cam)
Definition game.cpp:2276
volatile std::sig_atomic_t * kill
Definition game_internal.h:352
void toggleFog()
Definition game.cpp:1799
bool m_touch_simulate_aux1
Definition game_internal.h:392
void dropSelectedItem(bool single_item=false)
Definition game.cpp:1595
f32 m_cache_mouse_sensitivity
Definition game_internal.h:373
bool m_cache_doubletap_jump
Definition game_internal.h:367
~Game()
Definition game.cpp:395
float m_shutdown_progress
Definition game_internal.h:398
void updateShadows()
Definition game.cpp:3612
void processUserInput(f32 dtime)
Definition game.cpp:1370
void updateCamera(f32 dtime)
Definition game.cpp:2570
scene::ISceneManager * smgr
Definition game_internal.h:351
std::unique_ptr< GameUI > m_game_ui
Definition game_internal.h:328
void shutdown()
Definition game.cpp:610
void toggleFreeMove()
Definition game.cpp:1643
std::unique_ptr< ItemVisualsManager > m_item_visuals_manager
Definition game_internal.h:317
void openConsole(float scale, const wchar_t *line=NULL)
Definition game.cpp:1605
bool m_enable_hotbar_mouse_wheel
Definition game_internal.h:379
void updateCameraDirection(CameraOrientation *cam, float dtime)
Definition game.cpp:1937
void drawScene(ProfilerGraph *graph, RunStats *stats)
Definition game.cpp:3645
Definition hud.h:35
Definition itemdef.h:167
Definition shader.h:309
Definition texturesource.h:120
Definition inputhandler.h:188
Definition numeric.h:386
Definition minimap.h:118
This class is for getting the actual properties of nodes from their content ID.
Definition nodedef.h:514
Definition nodemetadata.h:25
Definition profilergraph.h:19
Definition quicktune_shortcutter.h:10
Definition renderingengine.h:64
Definition server.h:179
Definition sound_maker.h:35
@ CLIENTEVENT_MAX
Definition clientevent.h:40
static const float object_hit_delay
Definition game_internal.h:39
static const u16 bbox_debug_flag
Definition game_internal.h:41
std::vector< PausedNode > PausedNodesList
Definition game_internal.h:98
core::vector3d< s16 > v3s16
Definition irr_v3d.h:13
core::vector3df v3f
Definition irr_v3d.h:11
KeyType::T GameKeyType
Definition keys.h:109
static std::string percent(size_t n, size_t total)
Definition main.cpp:1279
Definition activeobjectmgr.cpp:11
Definition activeobjectmgr.cpp:11
Definition game.h:32
Definition clientdynamicinfo.h:12
Definition game_internal.h:83
void(Game::* handler)(ClientEvent *, CameraOrientation *)
Definition game_internal.h:84
Definition clientevent.h:70
Definition renderingengine.h:40
Data provided to Lua for error reporting by the main menu.
Definition gameparams.h:61
Definition game_formspec.h:25
Definition game_internal.h:49
ClientActiveObject * selected_object
Definition game_internal.h:65
bool btn_down_for_dig
Definition game_internal.h:55
bool digging_blocked
Definition game_internal.h:57
PointedThing pointed_old
Definition game_internal.h:52
u16 new_playeritem
Definition game_internal.h:51
v3f update_draw_list_last_cam_dir
Definition game_internal.h:77
bool dig_instantly
Definition game_internal.h:56
bool punching
Definition game_internal.h:54
float repeat_place_timer
Definition game_internal.h:62
float jump_timer_down
Definition game_internal.h:68
float damage_flash
Definition game_internal.h:71
float nodig_delay_timer
Definition game_internal.h:59
float jump_timer_down_before
Definition game_internal.h:69
float object_hit_delay_timer
Definition game_internal.h:63
float update_draw_list_timer
Definition game_internal.h:72
float jump_timer_up
Definition game_internal.h:67
f32 fog_range
Definition game_internal.h:75
float touch_blocks_timer
Definition game_internal.h:73
float dig_time
Definition game_internal.h:60
u16 dig_index
Definition game_internal.h:50
bool digging
Definition game_internal.h:53
float time_of_day_smooth
Definition game_internal.h:79
float dig_time_complete
Definition game_internal.h:61
float time_from_last_punch
Definition game_internal.h:64
bool reset_jump_timer
Definition game_internal.h:58
Definition gameparams.h:52
Definition game_internal.h:263
bool disable_camera_update
Definition game_internal.h:264
int debug_state
0 = no debug text active, see toggleDebug() for the rest
Definition game_internal.h:266
Definition itemdef.h:83
Definition inventory.h:21
Definition clientmap.h:14
Definition game_internal.h:91
f32 fps
Definition game_internal.h:93
u16 id
Definition game_internal.h:92
Definition game_internal.h:89
std::vector< Track > tracks
Definition game_internal.h:95
irr_ptr< scene::AnimatedMeshSceneNode > node
Definition game_internal.h:90
An active object or node which is selected by a ray on the map.
Definition pointedthing.h:22
Definition game.h:26