Merge remote-tracking branch 'sfan5/apple-trees'

This commit is contained in:
Perttu Ahola 2011-09-16 19:09:13 +03:00
commit b22cb69a15
8 changed files with 114 additions and 2 deletions

BIN
data/apple.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 203 B

BIN
data/apple_iron.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 207 B

@ -429,6 +429,20 @@ InventoryItem *craft_get_result(InventoryItem **items)
} }
} }
// Iron Apple
{
ItemSpec specs[9];
specs[1] = ItemSpec(ITEM_CRAFT, "steel_ingot");
specs[3] = ItemSpec(ITEM_CRAFT, "steel_ingot");
specs[4] = ItemSpec(ITEM_CRAFT, "apple");
specs[5] = ItemSpec(ITEM_CRAFT, "steel_ingot");
specs[7] = ItemSpec(ITEM_CRAFT, "steel_ingot");
if(checkItemCombination(items, specs))
{
return new CraftItem("apple_iron", 1);
}
}
return NULL; return NULL;
} }

@ -71,6 +71,10 @@ std::string item_craft_get_image_name(const std::string &subname)
return "scorched_stuff.png"; return "scorched_stuff.png";
else if(subname == "firefly") else if(subname == "firefly")
return "firefly.png"; return "firefly.png";
else if(subname == "apple")
return "apple.png";
else if(subname == "apple_iron")
return "apple_iron.png";
else else
return "cloud.png"; // just something return "cloud.png"; // just something
} }
@ -126,6 +130,10 @@ bool item_craft_is_eatable(const std::string &subname)
{ {
if(subname == "cooked_rat") if(subname == "cooked_rat")
return true; return true;
else if(subname == "apple")
return true;
else if(subname == "apple_iron")
return true;
return false; return false;
} }
@ -133,6 +141,10 @@ s16 item_craft_eat_hp_change(const std::string &subname)
{ {
if(subname == "cooked_rat") if(subname == "cooked_rat")
return 6; // 3 hearts return 6; // 3 hearts
else if(subname == "apple")
return 4; // 2 hearts
else if(subname == "apple_iron")
return 8; // 4 hearts
return 0; return 0;
} }

@ -189,6 +189,16 @@ void mapblock_mesh_generate_special(MeshMakeData *data,
g_texturesource->getTextureId("papyrus.png")); g_texturesource->getTextureId("papyrus.png"));
material_papyrus.setTexture(0, pa_papyrus.atlas); material_papyrus.setTexture(0, pa_papyrus.atlas);
// Apple material
video::SMaterial material_apple;
material_apple.setFlag(video::EMF_LIGHTING, false);
material_apple.setFlag(video::EMF_BILINEAR_FILTER, false);
material_apple.setFlag(video::EMF_FOG_ENABLE, true);
material_apple.MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL_REF;
AtlasPointer pa_apple = g_texturesource->getTexture(
g_texturesource->getTextureId("apple.png"));
material_apple.setTexture(0, pa_apple.atlas);
// junglegrass material // junglegrass material
video::SMaterial material_junglegrass; video::SMaterial material_junglegrass;
material_junglegrass.setFlag(video::EMF_LIGHTING, false); material_junglegrass.setFlag(video::EMF_LIGHTING, false);
@ -1203,6 +1213,56 @@ void mapblock_mesh_generate_special(MeshMakeData *data,
// Add to mesh collector // Add to mesh collector
collector.append(material_ladder, vertices, 4, indices, 6); collector.append(material_ladder, vertices, 4, indices, 6);
} }
else if(n.getContent() == CONTENT_APPLE)
{
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_apple.x0(), pa_apple.y1()),
video::S3DVertex(BS/2,-BS/2,0, 0,0,0, c,
pa_apple.x1(), pa_apple.y1()),
video::S3DVertex(BS/2,BS/2,0, 0,0,0, c,
pa_apple.x1(), pa_apple.y0()),
video::S3DVertex(-BS/2,BS/2,0, 0,0,0, c,
pa_apple.x0(), pa_apple.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_apple, vertices, 4, indices, 6);
}
}
} }
} }
#endif #endif

