Add peaceful / not peaceful distinction in mobs and the only_peaceful_mobs setting

This commit is contained in:
Perttu Ahola 2011-10-16 11:52:33 +03:00
parent a17abae128
commit 414c614893
6 changed files with 18 additions and 0 deletions

@ -122,6 +122,8 @@ screenH# = 600
#creative_mode = false #creative_mode = false
# Enable players getting damage and dying # Enable players getting damage and dying
#enable_damage = false #enable_damage = false
# Despawn all non-peaceful mobs
#only_peaceful_mobs = false
# A chosen map seed for a new map, leave empty for random # A chosen map seed for a new map, leave empty for random
#fixed_map_seed = #fixed_map_seed =
# Gives some stuff to players at the beginning # Gives some stuff to players at the beginning

@ -1370,6 +1370,11 @@ u16 MobV2SAO::punch(const std::string &toolname, v3f dir,
return 65536/100; return 65536/100;
} }
bool MobV2SAO::isPeaceful()
{
return m_properties->getBool("is_peaceful");
}
void MobV2SAO::sendPosition() void MobV2SAO::sendPosition()
{ {
m_last_sent_position = m_base_position; m_last_sent_position = m_base_position;
@ -1388,6 +1393,7 @@ void MobV2SAO::sendPosition()
void MobV2SAO::setPropertyDefaults() void MobV2SAO::setPropertyDefaults()
{ {
m_properties->setDefault("is_peaceful", "false");
m_properties->setDefault("move_type", "ground_nodes"); m_properties->setDefault("move_type", "ground_nodes");
m_properties->setDefault("speed", "(0,0,0)"); m_properties->setDefault("speed", "(0,0,0)");
m_properties->setDefault("age", "0"); m_properties->setDefault("age", "0");

@ -97,6 +97,7 @@ public:
std::string getStaticData(); std::string getStaticData();
InventoryItem* createPickedUpItem(){return NULL;} InventoryItem* createPickedUpItem(){return NULL;}
u16 punch(const std::string &toolname, v3f dir); u16 punch(const std::string &toolname, v3f dir);
bool isPeaceful(){return false;}
private: private:
void doDamage(u16 d); void doDamage(u16 d);
@ -157,6 +158,7 @@ public:
InventoryItem* createPickedUpItem(){return NULL;} InventoryItem* createPickedUpItem(){return NULL;}
u16 punch(const std::string &toolname, v3f dir, u16 punch(const std::string &toolname, v3f dir,
const std::string &playername); const std::string &playername);
bool isPeaceful();
private: private:
void sendPosition(); void sendPosition();
void setPropertyDefaults(); void setPropertyDefaults();

@ -83,6 +83,7 @@ void set_default_settings(Settings *settings)
settings->setDefault("strict_protocol_version_checking", "true"); settings->setDefault("strict_protocol_version_checking", "true");
settings->setDefault("creative_mode", "false"); settings->setDefault("creative_mode", "false");
settings->setDefault("enable_damage", "true"); settings->setDefault("enable_damage", "true");
settings->setDefault("only_peaceful_mobs", "false");
settings->setDefault("fixed_map_seed", ""); settings->setDefault("fixed_map_seed", "");
settings->setDefault("give_initial_stuff", "false"); settings->setDefault("give_initial_stuff", "false");
settings->setDefault("default_password", ""); settings->setDefault("default_password", "");

@ -1039,6 +1039,11 @@ void ServerEnvironment::step(float dtime)
i.atEnd()==false; i++) i.atEnd()==false; i++)
{ {
ServerActiveObject* obj = i.getNode()->getValue(); 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 // Don't step if is to be removed or stored statically
if(obj->m_removed || obj->m_pending_deactivation) if(obj->m_removed || obj->m_pending_deactivation)
continue; continue;

@ -111,6 +111,8 @@ public:
/* /*
*/ */
virtual void rightClick(Player *player){} virtual void rightClick(Player *player){}
virtual bool isPeaceful(){return true;}
/* /*
Number of players which know about this object. Object won't be Number of players which know about this object. Object won't be