Luanti 5.17.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 const 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(const std::string &map_dir, const std::string &address,
129 u16 port, const SubgameSpec &gamespec);
130 bool initSound();
131 bool createServer(const std::string &map_dir,
132 const SubgameSpec &gamespec, u16 port);
134
135 // Client creation
136 bool createClient(const GameStartData &start_data);
137 bool initGui();
138
139 // Client connection
140 bool connectToServer(const GameStartData &start_data,
141 bool *connect_ok, bool *aborted);
142 bool getServerContent(bool *aborted);
143
144 // Main loop
145
146 void updateInteractTimers(f32 dtime);
147 bool checkConnection();
148 void processQueues();
149 void updateProfilers(const RunStats &stats, const FpsControl &draw_times, f32 dtime);
150 void updateDebugState();
151 void updateStats(RunStats *stats, const FpsControl &draw_times, f32 dtime);
153
154 // Input related
155 void processUserInput(f32 dtime);
156 void processKeyInput();
157 void processItemSelection(u16 *new_playeritem);
159
160 void dropSelectedItem(bool single_item = false);
161 void openConsole(float scale, const wchar_t *line=NULL);
162 void toggleFreeMove();
163 void toggleFreeMoveAlt();
164 void togglePitchMove();
165 void toggleFast();
166 void toggleNoClip();
167 void toggleCinematic();
168 void toggleBlockBounds();
169 void toggleAutoforward();
170
171 void toggleMinimap(bool shift_pressed);
172 void toggleFog();
173 void toggleDebug();
174 void toggleUpdateCamera();
175
176 void increaseViewRange();
177 void decreaseViewRange();
178 void toggleFullViewRange();
179 void checkZoomEnabled();
180
181 void updateCameraDirection(CameraOrientation *cam, float dtime);
182 void updateCameraOrientation(CameraOrientation *cam, float dtime);
183 bool getTogglableKeyState(GameKeyType key, bool toggling_enabled, bool prev_key_state);
184 void updatePlayerControl(const CameraOrientation &cam);
185 void updatePauseState();
186 void step(f32 dtime);
188 void updateCameraMode(); // call after changing it
189 void updateCameraOffset();
190 void updateCamera(f32 dtime);
191 void updateSound(f32 dtime);
192 void processPlayerInteraction(f32 dtime, bool show_hud);
208 const core::line3d<f32> &shootline, bool liquids_pointable,
209 const std::optional<Pointabilities> &pointabilities,
210 bool look_for_object, const v3s16 &camera_offset);
211 void handlePointingAtNothing(const ItemStack &playerItem);
212 void handlePointingAtNode(const PointedThing &pointed,
213 const ItemStack &selected_item, const ItemStack &hand_item, f32 dtime);
214 void handlePointingAtObject(const PointedThing &pointed, const ItemStack &playeritem,
215 const ItemStack &hand_item, const v3f &player_position, bool show_debug);
216 void handleDigging(const PointedThing &pointed, const v3s16 &nodepos,
217 const ItemStack &selected_item, const ItemStack &hand_item, f32 dtime);
218 void updateFrame(ProfilerGraph *graph, RunStats *stats, f32 dtime,
219 const CameraOrientation &cam);
220 void updateClouds(float dtime);
221 void updateShadows();
222 void drawScene(ProfilerGraph *graph, RunStats *stats);
223
224 // Misc
225 void showOverlayMessage(const char *msg, float dtime, int percent,
226 float *indef_pos = nullptr);
227
228 inline bool fogEnabled()
229 {
230 // Client setting only takes effect if fog distance unlimited or debug priv
231 if (sky->getFogDistance() < 0 || client->checkPrivilege("debug"))
232 return m_cache_enable_fog;
233 return true;
234 }
235
236 static void settingChangedCallback(const std::string &setting_name, void *data);
237 void readSettings();
238
239 inline float getAxisValue(GameKeyType k)
240 {
241 return input->getAxisValue(k);
242 }
243 inline bool isKeyDown(GameKeyType k)
244 {
245 return input->isKeyDown(k);
246 }
247 inline bool wasKeyDown(GameKeyType k)
248 {
249 return input->wasKeyDown(k);
250 }
252 {
253 return input->wasKeyPressed(k);
254 }
256 {
257 return input->wasKeyReleased(k);
258 }
259
260#ifdef __ANDROID__
261 void handleAndroidChatInput();
262#endif
263
264private:
265 struct Flags {
268 int debug_state = 0;
269 };
270
271 void pauseAnimation();
272 void resumeAnimation();
273
274 // ClientEvent handlers
283 CameraOrientation *cam);
292 CameraOrientation *cam);
295
296 void updateChat(f32 dtime);
297
298 bool nodePlacement(const ItemDefinition &selected_def, const ItemStack &selected_item,
299 const v3s16 &nodepos, const v3s16 &neighborpos, const PointedThing &pointed,
300 const NodeMetadata *meta);
302
303 f32 getSensitivityScaleFactor() const;
304
305 InputHandler *input = nullptr;
306
307 Client *client = nullptr;
308 Server *server = nullptr;
309
312
315
316 // When created, these will be filled with data received from the server
319 std::unique_ptr<ItemVisualsManager> m_item_visuals_manager;
320
321 std::unique_ptr<ISoundManager> sound_manager;
322 std::unique_ptr<SoundMaker> soundmaker;
323
326
329
330 std::unique_ptr<GameUI> m_game_ui;
331 irr_ptr<GUIChatConsole> gui_chat_console;
333 Camera *camera = nullptr;
334 irr_ptr<Clouds> clouds;
335 irr_ptr<Sky> sky;
336 Hud *hud = nullptr;
337 Minimap *mapper = nullptr;
339
340 // Map server hud ids to client hud ids
341 std::unordered_map<u32, u32> m_hud_server_to_client;
342
345
346 /* 'cache'
347 This class does take ownership/responsibily for cleaning up etc of any of
348 these items (e.g. device)
349 */
350 IrrlichtDevice *device;
352 video::IVideoDriver *driver;
353 scene::ISceneManager *smgr;
354 volatile std::sig_atomic_t *kill;
357
359 /* End 'cache' */
360
362
363 /*
364 * TODO: Local caching of settings is not optimal and should at some stage
365 * be updated to use a global settings object for getting thse values
366 * (as opposed to the this local caching). This can be addressed in
367 * a later release.
368 */
379
383
386 bool m_game_focused = false;
387
389
390 // if true, (almost) the whole game is paused
391 // this happens in pause menu in singleplayer
392 bool m_is_paused = false;
393
395 bool isTouchShootlineUsed() const;
396#ifdef __ANDROID__
397 bool m_android_chat_open;
398#endif
399
401};
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:1237
void updateChat(f32 dtime)
Definition game.cpp:2520
void toggleFast()
Definition game.cpp:1682
bool wasKeyReleased(GameKeyType k)
Definition game_internal.h:255
InputHandler * input
Definition game_internal.h:305
bool isTouchShootlineUsed() const
Definition game.cpp:1985
f32 m_repeat_place_time
Definition game_internal.h:376
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:2820
void handleClientEvent_CloudParams(ClientEvent *event, CameraOrientation *cam)
Definition game.cpp:2492
void handleClientEvent_HudAdd(ClientEvent *event, CameraOrientation *cam)
Definition game.cpp:2274
void pauseAnimation()
Definition game.cpp:2150
void processPlayerInteraction(f32 dtime, bool show_hud)
Definition game.cpp:2662
void run()
Definition game.cpp:474
IntervalLimiter profiler_interval
Definition game_internal.h:361
void decreaseViewRange()
Definition game.cpp:1887
void handleClientEvent_ShowCSMFormSpec(ClientEvent *event, CameraOrientation *cam)
Definition game.cpp:2249
void handleClientEvent_PlayerDamage(ClientEvent *event, CameraOrientation *cam)
Definition game.cpp:2194
void handleClientEvent_UpdateCamera(ClientEvent *event, CameraOrientation *cam)
Definition game.cpp:2503
bool m_game_focused
Definition game_internal.h:386
int crack_animation_length
Definition game_internal.h:123
bool getServerContent(bool *aborted)
Definition game.cpp:1106
Hud * hud
Definition game_internal.h:336
bool m_cache_enable_noclip
Definition game_internal.h:373
void updateProfilerGraphs(ProfilerGraph *graph)
Definition game.cpp:3589
bool isKeyDown(GameKeyType k)
Definition game_internal.h:243
void updateCameraOffset()
Definition game.cpp:2606
bool m_invert_mouse
Definition game_internal.h:380
bool createServer(const std::string &map_dir, const SubgameSpec &gamespec, u16 port)
Definition game.cpp:747
bool wasKeyPressed(GameKeyType k)
Definition game_internal.h:251
bool connectToServer(const GameStartData &start_data, bool *connect_ok, bool *aborted)
Definition game.cpp:960
MapDrawControl * draw_control
Definition game_internal.h:332
ChatBackend * chat_backend
Definition game_internal.h:324
void toggleUpdateCamera()
Definition game.cpp:1854
void processClientEvents(CameraOrientation *cam)
Definition game.cpp:2510
void toggleCinematic()
Definition game.cpp:1718
GameRunData runData
Definition game_internal.h:343
void updateStats(RunStats *stats, const FpsControl &draw_times, f32 dtime)
Definition game.cpp:1309
bool shouldShowTouchControls()
Definition game.cpp:929
Minimap * mapper
Definition game_internal.h:337
void updateSound(f32 dtime)
Definition game.cpp:2639
IWritableTextureSource * texture_src
Definition game_internal.h:313
IrrlichtDevice * device
Definition game_internal.h:350
Flags m_flags
Definition game_internal.h:344
bool simple_singleplayer_mode
Definition game_internal.h:358
bool m_first_loop_after_window_activation
Definition game_internal.h:384
void handleClientEvent_SetSky(ClientEvent *event, CameraOrientation *cam)
Definition game.cpp:2381
EventManager * eventmgr
Definition game_internal.h:327
irr_ptr< Clouds > clouds
Definition game_internal.h:334
bool getTogglableKeyState(GameKeyType key, bool toggling_enabled, bool prev_key_state)
Definition game.cpp:2031
void toggleNoClip()
Definition game.cpp:1702
bool m_cache_enable_free_move
Definition game_internal.h:374
bool m_does_lost_focus_pause_game
Definition game_internal.h:388
void handleClientEvent_SetStars(ClientEvent *event, CameraOrientation *cam)
Definition game.cpp:2473
void handleClientEvent_DeathscreenLegacy(ClientEvent *event, CameraOrientation *cam)
Definition game.cpp:2230
void handleClientEvent_OverrideDayNightRatio(ClientEvent *event, CameraOrientation *cam)
Definition game.cpp:2484
void increaseViewRange()
Definition game.cpp:1865
IWritableShaderSource * shader_src
Definition game_internal.h:314
void handleDigging(const PointedThing &pointed, const v3s16 &nodepos, const ItemStack &selected_item, const ItemStack &hand_item, f32 dtime)
Definition game.cpp:3256
void updateCameraOrientation(CameraOrientation *cam, float dtime)
Definition game.cpp:1991
bool checkConnection()
Definition game.cpp:1214
void updatePlayerControl(const CameraOrientation &cam)
Definition game.cpp:2040
void handleClientEvent_ShowFormSpec(ClientEvent *event, CameraOrientation *cam)
Definition game.cpp:2235
irr_ptr< GUIChatConsole > gui_chat_console
Definition game_internal.h:331
f32 getSensitivityScaleFactor() const
Definition game.cpp:1975
void processKeyInput()
Definition game.cpp:1424
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:2983
void toggleAutoforward()
Definition game.cpp:1753
PausedNodesList paused_animated_nodes
Definition game_internal.h:356
f32 m_cache_cam_smoothing
Definition game_internal.h:378
void handleClientEvent_SetSun(ClientEvent *event, CameraOrientation *cam)
Definition game.cpp:2453
void togglePitchMove()
Definition game.cpp:1669
GameFormSpec m_game_formspec
Definition game_internal.h:338
float dynamic_info_send_timer
Definition game_internal.h:311
void readSettings()
Definition game.cpp:3727
std::unique_ptr< SoundMaker > soundmaker
Definition game_internal.h:322
CaptureLogOutput m_chat_log_buf
Definition game_internal.h:325
GameErrorData * errordata
Definition game_internal.h:355
void updateFrame(ProfilerGraph *graph, RunStats *stats, f32 dtime, const CameraOrientation &cam)
Definition game.cpp:3386
float getAxisValue(GameKeyType k)
Definition game_internal.h:239
bool initGui()
Definition game.cpp:940
f32 m_repeat_dig_time
Definition game_internal.h:377
ClientDynamicInfo client_display_info
Definition game_internal.h:310
irr_ptr< Sky > sky
Definition game_internal.h:335
QuicktuneShortcutter * quicktune
Definition game_internal.h:328
bool fogEnabled()
Definition game_internal.h:228
video::IVideoDriver * driver
Definition game_internal.h:352
void toggleMinimap(bool shift_pressed)
Definition game.cpp:1764
std::unordered_map< u32, u32 > m_hud_server_to_client
Definition game_internal.h:341
void processItemSelection(u16 *new_playeritem)
Definition game.cpp:1537
RenderingEngine * m_rendering_engine
Definition game_internal.h:351
bool m_invert_hotbar_mouse_wheel
Definition game_internal.h:382
bool createClient(const GameStartData &start_data)
Definition game.cpp:829
void handlePointingAtNothing(const ItemStack &playerItem)
Definition game.cpp:2918
void copyServerClientCache()
Definition game.cpp:809
bool m_is_paused
Definition game_internal.h:392
void handleClientEvent_PlayerForceMove(ClientEvent *event, CameraOrientation *cam)
Definition game.cpp:2224
void processQueues()
Definition game.cpp:1231
void handlePointingAtNode(const PointedThing &pointed, const ItemStack &selected_item, const ItemStack &hand_item, f32 dtime)
Definition game.cpp:2927
NodeDefManager * nodedef_manager
Definition game_internal.h:318
void handleClientEvent_HudRemove(ClientEvent *event, CameraOrientation *cam)
Definition game.cpp:2308
bool wasKeyDown(GameKeyType k)
Definition game_internal.h:247
bool m_cache_enable_fog
Definition game_internal.h:372
void handlePointingAtObject(const PointedThing &pointed, const ItemStack &playeritem, const ItemStack &hand_item, const v3f &player_position, bool show_debug)
Definition game.cpp:3203
void updateInteractTimers(f32 dtime)
Definition game.cpp:1200
void toggleFreeMoveAlt()
Definition game.cpp:1653
void toggleDebug()
Definition game.cpp:1807
std::unique_ptr< ISoundManager > sound_manager
Definition game_internal.h:321
void updateProfilers(const RunStats &stats, const FpsControl &draw_times, f32 dtime)
Definition game.cpp:1265
static void settingChangedCallback(const std::string &setting_name, void *data)
Definition game.cpp:3722
bool init(const std::string &map_dir, const std::string &address, u16 port, const SubgameSpec &gamespec)
Definition game.cpp:686
void showOverlayMessage(const char *msg, float dtime, int percent, float *indef_pos=nullptr)
Definition game.cpp:3716
void handleClientEvent_HudChange(ClientEvent *event, CameraOrientation *cam)
Definition game.cpp:2320
static const ClientEventHandler clientEventHandler[CLIENTEVENT_MAX]
Definition game_internal.h:2166
void updatePauseState()
Definition game.cpp:2090
void handleClientEvent_None(ClientEvent *event, CameraOrientation *cam)
Definition game.cpp:2189
void handleClientEvent_SetMoon(ClientEvent *event, CameraOrientation *cam)
Definition game.cpp:2464
void toggleBlockBounds()
Definition game.cpp:1729
bool startup(volatile std::sig_atomic_t *kill, InputHandler *input, RenderingEngine *rendering_engine, const GameStartData &game_params, GameErrorData &errordata, ChatBackend *chat_backend)
Definition game.cpp:421
void checkZoomEnabled()
Definition game.cpp:1924
bool m_camera_offset_changed
Definition game_internal.h:385
bool m_cache_toggle_sneak_key
Definition game_internal.h:370
IWritableItemDefManager * itemdef_manager
Definition game_internal.h:317
bool m_cache_toggle_aux1_key
Definition game_internal.h:371
bool initSound()
Definition game.cpp:722
void updateClouds(float dtime)
Definition game.cpp:3561
Client * getClient()
Definition game_internal.h:120
void toggleFullViewRange()
Definition game.cpp:1909
void step(f32 dtime)
Definition game.cpp:2105
void updateCameraMode()
Definition game.cpp:2590
void resumeAnimation()
Definition game.cpp:2155
void handleClientEvent_ShowPauseMenuFormSpec(ClientEvent *event, CameraOrientation *cam)
Definition game.cpp:2258
Camera * camera
Definition game_internal.h:333
Game()
Definition game.cpp:375
void handleClientEvent_HandleParticleEvent(ClientEvent *event, CameraOrientation *cam)
Definition game.cpp:2267
volatile std::sig_atomic_t * kill
Definition game_internal.h:354
void toggleFog()
Definition game.cpp:1793
bool m_touch_simulate_aux1
Definition game_internal.h:394
void dropSelectedItem(bool single_item=false)
Definition game.cpp:1589
f32 m_cache_mouse_sensitivity
Definition game_internal.h:375
bool m_cache_doubletap_jump
Definition game_internal.h:369
~Game()
Definition game.cpp:395
float m_shutdown_progress
Definition game_internal.h:400
void updateShadows()
Definition game.cpp:3599
void processUserInput(f32 dtime)
Definition game.cpp:1364
void updateCamera(f32 dtime)
Definition game.cpp:2561
scene::ISceneManager * smgr
Definition game_internal.h:353
std::unique_ptr< GameUI > m_game_ui
Definition game_internal.h:330
void shutdown()
Definition game.cpp:611
void toggleFreeMove()
Definition game.cpp:1637
std::unique_ptr< ItemVisualsManager > m_item_visuals_manager
Definition game_internal.h:319
void openConsole(float scale, const wchar_t *line=NULL)
Definition game.cpp:1599
bool m_enable_hotbar_mouse_wheel
Definition game_internal.h:381
void updateCameraDirection(CameraOrientation *cam, float dtime)
Definition game.cpp:1931
void drawScene(ProfilerGraph *graph, RunStats *stats)
Definition game.cpp:3632
Definition hud.h:35
Definition itemdef.h:165
Definition shader.h:309
Definition texturesource.h:120
Definition inputhandler.h:174
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:509
Definition nodemetadata.h:25
Definition profilergraph.h:19
Definition quicktune_shortcutter.h:10
Definition renderingengine.h:64
Definition server.h:178
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
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:265
bool disable_camera_update
Definition game_internal.h:266
int debug_state
0 = no debug text active, see toggleDebug() for the rest
Definition game_internal.h:268
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
Definition subgames.h:15