 92c59963f8
			
		
	
	
		92c59963f8
		
	
	
	
	
		
			
			git-svn-id: http://mc-server.googlecode.com/svn/trunk@606 0a769ca7-a7f5-676a-18bf-c427514a06d6
		
			
				
	
	
		
			324 lines
		
	
	
		
			8.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			324 lines
		
	
	
		
			8.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| 
 | |
| #include "Globals.h"  // NOTE: MSVC stupidness requires this to be the same across all modules
 | |
| 
 | |
| #include "cBlockToPickup.h"
 | |
| #include "Defines.h"
 | |
| #include "BlockID.h"
 | |
| #include "MersenneTwister.h"
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| static void AddRandomDrop(cItems & a_Drops, MTRand & r1, int a_OneInNChance, ENUM_ITEM_ID a_ItemID)
 | |
| {
 | |
| 	if ((r1.randInt(16 * a_OneInNChance - 1) / 16) != 0)
 | |
| 	{
 | |
| 		return;
 | |
| 	}
 | |
| 	a_Drops.push_back(cItem(a_ItemID, 1));
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| void cBlockToPickup::ToPickup(BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, const cItem & a_UsedItem, cItems & a_Drops)
 | |
| {
 | |
| 	MTRand r1;
 | |
| 
 | |
| 	switch (a_BlockType)
 | |
| 	{
 | |
| 		// Blocks that always drop themselves as the only item, no matter what tool; copy damage from meta:
 | |
| 		case E_BLOCK_LOG:
 | |
| 		case E_BLOCK_PLANKS:
 | |
| 		case E_BLOCK_WOOL:
 | |
| 		{
 | |
| 			a_Drops.push_back(cItem((ENUM_ITEM_ID)a_BlockType, 1, a_BlockMeta));
 | |
| 			return;
 | |
| 		}
 | |
| 		
 | |
| 		
 | |
| 		// Blocks that always drop themselves as the only item, no matter what tool, set damage value zero:
 | |
| 		case E_BLOCK_DIRT:
 | |
| 		case E_BLOCK_SAPLING:
 | |
| 		case E_BLOCK_SAND:
 | |
| 		case E_BLOCK_TORCH:
 | |
| 		case E_BLOCK_YELLOW_FLOWER:
 | |
| 		case E_BLOCK_RED_ROSE:
 | |
| 		case E_BLOCK_BROWN_MUSHROOM:
 | |
| 		case E_BLOCK_RED_MUSHROOM:
 | |
| 		case E_BLOCK_TNT:
 | |
| 		case E_BLOCK_CRAFTING_TABLE:
 | |
| 		case E_BLOCK_FURNACE:
 | |
| 		case E_BLOCK_CACTUS:
 | |
| 		case E_BLOCK_REDSTONE_TORCH_OFF:
 | |
| 		case E_BLOCK_POWERED_RAIL:
 | |
| 		case E_BLOCK_DETECTOR_RAIL:
 | |
| 		case E_BLOCK_RAIL:
 | |
| 		case E_BLOCK_LADDER:
 | |
| 		case E_BLOCK_LEVER:
 | |
| 		case E_BLOCK_WOODEN_PRESSURE_PLATE:
 | |
| 		case E_BLOCK_STONE_BUTTON:
 | |
| 		case E_BLOCK_JUKEBOX:
 | |
| 		case E_BLOCK_FENCE:
 | |
| 		case E_BLOCK_FENCE_GATE:
 | |
| 		case E_BLOCK_PUMPKIN:
 | |
| 		case E_BLOCK_NETHERRACK:
 | |
| 		case E_BLOCK_SOULSAND:
 | |
| 		case E_BLOCK_JACK_O_LANTERN:
 | |
| 		case E_BLOCK_TRAPDOOR:
 | |
| 		{
 | |
| 			a_Drops.push_back(cItem((ENUM_ITEM_ID)a_BlockType, 1, 0));
 | |
| 			return;
 | |
| 		}
 | |
| 		
 | |
| 		
 | |
| 		// Blocks that always drop a single item, no matter what tool:
 | |
| 		case E_BLOCK_SIGN_POST:
 | |
| 		case E_BLOCK_WALLSIGN:              a_Drops.push_back(cItem(E_ITEM_SIGN, 1));              return;
 | |
| 		case E_BLOCK_REDSTONE_WIRE:         a_Drops.push_back(cItem(E_ITEM_REDSTONE_DUST, 1));     return;
 | |
| 		case E_BLOCK_GLOWSTONE:             a_Drops.push_back(cItem(E_ITEM_GLOWSTONE_DUST, 1));    return;
 | |
| 		case E_BLOCK_REDSTONE_REPEATER_OFF:
 | |
| 		case E_BLOCK_REDSTONE_REPEATER_ON:  a_Drops.push_back(cItem(E_ITEM_REDSTONE_REPEATER, 1)); return;
 | |
| 		case E_BLOCK_COBWEB:                a_Drops.push_back(cItem(E_ITEM_STRING, 1));            return;
 | |
| 		case E_BLOCK_FARMLAND:
 | |
| 		case E_BLOCK_GRASS:                 a_Drops.push_back(cItem(E_ITEM_DIRT, 1));              return;
 | |
| 		case E_BLOCK_LIT_FURNACE:           a_Drops.push_back(cItem(E_ITEM_FURNACE, 1));           return;
 | |
| 		case E_BLOCK_SUGARCANE:             a_Drops.push_back(cItem(E_ITEM_SUGARCANE, 1));         return;
 | |
| 		case E_BLOCK_PUMPKIN_STEM:          a_Drops.push_back(cItem(E_ITEM_PUMPKIN_SEEDS, 1));     return;
 | |
| 		case E_BLOCK_MELON_STEM:            a_Drops.push_back(cItem(E_ITEM_MELON_SEEDS, 1));       return;
 | |
| 		
 | |
| 		
 | |
| 		// Doors seem to need their meta set to 1
 | |
| 		case E_BLOCK_WOODEN_DOOR: a_Drops.push_back(cItem(E_ITEM_WOODEN_DOOR, 1, 1)); return;
 | |
| 		case E_BLOCK_IRON_DOOR:   a_Drops.push_back(cItem(E_ITEM_IRON_DOOR,   1, 1)); return;
 | |
| 		
 | |
| 
 | |
| 		////////////////////////
 | |
| 		// Ores:
 | |
| 		
 | |
| 		// Coal ore requires a pickaxe:
 | |
| 		case E_BLOCK_COAL_ORE:
 | |
| 		{
 | |
| 			if (ItemCategory::IsPickaxe(a_UsedItem.m_ItemID))
 | |
| 			{
 | |
| 				a_Drops.push_back(cItem(E_ITEM_COAL, 1));
 | |
| 			}
 | |
| 			return;
 | |
| 		}
 | |
| 		
 | |
| 		// Iron ore requires a stone or better pickaxe:
 | |
| 		case E_BLOCK_IRON_ORE:
 | |
| 		{
 | |
| 			if (
 | |
| 				(a_UsedItem.m_ItemID == E_ITEM_STONE_PICKAXE) ||
 | |
| 				(a_UsedItem.m_ItemID == E_ITEM_IRON_PICKAXE)  ||
 | |
| 				(a_UsedItem.m_ItemID == E_ITEM_DIAMOND_PICKAXE)
 | |
| 			)
 | |
| 			{
 | |
| 				a_Drops.push_back(cItem(E_ITEM_IRON_ORE, 1));
 | |
| 			}
 | |
| 			return;
 | |
| 		}
 | |
| 		
 | |
| 		// Gold and diamond ores require an iron or better pickaxe:
 | |
| 		case E_BLOCK_GOLD_ORE:
 | |
| 		case E_BLOCK_DIAMOND_ORE:
 | |
| 		{
 | |
| 			if (
 | |
| 				(a_UsedItem.m_ItemID == E_ITEM_IRON_PICKAXE) ||
 | |
| 				(a_UsedItem.m_ItemID == E_ITEM_DIAMOND_PICKAXE)
 | |
| 			)
 | |
| 			{
 | |
| 				a_Drops.push_back(cItem((ENUM_ITEM_ID)a_BlockType, 1));
 | |
| 			}
 | |
| 			return;
 | |
| 		}
 | |
| 
 | |
| 		// Obsidian require a diamond pickaxe:
 | |
| 		case E_BLOCK_OBSIDIAN:
 | |
| 		{
 | |
| 			if (a_UsedItem.m_ItemID == E_ITEM_DIAMOND_PICKAXE)
 | |
| 			{
 | |
| 				a_Drops.push_back(cItem((ENUM_ITEM_ID)a_BlockType, 1));
 | |
| 			}
 | |
| 			return;
 | |
| 		}
 | |
| 
 | |
| 		// Redstone requires an iron or better pickaxe:
 | |
| 		case E_BLOCK_REDSTONE_ORE_GLOWING:
 | |
| 		case E_BLOCK_REDSTONE_ORE:
 | |
| 		{
 | |
| 			if (
 | |
| 				(a_UsedItem.m_ItemID == E_ITEM_IRON_PICKAXE) ||
 | |
| 				(a_UsedItem.m_ItemID == E_ITEM_DIAMOND_PICKAXE)
 | |
| 			)
 | |
| 			{
 | |
| 				a_Drops.push_back(cItem(E_ITEM_REDSTONE_DUST, 4 + (short)r1.randInt(1)));
 | |
| 			}
 | |
| 			return;
 | |
| 		}
 | |
| 				
 | |
| 		// Lapis ore requires a stone or better pickaxe:
 | |
| 		case E_BLOCK_LAPIS_ORE:
 | |
| 		{
 | |
| 			if (
 | |
| 				(a_UsedItem.m_ItemID == E_ITEM_STONE_PICKAXE) ||
 | |
| 				(a_UsedItem.m_ItemID == E_ITEM_IRON_PICKAXE)  ||
 | |
| 				(a_UsedItem.m_ItemID == E_ITEM_GOLD_PICKAXE)  ||
 | |
| 				(a_UsedItem.m_ItemID == E_ITEM_DIAMOND_PICKAXE)
 | |
| 			)
 | |
| 			{
 | |
| 				a_Drops.push_back(cItem(E_ITEM_DYE, 4 + (short)r1.randInt(4), E_META_DYE_BLUE));
 | |
| 			}
 | |
| 			return;
 | |
| 		}
 | |
| 		
 | |
| 
 | |
| 		////////////////////////
 | |
| 		// Resource blocks:
 | |
| 		
 | |
| 		// Iron and lapis blocks require a stone or better pickaxe:
 | |
| 		case E_BLOCK_IRON_BLOCK:
 | |
| 		case E_BLOCK_LAPIS_BLOCK:
 | |
| 		{
 | |
| 			if (
 | |
| 				(a_UsedItem.m_ItemID == E_ITEM_STONE_PICKAXE) ||
 | |
| 				(a_UsedItem.m_ItemID == E_ITEM_IRON_PICKAXE)  ||
 | |
| 				(a_UsedItem.m_ItemID == E_ITEM_DIAMOND_PICKAXE)
 | |
| 			)
 | |
| 			{
 | |
| 				a_Drops.push_back(cItem((ENUM_ITEM_ID)a_BlockType, 1));
 | |
| 			}
 | |
| 			return;
 | |
| 		}
 | |
| 		
 | |
| 		// Diamond and gold blocks require an iron or better pickaxe:
 | |
| 		case E_BLOCK_DIAMOND_BLOCK:
 | |
| 		{
 | |
| 			if (
 | |
| 				(a_UsedItem.m_ItemID == E_ITEM_IRON_PICKAXE) ||
 | |
| 				(a_UsedItem.m_ItemID == E_ITEM_DIAMOND_PICKAXE)
 | |
| 			)
 | |
| 			{
 | |
| 				a_Drops.push_back(cItem((ENUM_ITEM_ID)a_BlockType, 1));
 | |
| 			}
 | |
| 		}
 | |
| 		
 | |
| 		
 | |
| 		// These blocks require a pickaxe to drop themselves:
 | |
| 		case E_BLOCK_COBBLESTONE:
 | |
| 		case E_BLOCK_BRICK:
 | |
| 		case E_BLOCK_NETHER_BRICK:
 | |
| 		case E_BLOCK_MOSSY_COBBLESTONE:
 | |
| 		case E_BLOCK_STONE_SLAB:
 | |
| 		case E_BLOCK_COBBLESTONE_STAIRS:
 | |
| 		case E_BLOCK_STONE_BRICK_STAIRS:
 | |
| 		case E_BLOCK_NETHER_BRICK_STAIRS:
 | |
| 		case E_BLOCK_SANDSTONE_STAIRS:
 | |
| 		case E_BLOCK_SANDSTONE:
 | |
| 		case E_BLOCK_STONE_PRESSURE_PLATE:
 | |
| 		{
 | |
| 			if (ItemCategory::IsPickaxe(a_UsedItem.m_ItemID))
 | |
| 			{
 | |
| 				a_Drops.push_back(cItem((ENUM_ITEM_ID)a_BlockType, 1));
 | |
| 			}
 | |
| 			return;
 | |
| 		}
 | |
| 		
 | |
| 
 | |
| 		// Stone requires a pickaxe to drop cobblestone:
 | |
| 		case E_BLOCK_STONE:
 | |
| 		{
 | |
| 			if (ItemCategory::IsPickaxe(a_UsedItem.m_ItemID))
 | |
| 			{
 | |
| 				a_Drops.push_back(cItem(E_ITEM_COBBLESTONE, 1));
 | |
| 			}
 | |
| 			return;
 | |
| 		}
 | |
| 
 | |
| 
 | |
| 		// Snow requires a shovel to harvest:
 | |
| 		case E_BLOCK_SNOW:
 | |
| 		{
 | |
| 			if (ItemCategory::IsShovel(a_UsedItem.m_ItemID))
 | |
| 			{
 | |
| 				a_Drops.push_back(cItem(E_ITEM_SNOWBALL, 1));
 | |
| 			}
 | |
| 			return;
 | |
| 		}
 | |
| 		
 | |
| 		
 | |
| 		// Leaves require shears for harvesting and have a chance of dropping a sapling and a red apple:
 | |
| 		case E_BLOCK_LEAVES:
 | |
| 		{
 | |
| 			if (a_UsedItem.m_ItemID == E_ITEM_SHEARS)
 | |
| 			{
 | |
| 				a_Drops.push_back(cItem(E_ITEM_LEAVES, 1));
 | |
| 			}
 | |
| 			else
 | |
| 			{
 | |
| 				AddRandomDrop(a_Drops, r1, 5,   E_ITEM_SAPLING);
 | |
| 				AddRandomDrop(a_Drops, r1, 200, E_ITEM_APPLE);
 | |
| 			}
 | |
| 			return;
 | |
| 		}
 | |
| 		
 | |
| 		
 | |
| 		// Crops drop a wheat and possibly another seeds when ripe; always drop at least a single seed
 | |
| 		case E_BLOCK_CROPS:
 | |
| 		{
 | |
| 			if (a_BlockMeta == 7)
 | |
| 			{
 | |
| 				AddRandomDrop(a_Drops, r1, 3, E_ITEM_SEEDS);
 | |
| 				a_Drops.push_back(cItem(E_ITEM_WHEAT, 1));
 | |
| 			}
 | |
| 			a_Drops.push_back(cItem(E_ITEM_SEEDS, 1));
 | |
| 			return;
 | |
| 		}
 | |
| 		
 | |
| 		
 | |
| 		// Vines drop only with shears, otherwise they are destroyed
 | |
| 		case E_BLOCK_VINES:
 | |
| 		{
 | |
| 			if (a_UsedItem.m_ItemID == E_ITEM_SHEARS)
 | |
| 			{
 | |
| 				a_Drops.push_back(cItem(E_ITEM_VINES, 1));
 | |
| 			}
 | |
| 			return;
 | |
| 		}
 | |
| 		
 | |
| 		
 | |
| 		// Snow drops only when using a shovel
 | |
| 		case E_BLOCK_SNOW_BLOCK:
 | |
| 		{
 | |
| 			if (ItemCategory::IsShovel(a_UsedItem.m_ItemID))
 | |
| 			{
 | |
| 				a_Drops.push_back(cItem(E_ITEM_SNOWBALL,   4, 0)); return;
 | |
| 			}
 | |
| 			return;
 | |
| 		}
 | |
| 
 | |
| 
 | |
| 		// Random multi-drop blocks:
 | |
| 		case E_BLOCK_TALL_GRASS: a_Drops.push_back(cItem(E_ITEM_SEEDS,           (short)r1.randInt(3) / 2, 1)); return;
 | |
| 		case E_BLOCK_MELON:      a_Drops.push_back(cItem(E_ITEM_MELON_SLICE, 3 + (short)r1.randInt(2),     1)); return;
 | |
| 		
 | |
| 
 | |
| 		// Fixed multi-drop blocks:
 | |
| 		case E_BLOCK_DOUBLE_STONE_SLAB:  a_Drops.push_back(cItem(E_ITEM_STONE_SLAB, 2, 0)); return;
 | |
| 		case E_BLOCK_DOUBLE_WOODEN_SLAB: a_Drops.push_back(cItem(E_ITEM_STEP,       2, 0)); return;
 | |
| 		
 | |
| 		default:
 | |
| 		{
 | |
| 			return;
 | |
| 		}
 | |
| 	}  // switch (a_BlockType)
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 |