Adding (most) of the sapling functionality. It has yet to work, since MEET_OTHER...
authorMark Holmquist <marktraceur@gmail.com>
Tue, 16 Aug 2011 09:14:49 +0000 (02:14 -0700)
committerMark Holmquist <marktraceur@gmail.com>
Sat, 24 Sep 2011 01:13:53 +0000 (18:13 -0700)
src/content_mapblock.cpp
src/content_mapnode.cpp
src/content_mapnode.h
src/environment.cpp
src/map.cpp
src/mapgen.h
src/mapnode.h
src/server.cpp

index 1cc37b969d989a16a4fc2db1acc6af95e27b610a..9a156cb5567ed4aa68c3a5aea41a2fb4c417d7a1 100644 (file)
@@ -199,6 +199,18 @@ void mapblock_mesh_generate_special(MeshMakeData *data,
                        g_texturesource->getTextureId("apple.png"));
        material_apple.setTexture(0, pa_apple.atlas);
 
+
+       // Sapling material
+       video::SMaterial material_sapling;
+       material_sapling.setFlag(video::EMF_LIGHTING, false);
+       material_sapling.setFlag(video::EMF_BILINEAR_FILTER, false);
+       material_sapling.setFlag(video::EMF_FOG_ENABLE, true);
+       material_sapling.MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL_REF;
+       AtlasPointer pa_sapling = g_texturesource->getTexture(
+                       g_texturesource->getTextureId("sapling.png"));
+       material_sapling.setTexture(0, pa_sapling.atlas);
+
+
        // junglegrass material
        video::SMaterial material_junglegrass;
        material_junglegrass.setFlag(video::EMF_LIGHTING, false);
@@ -1263,6 +1275,55 @@ void mapblock_mesh_generate_special(MeshMakeData *data,
                                collector.append(material_apple, vertices, 4, indices, 6);
                        }
                }
+               else if(n.getContent() == CONTENT_SAPLING) {
+                       u8 l = decode_light(undiminish_light(n.getLightBlend(data->m_daynight_ratio)));
+                       video::SColor c = MapBlock_LightColor(255, l);
+
+                       for(u32 j=0; j<4; j++)
+                       {
+                               video::S3DVertex vertices[4] =
+                               {
+                                       video::S3DVertex(-BS/2,-BS/2,0, 0,0,0, c,
+                                               pa_sapling.x0(), pa_sapling.y1()),
+                                       video::S3DVertex(BS/2,-BS/2,0, 0,0,0, c,
+                                               pa_sapling.x1(), pa_sapling.y1()),
+                                       video::S3DVertex(BS/2,BS/1,0, 0,0,0, c,
+                                               pa_sapling.x1(), pa_sapling.y0()),
+                                       video::S3DVertex(-BS/2,BS/1,0, 0,0,0, c,
+                                               pa_sapling.x0(), pa_sapling.y0()),
+                               };
+
+                               if(j == 0)
+                               {
+                                       for(u16 i=0; i<4; i++)
+                                               vertices[i].Pos.rotateXZBy(45);
+                               }
+                               else if(j == 1)
+                               {
+                                       for(u16 i=0; i<4; i++)
+                                               vertices[i].Pos.rotateXZBy(-45);
+                               }
+                               else if(j == 2)
+                               {
+                                       for(u16 i=0; i<4; i++)
+                                               vertices[i].Pos.rotateXZBy(135);
+                               }
+                               else if(j == 3)
+                               {
+                                       for(u16 i=0; i<4; i++)
+                                               vertices[i].Pos.rotateXZBy(-135);
+                               }
+
+                               for(u16 i=0; i<4; i++)
+                               {
+                                       vertices[i].Pos += intToFloat(p + blockpos_nodes, BS);
+                               }
+
+                               u16 indices[] = {0,1,2,2,3,0};
+                               // Add to mesh collector
+                               collector.append(material_sapling, vertices, 4, indices, 6);
+                       }
+               }
        }
 }
 #endif
index 09a84156adada5ad2c36b32d3c8548848a840d4c..30839773538934bc39ca3388df3ad36900775ab9 100644 (file)
@@ -242,6 +242,8 @@ void content_mapnode_init()
        {
                f->setAllTextures("[noalpha:leaves.png");
        }
+       f->extra_dug_item = std::string("MaterialItem2 ")+itos(CONTENT_SAPLING)+" 1";
+       f->extra_dug_item_rarity = 10;
        f->dug_item = std::string("MaterialItem2 ")+itos(i)+" 1";
        setWoodLikeDiggingProperties(f->digging_properties, 0.15);
 
@@ -629,6 +631,18 @@ void content_mapnode_init()
        f->setInventoryTexture("nc_rb.png");
        f->dug_item = std::string("MaterialItem2 ")+itos(i)+" 1";
        setStoneLikeDiggingProperties(f->digging_properties, 3.0);
+
+       i = CONTENT_SAPLING;
+       f = &content_features(i);
+       f->param_type = CPT_LIGHT;
+       f->setAllTextures("sapling.png");
+       f->setInventoryTexture("sapling.png");
+       f->dug_item = std::string("MaterialItem2 ")+itos(i)+" 1";
+       f->light_propagates = true;
+       f->air_equivalent = false;
+       f->solidness = 0; // drawn separately, makes no faces
+       f->walkable = false;
+       f->digging_properties.set("", DiggingProperties(true, 0.0, 0));
        
        i = CONTENT_APPLE;
        f = &content_features(i);
