Added ladders--they don't have any use yet, though
authorMark Holmquist <marktraceur@gmail.com>
Wed, 27 Jul 2011 17:18:09 +0000 (10:18 -0700)
committerGiuseppe Bilotta <giuseppe.bilotta@gmail.com>
Mon, 1 Aug 2011 07:22:36 +0000 (09:22 +0200)
data/item_ladder.png [new file with mode: 0644]
data/ladder.png [new file with mode: 0644]
src/content_craft.cpp
src/content_mapblock.cpp
src/content_mapnode.cpp
src/content_mapnode.h
src/game.cpp

diff --git a/data/item_ladder.png b/data/item_ladder.png
new file mode 100644 (file)
index 0000000..f35978f
Binary files /dev/null and b/data/item_ladder.png differ
diff --git a/data/ladder.png b/data/ladder.png
new file mode 100644 (file)
index 0000000..dbbd680
Binary files /dev/null and b/data/ladder.png differ
index b5a1dc7761795deeee13cabf022ef920f15859f9..481ea1a6304d26d328124fc67ab208b1c5dec55f 100644 (file)
@@ -413,6 +413,22 @@ InventoryItem *craft_get_result(InventoryItem **items)
                }
        }
 
+       // Ladder
+       {
+               ItemSpec specs[9];
+               specs[0] = ItemSpec(ITEM_CRAFT, "Stick");
+               specs[2] = ItemSpec(ITEM_CRAFT, "Stick");
+               specs[3] = ItemSpec(ITEM_CRAFT, "Stick");
+               specs[4] = ItemSpec(ITEM_CRAFT, "Stick");
+               specs[5] = ItemSpec(ITEM_CRAFT, "Stick");
+               specs[6] = ItemSpec(ITEM_CRAFT, "Stick");
+               specs[8] = ItemSpec(ITEM_CRAFT, "Stick");
+               if(checkItemCombination(items, specs))
+               {
+                       return new MaterialItem(CONTENT_LADDER, 1);
+               }
+       }
+
        return NULL;
 }
 
index 3044c8b359102c8c55293d48ecd62fb1b1509b4f..ceb673606384049338d0e80b7cedb368a96548e0 100644 (file)
@@ -1134,6 +1134,53 @@ void mapblock_mesh_generate_special(MeshMakeData *data,
                        u16 indices[] = {0,1,2,2,3,0};
                        collector.append(material_rail, vertices, 4, indices, 6);
                }
+               else if (n.d == CONTENT_LADDER) {
+                       u8 l = decode_light(n.getLightBlend(data->m_daynight_ratio));
+                       video::SColor c(255,l,l,l);
+
+                       float d = (float)BS/16;
+
+                       // Assume wall is at X+
+                       video::S3DVertex vertices[4] =
+                       {
+                               video::S3DVertex(BS/2-d,-BS/2,-BS/2, 0,0,0, c, 0,1),
+                               video::S3DVertex(BS/2-d,-BS/2,BS/2, 0,0,0, c, 1,1),
+                               video::S3DVertex(BS/2-d,BS/2,BS/2, 0,0,0, c, 1,0),
+                               video::S3DVertex(BS/2-d,BS/2,-BS/2, 0,0,0, c, 0,0),
+                       };
+
+                       v3s16 dir = unpackDir(n.dir);
+
+                       for(s32 i=0; i<4; i++)
+                       {
+                               if(dir == v3s16(1,0,0))
+                                       vertices[i].Pos.rotateXZBy(0);
+                               if(dir == v3s16(-1,0,0))
+                                       vertices[i].Pos.rotateXZBy(180);
+                               if(dir == v3s16(0,0,1))
+                                       vertices[i].Pos.rotateXZBy(90);
+                               if(dir == v3s16(0,0,-1))
+                                       vertices[i].Pos.rotateXZBy(-90);
+                               if(dir == v3s16(0,-1,0))
+                                       vertices[i].Pos.rotateXYBy(-90);
+                               if(dir == v3s16(0,1,0))
+                                       vertices[i].Pos.rotateXYBy(90);
+
+                               vertices[i].Pos += intToFloat(p + blockpos_nodes, BS);
+                       }
+
+                       video::SMaterial material_ladder;
+                       material_ladder.setFlag(video::EMF_LIGHTING, false);
+                       material_ladder.setFlag(video::EMF_BACK_FACE_CULLING, false);
+                       material_ladder.setFlag(video::EMF_BILINEAR_FILTER, false);
+                       material_ladder.setFlag(video::EMF_FOG_ENABLE, true);
+                       material_ladder.MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL_REF;
+                       material_ladder.setTexture(0, g_texturesource->getTextureRaw("ladder.png"));
+
+                       u16 indices[] = {0,1,2,2,3,0};
+                       // Add to mesh collector
+                       collector.append(material_ladder, vertices, 4, indices, 6);
+               }
        }
 }
 #endif
