Minetest  5.4.0
serveractiveobject.h
Go to the documentation of this file.
1 /*
2 Minetest
3 Copyright (C) 2010-2013 celeron55, Perttu Ahola <celeron55@gmail.com>
4 
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU Lesser General Public License as published by
7 the Free Software Foundation; either version 2.1 of the License, or
8 (at your option) any later version.
9 
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU Lesser General Public License for more details.
14 
15 You should have received a copy of the GNU Lesser General Public License along
16 with this program; if not, write to the Free Software Foundation, Inc.,
17 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18 */
19 
20 #pragma once
21 
22 #include <unordered_set>
23 #include "irrlichttypes_bloated.h"
24 #include "activeobject.h"
25 #include "inventorymanager.h"
26 #include "itemgroup.h"
27 #include "util/container.h"
28 
29 /*
30 
31 Some planning
32 -------------
33 
34 * Server environment adds an active object, which gets the id 1
35 * The active object list is scanned for each client once in a while,
36  and it finds out what objects have been added that are not known
37  by the client yet. This scan is initiated by the Server class and
38  the result ends up directly to the server.
39 * A network packet is created with the info and sent to the client.
40 * Environment converts objects to static data and static data to
41  objects, based on how close players are to them.
42 
43 */
44 
45 class ServerEnvironment;
46 struct ItemStack;
47 struct ToolCapabilities;
48 struct ObjectProperties;
50 
52 {
53 public:
54  /*
55  NOTE: m_env can be NULL, but step() isn't called if it is.
56  Prototypes are used that way.
57  */
59  virtual ~ServerActiveObject() = default;
60 
61  virtual ActiveObjectType getSendType() const
62  { return getType(); }
63 
64  // Called after id has been set and has been inserted in environment
65  virtual void addedToEnvironment(u32 dtime_s){};
66  // Called before removing from environment
67  virtual void removingFromEnvironment(){};
68  // Returns true if object's deletion is the job of the
69  // environment
70  virtual bool environmentDeletes() const
71  { return true; }
72 
73  // Safely mark the object for removal or deactivation
74  void markForRemoval();
75  void markForDeactivation();
76 
77  // Create a certain type of ServerActiveObject
79  ServerEnvironment *env, u16 id, v3f pos,
80  const std::string &data);
81 
82  /*
83  Some simple getters/setters
84  */
85  v3f getBasePosition() const { return m_base_position; }
86  void setBasePosition(v3f pos){ m_base_position = pos; }
88 
89  /*
90  Some more dynamic interface
91  */
92 
93  virtual void setPos(const v3f &pos)
94  { setBasePosition(pos); }
95  // continuous: if true, object does not stop immediately at pos
96  virtual void moveTo(v3f pos, bool continuous)
97  { setBasePosition(pos); }
98  // If object has moved less than this and data has not changed,
99  // saving to disk may be omitted
100  virtual float getMinimumSavedMovement();
101 
102  virtual std::string getDescription(){return "SAO";}
103 
104  /*
105  Step object in time.
106  Messages added to messages are sent to client over network.
107 
108  send_recommended:
109  True at around 5-10 times a second, same for all objects.
110  This is used to let objects send most of the data at the
111  same time so that the data can be combined in a single
112  packet.
113  */
114  virtual void step(float dtime, bool send_recommended){}
115 
116  /*
117  The return value of this is passed to the client-side object
118  when it is created
119  */
120  virtual std::string getClientInitializationData(u16 protocol_version) {return "";}
121 
122  /*
123  The return value of this is passed to the server-side object
124  when it is created (converted from static to active - actually
125  the data is the static form)
126  */
127  virtual void getStaticData(std::string *result) const
128  {
129  assert(isStaticAllowed());
130  *result = "";
131  }
132 
133  /*
134  Return false in here to never save and instead remove object
135  on unload. getStaticData() will not be called in that case.
136  */
137  virtual bool isStaticAllowed() const
138  {return true;}
139 
140  /*
141  Return false here to never unload the object.
142  isStaticAllowed && shouldUnload -> unload when out of active block range
143  !isStaticAllowed && shouldUnload -> unload when block is unloaded
144  */
145  virtual bool shouldUnload() const
146  { return true; }
147 
148  // Returns tool wear
149  virtual u16 punch(v3f dir,
150  const ToolCapabilities *toolcap = nullptr,
151  ServerActiveObject *puncher = nullptr,
152  float time_from_last_punch = 1000000.0f)
153  { return 0; }
154  virtual void rightClick(ServerActiveObject *clicker)
155  {}
156  virtual void setHP(s32 hp, const PlayerHPChangeReason &reason)
157  {}
158  virtual u16 getHP() const
159  { return 0; }
160 
161  virtual void setArmorGroups(const ItemGroupList &armor_groups)
162  {}
163  virtual const ItemGroupList &getArmorGroups() const
164  { static ItemGroupList rv; return rv; }
165  virtual void setAnimation(v2f frames, float frame_speed, float frame_blend, bool frame_loop)
166  {}
167  virtual void getAnimation(v2f *frames, float *frame_speed, float *frame_blend, bool *frame_loop)
168  {}
169  virtual void setAnimationSpeed(float frame_speed)
170  {}
171  virtual void setBonePosition(const std::string &bone, v3f position, v3f rotation)
172  {}
173  virtual void getBonePosition(const std::string &bone, v3f *position, v3f *lotation)
174  {}
175  virtual const std::unordered_set<int> &getAttachmentChildIds() const
176  { static std::unordered_set<int> rv; return rv; }
177  virtual ServerActiveObject *getParent() const { return nullptr; }
179  { return NULL; }
181  {}
182 
183  // Inventory and wielded item
184  virtual Inventory *getInventory() const
185  { return NULL; }
187  { return InventoryLocation(); }
188  virtual void setInventoryModified()
189  {}
190  virtual std::string getWieldList() const
191  { return ""; }
192  virtual u16 getWieldIndex() const
193  { return 0; }
194  virtual ItemStack getWieldedItem(ItemStack *selected,
195  ItemStack *hand = nullptr) const;
196  virtual bool setWieldedItem(const ItemStack &item);
197  inline void attachParticleSpawner(u32 id)
198  {
199  m_attached_particle_spawners.insert(id);
200  }
201  inline void detachParticleSpawner(u32 id)
202  {
204  }
205 
206  std::string generateUpdateInfantCommand(u16 infant_id, u16 protocol_version);
207 
208  void dumpAOMessagesToQueue(std::queue<ActiveObjectMessage> &queue);
209 
210  /*
211  Number of players which know about this object. Object won't be
212  deleted until this is 0 to keep the id preserved for the right
213  object.
214  */
216 
217  /*
218  A getter that unifies the above to answer the question:
219  "Can the environment still interact with this object?"
220  */
221  inline bool isGone() const
223 
224  inline bool isPendingRemoval() const
225  { return m_pending_removal; }
226 
227  /*
228  Whether the object's static data has been stored to a block
229  */
230  bool m_static_exists = false;
231  /*
232  The block from which the object was loaded from, and in which
233  a copy of the static data resides.
234  */
235  v3s16 m_static_block = v3s16(1337,1337,1337);
236 
237 protected:
238  virtual void onMarkedForDeactivation() {}
239  virtual void onMarkedForRemoval() {}
240 
241  virtual void onAttach(int parent_id) {}
242  virtual void onDetach(int parent_id) {}
243 
246  std::unordered_set<u32> m_attached_particle_spawners;
247 
248  /*
249  Same purpose as m_pending_removal but for deactivation.
250  deactvation = save static data in block, remove active object
251 
252  If this is set alongside with m_pending_removal, removal takes
253  priority.
254  Note: Do not assign this directly, use markForDeactivation() instead.
255  */
257 
258  /*
259  - Whether this object is to be removed when nobody knows about
260  it anymore.
261  - Removal is delayed to preserve the id for the time during which
262  it could be confused to some other object by some client.
263  - This is usually set to true by the step() method when the object wants
264  to be deleted but can be set by anything else too.
265  Note: Do not assign this directly, use markForRemoval() instead.
266  */
267  bool m_pending_removal = false;
268 
269  /*
270  Queue of messages to be sent to the client
271  */
272  std::queue<ActiveObjectMessage> m_messages_out;
273 };
ActiveObjectType
Definition: activeobject.h:27
static v2f dir(const v2f &pos_dist)
Definition: camera.cpp:240
Definition: activeobject.h:79
virtual ActiveObjectType getType() const =0
Definition: inventory.h:282
Definition: serveractiveobject.h:52
v3f getBasePosition() const
Definition: serveractiveobject.h:85
virtual void setAnimationSpeed(float frame_speed)
Definition: serveractiveobject.h:169
virtual bool setWieldedItem(const ItemStack &item)
Definition: serveractiveobject.cpp:47
void markForDeactivation()
Definition: serveractiveobject.cpp:85
virtual bool shouldUnload() const
Definition: serveractiveobject.h:145
virtual u16 punch(v3f dir, const ToolCapabilities *toolcap=nullptr, ServerActiveObject *puncher=nullptr, float time_from_last_punch=1000000.0f)
Definition: serveractiveobject.h:149
ServerEnvironment * m_env
Definition: serveractiveobject.h:244
virtual void setPos(const v3f &pos)
Definition: serveractiveobject.h:93
virtual void onMarkedForDeactivation()
Definition: serveractiveobject.h:238
static ServerActiveObject * create(ActiveObjectType type, ServerEnvironment *env, u16 id, v3f pos, const std::string &data)
virtual std::string getClientInitializationData(u16 protocol_version)
Definition: serveractiveobject.h:120
bool m_static_exists
Definition: serveractiveobject.h:230
virtual ItemStack getWieldedItem(ItemStack *selected, ItemStack *hand=nullptr) const
Definition: serveractiveobject.cpp:38
virtual void getAnimation(v2f *frames, float *frame_speed, float *frame_blend, bool *frame_loop)
Definition: serveractiveobject.h:167
std::unordered_set< u32 > m_attached_particle_spawners
Definition: serveractiveobject.h:246
virtual void setInventoryModified()
Definition: serveractiveobject.h:188
virtual InventoryLocation getInventoryLocation() const
Definition: serveractiveobject.h:186
bool m_pending_deactivation
Definition: serveractiveobject.h:256
virtual bool environmentDeletes() const
Definition: serveractiveobject.h:70
void markForRemoval()
Definition: serveractiveobject.cpp:77
ServerActiveObject(ServerEnvironment *env, v3f pos)
Definition: serveractiveobject.cpp:26
virtual void addedToEnvironment(u32 dtime_s)
Definition: serveractiveobject.h:65
u16 m_known_by_count
Definition: serveractiveobject.h:215
virtual ActiveObjectType getSendType() const
Definition: serveractiveobject.h:61
virtual void onAttach(int parent_id)
Definition: serveractiveobject.h:241
void detachParticleSpawner(u32 id)
Definition: serveractiveobject.h:201
virtual u16 getHP() const
Definition: serveractiveobject.h:158
bool isPendingRemoval() const
Definition: serveractiveobject.h:224
virtual void setBonePosition(const std::string &bone, v3f position, v3f rotation)
Definition: serveractiveobject.h:171
virtual const std::unordered_set< int > & getAttachmentChildIds() const
Definition: serveractiveobject.h:175
void attachParticleSpawner(u32 id)
Definition: serveractiveobject.h:197
std::string generateUpdateInfantCommand(u16 infant_id, u16 protocol_version)
Definition: serveractiveobject.cpp:52
virtual void setAnimation(v2f frames, float frame_speed, float frame_blend, bool frame_loop)
Definition: serveractiveobject.h:165
virtual void setArmorGroups(const ItemGroupList &armor_groups)
Definition: serveractiveobject.h:161
virtual float getMinimumSavedMovement()
Definition: serveractiveobject.cpp:33
void dumpAOMessagesToQueue(std::queue< ActiveObjectMessage > &queue)
Definition: serveractiveobject.cpp:69
virtual const ItemGroupList & getArmorGroups() const
Definition: serveractiveobject.h:163
std::queue< ActiveObjectMessage > m_messages_out
Definition: serveractiveobject.h:272
virtual std::string getWieldList() const
Definition: serveractiveobject.h:190
virtual void notifyObjectPropertiesModified()
Definition: serveractiveobject.h:180
virtual void getStaticData(std::string *result) const
Definition: serveractiveobject.h:127
virtual void rightClick(ServerActiveObject *clicker)
Definition: serveractiveobject.h:154
virtual u16 getWieldIndex() const
Definition: serveractiveobject.h:192
virtual void removingFromEnvironment()
Definition: serveractiveobject.h:67
virtual void step(float dtime, bool send_recommended)
Definition: serveractiveobject.h:114
virtual Inventory * getInventory() const
Definition: serveractiveobject.h:184
ServerEnvironment * getEnv()
Definition: serveractiveobject.h:87
virtual void getBonePosition(const std::string &bone, v3f *position, v3f *lotation)
Definition: serveractiveobject.h:173
virtual std::string getDescription()
Definition: serveractiveobject.h:102
virtual bool isStaticAllowed() const
Definition: serveractiveobject.h:137
v3s16 m_static_block
Definition: serveractiveobject.h:235
void setBasePosition(v3f pos)
Definition: serveractiveobject.h:86
virtual void onMarkedForRemoval()
Definition: serveractiveobject.h:239
virtual void onDetach(int parent_id)
Definition: serveractiveobject.h:242
virtual ~ServerActiveObject()=default
virtual void moveTo(v3f pos, bool continuous)
Definition: serveractiveobject.h:96
virtual void setHP(s32 hp, const PlayerHPChangeReason &reason)
Definition: serveractiveobject.h:156
bool m_pending_removal
Definition: serveractiveobject.h:267
bool isGone() const
Definition: serveractiveobject.h:221
virtual ObjectProperties * accessObjectProperties()
Definition: serveractiveobject.h:178
v3f m_base_position
Definition: serveractiveobject.h:245
virtual ServerActiveObject * getParent() const
Definition: serveractiveobject.h:177
Definition: serverenvironment.h:194
core::vector2d< f32 > v2f
Definition: irr_v2d.h:26
core::vector3d< s16 > v3s16
Definition: irr_v3d.h:28
core::vector3df v3f
Definition: irr_v3d.h:26
std::unordered_map< std::string, int > ItemGroupList
Definition: itemgroup.h:25
Definition: inventorymanager.h:28
Definition: inventory.h:34
Definition: object_properties.h:30
Definition: player_sao.h:230
Definition: tool.h:58