Made rats cookable and made them spawn near trees
authorPerttu Ahola <celeron55@gmail.com>
Sat, 30 Jul 2011 14:51:21 +0000 (17:51 +0300)
committerPerttu Ahola <celeron55@gmail.com>
Sat, 30 Jul 2011 14:51:21 +0000 (17:51 +0300)
src/content_inventory.cpp
src/content_sao.cpp
src/defaultsettings.cpp
src/environment.cpp

index 3222506067169eb5af7be5805162fdc34dde07f8..24840d6aff7a706bd43a59eafbb70a59d20acf63 100644 (file)
@@ -65,6 +65,10 @@ std::string item_craft_get_image_name(const std::string &subname)
                return "clay_brick.png";
        else if(subname == "rat")
                return "rat.png";
+       else if(subname == "cooked_rat")
+               return "cooked_rat.png";
+       else if(subname == "scorched_stuff")
+               return "scorched_stuff.png";
        else if(subname == "firefly")
                return "firefly.png";
        else
@@ -98,7 +102,7 @@ s16 item_craft_get_drop_count(const std::string &subname)
 
 bool item_craft_is_cookable(const std::string &subname)
 {
-       if(subname == "lump_of_iron" || subname == "lump_of_clay")
+       if(subname == "lump_of_iron" || subname == "lump_of_clay" || subname == "rat" || subname == "cooked_rat")
                return true;
                
        return false;
@@ -110,6 +114,10 @@ InventoryItem* item_craft_create_cook_result(const std::string &subname)
                return new CraftItem("steel_ingot", 1);
        else if(subname == "lump_of_clay")
                return new CraftItem("clay_brick", 1);
+       else if(subname == "rat")
+               return new CraftItem("cooked_rat", 1);
+       else if(subname == "cooked_rat")
+               return new CraftItem("scorched_stuff", 1);
 
        return NULL;
 }
index 0b81855c16aec55f0c9fffaa685e9ed411ba86ca..eadaa6e5f1402f6fa7be00d3de3153cca605a6f4 100644 (file)
@@ -232,7 +232,7 @@ RatSAO::RatSAO(ServerEnvironment *env, u16 id, v3f pos):
 
        m_oldpos = v3f(0,0,0);
        m_last_sent_position = v3f(0,0,0);
-       m_yaw = 0;
+       m_yaw = myrand_range(0,PI*2);
        m_counter1 = 0;
        m_counter2 = 0;
        m_age = 0;
index 8326a0f0d8ea25453da1cb7c649ae183d78d41bd..947892d12a0d3a4f396fd5e899ae65d4b595fbe9 100644 (file)
@@ -79,7 +79,7 @@ void set_default_settings()
        // Server stuff
        g_settings.setDefault("enable_experimental", "false");
        g_settings.setDefault("creative_mode", "false");
-       g_settings.setDefault("enable_damage", "false"); //TODO: Set to true when healing is possible
+       g_settings.setDefault("enable_damage", "true");
        g_settings.setDefault("give_initial_stuff", "false");
        g_settings.setDefault("default_password", "");
        g_settings.setDefault("default_privs", "build, shout");
index d723696209c32a1cdee54e564ba1018898b416e5..e9b94f3fa8928be5ee820442e39a51186f64a7d6 100644 (file)
@@ -816,7 +816,7 @@ void ServerEnvironment::step(float dtime)
        if(m_active_blocks_test_interval.step(dtime, 10.0))
        {
                //float dtime = 10.0;
-
+               
                for(core::map<v3s16, bool>::Iterator
                                i = m_active_blocks.m_list.getIterator();
                                i.atEnd()==false; i++)
@@ -846,6 +846,21 @@ void ServerEnvironment::step(float dtime)
                                searching loop to keep things fast.
                        */
                        // TODO: Implement usage of ActiveBlockModifier
+                       
+                       // Find out how many objects the block contains
+                       u32 active_object_count = block->m_static_objects.m_active.size();
+                       // Find out how many objects this and all the neighbors contain
+                       u32 active_object_count_wider = 0;
+                       for(s16 x=-1; x<=1; x++)
+                       for(s16 y=-1; y<=1; y++)
+                       for(s16 z=-1; z<=1; z++)
+                       {
+                               MapBlock *block = m_map->getBlockNoCreateNoEx(p+v3s16(x,y,z));
+                               if(block==NULL)
+                                       continue;
+                               active_object_count_wider +=
+                                               block->m_static_objects.m_active.size();
+                       }
 
                        v3s16 p0;
                        for(p0.X=0; p0.X<MAP_BLOCKSIZE; p0.X++)
@@ -875,18 +890,39 @@ void ServerEnvironment::step(float dtime)
                                /*
                                        Convert grass into mud if under something else than air
                                */
-                               else if(n.getContent() == CONTENT_GRASS)
+                               if(n.getContent() == CONTENT_GRASS)
                                {
                                        //if(myrand()%20 == 0)
                                        {
                                                MapNode n_top = m_map->getNodeNoEx(p+v3s16(0,1,0));
-                        if(content_features(n_top).air_equivalent == false)
+                                               if(content_features(n_top).air_equivalent == false)
                                                {
                                                        n.setContent(CONTENT_MUD);
                                                        m_map->addNodeWithEvent(p, n);
                                                }
                                        }
                                }
+                               /*
+                                       Rats spawn around regular trees
+                               */
+                               if(n.getContent() == CONTENT_TREE ||
+                                               n.getContent() == CONTENT_JUNGLETREE)
+                               {
+                                       if(myrand()%200 == 0 && active_object_count_wider == 0)
+                                       {
+                                               v3s16 p1 = p + v3s16(myrand_range(-2, 2),
+                                                               0, myrand_range(-2, 2));
+                                               MapNode n1 = m_map->getNodeNoEx(p1);
+                                               MapNode n1b = m_map->getNodeNoEx(p1+v3s16(0,-1,0));
+                                               if(n1b.getContent() == CONTENT_GRASS &&
+                                                               n1.getContent() == CONTENT_AIR)
+                                               {
+                                                       v3f pos = intToFloat(p1, BS);
+                                                       ServerActiveObject *obj = new RatSAO(this, 0, pos);
+                                                       addActiveObject(obj);
+                                               }
+                                       }
+                        }
                        }
                }
        }