3 Copyright (C) 2010-2013 celeron55, Perttu Ahola <celeron55@gmail.com>
4 Copyright (C) 2013-2020 Minetest core developers & community
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.
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.
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.
23 #include "constants.h"
24 #include "network/networkprotocol.h"
26 #include "util/numeric.h"
29 PlayerSAO needs some internals exposed.
40 void setMax(float new_max)
54 void empty() { m_pool = m_max; }
56 bool grab(float dtime)
60 if (m_pool + dtime > m_max)
69 class PlayerSAO : public UnitSAO
72 PlayerSAO(ServerEnvironment *env_, RemotePlayer *player_, session_t peer_id_,
73 bool is_singleplayer);
75 ActiveObjectType getType() const override { return ACTIVEOBJECT_TYPE_PLAYER; }
76 ActiveObjectType getSendType() const override { return ACTIVEOBJECT_TYPE_GENERIC; }
77 std::string getDescription() override;
80 Active object <-> environment interface
83 void addedToEnvironment(u32 dtime_s) override;
84 void removingFromEnvironment() override;
85 bool isStaticAllowed() const override { return false; }
86 bool shouldUnload() const override { return false; }
87 std::string getClientInitializationData(u16 protocol_version) override;
88 void getStaticData(std::string *result) const override;
89 void step(float dtime, bool send_recommended) override;
90 void setBasePosition(v3f position);
91 void setPos(const v3f &pos) override;
92 void moveTo(v3f pos, bool continuous) override;
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; }
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; }
109 Interaction interface
112 u32 punch(v3f dir, const ToolCapabilities *toolcap, ServerActiveObject *puncher,
113 float time_from_last_punch, u16 initial_wear = 0) override;
114 void rightClick(ServerActiveObject *clicker) override;
115 void setHP(s32 hp, const PlayerHPChangeReason &reason) override
117 return setHP(hp, reason, false);
119 void setHP(s32 hp, const PlayerHPChangeReason &reason, bool from_client);
120 void setHPRaw(u16 hp) { m_hp = hp; }
121 u16 getBreath() const { return m_breath; }
122 void setBreath(const u16 breath, bool send = true);
127 Inventory *getInventory() const override;
128 InventoryLocation getInventoryLocation() const override;
129 void setInventoryModified() override {}
130 std::string getWieldList() const override { return "main"; }
131 u16 getWieldIndex() const override;
132 ItemStack getWieldedItem(ItemStack *selected, ItemStack *hand = nullptr) const override;
133 bool setWieldedItem(const ItemStack &item) override;
141 RemotePlayer *getPlayer() { return m_player; }
142 session_t getPeerID() const { return m_peer_id; }
146 v3f getLastGoodPosition() const { return m_last_good_position; }
147 float resetTimeFromLastPunch()
149 float r = m_time_from_last_punch;
150 m_time_from_last_punch = 0.0;
153 void noCheatDigStart(const v3s16 &p)
155 m_nocheat_dig_pos = p;
156 m_nocheat_dig_time = 0;
158 v3s16 getNoCheatDigPos() { return m_nocheat_dig_pos; }
159 float getNoCheatDigTime() { return m_nocheat_dig_time; }
160 void noCheatDigEnd() { m_nocheat_dig_pos = v3s16(32767, 32767, 32767); }
161 LagPool &getDigPool() { return m_dig_pool; }
162 void setMaxSpeedOverride(const v3f &vel);
163 // Returns true if cheated
164 bool checkMovementCheat();
168 void updatePrivileges(const std::set<std::string> &privs, bool is_singleplayer)
171 m_is_singleplayer = is_singleplayer;
174 bool getCollisionBox(aabb3f *toset) const override;
175 bool getSelectionBox(aabb3f *toset) const override;
176 bool collideWithObjects() const override { return true; }
178 void finalize(RemotePlayer *player, const std::set<std::string> &privs);
180 v3f getEyePosition() const { return m_base_position + getEyeOffset(); }
181 v3f getEyeOffset() const;
182 float getZoomFOV() const;
184 inline Metadata &getMeta() { return m_meta; }
187 std::string getPropertyPacket();
188 void unlinkPlayerSessionAndSave();
189 std::string generateUpdatePhysicsOverrideCommand() const;
191 RemotePlayer *m_player = nullptr;
192 session_t m_peer_id = 0;
197 v3f m_last_good_position;
198 float m_time_from_last_teleport = 0.0f;
199 float m_time_from_last_punch = 0.0f;
200 v3s16 m_nocheat_dig_pos = v3s16(32767, 32767, 32767);
201 float m_nocheat_dig_time = 0.0f;
202 float m_max_speed_override_time = 0.0f;
203 v3f m_max_speed_override = v3f(0.0f, 0.0f, 0.0f);
206 IntervalLimiter m_breathing_interval;
207 IntervalLimiter m_drowning_interval;
208 IntervalLimiter m_node_hurt_interval;
210 bool m_position_not_sent = false;
212 // Cached privileges for enforcement
213 std::set<std::string> m_privs;
214 bool m_is_singleplayer;
216 u16 m_breath = PLAYER_MAX_BREATH_DEFAULT;
219 s16 m_wanted_range = 0.0f;
224 bool m_physics_override_sent = false;
227 struct PlayerHPChangeReason
232 SET_HP_MAX, // internal type to allow distinguishing hp reset and damage (for effects)
241 bool from_mod = false;
242 int lua_reference = -1;
245 ServerActiveObject *object = nullptr;
249 inline bool hasLuaReference() const { return lua_reference >= 0; }
251 bool setTypeFromString(const std::string &typestr)
253 if (typestr == "set_hp")
255 else if (typestr == "punch")
257 else if (typestr == "fall")
259 else if (typestr == "node_damage")
261 else if (typestr == "drown")
263 else if (typestr == "respawn")
271 std::string getTypeAsString() const
274 case PlayerHPChangeReason::SET_HP:
275 case PlayerHPChangeReason::SET_HP_MAX:
277 case PlayerHPChangeReason::PLAYER_PUNCH:
279 case PlayerHPChangeReason::FALL:
281 case PlayerHPChangeReason::NODE_DAMAGE:
282 return "node_damage";
283 case PlayerHPChangeReason::DROWNING:
285 case PlayerHPChangeReason::RESPAWN:
292 PlayerHPChangeReason(Type type) : type(type) {}
294 PlayerHPChangeReason(Type type, ServerActiveObject *object) :
295 type(type), object(object)
299 PlayerHPChangeReason(Type type, std::string node) : type(type), node(node) {}