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.
22 #include "environment.h"
23 #include <ISceneManager.h>
24 #include "clientobject.h"
25 #include "util/numeric.h"
26 #include "activeobjectmgr.h"
28 class ClientSimpleObject;
30 class ClientScripting;
31 class ClientActiveObject;
36 The client-side environment.
38 This is not thread-safe.
39 Must be called from main (irrlicht) thread (uses the SceneManager)
40 Client uses an environment mutex.
43 enum ClientEnvEventType
51 ClientEnvEventType type;
62 typedef std::unordered_map<u16, ClientActiveObject*> ClientActiveObjectMap;
63 class ClientEnvironment : public Environment
66 ClientEnvironment(ClientMap *map, ITextureSource *texturesource, Client *client);
70 ClientMap & getClientMap();
72 Client *getGameDef() { return m_client; }
73 void setScript(ClientScripting *script) { m_script = script; }
77 virtual void setLocalPlayer(LocalPlayer *player);
78 LocalPlayer *getLocalPlayer() const { return m_local_player; }
84 void addSimpleObject(ClientSimpleObject *simple);
90 GenericCAO* getGenericCAO(u16 id);
91 ClientActiveObject* getActiveObject(u16 id)
93 return m_ao_manager.getActiveObject(id);
97 Adds an active object to the environment.
98 Environment handles deletion of object.
99 Object may be deleted by environment immediately.
100 If id of object is 0, assigns a free id to it.
101 Returns the id of the object.
102 Returns 0 if not added and thus deleted.
104 u16 addActiveObject(ClientActiveObject *object);
106 void addActiveObject(u16 id, u8 type, const std::string &init_data);
107 void removeActiveObject(u16 id)
109 m_ao_manager.removeObject(id);
112 void processActiveObjectMessage(u16 id, const std::string &data);
115 Callbacks for activeobjects
118 void damageLocalPlayer(u16 damage, bool handle_hp=true);
121 Client likes to call these
124 // Get all nearby objects
125 void getActiveObjects(const v3f &origin, f32 max_d,
126 std::vector<DistanceSortedActiveObject> &dest)
128 return m_ao_manager.getActiveObjects(origin, max_d, dest);
131 bool hasClientEnvEvents() const { return !m_client_event_queue.empty(); }
133 // Get event from queue. If queue is empty, it triggers an assertion failure.
134 ClientEnvEvent getClientEnvEvent();
136 virtual void getSelectedActiveObjects(
137 const core::line3d<f32> &shootline_on_map,
138 std::vector<PointedThing> &objects
141 u16 attachement_parent_ids[USHRT_MAX + 1];
143 const std::list<std::string> &getPlayerNames() { return m_player_names; }
144 void addPlayerName(const std::string &name) { m_player_names.push_back(name); }
145 void removePlayerName(const std::string &name) { m_player_names.remove(name); }
146 void updateCameraOffset(const v3s16 &camera_offset)
147 { m_camera_offset = camera_offset; }
148 v3s16 getCameraOffset() const { return m_camera_offset; }
151 LocalPlayer *m_local_player = nullptr;
152 ITextureSource *m_texturesource;
154 ClientScripting *m_script = nullptr;
155 client::ActiveObjectMgr m_ao_manager;
156 std::vector<ClientSimpleObject*> m_simple_objects;
157 std::queue<ClientEnvEvent> m_client_event_queue;
158 IntervalLimiter m_active_object_light_update_interval;
159 std::list<std::string> m_player_names;
160 v3s16 m_camera_offset;