aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--minetest.conf.example2
-rw-r--r--src/content_sao.cpp6
-rw-r--r--src/content_sao.h2
-rw-r--r--src/defaultsettings.cpp1
-rw-r--r--src/environment.cpp5
-rw-r--r--src/serverobject.h2
6 files changed, 18 insertions, 0 deletions
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