Luanti 5.15.0-dev
 
Loading...
Searching...
No Matches
player_sao.h
Go to the documentation of this file.
1// Luanti
2// SPDX-License-Identifier: LGPL-2.1-or-later
3// Copyright (C) 2010-2013 celeron55, Perttu Ahola <celeron55@gmail.com>
4// Copyright (C) 2013-2020 Minetest core developers & community
5
6#pragma once
7
8#include "constants.h"
9#include "inventorymanager.h" // InventoryLocation
10#include "metadata.h"
12#include "unit_sao.h"
13#include "util/numeric.h"
14#include <set>
15
16/*
17 PlayerSAO needs some internals exposed.
18*/
19
21{
22 float m_pool = 15.0f;
23 float m_max = 15.0f;
24
25public:
26 LagPool() = default;
27
28 void setMax(float new_max)
29 {
30 m_max = new_max;
31 if (m_pool > new_max)
32 m_pool = new_max;
33 }
34
35 void add(float dtime)
36 {
37 m_pool -= dtime;
38 if (m_pool < 0)
39 m_pool = 0;
40 }
41
42 void empty() { m_pool = m_max; }
43
44 bool grab(float dtime)
45 {
46 if (dtime <= 0)
47 return true;
48 if (m_pool + dtime > m_max)
49 return false;
50 m_pool += dtime;
51 return true;
52 }
53};
54
55class RemotePlayer;
56
57class PlayerSAO : public UnitSAO
58{
59public:
60 PlayerSAO(ServerEnvironment *env_, RemotePlayer *player_, session_t peer_id_,
61 bool is_singleplayer);
62
65 std::string getDescription() override;
66
67 /*
68 Active object <-> environment interface
69 */
70
71 void addedToEnvironment(u32 dtime_s) override;
72 void removingFromEnvironment() override;
73 bool isStaticAllowed() const override { return false; }
74 bool shouldUnload() const override { return false; }
75 std::string getClientInitializationData(u16 protocol_version) override;
76 void getStaticData(std::string *result) const override;
77 void step(float dtime, bool send_recommended) override;
78 void setBasePosition(v3f position);
79 void setPos(const v3f &pos) override;
80 void addPos(const v3f &added_pos) override;
81 void moveTo(v3f pos, bool continuous) override;
82 void setPlayerYaw(const float yaw);
83 std::string getGUID() const override { return m_player_name; }
84 // Data should not be sent at player initialization
85 void setPlayerYawAndSend(const float yaw);
86 void setLookPitch(const float pitch);
87 // Data should not be sent at player initialization
88 void setLookPitchAndSend(const float pitch);
89 f32 getLookPitch() const { return m_pitch; }
90 f32 getRadLookPitch() const { return m_pitch * core::DEGTORAD; }
91 // Deprecated
92 f32 getRadLookPitchDep() const { return -1.0 * m_pitch * core::DEGTORAD; }
93 void setFov(const float pitch);
94 f32 getFov() const { return m_fov; }
95 void setWantedRange(const s16 range);
96 s16 getWantedRange() const { return m_wanted_range; }
97 void setCameraInverted(bool camera_inverted) { m_camera_inverted = camera_inverted; }
98 bool getCameraInverted() const { return m_camera_inverted; }
99
100 /*
101 Interaction interface
102 */
103
104 u32 punch(v3f dir, const ToolCapabilities &toolcap, ServerActiveObject *puncher,
105 float time_from_last_punch, u16 initial_wear = 0) override;
106 void rightClick(ServerActiveObject *clicker) override;
107 void setHP(s32 hp, const PlayerHPChangeReason &reason) override
108 {
109 return setHP(hp, reason, false);
110 }
111 void setHP(s32 hp, const PlayerHPChangeReason &reason, bool from_client);
112 void setHPRaw(u16 hp) { m_hp = hp; }
113 u16 getBreath() const { return m_breath; }
114 void setBreath(const u16 breath, bool send = true);
115 void respawn();
116
117 /*
118 Inventory interface
119 */
120 Inventory *getInventory() const override;
122 void setInventoryModified() override {}
123 std::string getWieldList() const override { return "main"; }
124 u16 getWieldIndex() const override;
125 ItemStack getWieldedItem(ItemStack *selected, ItemStack *hand = nullptr) const override;
126 bool setWieldedItem(const ItemStack &item) override;
127
128 /*
129 PlayerSAO-specific
130 */
131
132 void disconnected();
133
134 void setPlayer(RemotePlayer *player) { m_player = player; }
136 session_t getPeerID() const;
137
138 // Cheat prevention
139
142 {
143 float r = m_time_from_last_punch;
145 return r;
146 }
148 {
151 }
154 void noCheatDigEnd() { m_nocheat_dig_pos = v3s16(32767, 32767, 32767); }
156 void setMaxSpeedOverride(const v3f &vel);
157 // Returns true if cheated
158 bool checkMovementCheat();
159
160 // Other
161
162 void updatePrivileges(const std::set<std::string> &privs)
163 {
164 m_privs = privs;
165 }
166
167 inline void setNewPlayer() { m_is_new_player = true; }
168 inline bool isNewPlayer() { return m_is_new_player; }
169
170 bool getCollisionBox(aabb3f *toset) const override;
171 bool getSelectionBox(aabb3f *toset) const override;
172 bool collideWithObjects() const override { return true; }
173
174 void finalize(RemotePlayer *player, const std::set<std::string> &privs);
175
177 v3f getEyeOffset() const;
178 float getZoomFOV() const;
179
180 inline SimpleMetadata &getMeta() { return m_meta; }
181
182private:
183 std::string getPropertyPacket();
185 std::string generateUpdatePhysicsOverrideCommand() const;
186
188 // Extra variable because during shutdown m_player is unavailable, but we still need to know.
189 std::string m_player_name;
191
192 // Cheat prevention
198 v3s16 m_nocheat_dig_pos = v3s16(32767, 32767, 32767);
199 float m_nocheat_dig_time = 0.0f;
201 v3f m_max_speed_override = v3f(0.0f, 0.0f, 0.0f);
202
203 // Timers
207
209
210 // Cached privileges for enforcement
211 std::set<std::string> m_privs;
213 bool m_is_new_player = false;
214
216 f32 m_pitch = 0.0f;
217 f32 m_fov = 0.0f;
218 s16 m_wanted_range = 0.0f;
219
220 bool m_camera_inverted = false; // this is not store in the player db
221
223
224public:
225 struct {
226 bool breathing : 1;
227 bool drowning : 1;
228 bool node_damage : 1;
229 } m_flags = {true, true, true};
230
232};
233
235{
236 enum Type : u8
237 {
239 SET_HP_MAX, // internal type to allow distinguishing hp reset and damage (for effects)
244 RESPAWN
245 };
246
248 bool from_mod = false;
250
251 // For PLAYER_PUNCH
252 ServerActiveObject *object = nullptr;
253 // For NODE_DAMAGE and DROWNING
254 std::string node;
256
257 inline bool hasLuaReference() const { return lua_reference >= 0; }
258
259 bool setTypeFromString(const std::string &typestr)
260 {
261 if (typestr == "set_hp")
262 type = SET_HP;
263 else if (typestr == "punch")
265 else if (typestr == "fall")
266 type = FALL;
267 else if (typestr == "node_damage")
269 else if (typestr == "drown")
270 type = DROWNING;
271 else if (typestr == "respawn")
272 type = RESPAWN;
273 else
274 return false;
275
276 return true;
277 }
278
279 std::string getTypeAsString() const
280 {
281 switch (type) {
284 return "set_hp";
286 return "punch";
288 return "fall";
290 return "node_damage";
292 return "drown";
294 return "respawn";
295 default:
296 return "?";
297 }
298 }
299
301
306
308};
ActiveObjectType
Definition activeobject.h:14
@ ACTIVEOBJECT_TYPE_PLAYER
Definition activeobject.h:26
@ ACTIVEOBJECT_TYPE_GENERIC
Definition activeobject.h:28
static v2f dir(const v2f &pos_dist)
Definition camera.cpp:207
Definition numeric.h:386
Definition inventory.h:277
Definition player_sao.h:21
LagPool()=default
float m_max
Definition player_sao.h:23
bool grab(float dtime)
Definition player_sao.h:44
void add(float dtime)
Definition player_sao.h:35
void empty()
Definition player_sao.h:42
float m_pool
Definition player_sao.h:22
void setMax(float new_max)
Definition player_sao.h:28
Definition player_sao.h:58
void setPlayerYawAndSend(const float yaw)
Definition player_sao.cpp:432
std::string generateUpdatePhysicsOverrideCommand() const
Definition player_sao.cpp:305
std::string getClientInitializationData(u16 protocol_version) override
Definition player_sao.cpp:98
void rightClick(ServerActiveObject *clicker) override
Definition player_sao.cpp:501
bool drowning
Definition player_sao.h:227
void setBasePosition(v3f position)
Definition player_sao.cpp:338
void disconnected()
Definition player_sao.cpp:595
std::string getGUID() const override
Returns an unique ID for this object (persistent across unload, server restarts).
Definition player_sao.h:83
s16 getWantedRange() const
Definition player_sao.h:96
bool m_is_new_player
Definition player_sao.h:213
float getZoomFOV() const
Definition player_sao.cpp:766
v3s16 m_nocheat_dig_pos
Definition player_sao.h:198
u16 getWieldIndex() const override
Definition player_sao.cpp:575
std::string getWieldList() const override
Definition player_sao.h:123
void noCheatDigEnd()
Definition player_sao.h:154
void unlinkPlayerSessionAndSave()
Definition player_sao.cpp:607
u32 punch(v3f dir, const ToolCapabilities &toolcap, ServerActiveObject *puncher, float time_from_last_punch, u16 initial_wear=0) override
Definition player_sao.cpp:452
bool m_position_not_sent
Definition player_sao.h:208
float m_time_from_last_teleport
Definition player_sao.h:196
void setPos(const v3f &pos) override
Definition player_sao.cpp:352
void moveTo(v3f pos, bool continuous) override
Definition player_sao.cpp:393
IntervalLimiter m_drowning_interval
Definition player_sao.h:205
s16 m_wanted_range
Definition player_sao.h:218
void noCheatDigStart(const v3s16 &p)
Definition player_sao.h:147
void setBreath(const u16 breath, bool send=true)
Definition player_sao.cpp:537
std::set< std::string > m_privs
Definition player_sao.h:211
const bool m_is_singleplayer
Definition player_sao.h:212
void setInventoryModified() override
Definition player_sao.h:122
LagPool & getDigPool()
Definition player_sao.h:155
void step(float dtime, bool send_recommended) override
Definition player_sao.cpp:145
bool m_camera_inverted
Definition player_sao.h:220
InventoryLocation getInventoryLocation() const override
Definition player_sao.cpp:568
SimpleMetadata m_meta
Definition player_sao.h:222
bool m_physics_override_sent
Definition player_sao.h:231
IntervalLimiter m_node_hurt_interval
Definition player_sao.h:206
v3f getLastGoodPosition() const
Definition player_sao.h:140
IntervalLimiter m_breathing_interval
Definition player_sao.h:204
void setLookPitchAndSend(const float pitch)
Definition player_sao.cpp:446
LagPool m_dig_pool
Definition player_sao.h:193
bool node_damage
Definition player_sao.h:228
void setPlayerYaw(const float yaw)
Definition player_sao.cpp:406
bool getCameraInverted() const
Definition player_sao.h:98
v3f m_last_good_position
Definition player_sao.h:195
float m_nocheat_dig_time
Definition player_sao.h:199
u16 m_breath
Definition player_sao.h:215
u16 getBreath() const
Definition player_sao.h:113
void setNewPlayer()
Definition player_sao.h:167
f32 getFov() const
Definition player_sao.h:94
float m_time_from_last_punch
Definition player_sao.h:197
PlayerSAO(ServerEnvironment *env_, RemotePlayer *player_, session_t peer_id_, bool is_singleplayer)
Definition player_sao.cpp:15
void finalize(RemotePlayer *player, const std::set< std::string > &privs)
Definition player_sao.cpp:57
bool checkMovementCheat()
Definition player_sao.cpp:633
bool isNewPlayer()
Definition player_sao.h:168
v3f getEyeOffset() const
Definition player_sao.cpp:64
f32 getLookPitch() const
Definition player_sao.h:89
void setCameraInverted(bool camera_inverted)
Definition player_sao.h:97
std::string getPropertyPacket()
Definition player_sao.cpp:614
f32 getRadLookPitch() const
Definition player_sao.h:90
void setHP(s32 hp, const PlayerHPChangeReason &reason) override
Definition player_sao.h:107
void setMaxSpeedOverride(const v3f &vel)
Definition player_sao.cpp:620
void setFov(const float pitch)
Definition player_sao.cpp:416
void respawn()
Definition player_sao.cpp:548
f32 m_pitch
Definition player_sao.h:216
Inventory * getInventory() const override
Definition player_sao.cpp:563
RemotePlayer * m_player
Definition player_sao.h:187
float m_max_speed_override_time
Definition player_sao.h:200
session_t getPeerID() const
Definition player_sao.cpp:601
std::string getDescription() override
Definition player_sao.cpp:69
ItemStack getWieldedItem(ItemStack *selected, ItemStack *hand=nullptr) const override
Definition player_sao.cpp:580
bool getSelectionBox(aabb3f *toset) const override
Definition player_sao.cpp:754
void getStaticData(std::string *result) const override
Definition player_sao.cpp:140
bool setWieldedItem(const ItemStack &item) override
Definition player_sao.cpp:585
float resetTimeFromLastPunch()
Definition player_sao.h:141
SimpleMetadata & getMeta()
Definition player_sao.h:180
void setWantedRange(const s16 range)
Definition player_sao.cpp:424
void setHPRaw(u16 hp)
Definition player_sao.h:112
f32 getRadLookPitchDep() const
Definition player_sao.h:92
std::string m_player_name
used as GUID
Definition player_sao.h:189
ActiveObjectType getSendType() const override
Definition player_sao.h:64
float getNoCheatDigTime()
Definition player_sao.h:153
v3s16 getNoCheatDigPos()
Definition player_sao.h:152
v3f getEyePosition() const
Definition player_sao.h:176
RemotePlayer * getPlayer()
Definition player_sao.h:135
bool getCollisionBox(aabb3f *toset) const override
Definition player_sao.cpp:743
bool isStaticAllowed() const override
Definition player_sao.h:73
v3f m_max_speed_override
Definition player_sao.h:201
void setLookPitch(const float pitch)
Definition player_sao.cpp:438
void setPlayer(RemotePlayer *player)
Definition player_sao.h:134
bool shouldUnload() const override
Definition player_sao.h:74
void addPos(const v3f &added_pos) override
Definition player_sao.cpp:369
bool collideWithObjects() const override
Definition player_sao.h:172
f32 m_fov
Definition player_sao.h:217
ActiveObjectType getType() const override
Definition player_sao.h:63
void removingFromEnvironment() override
Definition player_sao.cpp:85
void updatePrivileges(const std::set< std::string > &privs)
Definition player_sao.h:162
void addedToEnvironment(u32 dtime_s) override
Definition player_sao.cpp:75
session_t m_peer_id_initial
only used to initialize RemotePlayer
Definition player_sao.h:190
LagPool m_move_pool
Definition player_sao.h:194
bool breathing
Definition player_sao.h:226
struct PlayerSAO::@30 m_flags
Definition remoteplayer.h:27
Definition serveractiveobject.h:41
v3f getBasePosition() const
Definition serveractiveobject.h:65
Definition serverenvironment.h:113
Definition metadata.h:61
Definition unit_sao.h:14
u16 m_hp
Definition unit_sao.h:96
#define PLAYER_MAX_BREATH_DEFAULT
Definition constants.h:84
core::aabbox3d< f32 > aabb3f
Definition irr_aabb3d.h:11
core::vector3d< s16 > v3s16
Definition irr_v3d.h:13
core::vector3df v3f
Definition irr_v3d.h:11
u16 session_t
Definition networkprotocol.h:27
Definition inventorymanager.h:18
Definition inventory.h:21
Definition player_sao.h:235
PlayerHPChangeReason(Type type, ServerActiveObject *object)
Definition player_sao.h:302
ServerActiveObject * object
Definition player_sao.h:252
Type
Definition player_sao.h:237
@ RESPAWN
Definition player_sao.h:244
@ DROWNING
Definition player_sao.h:243
@ FALL
Definition player_sao.h:241
@ SET_HP
Definition player_sao.h:238
@ SET_HP_MAX
Definition player_sao.h:239
@ PLAYER_PUNCH
Definition player_sao.h:240
@ NODE_DAMAGE
Definition player_sao.h:242
bool from_mod
Definition player_sao.h:248
PlayerHPChangeReason(Type type, std::string node, v3s16 node_pos)
Definition player_sao.h:307
std::string getTypeAsString() const
Definition player_sao.h:279
bool setTypeFromString(const std::string &typestr)
Definition player_sao.h:259
std::string node
Definition player_sao.h:254
int lua_reference
Definition player_sao.h:249
PlayerHPChangeReason(Type type)
Definition player_sao.h:300
bool hasLuaReference() const
Definition player_sao.h:257
Type type
Definition player_sao.h:247
v3s16 node_pos
Definition player_sao.h:255
Definition tool.h:53
static std::string p(std::string path)
Definition test_filesys.cpp:64