diff --git a/minetest.conf.example b/minetest.conf.example index 440a26903..c8cfbe85c 100644 --- a/minetest.conf.example +++ b/minetest.conf.example @@ -122,6 +122,8 @@ screenH# = 600 #creative_mode = false # Enable players getting damage and dying #enable_damage = false +# Despawn all non-peaceful mobs +#only_peaceful_mobs = false # A chosen map seed for a new map, leave empty for random #fixed_map_seed = # Gives some stuff to players at the beginning diff --git a/src/content_sao.cpp b/src/content_sao.cpp index 8b1002c5a..e218fc765 100644 --- a/src/content_sao.cpp +++ b/src/content_sao.cpp @@ -1370,6 +1370,11 @@ u16 MobV2SAO::punch(const std::string &toolname, v3f dir, return 65536/100; } +bool MobV2SAO::isPeaceful() +{ + return m_properties->getBool("is_peaceful"); +} + void MobV2SAO::sendPosition() { m_last_sent_position = m_base_position; @@ -1388,6 +1393,7 @@ void MobV2SAO::sendPosition() void MobV2SAO::setPropertyDefaults() { + m_properties->setDefault("is_peaceful", "false"); m_properties->setDefault("move_type", "ground_nodes"); m_properties->setDefault("speed", "(0,0,0)"); m_properties->setDefault("age", "0"); diff --git a/src/content_sao.h b/src/content_sao.h index 42e8cab7d..a335c12b8 100644 --- a/src/content_sao.h +++ b/src/content_sao.h @@ -97,6 +97,7 @@ public: std::string getStaticData(); InventoryItem* createPickedUpItem(){return NULL;} u16 punch(const std::string &toolname, v3f dir); + bool isPeaceful(){return false;} private: void doDamage(u16 d); @@ -157,6 +158,7 @@ public: InventoryItem* createPickedUpItem(){return NULL;} u16 punch(const std::string &toolname, v3f dir, const std::string &playername); + bool isPeaceful(); private: void sendPosition(); void setPropertyDefaults(); diff --git a/src/defaultsettings.cpp b/src/defaultsettings.cpp index be787dd6b..a3a833327 100644 --- a/src/defaultsettings.cpp +++ b/src/defaultsettings.cpp @@ -83,6 +83,7 @@ void set_default_settings(Settings *settings) settings->setDefault("strict_protocol_version_checking", "true"); settings->setDefault("creative_mode", "false"); settings->setDefault("enable_damage", "true"); + settings->setDefault("only_peaceful_mobs", "false"); settings->setDefault("fixed_map_seed", ""); settings->setDefault("give_initial_stuff", "false"); settings->setDefault("default_password", ""); diff --git a/src/environment.cpp b/src/environment.cpp index a88d600bb..f6b9b0a22 100644 --- a/src/environment.cpp +++ b/src/environment.cpp @@ -1039,6 +1039,11 @@ void ServerEnvironment::step(float dtime) i.atEnd()==false; i++) { ServerActiveObject* obj = i.getNode()->getValue(); + // Remove non-peaceful mobs on peaceful mode + if(g_settings->getBool("only_peaceful_mobs")){ + if(!obj->isPeaceful()) + obj->m_removed = true; + } // Don't step if is to be removed or stored statically if(obj->m_removed || obj->m_pending_deactivation) continue; diff --git a/src/serverobject.h b/src/serverobject.h index a9bd0a7c4..cbb50949c 100644 --- a/src/serverobject.h +++ b/src/serverobject.h @@ -111,6 +111,8 @@ public: /* */ virtual void rightClick(Player *player){} + + virtual bool isPeaceful(){return true;} /* Number of players which know about this object. Object won't be