Minetest  5.4.0
player_sao.h
Go to the documentation of this file.
1 /*
2 Minetest
3 Copyright (C) 2010-2013 celeron55, Perttu Ahola <celeron55@gmail.com>
4 Copyright (C) 2013-2020 Minetest core developers & community
5 
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU Lesser General Public License as published by
8 the Free Software Foundation; either version 2.1 of the License, or
9 (at your option) any later version.
10 
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU Lesser General Public License for more details.
15 
16 You should have received a copy of the GNU Lesser General Public License along
17 with this program; if not, write to the Free Software Foundation, Inc.,
18 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
19 */
20 
21 #pragma once
22 
23 #include "constants.h"
25 #include "unit_sao.h"
26 #include "util/numeric.h"
27 
28 /*
29  PlayerSAO needs some internals exposed.
30 */
31 
32 class LagPool
33 {
34  float m_pool = 15.0f;
35  float m_max = 15.0f;
36 
37 public:
38  LagPool() = default;
39 
40  void setMax(float new_max)
41  {
42  m_max = new_max;
43  if (m_pool > new_max)
44  m_pool = new_max;
45  }
46 
47  void add(float dtime)
48  {
49  m_pool -= dtime;
50  if (m_pool < 0)
51  m_pool = 0;
52  }
53 
54  void empty() { m_pool = m_max; }
55 
56  bool grab(float dtime)
57  {
58  if (dtime <= 0)
59  return true;
60  if (m_pool + dtime > m_max)
61  return false;
62  m_pool += dtime;
63  return true;
64  }
65 };
66 
67 class RemotePlayer;
68 
69 class PlayerSAO : public UnitSAO
70 {
71 public:
72  PlayerSAO(ServerEnvironment *env_, RemotePlayer *player_, session_t peer_id_,
73  bool is_singleplayer);
74 
77  std::string getDescription();
78 
79  /*
80  Active object <-> environment interface
81  */
82 
83  void addedToEnvironment(u32 dtime_s);
85  bool isStaticAllowed() const { return false; }
86  bool shouldUnload() const { return false; }
87  std::string getClientInitializationData(u16 protocol_version);
88  void getStaticData(std::string *result) const;
89  void step(float dtime, bool send_recommended);
90  void setBasePosition(const v3f &position);
91  void setPos(const v3f &pos);
92  void moveTo(v3f pos, bool continuous);
93  void setPlayerYaw(const float yaw);
94  // Data should not be sent at player initialization
95  void setPlayerYawAndSend(const float yaw);
96  void setLookPitch(const float pitch);
97  // Data should not be sent at player initialization
98  void setLookPitchAndSend(const float pitch);
99  f32 getLookPitch() const { return m_pitch; }
100  f32 getRadLookPitch() const { return m_pitch * core::DEGTORAD; }
101  // Deprecated
102  f32 getRadLookPitchDep() const { return -1.0 * m_pitch * core::DEGTORAD; }
103  void setFov(const float pitch);
104  f32 getFov() const { return m_fov; }
105  void setWantedRange(const s16 range);
106  s16 getWantedRange() const { return m_wanted_range; }
107 
108  /*
109  Interaction interface
110  */
111 
112  u16 punch(v3f dir, const ToolCapabilities *toolcap, ServerActiveObject *puncher,
113  float time_from_last_punch);
114  void rightClick(ServerActiveObject *clicker);
115  void setHP(s32 hp, const PlayerHPChangeReason &reason);
116  void setHPRaw(u16 hp) { m_hp = hp; }
117  u16 getBreath() const { return m_breath; }
118  void setBreath(const u16 breath, bool send = true);
119 
120  /*
121  Inventory interface
122  */
123  Inventory *getInventory() const;
126  std::string getWieldList() const { return "main"; }
127  u16 getWieldIndex() const;
128  ItemStack getWieldedItem(ItemStack *selected, ItemStack *hand = nullptr) const;
129  bool setWieldedItem(const ItemStack &item);
130 
131  /*
132  PlayerSAO-specific
133  */
134 
135  void disconnected();
136 
138  session_t getPeerID() const { return m_peer_id; }
139 
140  // Cheat prevention
141 
144  {
145  float r = m_time_from_last_punch;
147  return r;
148  }
149  void noCheatDigStart(const v3s16 &p)
150  {
152  m_nocheat_dig_time = 0;
153  }
156  void noCheatDigEnd() { m_nocheat_dig_pos = v3s16(32767, 32767, 32767); }
158  void setMaxSpeedOverride(const v3f &vel);
159  // Returns true if cheated
160  bool checkMovementCheat();
161 
162  // Other
163 
164  void updatePrivileges(const std::set<std::string> &privs, bool is_singleplayer)
165  {
166  m_privs = privs;
167  m_is_singleplayer = is_singleplayer;
168  }
169 
170  bool getCollisionBox(aabb3f *toset) const;
171  bool getSelectionBox(aabb3f *toset) const;
172  bool collideWithObjects() const { 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 Metadata &getMeta() { return m_meta; }
181 
182 private:
183  std::string getPropertyPacket();
185  std::string generateUpdatePhysicsOverrideCommand() const;
186 
187  RemotePlayer *m_player = nullptr;
189 
190  // Cheat prevention
196  v3s16 m_nocheat_dig_pos = v3s16(32767, 32767, 32767);
197  float m_nocheat_dig_time = 0.0f;
199  v3f m_max_speed_override = v3f(0.0f, 0.0f, 0.0f);
200 
201  // Timers
205 
206  bool m_position_not_sent = false;
207 
208  // Cached privileges for enforcement
209  std::set<std::string> m_privs;
211 
213  f32 m_pitch = 0.0f;
214  f32 m_fov = 0.0f;
215  s16 m_wanted_range = 0.0f;
216 
218 
219 public:
227 };
228 
230 {
231  enum Type : u8
232  {
238  RESPAWN
239  };
240 
242  bool from_mod = false;
243  int lua_reference = -1;
244 
245  // For PLAYER_PUNCH
246  ServerActiveObject *object = nullptr;
247  // For NODE_DAMAGE
248  std::string node;
249 
250  inline bool hasLuaReference() const { return lua_reference >= 0; }
251 
252  bool setTypeFromString(const std::string &typestr)
253  {
254  if (typestr == "set_hp")
255  type = SET_HP;
256  else if (typestr == "punch")
257  type = PLAYER_PUNCH;
258  else if (typestr == "fall")
259  type = FALL;
260  else if (typestr == "node_damage")
261  type = NODE_DAMAGE;
262  else if (typestr == "drown")
263  type = DROWNING;
264  else if (typestr == "respawn")
265  type = RESPAWN;
266  else
267  return false;
268 
269  return true;
270  }
271 
272  std::string getTypeAsString() const
273  {
274  switch (type) {
276  return "set_hp";
278  return "punch";
280  return "fall";
282  return "node_damage";
284  return "drown";
286  return "respawn";
287  default:
288  return "?";
289  }
290  }
291 
293 
296  {
297  }
298 
300 };
ActiveObjectType
Definition: activeobject.h:27
@ ACTIVEOBJECT_TYPE_PLAYER
Definition: activeobject.h:39
@ ACTIVEOBJECT_TYPE_GENERIC
Definition: activeobject.h:41
static v2f dir(const v2f &pos_dist)
Definition: camera.cpp:240
Definition: numeric.h:319
Definition: inventory.h:282
Definition: player_sao.h:33
LagPool()=default
float m_max
Definition: player_sao.h:35
bool grab(float dtime)
Definition: player_sao.h:56
void add(float dtime)
Definition: player_sao.h:47
void empty()
Definition: player_sao.h:54
float m_pool
Definition: player_sao.h:34
void setMax(float new_max)
Definition: player_sao.h:40
Definition: metadata.h:28
Definition: player_sao.h:70
void setPlayerYawAndSend(const float yaw)
Definition: player_sao.cpp:394
std::string generateUpdatePhysicsOverrideCommand() const
Definition: player_sao.cpp:308
void disconnected()
Definition: player_sao.cpp:539
void addedToEnvironment(u32 dtime_s)
Definition: player_sao.cpp:86
s16 getWantedRange() const
Definition: player_sao.h:106
float getZoomFOV() const
Definition: player_sao.cpp:677
v3s16 m_nocheat_dig_pos
Definition: player_sao.h:196
bool m_physics_override_sneak
Definition: player_sao.h:223
void noCheatDigEnd()
Definition: player_sao.h:156
void unlinkPlayerSessionAndSave()
Definition: player_sao.cpp:545
bool m_position_not_sent
Definition: player_sao.h:206
float m_time_from_last_teleport
Definition: player_sao.h:194
void setBasePosition(const v3f &position)
Definition: player_sao.cpp:324
IntervalLimiter m_drowning_interval
Definition: player_sao.h:203
s16 m_wanted_range
Definition: player_sao.h:215
void noCheatDigStart(const v3s16 &p)
Definition: player_sao.h:149
ActiveObjectType getSendType() const
Definition: player_sao.h:76
void setBreath(const u16 breath, bool send=true)
Definition: player_sao.cpp:496
void removingFromEnvironment()
Definition: player_sao.cpp:96
std::set< std::string > m_privs
Definition: player_sao.h:209
std::string getWieldList() const
Definition: player_sao.h:126
Inventory * getInventory() const
Definition: player_sao.cpp:507
bool m_physics_override_sent
Definition: player_sao.h:226
bool setWieldedItem(const ItemStack &item)
Definition: player_sao.cpp:529
std::string getClientInitializationData(u16 protocol_version)
Definition: player_sao.cpp:107
void setPos(const v3f &pos)
Definition: player_sao.cpp:338
u16 punch(v3f dir, const ToolCapabilities *toolcap, ServerActiveObject *puncher, float time_from_last_punch)
Definition: player_sao.cpp:414
void getStaticData(std::string *result) const
Definition: player_sao.cpp:149
IntervalLimiter m_node_hurt_interval
Definition: player_sao.h:204
void setHP(s32 hp, const PlayerHPChangeReason &reason)
Definition: player_sao.cpp:467
float m_physics_override_speed
Definition: player_sao.h:220
v3f getLastGoodPosition() const
Definition: player_sao.h:142
IntervalLimiter m_breathing_interval
Definition: player_sao.h:202
void setLookPitchAndSend(const float pitch)
Definition: player_sao.cpp:408
void moveTo(v3f pos, bool continuous)
Definition: player_sao.cpp:355
LagPool m_dig_pool
Definition: player_sao.h:191
void step(float dtime, bool send_recommended)
Definition: player_sao.cpp:154
void setPlayerYaw(const float yaw)
Definition: player_sao.cpp:368
RemotePlayer * getPlayer()
Definition: player_sao.h:137
v3f m_last_good_position
Definition: player_sao.h:193
float m_nocheat_dig_time
Definition: player_sao.h:197
u16 m_breath
Definition: player_sao.h:212
ItemStack getWieldedItem(ItemStack *selected, ItemStack *hand=nullptr) const
Definition: player_sao.cpp:524
void setInventoryModified()
Definition: player_sao.h:125
u16 getBreath() const
Definition: player_sao.h:117
bool getSelectionBox(aabb3f *toset) const
Definition: player_sao.cpp:665
InventoryLocation getInventoryLocation() const
Definition: player_sao.cpp:512
std::string getDescription()
Definition: player_sao.cpp:80
Metadata m_meta
Definition: player_sao.h:217
f32 getFov() const
Definition: player_sao.h:104
float m_time_from_last_punch
Definition: player_sao.h:195
PlayerSAO(ServerEnvironment *env_, RemotePlayer *player_, session_t peer_id_, bool is_singleplayer)
Definition: player_sao.cpp:28
void finalize(RemotePlayer *player, const std::set< std::string > &privs)
Definition: player_sao.cpp:68
bool checkMovementCheat()
Definition: player_sao.cpp:573
v3f getEyeOffset() const
Definition: player_sao.cpp:75
f32 getLookPitch() const
Definition: player_sao.h:99
bool shouldUnload() const
Definition: player_sao.h:86
std::string getPropertyPacket()
Definition: player_sao.cpp:554
f32 getRadLookPitch() const
Definition: player_sao.h:100
LagPool & getDigPool()
Definition: player_sao.h:157
bool isStaticAllowed() const
Definition: player_sao.h:85
void setMaxSpeedOverride(const v3f &vel)
Definition: player_sao.cpp:560
void setFov(const float pitch)
Definition: player_sao.cpp:378
void rightClick(ServerActiveObject *clicker)
Definition: player_sao.cpp:462
f32 m_pitch
Definition: player_sao.h:213
RemotePlayer * m_player
Definition: player_sao.h:187
bool m_physics_override_new_move
Definition: player_sao.h:225
float m_max_speed_override_time
Definition: player_sao.h:198
session_t getPeerID() const
Definition: player_sao.h:138
float m_physics_override_gravity
Definition: player_sao.h:222
float resetTimeFromLastPunch()
Definition: player_sao.h:143
void setWantedRange(const s16 range)
Definition: player_sao.cpp:386
void setHPRaw(u16 hp)
Definition: player_sao.h:116
Metadata & getMeta()
Definition: player_sao.h:180
session_t m_peer_id
Definition: player_sao.h:188
f32 getRadLookPitchDep() const
Definition: player_sao.h:102
float getNoCheatDigTime()
Definition: player_sao.h:155
v3s16 getNoCheatDigPos()
Definition: player_sao.h:154
v3f getEyePosition() const
Definition: player_sao.h:176
bool m_physics_override_sneak_glitch
Definition: player_sao.h:224
bool collideWithObjects() const
Definition: player_sao.h:172
v3f m_max_speed_override
Definition: player_sao.h:199
ActiveObjectType getType() const
Definition: player_sao.h:75
void setLookPitch(const float pitch)
Definition: player_sao.cpp:400
f32 m_fov
Definition: player_sao.h:214
bool getCollisionBox(aabb3f *toset) const
Definition: player_sao.cpp:654
LagPool m_move_pool
Definition: player_sao.h:192
void updatePrivileges(const std::set< std::string > &privs, bool is_singleplayer)
Definition: player_sao.h:164
bool m_is_singleplayer
Definition: player_sao.h:210
u16 getWieldIndex() const
Definition: player_sao.cpp:519
float m_physics_override_jump
Definition: player_sao.h:221
Definition: remoteplayer.h:40
Definition: serveractiveobject.h:52
v3f m_base_position
Definition: serveractiveobject.h:245
Definition: serverenvironment.h:194
Definition: unit_sao.h:27
u16 m_hp
Definition: unit_sao.h:95
#define PLAYER_MAX_BREATH_DEFAULT
Definition: constants.h:96
core::aabbox3d< f32 > aabb3f
Definition: irr_aabb3d.h:26
core::vector3d< s16 > v3s16
Definition: irr_v3d.h:28
core::vector3df v3f
Definition: irr_v3d.h:26
u16 session_t
Definition: networkprotocol.h:234
Definition: inventorymanager.h:28
Definition: inventory.h:34
Definition: player_sao.h:230
PlayerHPChangeReason(Type type, ServerActiveObject *object)
Definition: player_sao.h:294
PlayerHPChangeReason(Type type, std::string node)
Definition: player_sao.h:299
ServerActiveObject * object
Definition: player_sao.h:246
Type
Definition: player_sao.h:232
@ RESPAWN
Definition: player_sao.h:238
@ DROWNING
Definition: player_sao.h:237
@ FALL
Definition: player_sao.h:235
@ SET_HP
Definition: player_sao.h:233
@ PLAYER_PUNCH
Definition: player_sao.h:234
@ NODE_DAMAGE
Definition: player_sao.h:236
bool from_mod
Definition: player_sao.h:242
std::string getTypeAsString() const
Definition: player_sao.h:272
bool setTypeFromString(const std::string &typestr)
Definition: player_sao.h:252
std::string node
Definition: player_sao.h:248
int lua_reference
Definition: player_sao.h:243
PlayerHPChangeReason(Type type)
Definition: player_sao.h:292
bool hasLuaReference() const
Definition: player_sao.h:250
Type type
Definition: player_sao.h:241
Definition: tool.h:58
std::string p(std::string path)
Definition: test_filepath.cpp:59