index 35dcc20ec5278944db341c731c3ebe9729dcc399..c1e12ab42785adc4bafa3d0f855decf0befbf6c2 100644 (file)
@@ -84,7 +84,7 @@ MapNode mapnode_translate_to_internal(MapNode n_from, u8 version);
 #define CONTENT_NC 0x817
 #define CONTENT_NC_RB 0x818
 #define CONTENT_APPLE 0x819
-
+#define CONTENT_SAPLING 0x820
 
 #endif
 
index 8103b7110436ddf3c7c4c8de7eb2678b9b5e3a59..93f1627c5292c0f1a6acb8ee7c6194b9ae8f5687 100644 (file)
@@ -25,6 +25,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "mapblock.h"
 #include "serverobject.h"
 #include "content_sao.h"
+#include "mapgen.h"
 
 Environment::Environment():
        m_time_of_day(9000)
@@ -922,7 +923,34 @@ void ServerEnvironment::step(float dtime)
                                                        addActiveObject(obj);
                                                }
                                        }
-                        }
+                               }
+                               /*
+                                       Make trees from saplings!
+                               */
+                               if(n.getContent() == CONTENT_SAPLING)
+                               {
+                                       if(myrand()%2 == 0)
+                                       {
+                                               core::map<v3s16, MapBlock*> modified_blocks;
+                                               v3s16 tree_p = p;
+                                               MapEditEvent event;
+                                               event.type = MEET_OTHER;
+                                               ManualMapVoxelManipulator vmanip(m_map);
+                                               v3s16 tree_blockp = getNodeBlockPos(tree_p);
+                                               vmanip.initialEmerge(tree_blockp - v3s16(1,1,1), tree_blockp + v3s16(1,1,1));
+                                               bool is_apple_tree = myrand()%4 == 0;
+                                               mapgen::make_tree(vmanip, tree_p, is_apple_tree);
+                                               for(core::map<v3s16, MapBlock*>::Iterator
+                                                     i = modified_blocks.getIterator();
+                                                     i.atEnd() == false; i++)
+                                               {
+                                                       v3s16 p = i.getNode()->getKey();
+                                                       event.modified_blocks.insert(p, true);
+                                               }
+                                               m_map->dispatchEvent(&event);
+                                       }
+                               }
+                                               
                        }
                }
        }
index 7de79c75d8f4a963fad21443c6e19f15e5ef5b24..d870b5e7148021964650d145c8be6eef8daf0d0a 100644 (file)
@@ -28,6 +28,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "porting.h"
 #include "mapgen.h"
 #include "nodemetadata.h"
+#include "content_mapnode.h"
 
 /*
        SQLite format specification:
index 57d0ee8a01d06de3b9707cc450fad4c59695b1e9..f848389a8491a97d59292d8c2788f16786c84567 100644 (file)
@@ -40,6 +40,9 @@ namespace mapgen
        
        // Add objects according to block content
        void add_random_objects(MapBlock *block);
+
+       // Add a tree
+       void make_tree(ManualMapVoxelManipulator &vmanip, v3s16 p0, bool is_apple_tree);
        
        /*
                These are used by FarMesh
index 3ad67aaf6bebc152078d09a9959ef8bbe3ca7da3..88e7a0d0a7fabb0e6936221065e4a515b556ea0a 100644 (file)
@@ -145,6 +145,10 @@ struct ContentFeatures
        // Inventory item string as which the node appears in inventory when dug.
        // Mineral overrides this.
        std::string dug_item;
+
+        // Extra dug item and its rarity
+        std::string extra_dug_item;
+        s32 extra_dug_item_rarity;
        
        // Initial metadata is cloned from this
        NodeMetadata *initial_metadata;
index a04417074f9f5d3045e13a517c5cc6600def6095..04a23b77711b75d44fc9511b6e65fe469cc2a5ef 100644 (file)
@@ -2735,6 +2735,34 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id)
                                        UpdateCrafting(player->peer_id);
                                        SendInventory(player->peer_id);
                                }
+
+                               item = NULL;
+
+                               if(mineral != MINERAL_NONE)
+                                 item = getDiggedMineralItem(mineral);
+                       
+                               // If not mineral
+                               if(item == NULL)
+                               {
+                                       std::string &extra_dug_s = content_features(material).extra_dug_item;
+                                       s32 extra_rarity = content_features(material).extra_dug_item_rarity;
+                                       if(extra_dug_s != "" && extra_rarity != 0
+                                          && myrand() % extra_rarity == 0)
+                                       {
+                                               std::istringstream is(extra_dug_s, std::ios::binary);
+                                               item = InventoryItem::deSerialize(is);
+                                       }
+                               }
+                       
+                               if(item != NULL)
+                               {
+                                       // Add a item to inventory
+                                       player->inventory.addItem("main", item);
+
+                                       // Send inventory
+                                       UpdateCrafting(player->peer_id);
+                                       SendInventory(player->peer_id);
+                               }
                        }
 
                        /*