index 7589f06edd02b9b3b776203780ea0b5c1d87c686..e3235778a234e9d9d8f50d06fe4bcf2636ff6e43 100644 (file)
@@ -303,6 +303,19 @@ void content_mapnode_init()
        f->walkable = false;
        setDirtLikeDiggingProperties(f->digging_properties, 0.75);
 
+       i = CONTENT_LADDER;
+       f = &content_features(i);
+       f->setInventoryTexture("item_ladder.png");
+       f->light_propagates = true;
+       f->param_type = CPT_LIGHT;
+       f->is_ground_content = true;
+       f->dug_item = std::string("MaterialItem ")+itos(i)+" 1";
+       f->wall_mounted = true;
+       f->solidness = 0;
+       f->air_equivalent = true;
+       f->walkable = false;
+       setWoodLikeDiggingProperties(f->digging_properties, 0.5);
+
        // Deprecated
        i = CONTENT_COALSTONE;
        f = &content_features(i);
index 609df0a958087ce0de4e44bd6b122885872039aa..8f44126cf6d94bc9073eb7e1ad4f04fdff15435f 100644 (file)
@@ -46,6 +46,7 @@ MapNode mapnode_translate_to_internal(MapNode n_from, u8 version);
 #define CONTENT_FURNACE 16
 #define CONTENT_FENCE 21
 #define CONTENT_RAIL 30
+#define CONTENT_LADDER 31
 
 // 0x800...0xfff (2048...4095): higher 4 bytes of param2 are not usable
 #define CONTENT_GRASS 0x800 //1
index 6c0474ee70688d51608294b9028c44f8dcc9d98d..d8ea45fb1f74248b06ec4f49f906bae6c9455133 100644 (file)
@@ -538,6 +538,56 @@ void getPointedNode(Client *client, v3f player_position,
                                }
                        }
                }
+
+               else if(n.getContent() == CONTENT_LADDER)
+               {
+                       v3s16 dir = unpackDir(n.dir);
+                       v3f dir_f = v3f(dir.X, dir.Y, dir.Z);
+                       dir_f *= BS/2 - BS/6 - BS/20;
+                       v3f cpf = npf + dir_f;
+                       f32 distance = (cpf - camera_position).getLength();
+
+                       v3f vertices[4] =
+                       {
+                               v3f(BS*0.42,-BS/2,-BS/2),
+                               v3f(BS*0.49, BS/2, BS/2),
+                       };
+
+                       for(s32 i=0; i<2; i++)
+                       {
+                               if(dir == v3s16(1,0,0))
+                                       vertices[i].rotateXZBy(0);
+                               if(dir == v3s16(-1,0,0))
+                                       vertices[i].rotateXZBy(180);
+                               if(dir == v3s16(0,0,1))
+                                       vertices[i].rotateXZBy(90);
+                               if(dir == v3s16(0,0,-1))
+                                       vertices[i].rotateXZBy(-90);
+                               if(dir == v3s16(0,-1,0))
+                                       vertices[i].rotateXYBy(-90);
+                               if(dir == v3s16(0,1,0))
+                                       vertices[i].rotateXYBy(90);
+
+                               vertices[i] += npf;
+                       }
+
+                       core::aabbox3d<f32> box;
+
+                       box = core::aabbox3d<f32>(vertices[0]);
+                       box.addInternalPoint(vertices[1]);
+
+                       if(distance < mindistance)
+                       {
+                               if(box.intersectsWithLine(shootline))
+                               {
+                                       nodefound = true;
+                                       nodepos = np;
+                                       neighbourpos = np;
+                                       mindistance = distance;
+                                       nodehilightbox = box;
+                               }
+                       }
+               }
                else if(n.getContent() == CONTENT_RAIL)
                {
                        v3s16 dir = unpackDir(n.param0);