diff --git a/data/crafting.txt b/data/crafting.txt
index 907a08aa..ae0a8576 100644
--- a/data/crafting.txt
+++ b/data/crafting.txt
@@ -177,39 +177,39 @@ CraftingTable = WoodPlanks^-1, 1:1, 1:2, 2:1, 2:2
##
#
## Axes:
-#DiamondAxe = Stick, 2:2, 2:3 | Diamond, 2:1, 1:1, 1:2
-#DiamondAxe = Stick, 2:2, 2:3 | Diamond, 2:1, 3:1, 3:2
-#GoldenAxe = Stick, 2:2, 2:3 | GoldIngot, 2:1, 1:1, 1:2
-#GoldenAxe = Stick, 2:2, 2:3 | GoldIngot, 2:1, 3:1, 3:2
-#IronAxe = Stick, 2:2, 2:3 | IronIngot, 2:1, 1:1, 1:2
-#IronAxe = Stick, 2:2, 2:3 | IronIngot, 2:1, 3:1, 3:2
-#StoneAxe = Stick, 2:2, 2:3 | Cobblestone, 2:1, 1:1, 1:2
-#StoneAxe = Stick, 2:2, 2:3 | Cobblestone, 2:1, 3:1, 3:2
-#WoodenAxe = Stick, 2:2, 2:3 | Planks^-1, 2:1, 1:1, 1:2
-#WoodenAxe = Stick, 2:2, 2:3 | Planks^-1, 2:1, 3:1, 3:2
+DiamondAxe = Stick, 2:2, 2:3 | Diamond, 2:1, 1:1, 1:2
+DiamondAxe = Stick, 2:2, 2:3 | Diamond, 2:1, 3:1, 3:2
+GoldenAxe = Stick, 2:2, 2:3 | GoldIngot, 2:1, 1:1, 1:2
+GoldenAxe = Stick, 2:2, 2:3 | GoldIngot, 2:1, 3:1, 3:2
+IronAxe = Stick, 2:2, 2:3 | IronIngot, 2:1, 1:1, 1:2
+IronAxe = Stick, 2:2, 2:3 | IronIngot, 2:1, 3:1, 3:2
+StoneAxe = Stick, 2:2, 2:3 | Cobblestone, 2:1, 1:1, 1:2
+StoneAxe = Stick, 2:2, 2:3 | Cobblestone, 2:1, 3:1, 3:2
+WoodenAxe = Stick, 2:2, 2:3 | WoodPlanks^-1, 2:1, 1:1, 1:2
+WoodenAxe = Stick, 2:2, 2:3 | WoodPlanks^-1, 2:1, 3:1, 3:2
#
## Pickaxes:
-#DiamondPickaxe = Stick, 2:2, 2:3 | Diamond, 1:1, 2:1, 3:1
-#GoldenPickaxe = Stick, 2:2, 2:3 | GoldIngot, 1:1, 2:1, 3:1
-#IronPickaxe = Stick, 2:2, 2:3 | IronIngot, 1:1, 2:1, 3:1
-#StonePickaxe = Stick, 2:2, 2:3 | Cobblestone, 1:1, 2:1, 3:1
-#WoodenPickaxe = Stick, 2:2, 2:3 | Planks^-1, 1:1, 2:1, 3:1
+DiamondPickaxe = Stick, 2:2, 2:3 | Diamond, 1:1, 2:1, 3:1
+GoldenPickaxe = Stick, 2:2, 2:3 | GoldIngot, 1:1, 2:1, 3:1
+IronPickaxe = Stick, 2:2, 2:3 | IronIngot, 1:1, 2:1, 3:1
+StonePickaxe = Stick, 2:2, 2:3 | Cobblestone, 1:1, 2:1, 3:1
+WoodenPickaxe = Stick, 2:2, 2:3 | WoodPlanks^-1, 1:1, 2:1, 3:1
#
## Shovels:
-#DiamondShovel = Stick, 2:2, 2:3 | Diamond, 2:1
-#GoldenShovel = Stick, 2:2, 2:3 | GoldIngot, 2:1
-#IronShovel = Stick, 2:2, 2:3 | IronIngot, 2:1
-#StoneShovel = Stick, 2:2, 2:3 | Cobblestone, 2:1
-#WoodenShovel = Stick, 2:2, 2:3 | Planks^-1, 2:1
+DiamondShovel = Stick, 2:2, 2:3 | Diamond, 2:1
+GoldenShovel = Stick, 2:2, 2:3 | GoldIngot, 2:1
+IronShovel = Stick, 2:2, 2:3 | IronIngot, 2:1
+StoneShovel = Stick, 2:2, 2:3 | Cobblestone, 2:1
+WoodenShovel = Stick, 2:2, 2:3 | WoodPlanks^-1, 2:1
#
## Hoes:
-#DiamondHoe = Stick, 2:2, 2:3 | Diamond, 2:1, *:1
-#GoldenHoe = Stick, 2:2, 2:3 | GoldIngot, 2:1, *:1
-#IronHoe = Stick, 2:2, 2:3 | IronIngot, 2:1, *:1
-#StoneHoe = Stick, 2:2, 2:3 | Cobblestone, 2:1, *:1
-#WoodenHoe = Stick, 2:2, 2:3 | Planks^-1, 2:1, *:1
+DiamondHoe = Stick, 2:2, 2:3 | Diamond, 2:1, *:1
+GoldenHoe = Stick, 2:2, 2:3 | GoldIngot, 2:1, *:1
+IronHoe = Stick, 2:2, 2:3 | IronIngot, 2:1, *:1
+StoneHoe = Stick, 2:2, 2:3 | Cobblestone, 2:1, *:1
+WoodenHoe = Stick, 2:2, 2:3 | WoodPlanks^-1, 2:1, *:1
#
-#Bucket = IronIngot, 1:1, 2:2, 3:1
+Bucket = IronIngot, 1:1, 2:2, 3:1
#Compass = IronIngot, 2:1, 1:2, 3:2, 2:3 | RedstoneDust, 2:2
#EmptyMap = Paper, 1:1, 1:2, 1:3, 2:1, 2:3, 3:1, 3:2, 3:3 | Compass, 2:2
#FireCharge, 3 = BlazePowder, * | Coal, * | Gunpowder, *
@@ -248,10 +248,10 @@ CraftingTable = WoodPlanks^-1, 1:1, 1:2, 2:1, 2:2
##
#
## Helmets:
-#DiamondHelmet = Diamond, 1:1, 2:1, 3:1, 1:2, 3:2
-#GoldenHelmet = GoldIngot, 1:1, 2:1, 3:1, 1:2, 3:2
-#IronHelmet = IronIngot, 1:1, 2:1, 3:1, 1:2, 3:2
-#LeatherHelmet = Leather, 1:1, 2:1, 3:1, 1:2, 3:2
+DiamondHelmet = Diamond, 1:1, 2:1, 3:1, 1:2, 3:2
+GoldenHelmet = GoldIngot, 1:1, 2:1, 3:1, 1:2, 3:2
+IronHelmet = IronIngot, 1:1, 2:1, 3:1, 1:2, 3:2
+LeatherCap = Leather, 1:1, 2:1, 3:1, 1:2, 3:2
#
## Chestplates:
#DiamondChestplate = Diamond, 1:1, 3:1, 1:2, 2:2, 3:2, 1:3, 2:3, 3:3
diff --git a/data/dropblock.txt b/data/dropblock.txt
new file mode 100644
index 00000000..d79ad579
--- /dev/null
+++ b/data/dropblock.txt
@@ -0,0 +1,177 @@
+#********************#
+# Drop Block Mapping #
+#********************#
+#
+#
+#******************************************************#
+# Basic Notation Help
+#******************************************************#
+#
+#
+#Block DroppedBlock Hardness Tool Hand Wooden Stone Iron Diamand Golden Shears Sword
+Barrier = -, Infinity, -, Infinity, -, -, -, -, -, -, -
+Bedrock = -, Infinity, -, Infinity, -, -, -, -, -, -, -
+CommandBlock = -, Infinity, -, Infinity, -, -, -, -, -, -, -
+EndPortal = -, Infinity, -, Infinity, -, -, -, -, -, -, -
+EndPortalFrame = -, Infinity, -, Infinity, -, -, -, -, -, -, -
+Portal = -, Infinity, -, Infinity, -, -, -, -, -, -, -
+Lava = -, 100, -, Infinity, -, -, -, -, -, -, -
+StructureBlock = -, Infinity, -, Infinity, -, -, -, -, -, -, -
+StructureVoid = -, 0, -, 0.05, -, -, -, -, -, -, -
+Water = -, 100, -, Infinity, -, -, -, -, -, -, -
+Obsidian = Obsidian, 50, DiamondPickaxe, 250, 125, 62.5, 41.7, 9.4, 20.85, -, -
+EnderChest = Obsidian, 22.5, WoodenPickaxe, 112.5, 16.9, 8.45, 5.65, 4.25, 2.85, -, -
+Anvil = Anvil, 5, WoodenPickaxe, 25, 3.75, 1.9, 1.25, 0.95, 0.65, -, -
+BlockOfCoal = BlockOfCoal, 5, WoodenPickaxe, 25, 3.75, 1.9, 1.25, 0.95, 0.65, -, -
+BlockOfDiamond = BlockOfDiamond, 5, IronPickaxe, 25, 12.5, 6.25, 1.25, 0.95, 2.1, -, -
+BlockOfEmerald = BlockOfEmerald, 5, IronPickaxe, 25, 12.5, 6.25, 1.25, 0.95, 2.1, -, -
+BlockOfIron = BlockOfIron, 5, StonePickaxe, 25, 12.5, 1.9, 1.25, 0.95, 2.1, -, -
+BlockOfRedstone = BlockOfRedstone, 5, WoodenPickaxe, 25, 3.75, 1.9, 1.25, 0.95, 0.65, -, -
+EnchantmentTable = EnchantmentTable, 5, WoodenPickaxe, 25, 3.75, 1.9, 1.25, 0.95, 0.65, -, -
+IronBars = IronBars, 5, WoodenPickaxe, 25, 3.75, 1.9, 1.25, 0.95, 0.65, -, -
+IronDoor = IronDoor, 5, WoodenPickaxe, 25, 3.75, 1.9, 1.25, 0.95, 0.65, -, -
+IronTrapdoor = IronTrapdoor, , WoodenPickaxe5, 25, 3.75, 1.9, 1.25, 0.95, 0.65, -, -
+MonsterSpawner = -, 5, WoodenPickaxe, 25, 3.75, 1.9, 1.25, 0.95, 0.65, -, -
+* Cobweb = -, 4, -, 20, -, -, -, -, -, 0.4, 0.4
+Dispenser = Dispenser, 3.5, WoodenPickaxe, 17.5, 2.65, 1.35, 0.9, 0.7, 0.45, -, -
+Dropper = Dropper, 3.5, WoodenPickaxe, 17.5, 2.65, 1.35, 0.9, 0.7, 0.45, -, -
+Furnace = Furnace, 3.5, WoodenPickaxe, 17.5, 2.65, 1.35, 0.9, 0.7, 0.45, -, -
+Beacon = Beacon, 3, -, 4.5, -, -, -, -, -, -, -
+BlockOfGold = BlockOfGold, 3, IronPickaxe, 15, 7.5, 3.75, 0.75, 0.6, 1.25, -, -
+CoalOre = CoalOre, 3, WoodenPickaxe, 15, 2.25, 1.15, 0.75, 0.6, 0.4, -, -
+DragonEgg = DragonEgg, 3, -, 4.5, -, -, -, -, -, -, -
+DiamondOre = DiamondOre, 3, IronPickaxe, 15, 7.5, 3.75, 0.75, 0.6, 1.25, -, -
+EmeraldOre = EmeraldOre, 3, IronPickaxe, 15, 7.5, 3.75, 0.75, 0.6, 1.25, -, -
+EndStone = EndStone, 3, WoodenPickaxe, 15, 2.25, 1.15, 0.75, 0.6, 0.4, -, -
+GoldOre = GoldOre, 3, IronPickaxe, 15, 7.5, 3.75, 0.75, 0.6, 1.25, -, -
+Hopper = Hopper, 3, WoodenPickaxe, 15, 2.25, 1.15, 0.75, 0.6, 0.4, -, -
+IronOre = IronOre, 3, StonePickaxe, 15, 7.5, 1.15, 0.75, 0.6, 1.25, -, -
+LapisLazuliBlock = LapisLazuliBlock, 3, StonePickaxe, 15, 7.5, 1.15, 0.75, 0.6, 1.25, -, -
+LapisLazuliOre = LapisLazuliOre, 3, StonePickaxe, 15, 7.5, 1.15, 0.75, 0.6, 1.25, -, -
+NetherQuartzOre = NetherQuartzOre, 3, WoodenPickaxe, 15, 2.25, 1.15, 0.75, 0.6, 0.4, -, -
+RedstoneOre = RedstoneOre, 3, IronPickaxe, 15, 7.5, 3.75, 0.75, 0.6, 1.25, -, -
+WoodenTrapdoor = Trapdoor, 3, Axe, 4.5, 2.25, 1.15, 0.75, 0.6, 0.4, -, -
+* WoodenDoor = -, 3, Axe, 4.5, 2.25, 1.15, 0.75, 0.6, 0.4, -, -
+Chest = Chest, 2.5, Axe, 3.75, 1.9, 0.95, 0.65, 0.5, 0.35, -, -
+TrappedChest = TrappedChest, 2.5, Axe, 3.75, 1.9, 0.95, 0.65, 0.5, 0.35, -, -
+CraftingTable = CraftingTable, 2.5, Axe, 3.75, 1.9, 0.95, 0.65, 0.5, 0.35, -, -
+BoneBlock = BoneBlock, 2, WoodenPickaxe, 10, 1.5, 0.75, 0.5, 0.4, 0.25, -, -
+BrickStairs = BrickStairs, 2, WoodenPickaxe, 10, 1.5, 0.75, 0.5, 0.4, 0.25, -, -
+Bricks = Bricks, 2, WoodenPickaxe, 10, 1.5, 0.75, 0.5, 0.4, 0.25, -, -
+Cauldron = Cauldron, 2, WoodenPickaxe, 10, 1.5, 0.75, 0.5, 0.4, 0.25, -, -
+Cobblestone = Cobblestone, 2, WoodenPickaxe, 10, 1.5, 0.75, 0.5, 0.4, 0.25, -, -
+CobblestoneStairs = CobblestoneStairs, 2, WoodenPickaxe, 10, 1.5, 0.75, 0.5, 0.4, 0.25, -, -
+CobblestoneWall = CobblestoneWall, 2, WoodenPickaxe, 10, 1.5, 0.75, 0.5, 0.4, 0.25, -, -
+* Fence = -, 2, Axe, 3, 1.5, 0.75, 0.5, 0.4, 0.25, -, -
+FenceGate = FenceGate, 2, Axe, 3, 1.5, 0.75, 0.5, 0.4, 0.25, -, -
+Jukebox = Jukebox, 2, Axe, 3, 1.5, 0.75, 0.5, 0.4, 0.25, -, -
+MossStone = MossStone, 2, WoodenPickaxe, 10, 1.5, 0.75, 0.5, 0.4, 0.25, -, -
+NetherBrick = NetherBrick, 2, WoodenPickaxe, 10, 1.5, 0.75, 0.5, 0.4, 0.25, -, -
+RedNetherBrick = RedNetherBrick, 2, WoodenPickaxe, 10, 1.5, 0.75, 0.5, 0.4, 0.25, -, -
+NetherBrickFence = NetherBrickFence, 2, WoodenPickaxe, 10, 1.5, 0.75, 0.5, 0.4, 0.25, -, -
+NetherBrickStairs = NetherBrickStairs, 2, WoodenPickaxe, 10, 1.5, 0.75, 0.5, 0.4, 0.25, -, -
+* StoneSlab = StoneSlab, 2, WoodenPickaxe, 10, 1.5, 0.75, 0.5, 0.4, 0.25, -, -
+Wood = Wood, 2, Axe, 3, 1.5, 0.75, 0.5, 0.4, 0.25, -, -
+WoodPlanks = WoodPlanks, 2, Axe, 3, 1.5, 0.75, 0.5, 0.4, 0.25, -, -
+* WoodenSlabs = WoodenSlab, 2, Axe, 3, 1.5, 0.75, 0.5, 0.4, 0.25, -, -
+* WoodenStairs = OakWoodStairs, 2, Axe, 3, 1.5, 0.75, 0.5, 0.4, 0.25, -, -
+Concrete = Concrete, 1.8, Pickaxe, 2.7, 1.35, 0.7, 0.45, 0.35, 0.25, -, -
+* Andesite = -, 1.5, WoodenPickaxe, 7.5, 1.15, 0.6, 0.4, 0.3, 0.2, -, -
+* Bookshelf = -, 1.5, Axe, 2.25, 1.15, 0.6, 0.4, 0.3, 0.2, -, -
+DarkPrismarine = Prismarine, 1.5, WoodenPickaxe, 7.5, 1.15, 0.6, 0.4, 0.3, 0.2, -, -
+* Diorite = -, 1.5, WoodenPickaxe, 7.5, 1.15, 0.6, 0.4, 0.3, 0.2, -, -
+* Granite = -, 1.5, WoodenPickaxe, 7.5, 1.15, 0.6, 0.4, 0.3, 0.2, -, -
+Prismarine = Prismarine, 1.5, WoodenPickaxe, 7.5, 1.15, 0.6, 0.4, 0.3, 0.2, -, -
+PrismarineBricks = Prismarine, 1.5, WoodenPickaxe, 7.5, 1.15, 0.6, 0.4, 0.3, 0.2, -, -
+Stone = Cobblestone, 1.5, WoodenPickaxe, 7.5, 1.15, 0.6, 0.4, 0.3, 0.2, -, -
+StoneBrick = StoneBricks, 1.5, WoodenPickaxe, 7.5, 1.15, 0.6, 0.4, 0.3, 0.2, -, -
+StoneBrickStairs = StoneBrickStairs, 1.5, WoodenPickaxe, 7.5, 1.15, 0.6, 0.4, 0.3, 0.2, -, -
+* GlazedTerracotta = -, 1.4, Pickaxe, 2.1, 1.05, 0.55, 0.35, 0.3, 0.2, -, -
+* Terracotta = -, 1.25, WoodenPickaxe, 6.25, 0.95, 0.5, 0.35, 0.25, 0.2, -, -
+* Banner = -, 1, Axe, 1.5, 0.75, 0.4, 0.25, 0.2, 0.15, -, -
+JackLantern = JackLantern, 1, Axe, 1.5, 0.75, 0.4, 0.25, 0.2, 0.15, -, 1
+Melon = Melon, 1, Axe, 1.5, 0.75, 0.4, 0.25, 0.2, 0.15, -, 1
+MobHead = MobHead, 1, -, 1.5, -, -, -, -, -, -, -
+NetherWartBlock = NetherWartBlock, 1, -, 1.5, -, -, -, -, -, -, -
+Pumpkin = Pumpkin, 1, Axe, 1.5, 0.75, 0.4, 0.25, 0.2, 0.15, -, 1
+Sign = StandingSign, 1, Axe, 1.5, 0.75, 0.4, 0.25, 0.2, 0.15, -, -
+BlockOfQuartz = BlockOfQuartz, 0.8, WoodenPickaxe, 4, 0.65, 0.35, 0.2, 0.2, 0.1, -, -
+NoteBlock = NoteBlock, 0.8, Axe, 1.25, 0.65, 0.35, 0.2, 0.2, 0.1, -, -
+QuartzStairs = QuartzStairs, 0.8, WoodenPickaxe, 4, 0.65, 0.35, 0.2, 0.2, 0.1, -, -
+RedSandstone = RedSandstone, 0.8, WoodenPickaxe, 4, 0.65, 0.35, 0.2, 0.2, 0.1, -, -
+RedSandstoneStairs = RedSandstoneStairs, 0.8, WoodenPickaxe, 4, 0.65, 0.35, 0.2, 0.2, 0.1, -, -
+Sandstone = Sandstone, 0.8, WoodenPickaxe, 4, 0.65, 0.35, 0.2, 0.2, 0.1, -, -
+SandstoneStairs = SandstoneStairs, 0.8, WoodenPickaxe, 4, 0.65, 0.35, 0.2, 0.2, 0.1, -, -
+Wool = Wool, 0.8, -, 1.25, -, -, -, -, -, 0.25, -
+* MonsterEgg = -, 0.75, -, 1.15, -, -, -, -, -, -, -
+Rails = Rail, 0.7, Pickaxe, 1.05, 0.55, 0.3, 0.2, 0.15, 0.1, -, -
+Clay = Clay, 0.6, Shovel, 0.9, 0.45, 0.25, 0.15, 0.15, 0.1, -, -
+Farmland = Dirt, 0.6, Shovel, 0.9, 0.45, 0.25, 0.15, 0.15, 0.1, -, -
+GrassBlock = Dirt, 0.6, Shovel, 0.9, 0.45, 0.25, 0.15, 0.15, 0.1, -, -
+* Gravel = Gravel, 0.6, Shovel, 0.9, 0.45, 0.25, 0.15, 0.15, 0.1, -, -
+Mycelium = Dirt, 0.6, Shovel, 0.9, 0.45, 0.25, 0.15, 0.15, 0.1, -, -
+LilyPad = LilyPad, 0, -, 0.05, -, -, -, -, -, -, -
+Sponge = Sponge, 0.6, -, 0.9, -, -, -, -, -, -, -
+WetSponge = Sponge, 0.6, -, 0.9, -, -, -, -, -, -, -
+BrewingStand = BrewingStand, 0.5, WoodenPickaxe, 2.5, 0.4, 0.2, 0.15, 0.1, 0.1, -, -
+* Button = -, 0.5, -, 0.75, -, -, -, -, -, -, -
+Cake = -, 0.5, -, 0.75, -, -, -, -, -, -, -
+CoarseDirt = Dirt, 0.5, Shovel, 0.75, 0.4, 0.2, 0.15, 0.1, 0.1, -, -
+ConcretePowder = ConcretePowder, 0.5, Shovel, 0.75, 0.4, 0.2, 0.15, 0.1, 0.1, -, -
+Dirt = Dirt, 0.5, Shovel, 0.75, 0.4, 0.2, 0.15, 0.1, 0.1, -, -
+FrostedIce = -, 0.5, -, 2.5, -, -, -, -, -, -, -
+HayBale = HayBale, 0.5, -, 0.75, -, -, -, -, -, -, -
+Ice = -, 0.5, Pickaxe, 0.75, 0.4, 0.2, 0.15, 0.1, 0.1, -, -
+Lever = Lever, 0.5, -, 0.75, -, -, -, -, -, -, -
+MagmaBlock = MagmaBlock, 0.5, WoodenPickaxe, 2.5, 0.4, 0.2, 0.15, 0.1, 0.1, -, -
+PackedIce = -, 0.5, Pickaxe, 0.75, 0.4, 0.2, 0.15, 0.1, 0.1, -, -
+FrostedIce = -, 0.5, Pickaxe, 0.75, 0.4, 0.2, 0.15, 0.1, 0.1, -, -
+Piston = Piston, 0.5, -, 0.75, -, -, -, -, -, -, -
+Sand = Sand, 0.5, Shovel, 0.75, 0.4, 0.2, 0.15, 0.1, 0.1, -, -
+SoulSand = SoulSand, 0.5, Shovel, 0.75, 0.4, 0.2, 0.15, 0.1, 0.1, -, -
+StonePressurePlate = StonePressurePlate, 0.5, WoodenPickaxe, 2.5, 0.4, 0.2, 0.15, 0.1, 0.1, -, -
+* WeightedPressurePlate = -, 0.5, WoodenPickaxe, 2.5, 0.4, 0.2, 0.15, 0.1, 0.1, -, -
+WoodenPressurePlate = WoodenPressurePlate, 0.5, Axe, 0.75, 0.4, 0.2, 0.15, 0.1, 0.1, -, -
+Cactus = Cactus, 0.4, -, 0.65, -, -, -, -, -, -, -
+Ladder = Ladder, 0.4, Axe, 0.65, 0.35, 0.2, 0.1, 0.1, 0.05, -, -
+Netherrack = Netherrack, 0.4, WoodenPickaxe, 2, 0.35, 0.2, 0.1, 0.1, 0.05, -, -
+Glass = -, 0.3, -, 0.45, -, -, -, -, -, -, -
+GlassPane = -, 0.3, -, 0.45, -, -, -, -, -, -, -
+Glowstone = Glowstone, 0.3, -, 0.45, -, -, -, -, -, -, -
+RedstoneLamp = RedstoneLampInactive, 0.3, -, 0.45, -, -, -, -, -, -, -
+* SeaLantern = Prismarine, 0.3, -, 0.45, -, -, -, -, -, -, -
+StainedGlass = -, 0.3, -, 0.45, -, -, -, -, -, -, -
+StainedGlassPane = -, 0.3, -, 0.45, -, -, -, -, -, -, -
+Bed = Bed, 0.2, -, 0.35, -, -, -, -, -, -, -
+Cocoa = Cocoa, 0.2, Axe, 0.35, 0.2, 0.1, 0.05, 0.05, 0.05, -, 0.2
+DaylightSensor = DaylightSensor, 0.2, Axe, 0.35, 0.2, 0.1, 0.05, 0.05, 0.05, -, -
+* HugeMushrooms = -, 0.2, Axe, 0.35, 0.2, 0.1, 0.05, 0.05, 0.05, -, -
+* Leaves = -, 0.2, -, 0.35, -, -, -, -, -, 0.05, 0.2
+Snow = Snow, 0.2, WoodenShovel, 1, 0.2, 0.1, 0.05, 0.05, 0.05, -, -
+Vines = Vines, 0.2, Axe, 0.35, 0.2, 0.1, 0.05, 0.05, 0.05, 0.35, 0.2
+Carpet = Carpet, 0.1, -, 0.2, -, -, -, -, -, -, -
+SnowLayer = Snow, 0.1, WoodenShovel, 0.5, 0.1, 0.05, 0.05, 0.05, 0.05, -, -
+Air = -, 0, -, Infinity, -, -, -, -, -, -, -
+* Carrots = Carrot, 0, -, 0.05, -, -, -, -, -, -, -
+* DeadBush = -, 0, -, 0.05, -, -, -, -, -, 0.05, -
+Fire = -, 0, -, 0.05, -, -, -, -, -, -, -
+FlowerPot = FlowerPot, 0, -, 0.05, -, -, -, -, -, -, -
+* Flowers = -, 0, -, 0.05, -, -, -, -, -, -, -
+* Grass = -, 0, -, 0.05, -, -, -, -, -, 0.05, -
+* MelonStem = -, 0, -, 0.05, -, -, -, -, -, -, -
+* Mushrooms = -, 0, -, 0.05, -, -, -, -, -, -, -
+* NetherWart = -, 0, -, 0.05, -, -, -, -, -, -, -
+* Potatoes = Potato, 0, -, 0.05, -, -, -, -, -, -, -
+* PumpkinStem = -, 0, -, 0.05, -, -, -, -, -, -, -
+RedstoneComparator = RedstoneComparator, 0, -, 0.05, -, -, -, -, -, -, -
+RedstoneRepeater = RedstoneRepeaterInactive, 0, -, 0.05, -, -, -, -, -, -, -
+RedstoneTorch = RedstoneTorchInactive, 0, -, 0.05, -, -, -, -, -, -, -
+* RedstoneWire = -, 0, -, 0.05, -, -, -, -, -, -, -
+Saplings = Sapling, 0, -, 0.05, -, -, -, -, -, -, -
+SlimeBlock = SlimeBlock, 0, -, 0.05, -, -, -, -, -, -, -
+SugarCane = SugarCane, 0, -, 0.05, -, -, -, -, -, -, -
+Tnt = TNT, 0, -, 0.05, -, -, -, -, -, -, -
+Torch = Torch, 0, -, 0.05, -, -, -, -, -, -, -
+* Tripwire = -, 0, -, 0.05, -, -, -, -, -, -, -
+TripwireHook = TripwireHook, 0, -, 0.05, -, -, -, -, -, -, -
+* Wheat = -, 0, -, 0.05, -, -, -, -, -, -, -
\ No newline at end of file
diff --git a/data/furnace.txt b/data/furnace.txt
index 67cf5e62..d9a1ebfa 100644
--- a/data/furnace.txt
+++ b/data/furnace.txt
@@ -53,16 +53,16 @@
#ChainmailLeggings = IronNugget
#Chicken = CookedChicken
#ChorusFruit = PoppedChorusFruit
-#Clay = Brick
+Clay = Brick
#ClayBlock = HardenedClay
-#CoalOre = Coal
+CoalOre = Coal
#Cobblestone = Stone
#CrackedStonebrick = Stonebrick
#CyanTerracotta = CyanGlazedTerracotta
#DiamondOre = Diamond
#EmeraldOre = Emerald
#Fish = CookedFish
-#GoldOre = GoldIngot
+GoldOre = GoldIngot
#GoldAxe = GoldNugget
#GoldBoots = GoldNugget
#GoldChestplate = GoldNugget
@@ -75,7 +75,7 @@
#GoldSword = GoldNugget
#GrayTerracotta = GrayGlazedTerracotta
#GreenTerracotta = GreenGlazedTerracotta
-#IronOre = IronIngot
+IronOre = IronIngot
#IronAxe = IronNugget
#IronBoots = IronNugget
#IronChestplate = IronNugget
@@ -105,7 +105,7 @@ Wood2^-1 = Coal^Charcoal
#RedTerracotta = RedGlazedTerracotta
#RedstoneOre = Redstone
#Salmon = CookedSalmon
-#Sand = Glass
+Sand = Glass
#StoneBrick = CrackedStoneBricks
#WetSponge = Sponge
#WhiteTerracotta = WhiteGlazedTerracotta
diff --git a/src/Common/Engine/Component.cs b/src/Common/Engine/Component.cs
index b7efd868..8c467fe8 100644
--- a/src/Common/Engine/Component.cs
+++ b/src/Common/Engine/Component.cs
@@ -12,19 +12,9 @@ namespace MineCase.Engine
{
internal interface IComponentIntern
{
-#if ECS_SERVER
- Task
-#else
- void
-#endif
- Attach(DependencyObject dependencyObject, ServiceProviderType serviceProvider);
+ void Attach(DependencyObject dependencyObject, ServiceProviderType serviceProvider);
-#if ECS_SERVER
- Task
-#else
- void
-#endif
- Detach();
+ void Detach();
int GetMessageOrder(object message);
}
@@ -58,61 +48,34 @@ public Component(string name)
Name = name;
}
-#if ECS_SERVER
- Task
-#else
- void
-#endif
- IComponentIntern.Attach(DependencyObject dependencyObject, ServiceProviderType serviceProvider)
+ void IComponentIntern.Attach(DependencyObject dependencyObject, ServiceProviderType serviceProvider)
{
AttachedObject = dependencyObject;
ServiceProvider = serviceProvider;
AttatchPartial(dependencyObject, serviceProvider);
-#if ECS_SERVER
- return
-#endif
OnAttached();
}
partial void AttatchPartial(DependencyObject dependencyObject, ServiceProviderType serviceProvider);
-#if ECS_SERVER
- Task
-#else
- void
-#endif
- IComponentIntern.Detach()
+ void IComponentIntern.Detach()
{
- AttachedObject = null;
-#if ECS_SERVER
- return
-#endif
OnDetached();
+ AttachedObject = null;
}
///
/// 组件被附加到实体时
///
- protected virtual
-
-#if ECS_SERVER
- Task
-#else
- void
-#endif
- OnAttached()
+ protected virtual void OnAttached()
{
-#if ECS_SERVER
- return Task.CompletedTask;
-#endif
}
///
/// 组件从实体卸载时
///
- protected virtual Task OnDetached()
+ protected virtual void OnDetached()
{
- return Task.CompletedTask;
}
///
diff --git a/src/Common/Engine/Data/DependencyValueStorage.cs b/src/Common/Engine/Data/DependencyValueStorage.cs
index e0c96203..6188bfb5 100644
--- a/src/Common/Engine/Data/DependencyValueStorage.cs
+++ b/src/Common/Engine/Data/DependencyValueStorage.cs
@@ -27,13 +27,7 @@ public IEnumerable Keys
public bool IsDirty { get; set; }
- public event
-#if ECS_SERVER
- AsyncEventHandler
-#else
- EventHandler
-#endif
- CurrentValueChanged;
+ public event EventHandler CurrentValueChanged;
public DependencyValueStorage()
{
@@ -54,12 +48,7 @@ public DependencyValueStorage(Dictionary AddOrUpdate(IDependencyValueProvider provider, DependencyProperty key, Func> addValueFactory, Func, Task>> updateValueFactory)
-#else
- IEffectiveValue AddOrUpdate(IDependencyValueProvider provider, DependencyProperty key, Func> addValueFactory, Func, IEffectiveValue> updateValueFactory)
-#endif
+ public IEffectiveValue AddOrUpdate(IDependencyValueProvider provider, DependencyProperty key, Func> addValueFactory, Func, IEffectiveValue> updateValueFactory)
{
var storage = GetStorage(provider, key);
var priority = provider.Priority;
@@ -70,43 +59,30 @@ IEffectiveValue AddOrUpdate(IDependencyValueProvider provider, DependencyProp
var value = addValueFactory(key);
storage.Add(priority, value);
value.ValueChanged = (s, e) => OnEffectiveValueChanged(priority, key, e.OldValue, e.NewValue);
+ IsDirty = true;
result = value;
var raiseChanged = storage.IndexOfKey(priority) == 0;
if (raiseChanged)
- {
-#if ECS_SERVER
- await
-#endif
OnCurrentValueChanged(key, false, null, true, value.Value);
- }
}
else
{
var oldValue = (IEffectiveValue)storage.Values[oldIdx];
- var newValue =
-#if ECS_SERVER
- await
-#endif
- updateValueFactory(key, oldValue);
+ var newValue = updateValueFactory(key, oldValue);
if (oldValue != newValue)
{
oldValue.ValueChanged = null;
newValue.ValueChanged = (s, e) => OnEffectiveValueChanged(priority, key, e.OldValue, e.NewValue);
storage[priority] = newValue;
+ IsDirty = true;
var raiseChanged = oldIdx == 0;
if (raiseChanged)
- {
-#if ECS_SERVER
- await
-#endif
OnCurrentValueChanged(key, true, oldValue.Value, true, newValue.Value);
- }
}
result = newValue;
}
- IsDirty = true;
return result;
}
@@ -149,28 +125,12 @@ public bool TryGetCurrentEffectiveValue(DependencyProperty key, out IEffectiveVa
return false;
}
- private
-#if ECS_SERVER
- Task
-#else
- void
-#endif
- OnCurrentValueChanged(DependencyProperty key, bool hasOldValue, object oldValue, bool hasNewValue, object newValue)
+ private void OnCurrentValueChanged(DependencyProperty key, bool hasOldValue, object oldValue, bool hasNewValue, object newValue)
{
- IsDirty = true;
-#if ECS_SERVER
- return
-#endif
CurrentValueChanged.InvokeSerial(this, new CurrentValueChangedEventArgs(key, hasOldValue, oldValue, hasNewValue, newValue));
}
- private
-#if ECS_SERVER
- Task
-#else
- void
-#endif
- OnEffectiveValueCleared(int index, DependencyProperty key, object oldValue)
+ private void OnEffectiveValueCleared(int index, DependencyProperty key, object oldValue)
{
IsDirty = true;
if (index == 0)
@@ -184,37 +144,18 @@ public bool TryGetCurrentEffectiveValue(DependencyProperty key, out IEffectiveVa
newValue = ((dynamic)list.Values[0]).Value;
}
-#if ECS_SERVER
- return
-#endif
OnCurrentValueChanged(key, true, oldValue, hasNewValue, newValue);
}
-
-#if ECS_SERVER
- return Task.CompletedTask;
-#endif
}
- private
-#if ECS_SERVER
- Task
-#else
- void
-#endif
- OnEffectiveValueChanged(float priority, DependencyProperty key, object oldValue, object newValue)
+ private void OnEffectiveValueChanged(float priority, DependencyProperty key, object oldValue, object newValue)
{
IsDirty = true;
SortedList list;
if (_dict.TryGetValue(key, out list) && list.IndexOfKey(priority) == 0)
{
-#if ECS_SERVER
- return
-#endif
OnCurrentValueChanged(key, true, oldValue, true, newValue);
}
-#if ECS_SERVER
- return Task.CompletedTask;
-#endif
}
public bool TryGetValue(IDependencyValueProvider provider, DependencyProperty key, out IEffectiveValue value)
@@ -231,13 +172,7 @@ public bool TryGetValue(IDependencyValueProvider provider, DependencyProperty
return false;
}
- public
-#if ECS_SERVER
- Task
-#else
- bool
-#endif
- TryRemove(IDependencyValueProvider provider, DependencyProperty key, out IEffectiveValue value)
+ public bool TryRemove(IDependencyValueProvider provider, DependencyProperty key, out IEffectiveValue value)
{
var storage = GetStorage(provider, key);
var priority = provider.Priority;
@@ -247,21 +182,12 @@ public bool TryGetValue(IDependencyValueProvider provider, DependencyProperty
value = (IEffectiveValue)eValue;
var index = storage.IndexOfKey(priority);
storage.RemoveAt(index);
-#if ECS_SERVER
- return OnEffectiveValueCleared(index, key, value.Value)
- .ContinueWith(t => true);
-#else
OnEffectiveValueCleared(index, key, value.Value);
return true;
-#endif
}
value = null;
-#if ECS_SERVER
- return Task.FromResult(false);
-#else
return false;
-#endif
}
private SortedList GetStorage(IDependencyValueProvider provider, DependencyProperty key)
diff --git a/src/Common/Engine/Data/IDependencyValueStorage.cs b/src/Common/Engine/Data/IDependencyValueStorage.cs
index 26e1f72f..39dafae7 100644
--- a/src/Common/Engine/Data/IDependencyValueStorage.cs
+++ b/src/Common/Engine/Data/IDependencyValueStorage.cs
@@ -18,13 +18,7 @@ public interface IDependencyValueStorage
///
/// 当前值变更事件
///
- event
-#if ECS_SERVER
- AsyncEventHandler
-#else
- EventHandler
-#endif
- CurrentValueChanged;
+ event EventHandler CurrentValueChanged;
///
/// 添加或更新
@@ -35,11 +29,7 @@ public interface IDependencyValueStorage
/// 添加工厂
/// 更新工厂
/// 新的值
-#if ECS_SERVER
- Task AddOrUpdate(IDependencyValueProvider provider, DependencyProperty key, Func> addValueFactory, Func, Task>> updateValueFactory);
-#else
IEffectiveValue AddOrUpdate(IDependencyValueProvider provider, DependencyProperty key, Func> addValueFactory, Func, IEffectiveValue> updateValueFactory);
-#endif
///
/// 尝试获取值
@@ -59,12 +49,7 @@ public interface IDependencyValueStorage
/// 依赖属性
/// 值
/// 是否成功删除
-#if ECS_SERVER
- Task
-#else
- bool
-#endif
- TryRemove(IDependencyValueProvider provider, DependencyProperty key, out IEffectiveValue value);
+ bool TryRemove(IDependencyValueProvider provider, DependencyProperty key, out IEffectiveValue value);
///
/// 尝试获取当前值
diff --git a/src/Common/Engine/Data/IEffectiveValue.cs b/src/Common/Engine/Data/IEffectiveValue.cs
index 00e534d3..ecf3a8c7 100644
--- a/src/Common/Engine/Data/IEffectiveValue.cs
+++ b/src/Common/Engine/Data/IEffectiveValue.cs
@@ -18,12 +18,7 @@ public interface IEffectiveValue
///
/// 获取值改变处理器
///
-#if ECS_SERVER
- AsyncEventHandler
-#else
- EventHandler
-#endif
- ValueChanged { set; }
+ EventHandler ValueChanged { set; }
}
///
@@ -46,12 +41,7 @@ public interface IEffectiveValue : IEffectiveValue
/// 设置值
///
/// 值
-#if ECS_SERVER
- Task
-#else
- void
-#endif
- SetValue(T value);
+ void SetValue(T value);
}
///
diff --git a/src/Common/Engine/Data/LocalDependencyValueExtensions.cs b/src/Common/Engine/Data/LocalDependencyValueExtensions.cs
index 995bd5c7..9ff92c19 100644
--- a/src/Common/Engine/Data/LocalDependencyValueExtensions.cs
+++ b/src/Common/Engine/Data/LocalDependencyValueExtensions.cs
@@ -31,17 +31,8 @@ public static bool TryGetLocalValue(this DependencyObject d, DependencyProper
/// 依赖对象
/// 依赖属性
/// 值
- public static
-#if ECS_SERVER
- Task
-#else
- void
-#endif
- SetLocalValue(this DependencyObject d, DependencyProperty property, T value)
+ public static void SetLocalValue(this DependencyObject d, DependencyProperty property, T value)
{
-#if ECS_SERVER
- return
-#endif
LocalDependencyValueProvider.Current.SetValue(property, d.ValueStorage, value);
}
@@ -51,17 +42,8 @@ public static
/// 值类型
/// 依赖对象
/// 依赖属性
- public static
-#if ECS_SERVER
- Task
-#else
- void
-#endif
- ClearLocalValue(this DependencyObject d, DependencyProperty property)
+ public static void ClearLocalValue(this DependencyObject d, DependencyProperty property)
{
-#if ECS_SERVER
- return
-#endif
LocalDependencyValueProvider.Current.ClearValue(property, d.ValueStorage);
}
}
diff --git a/src/Common/Engine/Data/LocalDependencyValueProvider.cs b/src/Common/Engine/Data/LocalDependencyValueProvider.cs
index f1c3652a..1bf81471 100644
--- a/src/Common/Engine/Data/LocalDependencyValueProvider.cs
+++ b/src/Common/Engine/Data/LocalDependencyValueProvider.cs
@@ -25,16 +25,6 @@ public class LocalDependencyValueProvider : IDependencyValueProvider
/// 依赖属性
/// 值存储
/// 值
-#if ECS_SERVER
- public Task SetValue(DependencyProperty property, IDependencyValueStorage storage, T value)
- {
- return storage.AddOrUpdate(this, property, o => new LocalEffectiveValue(value), async (k, o) =>
- {
- await ((LocalEffectiveValue)o).SetValue(value);
- return o;
- });
- }
-#else
public void SetValue(DependencyProperty property, IDependencyValueStorage storage, T value)
{
storage.AddOrUpdate(this, property, o => new LocalEffectiveValue(value), (k, o) =>
@@ -43,7 +33,6 @@ public void SetValue(DependencyProperty property, IDependencyValueStorage
return o;
});
}
-#endif
///
/// 尝试获取值
@@ -72,18 +61,9 @@ public bool TryGetValue(DependencyProperty property, IDependencyValueStora
/// 值类型
/// 依赖属性
/// 值存储
- public
-#if ECS_SERVER
- Task
-#else
- void
-#endif
- ClearValue(DependencyProperty property, IDependencyValueStorage storage)
+ public void ClearValue(DependencyProperty property, IDependencyValueStorage storage)
{
IEffectiveValue eValue;
-#if ECS_SERVER
- return
-#endif
storage.TryRemove(this, property, out eValue);
}
@@ -95,13 +75,7 @@ internal static IEffectiveValue FromValue(T value)
internal class LocalEffectiveValue : IEffectiveValue
{
///
- public
-#if ECS_SERVER
- AsyncEventHandler
-#else
- EventHandler
-#endif
- ValueChanged { get; set; }
+ public EventHandler ValueChanged { get; set; }
///
public bool CanSetValue => true;
@@ -119,19 +93,12 @@ public LocalEffectiveValue(T value)
}
///
-#if ECS_SERVER
- public async Task SetValue(T value)
-#else
public void SetValue(T value)
-#endif
{
if (!EqualityComparer.Default.Equals(_value, value))
{
var oldValue = _value;
_value = value;
-#if ECS_SERVER
- await
-#endif
ValueChanged.InvokeSerial(this, new EffectiveValueChangedEventArgs(oldValue, value));
}
}
diff --git a/src/Common/Engine/DependencyObject.cs b/src/Common/Engine/DependencyObject.cs
index 526646bd..1af69290 100644
--- a/src/Common/Engine/DependencyObject.cs
+++ b/src/Common/Engine/DependencyObject.cs
@@ -77,22 +77,13 @@ public T GetUnityComponent()
/// 设置组件
///
/// 组件
- public
-#if ECS_SERVER
- async Task
-#else
- void
-#endif
- SetComponent(Component component)
+ public void SetComponent(Component component)
{
var name = component.Name;
if (_components.TryGetValue(name, out var old))
{
if (old == component) return;
Unsubscribe(old);
-#if ECS_SERVER
- await
-#endif
old.Detach();
_indexes.Remove(old);
_components.Remove(name);
@@ -100,9 +91,6 @@ async Task
_components.Add(name, component);
_indexes.Add(component, _index++);
-#if ECS_SERVER
- await
-#endif
((IComponentIntern)component).Attach(this, ServiceProvider);
Subscribe(component);
}
@@ -111,22 +99,13 @@ async Task
/// 清除组件
///
/// 组件类型
- public
-#if ECS_SERVER
- async Task
-#else
- void
-#endif
- ClearComponent()
+ public void ClearComponent()
where T : Component
{
var components = _components.Where(o => o.Value is T);
foreach (var component in components)
{
Unsubscribe(component.Value);
-#if ECS_SERVER
- await
-#endif
component.Value.Detach();
_indexes.Remove(component.Value);
_components.Remove(component.Key);
@@ -142,8 +121,8 @@ async Task
///
public IDependencyValueStorage ValueStorage => _valueStorage;
- private readonly ConcurrentDictionary _propertyChangedHandlers = new ConcurrentDictionary();
- private readonly ConcurrentDictionary _propertyChangedHandlersGen = new ConcurrentDictionary();
+ private readonly Dictionary _propertyChangedHandlers = new Dictionary();
+ private readonly Dictionary _propertyChangedHandlersGen = new Dictionary();
private Delegate _anyPropertyChangedHandler;
///
@@ -167,46 +146,24 @@ public T GetValue(DependencyProperty property)
/// 值类型
/// 依赖属性
/// 值
- public
-#if ECS_SERVER
- Task
-#else
- void
-#endif
- SetCurrentValue(DependencyProperty property, T value)
+ public void SetCurrentValue(DependencyProperty property, T value)
{
IEffectiveValue eValue;
if (_valueStorage.TryGetCurrentEffectiveValue(property, out eValue) && eValue.CanSetValue)
{
-#if ECS_SERVER
- return
-#endif
eValue.SetValue(value);
}
else
{
-#if ECS_SERVER
- return
-#endif
this.SetLocalValue(property, value);
}
}
private static readonly MethodInfo _raisePropertyChangedHelper = typeof(DependencyObject).GetRuntimeMethods().Single(o => o.Name == nameof(RaisePropertyChangedHelper));
- private
-#if ECS_SERVER
- Task
-#else
- void
-#endif
- ValueStorage_CurrentValueChanged(object sender, CurrentValueChangedEventArgs e)
+ private void ValueStorage_CurrentValueChanged(object sender, CurrentValueChangedEventArgs e)
{
-#if ECS_SERVER
- return (Task)_raisePropertyChangedHelper.MakeGenericMethod(e.Property.PropertyType).Invoke(this, new object[] { e.Property, e });
-#else
_raisePropertyChangedHelper.MakeGenericMethod(e.Property.PropertyType).Invoke(this, new object[] { e.Property, e });
-#endif
}
///
@@ -215,16 +172,13 @@ public T GetValue(DependencyProperty property)
/// 值类型
/// 依赖属性
/// 处理器
- public void RegisterPropertyChangedHandler(
- DependencyProperty property,
-#if ECS_SERVER
- AsyncEventHandler>
-#else
- EventHandler>
-#endif
- handler)
+ public void RegisterPropertyChangedHandler(DependencyProperty property, EventHandler> handler)
{
- _propertyChangedHandlers.AddOrUpdate(property, handler, (k, old) => Delegate.Combine(old, handler));
+ if (_propertyChangedHandlers.TryGetValue(property, out var newHandler))
+ newHandler = Delegate.Combine(newHandler, handler);
+ else
+ newHandler = handler;
+ _propertyChangedHandlers[property] = newHandler;
}
///
@@ -233,19 +187,15 @@ public void RegisterPropertyChangedHandler(
/// 值类型
/// 依赖属性
/// 处理器
- public void RemovePropertyChangedHandler(
- DependencyProperty property,
-#if ECS_SERVER
- AsyncEventHandler>
-#else
- EventHandler>
-#endif
- handler)
+ public void RemovePropertyChangedHandler(DependencyProperty property, EventHandler> handler)
{
- Delegate d = null;
- _propertyChangedHandlers.TryRemove(property, out d);
- if (d != (Delegate)handler)
- _propertyChangedHandlers.AddOrUpdate(property, k => Delegate.Remove(d, handler), (k, old) => Delegate.Combine(old, Delegate.Remove(d, handler)));
+ if (_propertyChangedHandlers.TryGetValue(property, out var newHandler))
+ newHandler = Delegate.Remove(newHandler, handler);
+
+ if (newHandler == null)
+ _propertyChangedHandlers.Remove(property);
+ else
+ _propertyChangedHandlers[property] = newHandler;
}
///
@@ -253,16 +203,13 @@ public void RemovePropertyChangedHandler(
///
/// 依赖属性
/// 处理器
- public void RegisterPropertyChangedHandler(
- DependencyProperty property,
-#if ECS_SERVER
- AsyncEventHandler
-#else
- EventHandler
-#endif
- handler)
+ public void RegisterPropertyChangedHandler(DependencyProperty property, EventHandler handler)
{
- _propertyChangedHandlersGen.AddOrUpdate(property, handler, (k, old) => Delegate.Combine(old, handler));
+ if (_propertyChangedHandlersGen.TryGetValue(property, out var newHandler))
+ newHandler = Delegate.Combine(newHandler, handler);
+ else
+ newHandler = handler;
+ _propertyChangedHandlersGen[property] = newHandler;
}
///
@@ -270,32 +217,22 @@ public void RegisterPropertyChangedHandler(
///
/// 依赖属性
/// 处理器
- public void RemovePropertyChangedHandler(
- DependencyProperty property,
-#if ECS_SERVER
- AsyncEventHandler
-#else
- EventHandler
-#endif
- handler)
+ public void RemovePropertyChangedHandler(DependencyProperty property, EventHandler handler)
{
- Delegate d = null;
- _propertyChangedHandlersGen.TryRemove(property, out d);
- if (d != (Delegate)handler)
- _propertyChangedHandlersGen.AddOrUpdate(property, k => Delegate.Remove(d, handler), (k, old) => Delegate.Combine(old, Delegate.Remove(d, handler)));
+ if (_propertyChangedHandlersGen.TryGetValue(property, out var newHandler))
+ newHandler = Delegate.Remove(newHandler, handler);
+
+ if (newHandler == null)
+ _propertyChangedHandlersGen.Remove(property);
+ else
+ _propertyChangedHandlersGen[property] = newHandler;
}
///
/// 注册任意属性变更处理器
///
/// 处理器
- public void RegisterAnyPropertyChangedHandler(
-#if ECS_SERVER
- AsyncEventHandler
-#else
- EventHandler
-#endif
- handler)
+ public void RegisterAnyPropertyChangedHandler(EventHandler handler)
{
_anyPropertyChangedHandler = Delegate.Combine(_anyPropertyChangedHandler, handler);
}
@@ -304,24 +241,12 @@ public void RegisterAnyPropertyChangedHandler(
/// 删除任意属性变更处理器
///
/// 处理器
- public void RemoveAnyPropertyChangedHandler(
-#if ECS_SERVER
- AsyncEventHandler
-#else
- EventHandler
-#endif
- handler)
+ public void RemoveAnyPropertyChangedHandler(EventHandler handler)
{
_anyPropertyChangedHandler = Delegate.Remove(_anyPropertyChangedHandler, handler);
}
- internal
-#if ECS_SERVER
- async Task
-#else
- void
-#endif
- RaisePropertyChangedHelper(DependencyProperty property, CurrentValueChangedEventArgs e)
+ internal void RaisePropertyChangedHelper(DependencyProperty property, CurrentValueChangedEventArgs e)
{
var oldValue = e.HasOldValue ? (T)e.OldValue : GetDefaultValue(property);
var newValue = e.HasNewValue ? (T)e.NewValue : GetDefaultValue(property);
@@ -330,17 +255,8 @@ async Task
return;
var args = new PropertyChangedEventArgs(property, oldValue, newValue);
-#if ECS_SERVER
- await
-#endif
property.RaisePropertyChanged(_realType, this, args);
-#if ECS_SERVER
- await
-#endif
InvokeLocalPropertyChangedHandlers(args);
-#if ECS_SERVER
- await
-#endif
OnDependencyPropertyChanged(args);
}
@@ -349,29 +265,10 @@ async Task
///
/// 值类型
/// 参数
-#if ECS_SERVER
- public virtual Task OnDependencyPropertyChanged(PropertyChangedEventArgs args)
- {
- return Task.CompletedTask;
- }
-#else
public virtual void OnDependencyPropertyChanged(PropertyChangedEventArgs args)
{
}
-#endif
-#if ECS_SERVER
- private async Task InvokeLocalPropertyChangedHandlers(PropertyChangedEventArgs e)
- {
- Delegate d;
- if (_propertyChangedHandlers.TryGetValue(e.Property, out d))
- await ((AsyncEventHandler>)d).InvokeSerial(this, e);
-
- if (_propertyChangedHandlersGen.TryGetValue(e.Property, out d))
- await ((AsyncEventHandler)d).InvokeSerial(this, e);
- await ((AsyncEventHandler)_anyPropertyChangedHandler).InvokeSerial(this, e);
- }
-#else
private void InvokeLocalPropertyChangedHandlers(PropertyChangedEventArgs e)
{
Delegate d;
@@ -382,7 +279,6 @@ private void InvokeLocalPropertyChangedHandlers(PropertyChangedEventArgs e
((EventHandler)d).InvokeSerial(this, e);
((EventHandler)_anyPropertyChangedHandler).InvokeSerial(this, e);
}
-#endif
private T GetDefaultValue(DependencyProperty property)
{
diff --git a/src/Common/Engine/DependencyProperty.cs b/src/Common/Engine/DependencyProperty.cs
index 7bfc92a3..ab48c475 100644
--- a/src/Common/Engine/DependencyProperty.cs
+++ b/src/Common/Engine/DependencyProperty.cs
@@ -334,17 +334,8 @@ public bool TryGetDefaultValue(DependencyObject d, Type type, out T value)
return GetMetadata(type).TryGetDefaultValue(d, this, out value);
}
- internal
-#if ECS_SERVER
- Task
-#else
- void
-#endif
- RaisePropertyChanged(Type type, object sender, PropertyChangedEventArgs e)
+ internal void RaisePropertyChanged(Type type, object sender, PropertyChangedEventArgs e)
{
-#if ECS_SERVER
- return
-#endif
GetMetadata(type).RaisePropertyChanged(sender, e);
}
diff --git a/src/Common/Engine/PropertyMetadata.cs b/src/Common/Engine/PropertyMetadata.cs
index af198c94..7ff68ca1 100644
--- a/src/Common/Engine/PropertyMetadata.cs
+++ b/src/Common/Engine/PropertyMetadata.cs
@@ -27,27 +27,14 @@ public class PropertyMetadata
///
/// 属性更改事件
///
- public event
-#if ECS_SERVER
- AsyncEventHandler>
-#else
- EventHandler>
-#endif
- PropertyChanged;
+ public event EventHandler> PropertyChanged;
///
/// Initializes a new instance of the class.
///
/// 默认值
/// 属性更改处理器
- public PropertyMetadata(
- T defaultValue,
-#if ECS_SERVER
- AsyncEventHandler>
-#else
- EventHandler>
-#endif
- propertyChangedHandler = null)
+ public PropertyMetadata(T defaultValue, EventHandler> propertyChangedHandler = null)
{
_defaultValue = defaultValue;
_defaultValueSet = true;
@@ -60,14 +47,7 @@ public PropertyMetadata(
///
/// 未设置默认值
/// 属性更改处理器
- public PropertyMetadata(
- DependencyProperty.UnsetValueType unsetValue,
-#if ECS_SERVER
- AsyncEventHandler>
-#else
- EventHandler>
-#endif
- propertyChangedHandler = null)
+ public PropertyMetadata(DependencyProperty.UnsetValueType unsetValue, EventHandler> propertyChangedHandler = null)
{
_defaultValueSet = false;
if (propertyChangedHandler != null)
@@ -107,35 +87,20 @@ protected virtual bool TryGetDefaultValueOverride(DependencyObject d, Dependency
return false;
}
-#if ECS_SERVER
- internal async Task RaisePropertyChanged(object sender, PropertyChangedEventArgs e)
- {
- await OnPropertyChanged(sender, e);
- await PropertyChanged.InvokeSerial(sender, e);
- }
-#else
internal void RaisePropertyChanged(object sender, PropertyChangedEventArgs e)
{
OnPropertyChanged(sender, e);
PropertyChanged.InvokeSerial(sender, e);
}
-#endif
///
/// 当属性修改时
///
/// 发送方
/// 参数
-#if ECS_SERVER
- protected virtual Task OnPropertyChanged(object sender, PropertyChangedEventArgs e)
- {
- return Task.CompletedTask;
- }
-#else
protected virtual void OnPropertyChanged(object sender, PropertyChangedEventArgs e)
{
}
-#endif
///
/// 合并属性元数据
@@ -155,13 +120,7 @@ internal void Merge(PropertyMetadata old, bool ownerIsDerived)
if (ownerIsDerived)
{
- PropertyChanged =
-#if ECS_SERVER
- (AsyncEventHandler>
-#else
- (EventHandler>
-#endif
-)Delegate.Combine(old.PropertyChanged, PropertyChanged);
+ PropertyChanged = (EventHandler>)Delegate.Combine(old.PropertyChanged, PropertyChanged);
}
MergeOverride(old);
diff --git a/src/MineCase.Algorithm/DropBlockMappingMatcher.cs b/src/MineCase.Algorithm/DropBlockMappingMatcher.cs
new file mode 100644
index 00000000..bf58fe76
--- /dev/null
+++ b/src/MineCase.Algorithm/DropBlockMappingMatcher.cs
@@ -0,0 +1,38 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace MineCase.Algorithm
+{
+ public class DropBlockMappingMatcher
+ {
+ private Dictionary _mapping;
+
+ public DropBlockMappingMatcher(Dictionary mapping)
+ {
+ _mapping = mapping;
+ }
+
+ public uint DropBlock(uint item, BlockState block)
+ {
+ if (_mapping.ContainsKey(block))
+ {
+ DropBlockEntry entry = _mapping[block];
+
+ if (DropBlockMappingLoader.ItemsToTools(entry.Tool) == DropBlockMappingLoader.ItemsToTools(new ItemState { Id = item })
+ && DropBlockMappingLoader.ItemsToToolMaterial(new ItemState { Id = item }) >= DropBlockMappingLoader.ItemsToToolMaterial(entry.Tool))
+ {
+ return entry.DroppedBlock.Id;
+ }
+ else
+ {
+ return uint.MaxValue;
+ }
+ }
+ else
+ {
+ return block.Id;
+ }
+ }
+ }
+}
diff --git a/src/MineCase.Algorithm/Game/Entity/Ai/MobAi/CreatureAi.cs b/src/MineCase.Algorithm/Game/Entity/Ai/MobAi/CreatureAi.cs
index b8b342ae..7d401edc 100644
--- a/src/MineCase.Algorithm/Game/Entity/Ai/MobAi/CreatureAi.cs
+++ b/src/MineCase.Algorithm/Game/Entity/Ai/MobAi/CreatureAi.cs
@@ -22,8 +22,8 @@ public CreatureAi(Func getter, Action setter)
_stateMachine = stateMachine;
}
- public Task FireAsync(CreatureEvent @event) =>
- _stateMachine.FireAsync(@event);
+ public void Fire(CreatureEvent @event) =>
+ _stateMachine.Fire(@event);
protected abstract void Configure(StateMachine stateMachine);
}
diff --git a/src/MineCase.Core/CraftingRecipeLoader.cs b/src/MineCase.Core/CraftingRecipeLoader.cs
index 9e522051..302b49b2 100644
--- a/src/MineCase.Core/CraftingRecipeLoader.cs
+++ b/src/MineCase.Core/CraftingRecipeLoader.cs
@@ -60,29 +60,31 @@ private unsafe void ParseLine(string line)
recipe.Output.ItemCount = byte.Parse(ToString(resultSpan.Slice(resultSplitter + 1)));
}
+ var recipeSlots = new List();
var restSpan = ingredientsSpan;
while (!restSpan.IsEmpty)
{
var ingredientSplitter = restSpan.IndexOf('|');
var ingredientSpan = ingredientSplitter == -1 ? restSpan : restSpan.Slice(0, ingredientSplitter);
- ParseIngredient(ingredientSpan, recipe);
+ ParseIngredient(ingredientSpan, recipeSlots);
if (ingredientSplitter == -1)
break;
else
restSpan = restSpan.Slice(ingredientSplitter + 1);
}
+ recipe.Inputs = recipeSlots.ToArray();
+ NormalizeIngredients(recipe);
Recipes.Add(recipe);
}
- private void ParseIngredient(Span ingredientSpan, CraftingRecipe recipe)
+ private void ParseIngredient(Span ingredientSpan, ICollection recipeSlots)
{
var slot = new Slot { ItemCount = 1 };
var splitter = ingredientSpan.IndexOf(',');
ParseItem(ingredientSpan.Slice(0, splitter), ref slot);
var distributionSpan = ingredientSpan.Slice(splitter + 1);
- var recipeSlots = new List();
do
{
var positionSplitter = distributionSpan.IndexOf(',');
@@ -130,8 +132,6 @@ int ParsePoint(ReadOnlySpan span)
distributionSpan = distributionSpan.Slice(positionSplitter + 1);
}
while (true);
- recipe.Inputs = recipeSlots.ToArray();
- NormalizeIngredients(recipe);
}
private void NormalizeIngredients(CraftingRecipe recipe)
diff --git a/src/MineCase.Core/DropBlockMappingLoader.cs b/src/MineCase.Core/DropBlockMappingLoader.cs
new file mode 100644
index 00000000..df6e6f12
--- /dev/null
+++ b/src/MineCase.Core/DropBlockMappingLoader.cs
@@ -0,0 +1,220 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Runtime.CompilerServices;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace MineCase
+{
+ public class DropBlockMappingLoader
+ {
+ public Dictionary Mapping { get; } = new Dictionary();
+
+ public async Task LoadMapping(StreamReader streamReader)
+ {
+ while (!streamReader.EndOfStream)
+ {
+ var line = await streamReader.ReadLineAsync();
+ ParseLine(line);
+ }
+ }
+
+ private unsafe void ParseLine(string line)
+ {
+ var lineSpan = line.AsSpan();
+ var commentIndex = lineSpan.IndexOf('#');
+ if (commentIndex != -1)
+ lineSpan = lineSpan.Slice(0, commentIndex);
+ if (lineSpan.IsEmpty) return;
+
+ char* buffer = stackalloc char[lineSpan.Length];
+ int bufLen = 0;
+
+ // 删除空格
+ {
+ for (int i = 0; i < lineSpan.Length; i++)
+ {
+ if (!char.IsWhiteSpace(lineSpan[i]))
+ buffer[bufLen++] = lineSpan[i];
+ }
+ }
+
+ var normLine = new Span(buffer, bufLen);
+ if (normLine.IsEmpty) return;
+ var splitter = normLine.IndexOf('=');
+
+ var resultSpan = normLine.Slice(0, splitter);
+ var ingredientsSpan = normLine.Slice(splitter + 1);
+
+ var entry = new DropBlockEntry();
+ var resultString = resultSpan.ToString();
+ string[] splittedItems = resultString.Split(',');
+
+ if (splittedItems.Length != 11)
+ throw new ArgumentOutOfRangeException(nameof(splittedItems));
+
+ Enum.TryParse(splittedItems[0], out BlockId droppedBlock);
+ entry.DroppedBlock = new BlockState { Id = (uint)droppedBlock };
+ entry.Hardness = float.Parse(splittedItems[1]);
+ Enum.TryParse(splittedItems[2], out ItemId tool);
+ entry.Tool = new ItemState { Id = (uint)tool };
+ entry.Hand = float.Parse(splittedItems[3]);
+ entry.Wooden = float.Parse(splittedItems[4]);
+ entry.Stone = float.Parse(splittedItems[5]);
+ entry.Iron = float.Parse(splittedItems[6]);
+ entry.Diamand = float.Parse(splittedItems[7]);
+ entry.Golden = float.Parse(splittedItems[8]);
+ entry.Shears = float.Parse(splittedItems[9]);
+ entry.Sword = float.Parse(splittedItems[10]);
+
+ Enum.TryParse(resultSpan.ToString(), out BlockId targetBlock);
+ Mapping.Add(new BlockState { Id = (uint)targetBlock }, entry);
+ }
+
+ public static Tools ItemsToTools(ItemState state)
+ {
+ if ((int)state.Id == -1)
+ {
+ return Tools.Hand;
+ }
+ else if (state.Id == (uint)ItemId.WoodenAxe ||
+ state.Id == (uint)ItemId.StoneAxe ||
+ state.Id == (uint)ItemId.IronAxe ||
+ state.Id == (uint)ItemId.GoldenAxe ||
+ state.Id == (uint)ItemId.DiamondAxe)
+ {
+ return Tools.Axes;
+ }
+ else if (state.Id == (uint)ItemId.WoodenHoe ||
+ state.Id == (uint)ItemId.StoneHoe ||
+ state.Id == (uint)ItemId.IronHoe ||
+ state.Id == (uint)ItemId.GoldenHoe ||
+ state.Id == (uint)ItemId.DiamondHoe)
+ {
+ return Tools.Hoes;
+ }
+ else if (state.Id == (uint)ItemId.WoodenPickaxe ||
+ state.Id == (uint)ItemId.StonePickaxe ||
+ state.Id == (uint)ItemId.IronPickaxe ||
+ state.Id == (uint)ItemId.GoldenPickaxe ||
+ state.Id == (uint)ItemId.DiamondPickaxe)
+ {
+ return Tools.PickAxes;
+ }
+ else if (state.Id == (uint)ItemId.WoodenShovel ||
+ state.Id == (uint)ItemId.StoneShovel ||
+ state.Id == (uint)ItemId.IronShovel ||
+ state.Id == (uint)ItemId.GoldenShovel ||
+ state.Id == (uint)ItemId.DiamondShovel)
+ {
+ return Tools.Shovels;
+ }
+ else if (state.Id == (uint)ItemId.WoodenSword ||
+ state.Id == (uint)ItemId.StoneSword ||
+ state.Id == (uint)ItemId.IronSword ||
+ state.Id == (uint)ItemId.GoldenSword ||
+ state.Id == (uint)ItemId.DiamondSword)
+ {
+ return Tools.Swords;
+ }
+ else
+ {
+ return Tools.Hand;
+ }
+ }
+
+ public static ToolMaterial ItemsToToolMaterial(ItemState state)
+ {
+ if ((int)state.Id == -1)
+ {
+ return ToolMaterial.Hand;
+ }
+ else if (state.Id == (uint)ItemId.WoodenAxe ||
+ state.Id == (uint)ItemId.WoodenHoe ||
+ state.Id == (uint)ItemId.WoodenPickaxe ||
+ state.Id == (uint)ItemId.WoodenShovel ||
+ state.Id == (uint)ItemId.WoodenSword)
+ {
+ return ToolMaterial.Wooden;
+ }
+ else if (state.Id == (uint)ItemId.StoneAxe ||
+ state.Id == (uint)ItemId.StoneHoe ||
+ state.Id == (uint)ItemId.StonePickaxe ||
+ state.Id == (uint)ItemId.StoneShovel ||
+ state.Id == (uint)ItemId.StoneSword)
+ {
+ return ToolMaterial.Stone;
+ }
+ else if (state.Id == (uint)ItemId.IronAxe ||
+ state.Id == (uint)ItemId.IronHoe ||
+ state.Id == (uint)ItemId.IronPickaxe ||
+ state.Id == (uint)ItemId.IronShovel ||
+ state.Id == (uint)ItemId.IronSword)
+ {
+ return ToolMaterial.Iron;
+ }
+ else if (state.Id == (uint)ItemId.GoldenAxe ||
+ state.Id == (uint)ItemId.GoldenHoe ||
+ state.Id == (uint)ItemId.GoldenPickaxe ||
+ state.Id == (uint)ItemId.GoldenShovel ||
+ state.Id == (uint)ItemId.GoldenSword)
+ {
+ return ToolMaterial.Golden;
+ }
+ else if (state.Id == (uint)ItemId.DiamondAxe ||
+ state.Id == (uint)ItemId.DiamondHoe ||
+ state.Id == (uint)ItemId.DiamondPickaxe ||
+ state.Id == (uint)ItemId.DiamondShovel ||
+ state.Id == (uint)ItemId.DiamondSword)
+ {
+ return ToolMaterial.Diamand;
+ }
+ else
+ {
+ return ToolMaterial.Hand;
+ }
+ }
+
+ private static unsafe string ToString(ReadOnlySpan span)
+ {
+ return new string((char*)Unsafe.AsPointer(ref span.DangerousGetPinnableReference()), 0, span.Length);
+ }
+ }
+
+ public enum Tools
+ {
+ Hand,
+ Axes,
+ PickAxes,
+ Shovels,
+ Hoes,
+ Swords
+ }
+
+ public enum ToolMaterial
+ {
+ Hand,
+ Wooden,
+ Stone,
+ Iron,
+ Diamand,
+ Golden
+ }
+
+ public class DropBlockEntry
+ {
+ public BlockState TargetBlock;
+ public BlockState DroppedBlock;
+ public float Hardness;
+ public ItemState Tool;
+ public float Hand;
+ public float Wooden;
+ public float Stone;
+ public float Iron;
+ public float Diamand;
+ public float Golden;
+ public float Shears;
+ public float Sword;
+ }
+}
diff --git a/src/MineCase.Core/MineCase.Core.csproj b/src/MineCase.Core/MineCase.Core.csproj
index 55fbb0ef..37988cbc 100644
--- a/src/MineCase.Core/MineCase.Core.csproj
+++ b/src/MineCase.Core/MineCase.Core.csproj
@@ -38,6 +38,10 @@
+
+
+
+
diff --git a/src/MineCase.Core/World/GameTickArgs.cs b/src/MineCase.Core/World/GameTickArgs.cs
index a7000745..2ce1b9bc 100644
--- a/src/MineCase.Core/World/GameTickArgs.cs
+++ b/src/MineCase.Core/World/GameTickArgs.cs
@@ -4,6 +4,9 @@
namespace MineCase.World
{
+#if !NET46
+ [Orleans.Concurrency.Immutable]
+#endif
public sealed class GameTickArgs
{
public TimeSpan DeltaTime { get; set; }
diff --git a/src/MineCase.Engine/DependencyObject.Server.cs b/src/MineCase.Engine/DependencyObject.Server.cs
index b2616488..0f9b7546 100644
--- a/src/MineCase.Engine/DependencyObject.Server.cs
+++ b/src/MineCase.Engine/DependencyObject.Server.cs
@@ -5,6 +5,7 @@
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using MineCase.Engine.Serialization;
+using Orleans.Streams;
namespace MineCase.Engine
{
@@ -18,9 +19,9 @@ public partial class DependencyObject
public override async Task OnActivateAsync()
{
Logger = ServiceProvider.GetRequiredService().CreateLogger(GetType());
- await InitializePreLoadComponent();
+ InitializePreLoadComponent();
await ReadStateAsync();
- await InitializeComponents();
+ InitializeComponents();
}
public override async Task OnDeactivateAsync()
@@ -35,14 +36,12 @@ public void Destroy()
DeactivateOnIdle();
}
- protected virtual Task InitializeComponents()
+ protected virtual void InitializeComponents()
{
- return Task.CompletedTask;
}
- protected virtual Task InitializePreLoadComponent()
+ protected virtual void InitializePreLoadComponent()
{
- return Task.CompletedTask;
}
public async Task ReadStateAsync()
@@ -115,5 +114,15 @@ public async Task ClearOperationQueue()
await _operationQueue.Dequeue()();
}
}
+
+ public IAsyncStream GetStream(string providerName, Guid streamId, string streamNamespace)
+ {
+ return GetStreamProvider(providerName).GetStream(streamId, streamNamespace);
+ }
+
+ public new IDisposable RegisterTimer(Func