X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Fitemdef.h;h=fb157705f2b04006ae7d9e54374e657e65c73924;hb=f14e7bac54af65e3d3d99f89f23f114b17058e49;hp=cbbe7e2adcf844ba35db37c9c582bf8f7ac07c61;hpb=7d9329ecfe84733cdefa34eab25ee3d124c94c59;p=oweals%2Fminetest.git diff --git a/src/itemdef.h b/src/itemdef.h index cbbe7e2ad..fb157705f 100644 --- a/src/itemdef.h +++ b/src/itemdef.h @@ -25,8 +25,18 @@ with this program; if not, write to the Free Software Foundation, Inc., #include #include #include +#include #include "itemgroup.h" +#include "sound.h" +#include "util/container.h" +#include "util/thread.h" + +#ifndef SERVER +#include "client/tile.h" +#endif + class IGameDef; +class INodeDefManager; struct ToolCapabilities; /* @@ -38,7 +48,7 @@ enum ItemType ITEM_NONE, ITEM_NODE, ITEM_CRAFT, - ITEM_TOOL, + ITEM_TOOL }; struct ItemDefinition @@ -66,6 +76,9 @@ struct ItemDefinition // May be NULL. If non-NULL, deleted by destructor ToolCapabilities *tool_capabilities; ItemGroupList groups; + SimpleSoundSpec sound_place; + SimpleSoundSpec sound_place_failed; + f32 range; // Client shall immediately place this node when player places the item. // Server will update the precise end result a moment later. @@ -153,6 +166,77 @@ public: virtual void processQueue(IGameDef *gamedef)=0; }; + +class CItemDefManager: public IWritableItemDefManager +{ +public: + CItemDefManager(); + virtual ~CItemDefManager(); + virtual const ItemDefinition& get(const std::string &name_) const; + virtual std::string getAlias(const std::string &name) const; + virtual std::set getAll() const; + virtual bool isKnown(const std::string &name_) const; + +#ifndef SERVER + // Get item inventory texture + virtual video::ITexture* getInventoryTexture(const std::string &name, + IGameDef *gamedef) const; + + // Get item wield mesh + virtual scene::IMesh* getWieldMesh(const std::string &name, + IGameDef *gamedef) const; +#endif + void clear(); + + virtual void registerItem(const ItemDefinition &def); + virtual void registerAlias(const std::string &name, + const std::string &convert_to); + void serialize(std::ostream &os, u16 protocol_version); + void deSerialize(std::istream &is); + + void processQueue(IGameDef *gamedef); + +private: + +#ifndef SERVER + struct ClientCached + { + video::ITexture *inventory_texture; + scene::IMesh *wield_mesh; + + ClientCached(); + }; + + void createNodeItemTexture(const std::string& name, + const ItemDefinition& def, INodeDefManager* nodedef, + ClientCached* cc, IGameDef* gamedef, ITextureSource* tsrc) const; + + ClientCached* createClientCachedDirect(const std::string &name, + IGameDef *gamedef) const; + + ClientCached* getClientCached(const std::string &name, + IGameDef *gamedef) const; + + // The id of the thread that is allowed to use irrlicht directly + threadid_t m_main_thread; + + // A reference to this can be returned when nothing is found, to avoid NULLs + mutable ClientCached m_dummy_clientcached; + + // Cached textures and meshes + mutable MutexedMap m_clientcached; + + // Queued clientcached fetches (to be processed by the main thread) + mutable RequestQueue m_get_clientcached_queue; +#endif + + // Key is name + std::map m_item_definitions; + + // Aliases + std::map m_aliases; +}; + IWritableItemDefManager* createItemDefManager(); #endif