#include "mapnode.h"
#include "tileanimation.h"
#include "mesh_generator_thread.h"
+#include <fstream>
+#include "filesys.h"
#define CLIENT_CHAT_MESSAGE_LIMIT_PER_10S 10.0f
struct MeshMakeData;
+struct ChatMessage;
class MapBlockMesh;
class IWritableTextureSource;
class IWritableShaderSource;
*/
Client(
- IrrlichtDevice *device,
const char *playername,
const std::string &password,
const std::string &address_name,
~Client();
DISABLE_CLASS_COPY(Client);
+ // Load local mods into memory
+ void loadMods();
+ void scanModSubfolder(const std::string &mod_name, const std::string &mod_path,
+ std::string mod_subpath);
+ inline void scanModIntoMemory(const std::string &mod_name, const std::string &mod_path)
+ {
+ scanModSubfolder(mod_name, mod_path, "");
+ }
+
+ // Initizle the mods
void initMods();
/*
void handleCommand_BlockData(NetworkPacket* pkt);
void handleCommand_Inventory(NetworkPacket* pkt);
void handleCommand_TimeOfDay(NetworkPacket* pkt);
- void handleCommand_ChatMessage(NetworkPacket* pkt);
+ void handleCommand_ChatMessageOld(NetworkPacket *pkt);
+ void handleCommand_ChatMessage(NetworkPacket *pkt);
void handleCommand_ActiveObjectRemoveAdd(NetworkPacket* pkt);
void handleCommand_ActiveObjectMessages(NetworkPacket* pkt);
void handleCommand_Movement(NetworkPacket* pkt);
void handleCommand_EyeOffset(NetworkPacket* pkt);
void handleCommand_UpdatePlayerList(NetworkPacket* pkt);
void handleCommand_SrpBytesSandB(NetworkPacket* pkt);
+ void handleCommand_CSMFlavourLimits(NetworkPacket *pkt);
void ProcessData(NetworkPacket *pkt);
// Causes urgent mesh updates (unlike Map::add/removeNodeWithEvent)
void removeNode(v3s16 p);
+
+ /**
+ * Helper function for Client Side Modding
+ * Flavour is applied there, this should not be used for core engine
+ * @param p
+ * @param is_valid_position
+ * @return
+ */
MapNode getNode(v3s16 p, bool *is_valid_position);
void addNode(v3s16 p, MapNode n, bool remove_metadata = true);
bool nodedefReceived()
{ return m_nodedef_received; }
bool mediaReceived()
- { return m_media_downloader == NULL; }
+ { return !m_media_downloader; }
u8 getProtoVersion()
{ return m_proto_ver; }
float mediaReceiveProgress();
- void afterContentReceived(IrrlichtDevice *device);
+ void afterContentReceived();
float getRTT();
float getCurRate();
ITextureSource* getTextureSource();
virtual IShaderSource* getShaderSource();
IShaderSource *shsrc() { return getShaderSource(); }
- scene::ISceneManager* getSceneManager();
virtual u16 allocateUnknownNodeId(const std::string &name);
virtual ISoundManager* getSoundManager();
virtual MtEventManager* getEventManager();
bool checkLocalPrivilege(const std::string &priv)
{ return checkPrivilege(priv); }
virtual scene::IAnimatedMesh* getMesh(const std::string &filename);
+ const std::string* getModFile(const std::string &filename);
virtual std::string getModStoragePath() const;
virtual bool registerModStorage(ModMetadata *meta);
LocalClientState getState() { return m_state; }
- void makeScreenshot(IrrlichtDevice *device);
+ void makeScreenshot();
- inline void pushToChatQueue(const std::wstring &input)
+ inline void pushToChatQueue(ChatMessage *cec)
{
- m_chat_queue.push(input);
+ m_chat_queue.push(cec);
}
ClientScripting *getScript() { return m_script; }
void showGameFog(const bool show = true);
void showGameDebug(const bool show = true);
- IrrlichtDevice *getDevice() const { return m_device; }
-
const Address getServerAddress()
{
return m_con.GetPeerAddress(PEER_ID_SERVER);
return m_address_name;
}
+ inline bool checkCSMFlavourLimit(CSMFlavourLimit flag) const
+ {
+ return m_csm_flavour_limits & flag;
+ }
+
+ u32 getCSMNodeRangeLimit() const
+ {
+ return m_csm_noderange_limit;
+ }
+
private:
// Virtual methods from con::PeerHandler
ParticleManager m_particle_manager;
con::Connection m_con;
std::string m_address_name;
- IrrlichtDevice *m_device;
Camera *m_camera = nullptr;
Minimap *m_minimap = nullptr;
bool m_minimap_disabled_by_server = false;
// 0 <= m_daynight_i < DAYNIGHT_CACHE_COUNT
//s32 m_daynight_i;
//u32 m_daynight_ratio;
- std::queue<std::wstring> m_chat_queue;
std::queue<std::wstring> m_out_chat_queue;
u32 m_last_chat_message_sent;
float m_chat_message_allowance = 5.0f;
+ std::queue<ChatMessage *> m_chat_queue;
// The authentication methods we can use to enter sudo mode (=change password)
u32 m_sudo_auth_methods;
// Storage for mesh data for creating multiple instances of the same mesh
StringMap m_mesh_data;
+ StringMap m_mod_files;
+
// own state
LocalClientState m_state;
bool m_modding_enabled;
std::unordered_map<std::string, ModMetadata *> m_mod_storages;
float m_mod_storage_save_timer = 10.0f;
+ std::vector<ModSpec> m_mods;
GameUIFlags *m_game_ui_flags;
bool m_shutdown = false;
+
+ // CSM flavour limits byteflag
+ u64 m_csm_flavour_limits = CSMFlavourLimit::CSM_FL_NONE;
+ u32 m_csm_noderange_limit = 8;
};
#endif // !CLIENT_HEADER