14dce23845
It was really a lot of work :D Took me the complete weekend :D Would really like to here your opinion on this =) The aim of this is to put all the actions for one block in one place so it is not spread around the source. (ToPickup, Action in cWorld, Action in cChunk, Action here, action there :D) git-svn-id: http://mc-server.googlecode.com/svn/trunk@671 0a769ca7-a7f5-676a-18bf-c427514a06d6
371 lines
14 KiB
C++
371 lines
14 KiB
C++
|
||
// BlockID.cpp
|
||
|
||
// Implements the helper functions for converting Block ID string to int etc.
|
||
|
||
#include "Globals.h"
|
||
#include "BlockID.h"
|
||
#include "../iniFile/iniFile.h"
|
||
#include "cItem.h"
|
||
|
||
|
||
|
||
|
||
|
||
NIBBLETYPE g_BlockLightValue[256];
|
||
NIBBLETYPE g_BlockSpreadLightFalloff[256];
|
||
bool g_BlockTransparent[256];
|
||
bool g_BlockOneHitDig[256];
|
||
bool g_BlockPistonBreakable[256];
|
||
bool g_BlockIsSnowable[256];
|
||
bool g_BlockRequiresSpecialTool[256];
|
||
|
||
|
||
|
||
|
||
|
||
class cBlockIDMap
|
||
{
|
||
public:
|
||
cBlockIDMap(void) : m_Ini("items.ini")
|
||
{
|
||
m_Ini.ReadFile();
|
||
}
|
||
|
||
int Resolve(const AString & a_ItemName)
|
||
{
|
||
return m_Ini.GetValueI("Items", a_ItemName, -1);
|
||
}
|
||
|
||
AString ResolveString(const AString & a_ItemName)
|
||
{
|
||
return m_Ini.GetValue("Items", a_ItemName, "");
|
||
}
|
||
|
||
protected:
|
||
cIniFile m_Ini;
|
||
} ;
|
||
|
||
|
||
|
||
|
||
|
||
static cBlockIDMap gsBlockIDMap;
|
||
|
||
|
||
|
||
|
||
|
||
int BlockStringToType(const AString & a_BlockTypeString)
|
||
{
|
||
int res = atoi(a_BlockTypeString.c_str());
|
||
if ((res != 0) || (a_BlockTypeString.compare("0") == 0))
|
||
{
|
||
// It was a valid number, return that
|
||
return res;
|
||
}
|
||
|
||
return gsBlockIDMap.Resolve(TrimString(a_BlockTypeString));
|
||
}
|
||
|
||
|
||
|
||
|
||
bool StringToItem(const AString & a_ItemTypeString, cItem & a_Item)
|
||
{
|
||
AString Resolved = TrimString(gsBlockIDMap.ResolveString(TrimString(a_ItemTypeString)));
|
||
AString txt = (!Resolved.empty()) ? Resolved : a_ItemTypeString;
|
||
AStringVector Split = StringSplit(txt, ":");
|
||
if (Split.size() == 1)
|
||
{
|
||
Split = StringSplit(txt, "^");
|
||
}
|
||
if (Split.empty())
|
||
{
|
||
return false;
|
||
}
|
||
a_Item.m_ItemID = (ENUM_ITEM_ID)atoi(Split[0].c_str());
|
||
if ((a_Item.m_ItemID == 0) && (Split[0] != "0"))
|
||
{
|
||
// Parsing the number failed
|
||
return false;
|
||
}
|
||
if (Split.size() > 1)
|
||
{
|
||
a_Item.m_ItemHealth = atoi(Split[1].c_str());
|
||
if ((a_Item.m_ItemHealth == 0) && (Split[1] != "0"))
|
||
{
|
||
// Parsing the number failed
|
||
return false;
|
||
}
|
||
}
|
||
return true;
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
EMCSBiome StringToBiome(const AString & a_BiomeString)
|
||
{
|
||
// If it is a number, return it:
|
||
int res = atoi(a_BiomeString.c_str());
|
||
if ((res != 0) || (a_BiomeString.compare("0") == 0))
|
||
{
|
||
// It was a valid number
|
||
return (EMCSBiome)res;
|
||
}
|
||
|
||
// Convert using the built-in map:
|
||
static struct {
|
||
EMCSBiome m_Biome;
|
||
const char * m_String;
|
||
} BiomeMap[] =
|
||
{
|
||
{biOcean, "Ocean"} ,
|
||
{biPlains, "Plains"},
|
||
{biDesert, "Desert"},
|
||
{biExtremeHills, "ExtremeHills"},
|
||
{biForest, "Forest"},
|
||
{biTaiga, "Taiga"},
|
||
{biSwampland, "Swampland"},
|
||
{biRiver, "River"},
|
||
{biHell, "Hell"},
|
||
{biHell, "Nether"},
|
||
{biSky, "Sky"},
|
||
{biFrozenOcean, "FrozenOcean"},
|
||
{biFrozenRiver, "FrozenRiver"},
|
||
{biIcePlains, "IcePlains"},
|
||
{biIcePlains, "Tundra"},
|
||
{biIceMountains, "IceMountains"},
|
||
{biMushroomIsland, "MushroomIsland"},
|
||
{biMushroomShore, "MushroomShore"},
|
||
{biBeach, "Beach"},
|
||
{biDesertHills, "DesertHills"},
|
||
{biForestHills, "ForestHills"},
|
||
{biTaigaHills, "TaigaHills"},
|
||
{biExtremeHillsEdge, "ExtremeHillsEdge"},
|
||
{biJungle, "Jungle"},
|
||
{biJungleHills, "JungleHills"},
|
||
} ;
|
||
|
||
for (int i = 0; i < ARRAYCOUNT(BiomeMap); i++)
|
||
{
|
||
if (NoCaseCompare(BiomeMap[i].m_String, a_BiomeString) == 0)
|
||
{
|
||
return BiomeMap[i].m_Biome;
|
||
}
|
||
} // for i - BiomeMap[]
|
||
return (EMCSBiome)-1;
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
// This is actually just some code that needs to run at program startup, so it is wrapped into a global var's constructor:
|
||
class cBlockPropertiesInitializer
|
||
{
|
||
public:
|
||
cBlockPropertiesInitializer(void)
|
||
{
|
||
memset( g_BlockLightValue, 0x00, sizeof( g_BlockLightValue ) );
|
||
memset( g_BlockSpreadLightFalloff, 0x0f, sizeof( g_BlockSpreadLightFalloff ) ); // 0x0f means total falloff
|
||
memset( g_BlockTransparent, 0x00, sizeof( g_BlockTransparent ) );
|
||
memset( g_BlockOneHitDig, 0x00, sizeof( g_BlockOneHitDig ) );
|
||
memset( g_BlockPistonBreakable, 0x00, sizeof( g_BlockPistonBreakable ) );
|
||
memset( g_BlockIsSnowable, 0xff, sizeof( g_BlockIsSnowable)); // Set all blocks' snowable to true
|
||
memset( g_BlockRequiresSpecialTool, false, sizeof( g_BlockRequiresSpecialTool));
|
||
|
||
// Emissive blocks
|
||
g_BlockLightValue[E_BLOCK_FIRE] = 15;
|
||
g_BlockLightValue[E_BLOCK_GLOWSTONE] = 15;
|
||
g_BlockLightValue[E_BLOCK_JACK_O_LANTERN] = 15;
|
||
g_BlockLightValue[E_BLOCK_LAVA] = 15;
|
||
g_BlockLightValue[E_BLOCK_STATIONARY_LAVA] = 15;
|
||
g_BlockLightValue[E_BLOCK_END_PORTAL] = 15;
|
||
g_BlockLightValue[E_BLOCK_REDSTONE_LAMP_ON] = 15;
|
||
g_BlockLightValue[E_BLOCK_TORCH] = 14;
|
||
g_BlockLightValue[E_BLOCK_BURNING_FURNACE] = 13;
|
||
g_BlockLightValue[E_BLOCK_NETHER_PORTAL] = 11;
|
||
g_BlockLightValue[E_BLOCK_REDSTONE_ORE_GLOWING] = 9;
|
||
g_BlockLightValue[E_BLOCK_REDSTONE_REPEATER_ON] = 9;
|
||
g_BlockLightValue[E_BLOCK_REDSTONE_TORCH_ON] = 7;
|
||
g_BlockLightValue[E_BLOCK_BREWING_STAND] = 1;
|
||
g_BlockLightValue[E_BLOCK_BROWN_MUSHROOM] = 1;
|
||
g_BlockLightValue[E_BLOCK_DRAGON_EGG] = 1;
|
||
|
||
// Spread blocks
|
||
g_BlockSpreadLightFalloff[E_BLOCK_AIR] = 1;
|
||
g_BlockSpreadLightFalloff[E_BLOCK_CAKE] = 1;
|
||
g_BlockSpreadLightFalloff[E_BLOCK_CHEST] = 1;
|
||
g_BlockSpreadLightFalloff[E_BLOCK_CROPS] = 1;
|
||
g_BlockSpreadLightFalloff[E_BLOCK_FENCE] = 1;
|
||
g_BlockSpreadLightFalloff[E_BLOCK_FENCE_GATE] = 1;
|
||
g_BlockSpreadLightFalloff[E_BLOCK_FIRE] = 1;
|
||
g_BlockSpreadLightFalloff[E_BLOCK_GLASS] = 1;
|
||
g_BlockSpreadLightFalloff[E_BLOCK_GLASS_PLANE] = 1;
|
||
g_BlockSpreadLightFalloff[E_BLOCK_GLOWSTONE] = 1;
|
||
g_BlockSpreadLightFalloff[E_BLOCK_IRON_BARS] = 1;
|
||
g_BlockSpreadLightFalloff[E_BLOCK_IRON_DOOR] = 1;
|
||
g_BlockSpreadLightFalloff[E_BLOCK_LEAVES] = 1;
|
||
g_BlockSpreadLightFalloff[E_BLOCK_SIGN_POST] = 1;
|
||
g_BlockSpreadLightFalloff[E_BLOCK_TORCH] = 1;
|
||
g_BlockSpreadLightFalloff[E_BLOCK_VINES] = 1;
|
||
g_BlockSpreadLightFalloff[E_BLOCK_WALLSIGN] = 1;
|
||
g_BlockSpreadLightFalloff[E_BLOCK_WOODEN_DOOR] = 1;
|
||
// Light in water and lava dissapears faster:
|
||
g_BlockSpreadLightFalloff[E_BLOCK_LAVA] = 2;
|
||
g_BlockSpreadLightFalloff[E_BLOCK_STATIONARY_LAVA] = 2;
|
||
g_BlockSpreadLightFalloff[E_BLOCK_STATIONARY_WATER] = 2;
|
||
g_BlockSpreadLightFalloff[E_BLOCK_WATER] = 2;
|
||
|
||
// Transparent blocks
|
||
g_BlockTransparent[E_BLOCK_AIR] = true;
|
||
g_BlockTransparent[E_BLOCK_BROWN_MUSHROOM] = true;
|
||
g_BlockTransparent[E_BLOCK_CHEST] = true;
|
||
g_BlockTransparent[E_BLOCK_CROPS] = true;
|
||
g_BlockTransparent[E_BLOCK_FIRE] = true;
|
||
g_BlockTransparent[E_BLOCK_GLASS] = true;
|
||
g_BlockTransparent[E_BLOCK_ICE] = true;
|
||
g_BlockTransparent[E_BLOCK_RED_MUSHROOM] = true;
|
||
g_BlockTransparent[E_BLOCK_RED_ROSE] = true;
|
||
g_BlockTransparent[E_BLOCK_SIGN_POST] = true;
|
||
g_BlockTransparent[E_BLOCK_SNOW] = true;
|
||
g_BlockTransparent[E_BLOCK_TALL_GRASS] = true;
|
||
g_BlockTransparent[E_BLOCK_TORCH] = true;
|
||
g_BlockTransparent[E_BLOCK_VINES] = true;
|
||
g_BlockTransparent[E_BLOCK_WALLSIGN] = true;
|
||
g_BlockTransparent[E_BLOCK_YELLOW_FLOWER] = true;
|
||
|
||
// TODO: Any other transparent blocks?
|
||
|
||
// One hit break blocks
|
||
g_BlockOneHitDig[E_BLOCK_BROWN_MUSHROOM] = true;
|
||
g_BlockOneHitDig[E_BLOCK_CROPS] = true;
|
||
g_BlockOneHitDig[E_BLOCK_FIRE] = true;
|
||
g_BlockOneHitDig[E_BLOCK_LOCKED_CHEST] = true;
|
||
g_BlockOneHitDig[E_BLOCK_REDSTONE_REPEATER_OFF] = true;
|
||
g_BlockOneHitDig[E_BLOCK_REDSTONE_REPEATER_ON] = true;
|
||
g_BlockOneHitDig[E_BLOCK_REDSTONE_TORCH_OFF] = true;
|
||
g_BlockOneHitDig[E_BLOCK_REDSTONE_TORCH_ON] = true;
|
||
g_BlockOneHitDig[E_BLOCK_REDSTONE_WIRE] = true;
|
||
g_BlockOneHitDig[E_BLOCK_REDSTONE_WIRE] = true;
|
||
g_BlockOneHitDig[E_BLOCK_RED_MUSHROOM] = true;
|
||
g_BlockOneHitDig[E_BLOCK_RED_ROSE] = true;
|
||
g_BlockOneHitDig[E_BLOCK_REEDS] = true;
|
||
g_BlockOneHitDig[E_BLOCK_SAPLING] = true;
|
||
g_BlockOneHitDig[E_BLOCK_TNT] = true;
|
||
g_BlockOneHitDig[E_BLOCK_TALL_GRASS] = true;
|
||
g_BlockOneHitDig[E_BLOCK_TORCH] = true;
|
||
g_BlockOneHitDig[E_BLOCK_YELLOW_FLOWER] = true;
|
||
|
||
// Blocks that breaks when pushed by piston
|
||
g_BlockPistonBreakable[E_BLOCK_AIR] = true;
|
||
g_BlockPistonBreakable[E_BLOCK_BED] = true;
|
||
g_BlockPistonBreakable[E_BLOCK_BROWN_MUSHROOM] = true;
|
||
g_BlockPistonBreakable[E_BLOCK_COBWEB] = true;
|
||
g_BlockPistonBreakable[E_BLOCK_CROPS] = true;
|
||
g_BlockPistonBreakable[E_BLOCK_DEAD_BUSH] = true;
|
||
g_BlockPistonBreakable[E_BLOCK_FIRE] = true;
|
||
g_BlockPistonBreakable[E_BLOCK_IRON_DOOR] = true;
|
||
g_BlockPistonBreakable[E_BLOCK_JACK_O_LANTERN] = true;
|
||
g_BlockPistonBreakable[E_BLOCK_LADDER] = true;
|
||
g_BlockPistonBreakable[E_BLOCK_LAVA] = false;
|
||
g_BlockPistonBreakable[E_BLOCK_LEVER] = true;
|
||
g_BlockPistonBreakable[E_BLOCK_MELON] = true;
|
||
g_BlockPistonBreakable[E_BLOCK_MELON_STEM] = true;
|
||
g_BlockPistonBreakable[E_BLOCK_PUMPKIN] = true;
|
||
g_BlockPistonBreakable[E_BLOCK_PUMPKIN_STEM] = true;
|
||
g_BlockPistonBreakable[E_BLOCK_REDSTONE_TORCH_OFF] = true;
|
||
g_BlockPistonBreakable[E_BLOCK_REDSTONE_TORCH_ON] = true;
|
||
g_BlockPistonBreakable[E_BLOCK_REDSTONE_WIRE] = true;
|
||
g_BlockPistonBreakable[E_BLOCK_RED_MUSHROOM] = true;
|
||
g_BlockPistonBreakable[E_BLOCK_RED_ROSE] = true;
|
||
g_BlockPistonBreakable[E_BLOCK_REEDS] = true;
|
||
g_BlockPistonBreakable[E_BLOCK_SNOW] = true;
|
||
g_BlockPistonBreakable[E_BLOCK_STATIONARY_LAVA] = false;
|
||
g_BlockPistonBreakable[E_BLOCK_STATIONARY_WATER] = false; //This gave pistons the ability to drop water :D
|
||
g_BlockPistonBreakable[E_BLOCK_STONE_BUTTON] = true;
|
||
g_BlockPistonBreakable[E_BLOCK_STONE_PRESSURE_PLATE] = true;
|
||
g_BlockPistonBreakable[E_BLOCK_TALL_GRASS] = true;
|
||
g_BlockPistonBreakable[E_BLOCK_TORCH] = true;
|
||
g_BlockPistonBreakable[E_BLOCK_VINES] = true;
|
||
g_BlockPistonBreakable[E_BLOCK_WATER] = false;
|
||
g_BlockPistonBreakable[E_BLOCK_WOODEN_DOOR] = true;
|
||
g_BlockPistonBreakable[E_BLOCK_WOODEN_PRESSURE_PLATE] = true;
|
||
g_BlockPistonBreakable[E_BLOCK_YELLOW_FLOWER] = true;
|
||
|
||
// Blocks that can be snowed over:
|
||
g_BlockIsSnowable[E_BLOCK_BROWN_MUSHROOM] = false;
|
||
g_BlockIsSnowable[E_BLOCK_CACTUS] = false;
|
||
g_BlockIsSnowable[E_BLOCK_CHEST] = false;
|
||
g_BlockIsSnowable[E_BLOCK_CROPS] = false;
|
||
g_BlockIsSnowable[E_BLOCK_FIRE] = false;
|
||
g_BlockIsSnowable[E_BLOCK_FIRE] = false;
|
||
g_BlockIsSnowable[E_BLOCK_GLASS] = false;
|
||
g_BlockIsSnowable[E_BLOCK_ICE] = false;
|
||
g_BlockIsSnowable[E_BLOCK_LAVA] = false;
|
||
g_BlockIsSnowable[E_BLOCK_LOCKED_CHEST] = false;
|
||
g_BlockIsSnowable[E_BLOCK_REDSTONE_REPEATER_OFF] = false;
|
||
g_BlockIsSnowable[E_BLOCK_REDSTONE_REPEATER_ON] = false;
|
||
g_BlockIsSnowable[E_BLOCK_REDSTONE_TORCH_OFF] = false;
|
||
g_BlockIsSnowable[E_BLOCK_REDSTONE_TORCH_ON] = false;
|
||
g_BlockIsSnowable[E_BLOCK_REDSTONE_WIRE] = false;
|
||
g_BlockIsSnowable[E_BLOCK_RED_MUSHROOM] = false;
|
||
g_BlockIsSnowable[E_BLOCK_RED_ROSE] = false;
|
||
g_BlockIsSnowable[E_BLOCK_REEDS] = false;
|
||
g_BlockIsSnowable[E_BLOCK_SAPLING] = false;
|
||
g_BlockIsSnowable[E_BLOCK_SIGN_POST] = false;
|
||
g_BlockIsSnowable[E_BLOCK_SNOW] = false;
|
||
g_BlockIsSnowable[E_BLOCK_STATIONARY_LAVA] = false;
|
||
g_BlockIsSnowable[E_BLOCK_STATIONARY_WATER] = false;
|
||
g_BlockIsSnowable[E_BLOCK_TALL_GRASS] = false;
|
||
g_BlockIsSnowable[E_BLOCK_TNT] = false;
|
||
g_BlockIsSnowable[E_BLOCK_TORCH] = false;
|
||
g_BlockIsSnowable[E_BLOCK_WALLSIGN] = false;
|
||
g_BlockIsSnowable[E_BLOCK_WATER] = false;
|
||
g_BlockIsSnowable[E_BLOCK_YELLOW_FLOWER] = false;
|
||
|
||
//Blocks that don<6F>t drop without a special tool
|
||
g_BlockRequiresSpecialTool[E_BLOCK_DIAMOND_BLOCK] = true;
|
||
g_BlockRequiresSpecialTool[E_BLOCK_DIAMOND_ORE] = true;
|
||
g_BlockRequiresSpecialTool[E_BLOCK_GOLD_BLOCK] = true;
|
||
g_BlockRequiresSpecialTool[E_BLOCK_GOLD_ORE] = true;
|
||
g_BlockRequiresSpecialTool[E_BLOCK_IRON_BLOCK] = true;
|
||
g_BlockRequiresSpecialTool[E_BLOCK_IRON_ORE] = true;
|
||
g_BlockRequiresSpecialTool[E_BLOCK_REDSTONE_ORE] = true;
|
||
g_BlockRequiresSpecialTool[E_BLOCK_REDSTONE_ORE_GLOWING]= true;
|
||
g_BlockRequiresSpecialTool[E_BLOCK_LAPIS_ORE] = true;
|
||
g_BlockRequiresSpecialTool[E_BLOCK_LAPIS_BLOCK] = true;
|
||
g_BlockRequiresSpecialTool[E_BLOCK_EMERALD_ORE] = true;
|
||
g_BlockRequiresSpecialTool[E_BLOCK_COAL_ORE] = true;
|
||
g_BlockRequiresSpecialTool[E_BLOCK_OBSIDIAN] = true;
|
||
g_BlockRequiresSpecialTool[E_BLOCK_STONE] = true;
|
||
g_BlockRequiresSpecialTool[E_BLOCK_COBBLESTONE] = true;
|
||
g_BlockRequiresSpecialTool[E_BLOCK_END_STONE] = true;
|
||
g_BlockRequiresSpecialTool[E_BLOCK_MOSSY_COBBLESTONE] = true;
|
||
g_BlockRequiresSpecialTool[E_BLOCK_SANDSTONE] = true;
|
||
g_BlockRequiresSpecialTool[E_BLOCK_STONE_BRICKS] = true;
|
||
g_BlockRequiresSpecialTool[E_BLOCK_COBWEB] = true;
|
||
g_BlockRequiresSpecialTool[E_BLOCK_SNOW] = true;
|
||
g_BlockRequiresSpecialTool[E_BLOCK_NETHER_BRICK] = true;
|
||
g_BlockRequiresSpecialTool[E_BLOCK_NETHERRACK] = true;
|
||
g_BlockRequiresSpecialTool[E_BLOCK_STONE_SLAB] = true;
|
||
g_BlockRequiresSpecialTool[E_BLOCK_DOUBLE_STONE_SLAB] = true;
|
||
g_BlockRequiresSpecialTool[E_BLOCK_STONE_PRESSURE_PLATE]= true;
|
||
g_BlockRequiresSpecialTool[E_BLOCK_BRICK] = true;
|
||
g_BlockRequiresSpecialTool[E_BLOCK_COBBLESTONE_STAIRS] = true;
|
||
g_BlockRequiresSpecialTool[E_BLOCK_STONE_BRICK_STAIRS] = true;
|
||
g_BlockRequiresSpecialTool[E_BLOCK_SANDSTONE_STAIRS] = true;
|
||
g_BlockRequiresSpecialTool[E_BLOCK_NETHER_BRICK_STAIRS] = true;
|
||
g_BlockRequiresSpecialTool[E_BLOCK_VINES] = true;
|
||
|
||
|
||
}
|
||
} BlockPropertiesInitializer;
|
||
|
||
|
||
|
||
|