X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Fenvironment.h;h=5d2fe55515d785e83399199f49b624f2686c09fa;hb=9b907dd65a2c045d10605894fdaea504200e2be7;hp=8993b8e87c07ce2bc129206ed9144edb74312ec2;hpb=e1a2b8f600ff9845ecff0f06c85d4d2c29970414;p=minetest.git diff --git a/src/environment.h b/src/environment.h index 8993b8e87..5d2fe5551 100644 --- a/src/environment.h +++ b/src/environment.h @@ -36,6 +36,11 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "map.h" #include #include "utility.h" +#include "activeobject.h" + +class Server; +class ActiveBlockModifier; +class ServerActiveObject; class Environment { @@ -112,29 +117,12 @@ class ActiveBlockList private: }; -/* - Active block modifier interface -*/ - -class ActiveBlockModifier -{ -public: - ActiveBlockModifier(){}; - virtual ~ActiveBlockModifier(){}; - //TODO - //virtual void -}; - /* The server-side environment. This is not thread-safe. Server uses an environment mutex. */ -#include "serverobject.h" - -class Server; - class ServerEnvironment : public Environment { public: @@ -171,7 +159,8 @@ class ServerEnvironment : public Environment void loadMeta(const std::string &savedir); /* - ActiveObjects + External ActiveObject interface + ------------------------------------------- */ ServerActiveObject* getActiveObject(u16 id); @@ -186,6 +175,14 @@ class ServerEnvironment : public Environment */ u16 addActiveObject(ServerActiveObject *object); + /* + Add an active object as a static object to the corresponding + MapBlock. + Caller allocates memory, ServerEnvironment frees memory. + Return value: true if succeeded, false if failed. + */ + bool addActiveObjectAsStatic(ServerActiveObject *object); + /* Find out what new objects have been added to inside a radius around a position @@ -208,7 +205,43 @@ class ServerEnvironment : public Environment */ ActiveObjectMessage getActiveObjectMessage(); + /* + Activate objects and dynamically modify for the dtime determined + from timestamp and additional_dtime + */ + void activateBlock(MapBlock *block, u32 additional_dtime=0); + + /* + ActiveBlockModifiers (TODO) + ------------------------------------------- + */ + + void addActiveBlockModifier(ActiveBlockModifier *abm); + + /* Other stuff */ + + // Clear all objects, loading and going through every MapBlock + void clearAllObjects(); + private: + + /* + Internal ActiveObject interface + ------------------------------------------- + */ + + /* + Add an active object to the environment. + + Called by addActiveObject. + + Object may be deleted by environment immediately. + If id of object is 0, assigns a free id to it. + Returns the id of the object. + Returns 0 if not added and thus deleted. + */ + u16 addActiveObjectRaw(ServerActiveObject *object, bool set_changed); + /* Remove all objects that satisfy (m_removed && m_known_by_count==0) */ @@ -250,6 +283,7 @@ class ServerEnvironment : public Environment ActiveBlockList m_active_blocks; IntervalLimiter m_active_blocks_management_interval; IntervalLimiter m_active_blocks_test_interval; + IntervalLimiter m_active_blocks_nodemetadata_interval; // Time from the beginning of the game in seconds. // Incremented in step(). u32 m_game_time; @@ -257,6 +291,29 @@ class ServerEnvironment : public Environment float m_game_time_fraction_counter; }; +/* + Active block modifier interface. + + These are fed into ServerEnvironment at initialization time; + ServerEnvironment handles deleting them. +*/ + +class ActiveBlockModifier +{ +public: + ActiveBlockModifier(){}; + virtual ~ActiveBlockModifier(){}; + + //virtual core::list update(ServerEnvironment *env) = 0; + virtual u32 getTriggerContentCount(){ return 1;} + virtual u8 getTriggerContent(u32 i) = 0; + virtual float getActiveInterval() = 0; + // chance of (1 / return value), 0 is disallowed + virtual u32 getActiveChance() = 0; + // This is called usually at interval for 1/chance of the nodes + virtual void triggerEvent(ServerEnvironment *env, v3s16 p) = 0; +}; + #ifndef SERVER #include "clientobject.h" @@ -368,6 +425,8 @@ class ClientEnvironment : public Environment scene::ISceneManager *m_smgr; core::map m_active_objects; Queue m_client_event_queue; + IntervalLimiter m_active_object_light_update_interval; + IntervalLimiter m_lava_hurt_interval; }; #endif