mirror of
https://github.com/minetest/minetest.git
synced 2024-11-23 16:13:46 +01:00
Merge remote-tracking branch 'marktraceur/master'
This commit is contained in:
commit
a7833cca22
BIN
data/sapling.png
Normal file
BIN
data/sapling.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 502 B |
@ -199,6 +199,18 @@ void mapblock_mesh_generate_special(MeshMakeData *data,
|
|||||||
g_texturesource->getTextureId("apple.png"));
|
g_texturesource->getTextureId("apple.png"));
|
||||||
material_apple.setTexture(0, pa_apple.atlas);
|
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
|
// junglegrass material
|
||||||
video::SMaterial material_junglegrass;
|
video::SMaterial material_junglegrass;
|
||||||
material_junglegrass.setFlag(video::EMF_LIGHTING, false);
|
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);
|
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
|
#endif
|
||||||
|
@ -244,6 +244,8 @@ void content_mapnode_init()
|
|||||||
{
|
{
|
||||||
f->setAllTextures("[noalpha:leaves.png");
|
f->setAllTextures("[noalpha:leaves.png");
|
||||||
}
|
}
|
||||||
|
f->extra_dug_item = std::string("MaterialItem2 ")+itos(CONTENT_SAPLING)+" 1";
|
||||||
|
f->extra_dug_item_rarity = 20;
|
||||||
f->dug_item = std::string("MaterialItem2 ")+itos(i)+" 1";
|
f->dug_item = std::string("MaterialItem2 ")+itos(i)+" 1";
|
||||||
setWoodLikeDiggingProperties(f->digging_properties, 0.15);
|
setWoodLikeDiggingProperties(f->digging_properties, 0.15);
|
||||||
|
|
||||||
@ -652,6 +654,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_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;
|
i = CONTENT_APPLE;
|
||||||
f = &content_features(i);
|
f = &content_features(i);
|
||||||
f->setInventoryTexture("apple.png");
|
f->setInventoryTexture("apple.png");
|
||||||
|
@ -85,7 +85,7 @@ MapNode mapnode_translate_to_internal(MapNode n_from, u8 version);
|
|||||||
#define CONTENT_NC 0x817
|
#define CONTENT_NC 0x817
|
||||||
#define CONTENT_NC_RB 0x818
|
#define CONTENT_NC_RB 0x818
|
||||||
#define CONTENT_APPLE 0x819
|
#define CONTENT_APPLE 0x819
|
||||||
|
#define CONTENT_SAPLING 0x820
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -25,6 +25,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
|||||||
#include "mapblock.h"
|
#include "mapblock.h"
|
||||||
#include "serverobject.h"
|
#include "serverobject.h"
|
||||||
#include "content_sao.h"
|
#include "content_sao.h"
|
||||||
|
#include "mapgen.h"
|
||||||
|
|
||||||
Environment::Environment():
|
Environment::Environment():
|
||||||
m_time_of_day(9000)
|
m_time_of_day(9000)
|
||||||
@ -923,6 +924,46 @@ void ServerEnvironment::step(float dtime)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
/*
|
||||||
|
Make trees from saplings!
|
||||||
|
*/
|
||||||
|
if(n.getContent() == CONTENT_SAPLING)
|
||||||
|
{
|
||||||
|
if(myrand()%50 == 0)
|
||||||
|
{
|
||||||
|
core::map<v3s16, MapBlock*> modified_blocks;
|
||||||
|
v3s16 tree_p = p;
|
||||||
|
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);
|
||||||
|
vmanip.blitBackAll(&modified_blocks);
|
||||||
|
|
||||||
|
// update lighting
|
||||||
|
core::map<v3s16, MapBlock*> lighting_modified_blocks;
|
||||||
|
for(core::map<v3s16, MapBlock*>::Iterator
|
||||||
|
i = modified_blocks.getIterator();
|
||||||
|
i.atEnd() == false; i++)
|
||||||
|
{
|
||||||
|
lighting_modified_blocks.insert(i.getNode()->getKey(), i.getNode()->getValue());
|
||||||
|
}
|
||||||
|
m_map->updateLighting(lighting_modified_blocks, modified_blocks);
|
||||||
|
|
||||||
|
// Send a MEET_OTHER event
|
||||||
|
MapEditEvent event;
|
||||||
|
event.type = MEET_OTHER;
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -28,6 +28,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
|||||||
#include "porting.h"
|
#include "porting.h"
|
||||||
#include "mapgen.h"
|
#include "mapgen.h"
|
||||||
#include "nodemetadata.h"
|
#include "nodemetadata.h"
|
||||||
|
#include "content_mapnode.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
SQLite format specification:
|
SQLite format specification:
|
||||||
|
@ -80,7 +80,7 @@ static s16 find_ground_level_clever(VoxelManipulator &vmanip, v2s16 p2d)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static void make_tree(VoxelManipulator &vmanip, v3s16 p0, bool is_apple_tree)
|
void make_tree(ManualMapVoxelManipulator &vmanip, v3s16 p0, bool is_apple_tree)
|
||||||
{
|
{
|
||||||
MapNode treenode(CONTENT_TREE);
|
MapNode treenode(CONTENT_TREE);
|
||||||
MapNode leavesnode(CONTENT_LEAVES);
|
MapNode leavesnode(CONTENT_LEAVES);
|
||||||
|
@ -41,6 +41,9 @@ namespace mapgen
|
|||||||
// Add objects according to block content
|
// Add objects according to block content
|
||||||
void add_random_objects(MapBlock *block);
|
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
|
These are used by FarMesh
|
||||||
*/
|
*/
|
||||||
|
@ -146,6 +146,10 @@ struct ContentFeatures
|
|||||||
// Mineral overrides this.
|
// Mineral overrides this.
|
||||||
std::string dug_item;
|
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
|
// Initial metadata is cloned from this
|
||||||
NodeMetadata *initial_metadata;
|
NodeMetadata *initial_metadata;
|
||||||
|
|
||||||
|
@ -2748,6 +2748,34 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id)
|
|||||||
UpdateCrafting(player->peer_id);
|
UpdateCrafting(player->peer_id);
|
||||||
SendInventory(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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Loading…
Reference in New Issue
Block a user