From 61310e6bbb0f409c3f26e63b9b74a362e5b1d356 Mon Sep 17 00:00:00 2001 From: Drew DeVault Date: Fri, 26 Jun 2015 17:56:07 -0600 Subject: [PATCH] Improve tool effectiveness subsystem --- TrueCraft.API/Logic/IBlockProvider.cs | 2 ++ TrueCraft.API/ToolMaterial.cs | 18 ++++++++++----- TrueCraft.API/ToolType.cs | 16 +++++++++++++ TrueCraft.API/TrueCraft.API.csproj | 1 + .../Logic/BlockProviderTest.cs | 5 +++- TrueCraft.Core/Logic/BlockProvider.cs | 23 ++++++++++++++++++- TrueCraft.Core/Logic/Blocks/CoalOreBlock.cs | 8 +++++++ TrueCraft.Core/Logic/Blocks/CobwebBlock.cs | 22 +++++++++++++----- TrueCraft.Core/Logic/Blocks/DiamondBlock.cs | 16 +++++++++++++ .../Logic/Blocks/DiamondOreBlock.cs | 16 +++++++++++++ TrueCraft.Core/Logic/Blocks/GoldBlock.cs | 16 +++++++++++++ TrueCraft.Core/Logic/Blocks/GoldOreBlock.cs | 17 ++++++++++++++ TrueCraft.Core/Logic/Blocks/IronBlock.cs | 16 +++++++++++++ TrueCraft.Core/Logic/Blocks/IronOreBlock.cs | 17 ++++++++++++++ .../Logic/Blocks/LapisLazuliBlock.cs | 16 +++++++++++++ .../Logic/Blocks/LapisLazuliOreBlock.cs | 16 +++++++++++++ TrueCraft.Core/Logic/Blocks/ObsidianBlock.cs | 17 ++++++++++++++ TrueCraft.Core/Logic/Blocks/SnowBlock.cs | 14 +++++++---- .../Logic}/ItemRepository.cs | 4 ++-- TrueCraft.Core/Logic/Items/AxeItem.cs | 8 +++++++ TrueCraft.Core/Logic/Items/HoeItem.cs | 8 +++++++ TrueCraft.Core/Logic/Items/PickaxeItem.cs | 8 +++++++ TrueCraft.Core/Logic/Items/ShovelItem.cs | 8 +++++++ TrueCraft.Core/Logic/Items/SwordItem.cs | 8 +++++++ TrueCraft.Core/Logic/Items/ToolItem.cs | 2 ++ TrueCraft.Core/TrueCraft.Core.csproj | 1 + TrueCraft/TrueCraft.csproj | 1 - 27 files changed, 282 insertions(+), 22 deletions(-) create mode 100644 TrueCraft.API/ToolType.cs rename {TrueCraft => TrueCraft.Core/Logic}/ItemRepository.cs (96%) diff --git a/TrueCraft.API/Logic/IBlockProvider.cs b/TrueCraft.API/Logic/IBlockProvider.cs index e09db25..bc33b88 100644 --- a/TrueCraft.API/Logic/IBlockProvider.cs +++ b/TrueCraft.API/Logic/IBlockProvider.cs @@ -16,6 +16,8 @@ namespace TrueCraft.API.Logic bool RenderOpaque { get; } byte LightModifier { get; } bool DiffuseSkyLight { get; } + ToolMaterial EffectiveToolMaterials { get; } + ToolType EffectiveTools { get; } string DisplayName { get; } BoundingBox? BoundingBox { get; } // NOTE: Will this eventually need to be metadata-aware? Tuple GetTextureMap(byte metadata); diff --git a/TrueCraft.API/ToolMaterial.cs b/TrueCraft.API/ToolMaterial.cs index 87a3587..91a8e66 100644 --- a/TrueCraft.API/ToolMaterial.cs +++ b/TrueCraft.API/ToolMaterial.cs @@ -8,36 +8,42 @@ namespace TrueCraft.API /// /// Enumerates the materials tools can be crafted from. /// + [Flags] public enum ToolMaterial { /// /// The tool is crafted from no material (special). /// - None, + None = 1, /// /// The tool is crafted from wood. /// - Wood, + Wood = 2, /// /// The tool is crafted from cobblestone. /// - Stone, + Stone = 4, /// /// The tool is crafted from iron ingots. /// - Iron, + Iron = 8, /// /// The tool is crafted from gold ingots. /// - Gold, + Gold = 16, /// /// The tool is crafted from diamonds. /// - Diamond + Diamond = 32, + + /// + /// Any tool material is valid in these circumstances. + /// + All = None | Wood | Stone | Iron | Gold | Diamond } } \ No newline at end of file diff --git a/TrueCraft.API/ToolType.cs b/TrueCraft.API/ToolType.cs new file mode 100644 index 0000000..835bcd5 --- /dev/null +++ b/TrueCraft.API/ToolType.cs @@ -0,0 +1,16 @@ +using System; + +namespace TrueCraft.API +{ + [Flags] + public enum ToolType + { + None = 1, + Pickaxe = 2, + Axe = 4, + Shovel = 8, + Hoe = 16, + Sword = 32, + All = None | Pickaxe | Axe | Shovel | Hoe | Sword + } +} \ No newline at end of file diff --git a/TrueCraft.API/TrueCraft.API.csproj b/TrueCraft.API/TrueCraft.API.csproj index 23df9ee..7d209d6 100644 --- a/TrueCraft.API/TrueCraft.API.csproj +++ b/TrueCraft.API/TrueCraft.API.csproj @@ -106,6 +106,7 @@ + diff --git a/TrueCraft.Core.Test/Logic/BlockProviderTest.cs b/TrueCraft.Core.Test/Logic/BlockProviderTest.cs index 6804b80..0decf27 100644 --- a/TrueCraft.Core.Test/Logic/BlockProviderTest.cs +++ b/TrueCraft.Core.Test/Logic/BlockProviderTest.cs @@ -31,6 +31,9 @@ namespace TrueCraft.Core.Test.Logic EntityManager = new Mock(); User = new Mock(); BlockRepository = new Mock(); + var itemRepository = new ItemRepository(); + BlockProvider.BlockRepository = BlockRepository.Object; + BlockProvider.ItemRepository = itemRepository; User.SetupGet(u => u.World).Returns(World.Object); User.SetupGet(u => u.Server).Returns(Server.Object); @@ -67,7 +70,7 @@ namespace TrueCraft.Core.Test.Logic EntityManager.Verify(m => m.SpawnEntity(It.Is(e => e.Item.ID == 10))); World.Verify(w => w.SetBlockID(Coordinates3D.Zero, 0)); - blockProvider.Protected().Setup("GetDrop", ItExpr.IsAny()) + blockProvider.Protected().Setup("GetDrop", ItExpr.IsAny(), ItExpr.IsAny()) .Returns(() => new[] { new ItemStack(12) }); blockProvider.Object.BlockMined(descriptor, BlockFace.PositiveY, World.Object, User.Object); EntityManager.Verify(m => m.SpawnEntity(It.Is(e => e.Item.ID == 12))); diff --git a/TrueCraft.Core/Logic/BlockProvider.cs b/TrueCraft.Core/Logic/BlockProvider.cs index 772f767..49e565c 100644 --- a/TrueCraft.Core/Logic/BlockProvider.cs +++ b/TrueCraft.Core/Logic/BlockProvider.cs @@ -44,7 +44,24 @@ namespace TrueCraft.Core.Logic public void GenerateDropEntity(BlockDescriptor descriptor, IWorld world, IMultiplayerServer server, ItemStack item) { var entityManager = server.GetEntityManagerForWorld(world); - var items = GetDrop(descriptor, item); + var items = new ItemStack[0]; + var type = ToolType.None; + var material = ToolMaterial.None; + var held = ItemRepository.GetItemProvider(item.ID); + + if (held is ToolItem) + { + var tool = held as ToolItem; + material = tool.Material; + type = tool.ToolType; + } + + if ((EffectiveTools & type) > 0) + { + if ((EffectiveToolMaterials & material) > 0) + items = GetDrop(descriptor, item); + } + foreach (var i in items) { if (i.Empty) continue; @@ -200,6 +217,10 @@ namespace TrueCraft.Core.Logic /// public virtual string DisplayName { get { return string.Empty; } } + public virtual ToolMaterial EffectiveToolMaterials { get { return ToolMaterial.All; } } + + public virtual ToolType EffectiveTools { get { return ToolType.All; } } + public virtual Tuple GetTextureMap(byte metadata) { return null; diff --git a/TrueCraft.Core/Logic/Blocks/CoalOreBlock.cs b/TrueCraft.Core/Logic/Blocks/CoalOreBlock.cs index a06d5b2..2847695 100644 --- a/TrueCraft.Core/Logic/Blocks/CoalOreBlock.cs +++ b/TrueCraft.Core/Logic/Blocks/CoalOreBlock.cs @@ -24,6 +24,14 @@ namespace TrueCraft.Core.Logic.Blocks return new Tuple(2, 2); } + public override ToolType EffectiveTools + { + get + { + return ToolType.Pickaxe; + } + } + protected override ItemStack[] GetDrop(BlockDescriptor descriptor, ItemStack item) { return new[] { new ItemStack(CoalItem.ItemID, 1, descriptor.Metadata) }; diff --git a/TrueCraft.Core/Logic/Blocks/CobwebBlock.cs b/TrueCraft.Core/Logic/Blocks/CobwebBlock.cs index 3153c98..1486059 100644 --- a/TrueCraft.Core/Logic/Blocks/CobwebBlock.cs +++ b/TrueCraft.Core/Logic/Blocks/CobwebBlock.cs @@ -19,7 +19,21 @@ namespace TrueCraft.Core.Logic.Blocks public override bool Opaque { get { return false; } } - //TODO: Mark this as a block that diffuses sun light. + public override bool DiffuseSkyLight + { + get + { + return true; + } + } + + public override ToolType EffectiveTools + { + get + { + return ToolType.Sword; + } + } public override string DisplayName { get { return "Cobweb"; } } @@ -30,11 +44,7 @@ namespace TrueCraft.Core.Logic.Blocks protected override ItemStack[] GetDrop(BlockDescriptor descriptor, ItemStack item) { - var provider = ItemRepository.GetItemProvider(item.ID); - if (provider is SwordItem) - return new[] { new ItemStack(StringItem.ItemID, 1, descriptor.Metadata) }; - else - return new ItemStack[0]; + return new[] { new ItemStack(StringItem.ItemID, 1, descriptor.Metadata) }; } } } \ No newline at end of file diff --git a/TrueCraft.Core/Logic/Blocks/DiamondBlock.cs b/TrueCraft.Core/Logic/Blocks/DiamondBlock.cs index c7686d0..11ff766 100644 --- a/TrueCraft.Core/Logic/Blocks/DiamondBlock.cs +++ b/TrueCraft.Core/Logic/Blocks/DiamondBlock.cs @@ -46,5 +46,21 @@ namespace TrueCraft.Core.Logic.Blocks { get { return false; } } + + public override ToolMaterial EffectiveToolMaterials + { + get + { + return ToolMaterial.Iron | ToolMaterial.Diamond; + } + } + + public override ToolType EffectiveTools + { + get + { + return ToolType.Pickaxe; + } + } } } \ No newline at end of file diff --git a/TrueCraft.Core/Logic/Blocks/DiamondOreBlock.cs b/TrueCraft.Core/Logic/Blocks/DiamondOreBlock.cs index f38af48..eee5af7 100644 --- a/TrueCraft.Core/Logic/Blocks/DiamondOreBlock.cs +++ b/TrueCraft.Core/Logic/Blocks/DiamondOreBlock.cs @@ -19,6 +19,22 @@ namespace TrueCraft.Core.Logic.Blocks public override string DisplayName { get { return "Diamond Ore"; } } + public override ToolMaterial EffectiveToolMaterials + { + get + { + return ToolMaterial.Iron | ToolMaterial.Diamond; + } + } + + public override ToolType EffectiveTools + { + get + { + return ToolType.Pickaxe; + } + } + public override Tuple GetTextureMap(byte metadata) { return new Tuple(2, 3); diff --git a/TrueCraft.Core/Logic/Blocks/GoldBlock.cs b/TrueCraft.Core/Logic/Blocks/GoldBlock.cs index dcbf7f7..767d0e2 100644 --- a/TrueCraft.Core/Logic/Blocks/GoldBlock.cs +++ b/TrueCraft.Core/Logic/Blocks/GoldBlock.cs @@ -46,5 +46,21 @@ namespace TrueCraft.Core.Logic.Blocks { get { return false; } } + + public override ToolMaterial EffectiveToolMaterials + { + get + { + return ToolMaterial.Iron | ToolMaterial.Diamond; + } + } + + public override ToolType EffectiveTools + { + get + { + return ToolType.Pickaxe; + } + } } } \ No newline at end of file diff --git a/TrueCraft.Core/Logic/Blocks/GoldOreBlock.cs b/TrueCraft.Core/Logic/Blocks/GoldOreBlock.cs index a8dff0d..1d35b26 100644 --- a/TrueCraft.Core/Logic/Blocks/GoldOreBlock.cs +++ b/TrueCraft.Core/Logic/Blocks/GoldOreBlock.cs @@ -1,5 +1,6 @@ using System; using TrueCraft.API.Logic; +using TrueCraft.API; namespace TrueCraft.Core.Logic.Blocks { @@ -21,5 +22,21 @@ namespace TrueCraft.Core.Logic.Blocks { return new Tuple(0, 2); } + + public override ToolMaterial EffectiveToolMaterials + { + get + { + return ToolMaterial.Iron | ToolMaterial.Diamond; + } + } + + public override ToolType EffectiveTools + { + get + { + return ToolType.Pickaxe; + } + } } } \ No newline at end of file diff --git a/TrueCraft.Core/Logic/Blocks/IronBlock.cs b/TrueCraft.Core/Logic/Blocks/IronBlock.cs index 7324fd6..9d32ba1 100644 --- a/TrueCraft.Core/Logic/Blocks/IronBlock.cs +++ b/TrueCraft.Core/Logic/Blocks/IronBlock.cs @@ -46,5 +46,21 @@ namespace TrueCraft.Core.Logic.Blocks { get { return false; } } + + public override ToolMaterial EffectiveToolMaterials + { + get + { + return ToolMaterial.Stone | ToolMaterial.Iron | ToolMaterial.Diamond; + } + } + + public override ToolType EffectiveTools + { + get + { + return ToolType.Pickaxe; + } + } } } \ No newline at end of file diff --git a/TrueCraft.Core/Logic/Blocks/IronOreBlock.cs b/TrueCraft.Core/Logic/Blocks/IronOreBlock.cs index cbca874..7fb28df 100644 --- a/TrueCraft.Core/Logic/Blocks/IronOreBlock.cs +++ b/TrueCraft.Core/Logic/Blocks/IronOreBlock.cs @@ -1,5 +1,6 @@ using System; using TrueCraft.API.Logic; +using TrueCraft.API; namespace TrueCraft.Core.Logic.Blocks { @@ -21,5 +22,21 @@ namespace TrueCraft.Core.Logic.Blocks { return new Tuple(1, 2); } + + public override ToolMaterial EffectiveToolMaterials + { + get + { + return ToolMaterial.Stone | ToolMaterial.Iron | ToolMaterial.Diamond; + } + } + + public override ToolType EffectiveTools + { + get + { + return ToolType.Pickaxe; + } + } } } \ No newline at end of file diff --git a/TrueCraft.Core/Logic/Blocks/LapisLazuliBlock.cs b/TrueCraft.Core/Logic/Blocks/LapisLazuliBlock.cs index a496718..f95e824 100644 --- a/TrueCraft.Core/Logic/Blocks/LapisLazuliBlock.cs +++ b/TrueCraft.Core/Logic/Blocks/LapisLazuliBlock.cs @@ -58,5 +58,21 @@ namespace TrueCraft.Core.Logic.Blocks { get { return true; } } + + public override ToolMaterial EffectiveToolMaterials + { + get + { + return ToolMaterial.Stone | ToolMaterial.Iron | ToolMaterial.Diamond; + } + } + + public override ToolType EffectiveTools + { + get + { + return ToolType.Pickaxe; + } + } } } \ No newline at end of file diff --git a/TrueCraft.Core/Logic/Blocks/LapisLazuliOreBlock.cs b/TrueCraft.Core/Logic/Blocks/LapisLazuliOreBlock.cs index e66bde0..031e266 100644 --- a/TrueCraft.Core/Logic/Blocks/LapisLazuliOreBlock.cs +++ b/TrueCraft.Core/Logic/Blocks/LapisLazuliOreBlock.cs @@ -28,5 +28,21 @@ namespace TrueCraft.Core.Logic.Blocks { return new[] { new ItemStack(DyeItem.ItemID, (sbyte)new Random().Next(4, 8), (short)DyeItem.DyeType.LapisLazuli) }; } + + public override ToolMaterial EffectiveToolMaterials + { + get + { + return ToolMaterial.Stone | ToolMaterial.Iron | ToolMaterial.Diamond; + } + } + + public override ToolType EffectiveTools + { + get + { + return ToolType.Pickaxe; + } + } } } \ No newline at end of file diff --git a/TrueCraft.Core/Logic/Blocks/ObsidianBlock.cs b/TrueCraft.Core/Logic/Blocks/ObsidianBlock.cs index 804e5b2..f8d236b 100644 --- a/TrueCraft.Core/Logic/Blocks/ObsidianBlock.cs +++ b/TrueCraft.Core/Logic/Blocks/ObsidianBlock.cs @@ -1,5 +1,6 @@ using System; using TrueCraft.API.Logic; +using TrueCraft.API; namespace TrueCraft.Core.Logic.Blocks { @@ -21,5 +22,21 @@ namespace TrueCraft.Core.Logic.Blocks { return new Tuple(5, 2); } + + public override ToolMaterial EffectiveToolMaterials + { + get + { + return ToolMaterial.Diamond; + } + } + + public override ToolType EffectiveTools + { + get + { + return ToolType.Pickaxe; + } + } } } \ No newline at end of file diff --git a/TrueCraft.Core/Logic/Blocks/SnowBlock.cs b/TrueCraft.Core/Logic/Blocks/SnowBlock.cs index 6ef1c0c..30d1989 100644 --- a/TrueCraft.Core/Logic/Blocks/SnowBlock.cs +++ b/TrueCraft.Core/Logic/Blocks/SnowBlock.cs @@ -78,13 +78,17 @@ namespace TrueCraft.Core.Logic.Blocks return new Tuple(2, 4); } + public override ToolType EffectiveTools + { + get + { + return ToolType.Shovel; + } + } + protected override ItemStack[] GetDrop(BlockDescriptor descriptor, ItemStack item) { - var provider = ItemRepository.GetItemProvider(item.ID); - if (provider is ShovelItem) - return new[] { new ItemStack(SnowballItem.ItemID) }; - else - return new ItemStack[0]; + return new[] { new ItemStack(SnowballItem.ItemID) }; } } } diff --git a/TrueCraft/ItemRepository.cs b/TrueCraft.Core/Logic/ItemRepository.cs similarity index 96% rename from TrueCraft/ItemRepository.cs rename to TrueCraft.Core/Logic/ItemRepository.cs index 04ab8d1..b4eebca 100644 --- a/TrueCraft/ItemRepository.cs +++ b/TrueCraft.Core/Logic/ItemRepository.cs @@ -6,7 +6,7 @@ using TrueCraft.API.Entities; using TrueCraft.API; using TrueCraft.API.World; -namespace TrueCraft +namespace TrueCraft.Core.Logic { public class ItemRepository : IItemRepository { @@ -44,7 +44,7 @@ namespace TrueCraft ItemProviders.Insert(i + 1, provider); } - internal void DiscoverItemProviders() + public void DiscoverItemProviders() { var providerTypes = new List(); foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies()) diff --git a/TrueCraft.Core/Logic/Items/AxeItem.cs b/TrueCraft.Core/Logic/Items/AxeItem.cs index da1d331..8820a18 100644 --- a/TrueCraft.Core/Logic/Items/AxeItem.cs +++ b/TrueCraft.Core/Logic/Items/AxeItem.cs @@ -58,6 +58,14 @@ namespace TrueCraft.Core.Logic.Items return false; } } + + public override ToolType ToolType + { + get + { + return ToolType.Axe; + } + } } public class WoodenAxeItem : AxeItem diff --git a/TrueCraft.Core/Logic/Items/HoeItem.cs b/TrueCraft.Core/Logic/Items/HoeItem.cs index ce53840..ce8911e 100644 --- a/TrueCraft.Core/Logic/Items/HoeItem.cs +++ b/TrueCraft.Core/Logic/Items/HoeItem.cs @@ -61,6 +61,14 @@ namespace TrueCraft.Core.Logic.Items } } + public override ToolType ToolType + { + get + { + return ToolType.Hoe; + } + } + public override void ItemUsedOnBlock(Coordinates3D coordinates, ItemStack item, BlockFace face, IWorld world, IRemoteClient user) { var id = world.GetBlockID(coordinates); diff --git a/TrueCraft.Core/Logic/Items/PickaxeItem.cs b/TrueCraft.Core/Logic/Items/PickaxeItem.cs index 223d1c2..80630af 100644 --- a/TrueCraft.Core/Logic/Items/PickaxeItem.cs +++ b/TrueCraft.Core/Logic/Items/PickaxeItem.cs @@ -58,6 +58,14 @@ namespace TrueCraft.Core.Logic.Items return false; } } + + public override ToolType ToolType + { + get + { + return ToolType.Pickaxe; + } + } } public class WoodenPickaxeItem : PickaxeItem diff --git a/TrueCraft.Core/Logic/Items/ShovelItem.cs b/TrueCraft.Core/Logic/Items/ShovelItem.cs index 34d96fa..b0b2e2d 100644 --- a/TrueCraft.Core/Logic/Items/ShovelItem.cs +++ b/TrueCraft.Core/Logic/Items/ShovelItem.cs @@ -58,6 +58,14 @@ namespace TrueCraft.Core.Logic.Items return false; } } + + public override ToolType ToolType + { + get + { + return ToolType.Shovel; + } + } } public class WoodenShovelItem : ShovelItem diff --git a/TrueCraft.Core/Logic/Items/SwordItem.cs b/TrueCraft.Core/Logic/Items/SwordItem.cs index 58dd267..cb37bce 100644 --- a/TrueCraft.Core/Logic/Items/SwordItem.cs +++ b/TrueCraft.Core/Logic/Items/SwordItem.cs @@ -60,6 +60,14 @@ namespace TrueCraft.Core.Logic.Items return false; } } + + public override ToolType ToolType + { + get + { + return ToolType.Sword; + } + } } public class WoodenSwordItem : SwordItem diff --git a/TrueCraft.Core/Logic/Items/ToolItem.cs b/TrueCraft.Core/Logic/Items/ToolItem.cs index bcb8c76..f7b9b0a 100644 --- a/TrueCraft.Core/Logic/Items/ToolItem.cs +++ b/TrueCraft.Core/Logic/Items/ToolItem.cs @@ -10,6 +10,8 @@ namespace TrueCraft.Core.Logic { public virtual ToolMaterial Material { get { return ToolMaterial.None; } } + public virtual ToolType ToolType { get { return ToolType.None; } } + public virtual short BaseDurability { get { return 0; } } public override sbyte MaximumStack { get { return 1; } } diff --git a/TrueCraft.Core/TrueCraft.Core.csproj b/TrueCraft.Core/TrueCraft.Core.csproj index e68596b..918743e 100644 --- a/TrueCraft.Core/TrueCraft.Core.csproj +++ b/TrueCraft.Core/TrueCraft.Core.csproj @@ -326,6 +326,7 @@ + diff --git a/TrueCraft/TrueCraft.csproj b/TrueCraft/TrueCraft.csproj index affb812..5a70525 100644 --- a/TrueCraft/TrueCraft.csproj +++ b/TrueCraft/TrueCraft.csproj @@ -54,7 +54,6 @@ -