@ -630,6 +630,18 @@ void content_mapnode_init()
f->dug_item = std::string("MaterialItem2 ")+itos(i)+" 1"; f->dug_item = std::string("MaterialItem2 ")+itos(i)+" 1";
setStoneLikeDiggingProperties(f->digging_properties, 3.0); setStoneLikeDiggingProperties(f->digging_properties, 3.0);
i = CONTENT_APPLE;
f = &content_features(i);
f->setInventoryTexture("apple.png");
f->param_type = CPT_LIGHT;
f->light_propagates = true;
f->sunlight_propagates = true;
f->solidness = 0; // drawn separately, makes no faces
f->walkable = false;
f->air_equivalent = true;
f->dug_item = std::string("CraftItem apple 1");
f->digging_properties.set("", DiggingProperties(true, 0.0, 0));
// NOTE: Remember to add frequently used stuff to the texture atlas in tile.cpp // NOTE: Remember to add frequently used stuff to the texture atlas in tile.cpp

@ -83,6 +83,8 @@ MapNode mapnode_translate_to_internal(MapNode n_from, u8 version);
#define CONTENT_JUNGLEGRASS 0x816 #define CONTENT_JUNGLEGRASS 0x816
#define CONTENT_NC 0x817 #define CONTENT_NC 0x817
#define CONTENT_NC_RB 0x818 #define CONTENT_NC_RB 0x818
#define CONTENT_APPLE 0x819
#endif #endif

@ -84,6 +84,11 @@ static void make_tree(VoxelManipulator &vmanip, v3s16 p0)
{ {
MapNode treenode(CONTENT_TREE); MapNode treenode(CONTENT_TREE);
MapNode leavesnode(CONTENT_LEAVES); MapNode leavesnode(CONTENT_LEAVES);
MapNode applenode(CONTENT_APPLE);
bool is_apple_tree = myrand_range(0,100) < 35?true:false;
s16 apple_count = 0;
s16 trunk_h = myrand_range(4, 5); s16 trunk_h = myrand_range(4, 5);
v3s16 p1 = p0; v3s16 p1 = p0;
@ -138,6 +143,7 @@ static void make_tree(VoxelManipulator &vmanip, v3s16 p0)
for(s16 y=leaves_a.MinEdge.Y; y<=leaves_a.MaxEdge.Y; y++) for(s16 y=leaves_a.MinEdge.Y; y<=leaves_a.MaxEdge.Y; y++)
for(s16 x=leaves_a.MinEdge.X; x<=leaves_a.MaxEdge.X; x++) for(s16 x=leaves_a.MinEdge.X; x<=leaves_a.MaxEdge.X; x++)
{ {
bool is_apple = myrand_range(0,100) < 50?true:false;
v3s16 p(x,y,z); v3s16 p(x,y,z);
p += p1; p += p1;
if(vmanip.m_area.contains(p) == false) if(vmanip.m_area.contains(p) == false)
@ -147,10 +153,16 @@ static void make_tree(VoxelManipulator &vmanip, v3s16 p0)
&& vmanip.m_data[vi].getContent() != CONTENT_IGNORE) && vmanip.m_data[vi].getContent() != CONTENT_IGNORE)
continue; continue;
u32 i = leaves_a.index(x,y,z); u32 i = leaves_a.index(x,y,z);
if(leaves_d[i] == 1) if(leaves_d[i] == 1) {
if(is_apple_tree && is_apple && apple_count < 4) {
vmanip.m_data[vi] = applenode;
apple_count++;
} else {
vmanip.m_data[vi] = leavesnode; vmanip.m_data[vi] = leavesnode;
} }
} }
}
}
static void make_jungletree(VoxelManipulator &vmanip, v3s16 p0) static void make_jungletree(VoxelManipulator &vmanip, v3s16 p0)
{ {