3 Copyright (C) 2010-2017 celeron55, Perttu Ahola <celeron55@gmail.com>
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.
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.
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.
20 #ifndef CLIENT_ENVIRONMENT_HEADER
21 #define CLIENT_ENVIRONMENT_HEADER
23 #include <IrrlichtDevice.h>
24 #include <ISceneManager.h>
25 #include "environment.h"
26 #include "clientobject.h"
28 class ClientSimpleObject;
30 class ClientScripting;
31 class ClientActiveObject;
37 The client-side environment.
39 This is not thread-safe.
40 Must be called from main (irrlicht) thread (uses the SceneManager)
41 Client uses an environment mutex.
44 enum ClientEnvEventType
53 ClientEnvEventType type;
67 class ClientEnvironment : public Environment
70 ClientEnvironment(ClientMap *map, scene::ISceneManager *smgr,
71 ITextureSource *texturesource, Client *client,
72 IrrlichtDevice *device);
76 ClientMap & getClientMap();
78 Client *getGameDef() { return m_client; }
79 void setScript(ClientScripting *script) { m_script = script; }
83 virtual void setLocalPlayer(LocalPlayer *player);
84 LocalPlayer *getLocalPlayer() { return m_local_player; }
90 void addSimpleObject(ClientSimpleObject *simple);
96 GenericCAO* getGenericCAO(u16 id);
97 ClientActiveObject* getActiveObject(u16 id);
100 Adds an active object to the environment.
101 Environment handles deletion of object.
102 Object may be deleted by environment immediately.
103 If id of object is 0, assigns a free id to it.
104 Returns the id of the object.
105 Returns 0 if not added and thus deleted.
107 u16 addActiveObject(ClientActiveObject *object);
109 void addActiveObject(u16 id, u8 type, const std::string &init_data);
110 void removeActiveObject(u16 id);
112 void processActiveObjectMessage(u16 id, const std::string &data);
115 Callbacks for activeobjects
118 void damageLocalPlayer(u8 damage, bool handle_hp=true);
119 void updateLocalPlayerBreath(u16 breath);
122 Client likes to call these
125 // Get all nearby objects
126 void getActiveObjects(v3f origin, f32 max_d,
127 std::vector<DistanceSortedActiveObject> &dest);
129 // Get event from queue. CEE_NONE is returned if queue is empty.
130 ClientEnvEvent getClientEvent();
133 * Gets closest object pointed by the shootline.
134 * Returns NULL if not found.
136 * \param[in] shootline_on_map the shootline for
137 * the test in world coordinates
138 * \param[out] intersection_point the first point where
139 * the shootline meets the object. Valid only if
140 * not NULL is returned.
141 * \param[out] intersection_normal the normal vector of
142 * the intersection, pointing outwards. Zero vector if
143 * the shootline starts in an active object.
144 * Valid only if not NULL is returned.
146 ClientActiveObject * getSelectedActiveObject(
147 const core::line3d<f32> &shootline_on_map,
148 v3f *intersection_point,
149 v3s16 *intersection_normal
153 * Performs a raycast on the world.
154 * Returns the first thing the shootline meets.
156 * @param[in] shootline the shootline, starting from
157 * the camera position. This also gives the maximal distance
159 * @param[in] liquids_pointable if false, liquids are ignored
160 * @param[in] look_for_object if false, objects are ignored
162 PointedThing getPointedThing(
163 core::line3d<f32> shootline,
164 bool liquids_pointable,
165 bool look_for_object);
167 u16 attachement_parent_ids[USHRT_MAX + 1];
169 const std::list<std::string> &getPlayerNames() { return m_player_names; }
170 void addPlayerName(const std::string &name) { m_player_names.push_back(name); }
171 void removePlayerName(const std::string &name) { m_player_names.remove(name); }
172 void updateCameraOffset(v3s16 camera_offset)
173 { m_camera_offset = camera_offset; }
174 v3s16 getCameraOffset() const { return m_camera_offset; }
177 LocalPlayer *m_local_player;
178 scene::ISceneManager *m_smgr;
179 ITextureSource *m_texturesource;
181 ClientScripting *m_script;
182 IrrlichtDevice *m_irr;
183 UNORDERED_MAP<u16, ClientActiveObject*> m_active_objects;
184 std::vector<ClientSimpleObject*> m_simple_objects;
185 std::queue<ClientEnvEvent> m_client_event_queue;
186 IntervalLimiter m_active_object_light_update_interval;
187 IntervalLimiter m_lava_hurt_interval;
188 IntervalLimiter m_drowning_interval;
189 IntervalLimiter m_breathing_interval;
190 std::list<std::string> m_player_names;
191 v3s16 m_camera_offset;