craft guide v1

This commit is contained in:
darkrose 2013-11-27 01:19:35 +10:00
parent 5039e6b68c
commit 5ec634f2d1
8 changed files with 421 additions and 2 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 878 B

View File

@ -569,8 +569,30 @@ InventoryItem *getResult(InventoryItem **items)
}
// TODO: return recipe from result
InventoryItem **getRecipe(InventoryItem *item)
content_t *getRecipe(InventoryItem *item)
{
content_t r = item->getContent();
content_t *recipe;
for (std::vector<CraftDef>::iterator i=shaped_recipes.begin(); i!=shaped_recipes.end(); i++) {
CraftDef d = *i;
if (d.result == r) {
recipe = new content_t[9];
for (int j=0; j<9; j++) {
recipe[j] = d.recipe[j];
}
return recipe;
}
}
for (std::vector<CraftDefShapeless>::iterator i=shapeless_recipes.begin(); i!=shapeless_recipes.end(); i++) {
CraftDefShapeless d = *i;
if (d.result == r) {
recipe = new content_t[9];
for (int j=0; j<9; j++) {
recipe[j] = d.recipe[j];
}
return recipe;
}
}
return NULL;
}

View File

@ -234,7 +234,7 @@ namespace crafting {
void setGateRecipe(u16 input1, u16 input2, u16 result);
InventoryItem *getResult(InventoryItem **items);
InventoryItem **getRecipe(InventoryItem *item);
content_t *getRecipe(InventoryItem *item);
void giveCreative(Player *player);
void giveInitial(Player *player);

235
src/content_list.h Normal file
View File

@ -0,0 +1,235 @@
CONTENT_CRAFTITEM_PAPER,
CONTENT_CRAFTITEM_BOOK,
CONTENT_CRAFTITEM_CHARCOAL,
CONTENT_CRAFTITEM_COAL,
CONTENT_CRAFTITEM_IRON,
CONTENT_CRAFTITEM_CLAY,
CONTENT_CRAFTITEM_TIN,
CONTENT_CRAFTITEM_COPPER,
CONTENT_CRAFTITEM_SILVER,
CONTENT_CRAFTITEM_GOLD,
CONTENT_CRAFTITEM_QUARTZ,
CONTENT_CRAFTITEM_TIN_INGOT,
CONTENT_CRAFTITEM_COPPER_INGOT,
CONTENT_CRAFTITEM_SILVER_INGOT,
CONTENT_CRAFTITEM_GOLD_INGOT,
CONTENT_CRAFTITEM_FLINT,
CONTENT_CRAFTITEM_STEEL_INGOT,
CONTENT_CRAFTITEM_CLAY_BRICK,
CONTENT_CRAFTITEM_RAT,
CONTENT_CRAFTITEM_COOKED_RAT,
CONTENT_CRAFTITEM_SCORCHED_STUFF,
CONTENT_CRAFTITEM_FIREFLY,
CONTENT_CRAFTITEM_APPLE,
CONTENT_CRAFTITEM_APPLE_IRON,
CONTENT_CRAFTITEM_DYE_BLUE,
CONTENT_CRAFTITEM_DYE_GREEN,
CONTENT_CRAFTITEM_DYE_ORANGE,
CONTENT_CRAFTITEM_DYE_PURPLE,
CONTENT_CRAFTITEM_DYE_RED,
CONTENT_CRAFTITEM_DYE_YELLOW,
CONTENT_CRAFTITEM_DYE_WHITE,
CONTENT_CRAFTITEM_DYE_BLACK,
CONTENT_CRAFTITEM_QUARTZ_DUST,
CONTENT_CRAFTITEM_SALTPETER,
CONTENT_CRAFTITEM_GUNPOWDER,
CONTENT_CRAFTITEM_SNOW_BALL,
CONTENT_CRAFTITEM_STICK,
CONTENT_CRAFTITEM_PINE_PLANK,
CONTENT_CRAFTITEM_WOOD_PLANK,
CONTENT_CRAFTITEM_JUNGLE_PLANK,
CONTENT_STONE,
CONTENT_ICE,
CONTENT_COAL,
CONTENT_CHARCOAL,
CONTENT_STONEBRICK,
CONTENT_STONEBLOCK,
CONTENT_ROUGHSTONEBRICK,
CONTENT_ROUGHSTONEBLOCK,
CONTENT_GRASS,
CONTENT_FARM_DIRT,
CONTENT_SAND,
CONTENT_GRAVEL,
CONTENT_SANDSTONE,
CONTENT_SANDSTONE_BRICK,
CONTENT_SANDSTONE_BLOCK,
CONTENT_CLAY,
CONTENT_CLAY_BLUE,
CONTENT_CLAY_GREEN,
CONTENT_CLAY_ORANGE,
CONTENT_CLAY_PURPLE,
CONTENT_CLAY_RED,
CONTENT_CLAY_YELLOW,
CONTENT_CLAY_BLACK,
CONTENT_BRICK,
CONTENT_TERRACOTTA,
CONTENT_TERRACOTTA_BRICK,
CONTENT_TERRACOTTA_BLOCK,
CONTENT_TERRACOTTA_TILE,
CONTENT_TREE,
CONTENT_APPLE_TREE,
CONTENT_JUNGLETREE,
CONTENT_CONIFER_TREE,
CONTENT_JUNGLEGRASS,
CONTENT_LEAVES,
CONTENT_APPLE_LEAVES,
CONTENT_JUNGLELEAVES,
CONTENT_CONIFER_LEAVES,
CONTENT_TRIMMED_LEAVES,
CONTENT_TRIMMED_APPLE_LEAVES,
CONTENT_TRIMMED_JUNGLE_LEAVES,
CONTENT_TRIMMED_CONIFER_LEAVES,
CONTENT_CACTUS,
CONTENT_PAPYRUS,
CONTENT_BOOKSHELF,
CONTENT_GLASS,
CONTENT_GLASS_BLUE,
CONTENT_GLASS_GREEN,
CONTENT_GLASS_ORANGE,
CONTENT_GLASS_PURPLE,
CONTENT_GLASS_RED,
CONTENT_GLASS_YELLOW,
CONTENT_GLASS_BLACK,
CONTENT_GLASS_PANE,
CONTENT_GLASS_PANE_BLUE,
CONTENT_GLASS_PANE_GREEN,
CONTENT_GLASS_PANE_ORANGE,
CONTENT_GLASS_PANE_PURPLE,
CONTENT_GLASS_PANE_RED,
CONTENT_GLASS_PANE_YELLOW,
CONTENT_GLASS_PANE_BLACK,
CONTENT_GLASSLIGHT,
CONTENT_FENCE,
CONTENT_RAIL,
CONTENT_LADDER,
CONTENT_BORDERSTONE,
CONTENT_WOOD,
CONTENT_JUNGLEWOOD,
CONTENT_WOOD_PINE,
CONTENT_MESE,
CONTENT_MESE_DIGGING,
CONTENT_SPONGE,
CONTENT_SPONGE_FULL,
CONTENT_HAY,
CONTENT_SNOW_BLOCK,
CONTENT_SNOW,
CONTENT_CRAFT_GUIDE,
CONTENT_COTTON,
CONTENT_COTTON_BLUE,
CONTENT_COTTON_GREEN,
CONTENT_COTTON_ORANGE,
CONTENT_COTTON_PURPLE,
CONTENT_COTTON_RED,
CONTENT_COTTON_YELLOW,
CONTENT_COTTON_BLACK,
CONTENT_CARPET,
CONTENT_CARPET_BLUE,
CONTENT_CARPET_GREEN,
CONTENT_CARPET_ORANGE,
CONTENT_CARPET_PURPLE,
CONTENT_CARPET_RED,
CONTENT_CARPET_YELLOW,
CONTENT_CARPET_BLACK,
CONTENT_AIR,
CONTENT_WATER,
CONTENT_WATERSOURCE,
CONTENT_LAVA,
CONTENT_LAVASOURCE,
CONTENT_FIRE,
CONTENT_FIRE_SHORTTERM,
CONTENT_TORCH,
CONTENT_SIGN_WALL,
CONTENT_SIGN,
CONTENT_CHEST,
CONTENT_LOCKABLE_CHEST,
CONTENT_FURNACE,
CONTENT_INCINERATOR,
CONTENT_ROUGHSTONE,
CONTENT_COBBLE,
CONTENT_MOSSYCOBBLE,
CONTENT_STEEL,
CONTENT_COPPER,
CONTENT_GOLD,
CONTENT_SILVER,
CONTENT_TIN,
CONTENT_QUARTZ,
CONTENT_NC,
CONTENT_SAPLING,
CONTENT_APPLE_SAPLING,
CONTENT_JUNGLESAPLING,
CONTENT_CONIFER_SAPLING,
CONTENT_APPLE,
CONTENT_ROUGHSTONE_STAIR,
CONTENT_COBBLE_STAIR,
CONTENT_MOSSYCOBBLE_STAIR,
CONTENT_STONE_STAIR,
CONTENT_WOOD_STAIR,
CONTENT_JUNGLE_STAIR,
CONTENT_BRICK_STAIR,
CONTENT_SANDSTONE_STAIR,
CONTENT_WOOD_DOOR_LT,
CONTENT_STEEL_DOOR_LT,
CONTENT_GLASS_DOOR_LT,
CONTENT_WOOD_W_DOOR_LT,
CONTENT_STEEL_W_DOOR_LT,
CONTENT_WOOD_DOOR_RT,
CONTENT_GLASS_DOOR_RT,
CONTENT_STEEL_DOOR_RT,
CONTENT_WOOD_W_DOOR_RT,
CONTENT_STEEL_W_DOOR_RT,
CONTENT_WOOD_HATCH,
CONTENT_STEEL_HATCH,
CONTENT_WOOD_W_HATCH,
CONTENT_STEEL_W_HATCH,
CONTENT_WOOD_GATE,
CONTENT_STEEL_GATE,
CONTENT_WILDGRASS_SHORT,
CONTENT_WILDGRASS_LONG,
CONTENT_DEADGRASS,
CONTENT_FLOWER_STEM,
CONTENT_FLOWER_ROSE,
CONTENT_FLOWER_DAFFODIL,
CONTENT_FLOWER_TULIP,
CONTENT_FLOWER_POT_RAW,
CONTENT_FLOWER_POT,
CONTENT_COBBLE_WALL,
CONTENT_ROUGHSTONE_WALL,
CONTENT_MOSSYCOBBLE_WALL,
CONTENT_STONE_WALL,
CONTENT_SANDSTONE_WALL,
CONTENT_TNT,
CONTENT_FLASH,
CONTENT_STEAM,
CONTENT_CHAIR,
CONTENT_TABLE,
CONTENT_BED_HEAD,
CONTENT_BED_BLUE_HEAD,
CONTENT_BED_GREEN_HEAD,
CONTENT_BED_ORANGE_HEAD,
CONTENT_BED_PURPLE_HEAD,
CONTENT_BED_RED_HEAD,
CONTENT_BED_YELLOW_HEAD,
CONTENT_BED_BLACK_HEAD,
CONTENT_TOOLITEM_WPICK,
CONTENT_TOOLITEM_STPICK,
CONTENT_TOOLITEM_STEELPICK,
CONTENT_TOOLITEM_MESEPICK,
CONTENT_TOOLITEM_WSHOVEL,
CONTENT_TOOLITEM_STSHOVEL,
CONTENT_TOOLITEM_STEELSHOVEL,
CONTENT_TOOLITEM_WAXE,
CONTENT_TOOLITEM_STAXE,
CONTENT_TOOLITEM_STEELAXE,
CONTENT_TOOLITEM_WSWORD,
CONTENT_TOOLITEM_STSWORD,
CONTENT_TOOLITEM_STEELSWORD,
CONTENT_TOOLITEM_STEELSHEARS,
CONTENT_TOOLITEM_WBUCKET,
CONTENT_TOOLITEM_TINBUCKET,
CONTENT_TOOLITEM_WBUCKET_WATER,
CONTENT_TOOLITEM_TINBUCKET_WATER,
CONTENT_TOOLITEM_STEELBUCKET,
CONTENT_TOOLITEM_STEELBUCKET_WATER,
CONTENT_TOOLITEM_STEELBUCKET_LAVA,
CONTENT_TOOLITEM_FIRESTARTER,
CONTENT_TOOLITEM_CROWBAR,

View File

@ -2356,6 +2356,26 @@ void content_mapnode_init()
f->setInventoryTextureNodeBox(i,"snow.png", "snow.png", "snow.png");
setDirtLikeDiggingProperties(f->digging_properties, 0.3);
i = CONTENT_CRAFT_GUIDE;
f = &content_features(i);
f->description = std::string("Craft Guide");
f->setAllTextures("craft_guide.png");
f->setInventoryTextureCube("craft_guide.png", "craft_guide.png", "craft_guide.png");
f->draw_type = CDT_CUBELIKE;
f->is_ground_content = true;
f->dug_item = std::string("MaterialItem2 ")+itos(i)+" 1";
setDirtLikeDiggingProperties(f->digging_properties, 1.0);
if (f->initial_metadata == NULL)
f->initial_metadata = new CraftGuideNodeMetadata();
{
content_t r[9] = {
CONTENT_CRAFTITEM_STICK, CONTENT_CRAFTITEM_STICK, CONTENT_IGNORE,
CONTENT_IGNORE, CONTENT_CRAFTITEM_STICK, CONTENT_IGNORE,
CONTENT_CRAFTITEM_STICK, CONTENT_IGNORE, CONTENT_IGNORE
};
crafting::setRecipe(r,CONTENT_CRAFT_GUIDE,1);
}
i = CONTENT_COTTON;
f = &content_features(i);
f->description = std::string("Cotton");

View File

@ -196,6 +196,9 @@ MapNode mapnode_translate_to_internal(MapNode n_from, u8 version);
#define CONTENT_TRIMMED_JUNGLE_LEAVES 0x916
#define CONTENT_TRIMMED_CONIFER_LEAVES 0x917
//bwahaha!
#define CONTENT_CRAFT_GUIDE 0x9FF
// slabs
#define CONTENT_ROUGHSTONE_SLAB 0xA00
#define CONTENT_MOSSYCOBBLE_SLAB 0xA01

View File

@ -20,6 +20,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "content_nodemeta.h"
#include "inventory.h"
#include "content_mapnode.h"
#include "content_craft.h"
#include "log.h"
/*
@ -609,3 +610,121 @@ std::string IncineratorNodeMetadata::getInventoryDrawSpecString()
"list[current_name;fuel;4,1;1,1;]"
"list[current_player;main;0,3;8,4;]";
}
/*
CraftGuideNodeMetadata
*/
static content_t g_contents[] = {
#include "content_list.h"
CONTENT_IGNORE
};
// Prototype
CraftGuideNodeMetadata proto_CraftGuideNodeMetadata;
CraftGuideNodeMetadata::CraftGuideNodeMetadata()
{
NodeMetadata::registerType(typeId(), create);
m_inventory = new Inventory();
m_inventory->addList("list", 300);
m_inventory->addList("recipe", 9);
m_inventory->addList("result", 1);
//m_inventory->addList("furnace",1);
}
CraftGuideNodeMetadata::~CraftGuideNodeMetadata()
{
delete m_inventory;
}
u16 CraftGuideNodeMetadata::typeId() const
{
return CONTENT_CRAFT_GUIDE;
}
NodeMetadata* CraftGuideNodeMetadata::clone()
{
CraftGuideNodeMetadata *d = new CraftGuideNodeMetadata();
*d->m_inventory = *m_inventory;
InventoryList *l = d->m_inventory->getList("list");
InventoryItem *t;
content_t *r;
for (int i=0; g_contents[i] != CONTENT_IGNORE; i++) {
if ((g_contents[i]&CONTENT_CRAFTITEM_MASK) == CONTENT_CRAFTITEM_MASK) {
t = new CraftItem(g_contents[i],1);
}else if ((g_contents[i]&CONTENT_TOOLITEM_MASK) == CONTENT_TOOLITEM_MASK) {
t = new ToolItem(g_contents[i],1);
}else{
t = new MaterialItem(g_contents[i],1);
}
r = crafting::getRecipe(t);
if (!r) {
delete t;
continue;
}
l->addItem(t);
}
return d;
}
NodeMetadata* CraftGuideNodeMetadata::create(std::istream &is)
{
CraftGuideNodeMetadata *d = new CraftGuideNodeMetadata();
d->m_inventory->deSerialize(is);
return d;
}
void CraftGuideNodeMetadata::serializeBody(std::ostream &os)
{
m_inventory->serialize(os);
}
bool CraftGuideNodeMetadata::nodeRemovalDisabled()
{
return false;
}
void CraftGuideNodeMetadata::inventoryModified()
{
infostream<<"CraftGuide inventory modification callback"<<std::endl;
}
bool CraftGuideNodeMetadata::step(float dtime)
{
InventoryList *l = m_inventory->getList("result");
InventoryItem *t = l->getItem(0);
if (!t || t->getContent() == CONTENT_IGNORE)
return false;
content_t *r = crafting::getRecipe(t);
if (!r)
return false;
l = m_inventory->getList("recipe");
l->clearItems();
for (int i=0; i<9; i++) {
if (r[i] == CONTENT_IGNORE)
continue;
if ((r[i]&CONTENT_CRAFTITEM_MASK) == CONTENT_CRAFTITEM_MASK) {
t = new CraftItem(r[i],1);
}else if ((r[i]&CONTENT_TOOLITEM_MASK) == CONTENT_TOOLITEM_MASK) {
t = new ToolItem(r[i],1);
}else{
t = new MaterialItem(r[i],1);
}
l->addItem(i,t);
}
delete[] r;
return true;
}
std::string CraftGuideNodeMetadata::getInventoryDrawSpecString()
{
return
"invsize[22,15;]"
"list[current_name;list;4,1;17,13;]"
"list[current_name;recipe;0,3;3,3;]"
"list[current_name;result;1,7;1,1;]";
//"list[current_name;furnace;1,9;1,1;]";
}

View File

@ -205,5 +205,25 @@ private:
};
class CraftGuideNodeMetadata : public NodeMetadata
{
public:
CraftGuideNodeMetadata();
~CraftGuideNodeMetadata();
virtual u16 typeId() const;
NodeMetadata* clone();
static NodeMetadata* create(std::istream &is);
virtual void serializeBody(std::ostream &os);
virtual Inventory* getInventory() {return m_inventory;}
virtual bool nodeRemovalDisabled();
virtual void inventoryModified();
virtual bool step(float dtime);
virtual std::string getInventoryDrawSpecString();
private:
Inventory *m_inventory;
};
#endif