126 lines
5.2 KiB
Go
126 lines
5.2 KiB
Go
|
|
package item
|
||
|
|
|
||
|
|
import (
|
||
|
|
"github.com/df-mc/dragonfly/server/world"
|
||
|
|
)
|
||
|
|
|
||
|
|
var (
|
||
|
|
// TypeNone is the ToolType of items that are not tools.
|
||
|
|
TypeNone = ToolType{-1}
|
||
|
|
// TypePickaxe is the ToolType for pickaxes.
|
||
|
|
TypePickaxe = ToolType{0}
|
||
|
|
// TypeAxe is the ToolType for axes.
|
||
|
|
TypeAxe = ToolType{1}
|
||
|
|
// TypeHoe is the ToolType for hoes.
|
||
|
|
TypeHoe = ToolType{2}
|
||
|
|
// TypeShovel is the ToolType for shovels.
|
||
|
|
TypeShovel = ToolType{3}
|
||
|
|
// TypeShears is the ToolType for shears.
|
||
|
|
TypeShears = ToolType{4}
|
||
|
|
// TypeSword is the ToolType for swords.
|
||
|
|
TypeSword = ToolType{5}
|
||
|
|
|
||
|
|
// ToolTierWood is the ToolTier of wood tools. This is the lowest possible tier.
|
||
|
|
ToolTierWood = ToolTier{HarvestLevel: 1, Durability: 59, BaseMiningEfficiency: 2, BaseAttackDamage: 1, EnchantmentValue: 15, Name: "wooden"}
|
||
|
|
// ToolTierGold is the ToolTier of gold tools.
|
||
|
|
ToolTierGold = ToolTier{HarvestLevel: 1, Durability: 32, BaseMiningEfficiency: 12, BaseAttackDamage: 1, EnchantmentValue: 22, Name: "golden"}
|
||
|
|
// ToolTierStone is the ToolTier of stone tools.
|
||
|
|
ToolTierStone = ToolTier{HarvestLevel: 2, Durability: 131, BaseMiningEfficiency: 4, BaseAttackDamage: 2, EnchantmentValue: 5, Name: "stone"}
|
||
|
|
// ToolTierCopper is the ToolTier of copper tools.
|
||
|
|
ToolTierCopper = ToolTier{HarvestLevel: 2, Durability: 190, BaseMiningEfficiency: 5, BaseAttackDamage: 2, EnchantmentValue: 13, Name: "copper"}
|
||
|
|
// ToolTierIron is the ToolTier of iron tools.
|
||
|
|
ToolTierIron = ToolTier{HarvestLevel: 3, Durability: 250, BaseMiningEfficiency: 6, BaseAttackDamage: 3, EnchantmentValue: 14, Name: "iron"}
|
||
|
|
// ToolTierDiamond is the ToolTier of diamond tools.
|
||
|
|
ToolTierDiamond = ToolTier{HarvestLevel: 4, Durability: 1561, BaseMiningEfficiency: 8, BaseAttackDamage: 4, EnchantmentValue: 10, Name: "diamond"}
|
||
|
|
// ToolTierNetherite is the ToolTier of netherite tools. This is the highest possible tier.
|
||
|
|
ToolTierNetherite = ToolTier{HarvestLevel: 4, Durability: 2031, BaseMiningEfficiency: 9, BaseAttackDamage: 5, EnchantmentValue: 15, Name: "netherite"}
|
||
|
|
)
|
||
|
|
|
||
|
|
type (
|
||
|
|
// Tool represents an item that may be used as a tool.
|
||
|
|
Tool interface {
|
||
|
|
// ToolType returns the type of the tool. The blocks that can be mined with this tool depend on this
|
||
|
|
// tool type.
|
||
|
|
ToolType() ToolType
|
||
|
|
// HarvestLevel returns the level that this tool is able to harvest. If a block has a harvest level above
|
||
|
|
// this one, this tool won't be able to harvest it.
|
||
|
|
HarvestLevel() int
|
||
|
|
// BaseMiningEfficiency is the base efficiency of the tool, when it comes to mining blocks. This decides
|
||
|
|
// the speed with which blocks can be mined.
|
||
|
|
// Some tools have a mining efficiency that depends on the block (swords, shears). The block mined is
|
||
|
|
// passed for this behaviour.
|
||
|
|
BaseMiningEfficiency(b world.Block) float64
|
||
|
|
}
|
||
|
|
// ToolTier represents the tier, or material, that a Tool is made of.
|
||
|
|
ToolTier struct {
|
||
|
|
// HarvestLevel is the level that this tier of tools is able to harvest. If a block has a harvest level
|
||
|
|
// above this one, a tool with this tier won't be able to harvest it.
|
||
|
|
HarvestLevel int
|
||
|
|
// BaseMiningEfficiency is the base efficiency of the tier, when it comes to mining blocks. This is
|
||
|
|
// specifically used for tools such as pickaxes.
|
||
|
|
BaseMiningEfficiency float64
|
||
|
|
// BaseAttackDamage is the base attack damage to tools with this tier. All tools have a constant value
|
||
|
|
// that is added on top of this.
|
||
|
|
BaseAttackDamage float64
|
||
|
|
// EnchantmentValue is the enchantment value of the tool used when selecting pseudo-random enchantments for
|
||
|
|
// enchanting tables.
|
||
|
|
EnchantmentValue int
|
||
|
|
// BaseDurability returns the maximum durability that a tool with this tier has.
|
||
|
|
Durability int
|
||
|
|
// Name is the name of the tier.
|
||
|
|
Name string
|
||
|
|
}
|
||
|
|
// ToolType represents the type of tool. This decides the type of blocks that the tool is used for.
|
||
|
|
ToolType struct{ t }
|
||
|
|
t int
|
||
|
|
|
||
|
|
// ToolNone is a ToolType typically used in functions for items that do not function as tools.
|
||
|
|
ToolNone struct{}
|
||
|
|
)
|
||
|
|
|
||
|
|
// ToolTiers returns a ToolTier slice containing all available tiers.
|
||
|
|
func ToolTiers() []ToolTier {
|
||
|
|
return []ToolTier{ToolTierWood, ToolTierGold, ToolTierStone, ToolTierCopper, ToolTierIron, ToolTierDiamond, ToolTierNetherite}
|
||
|
|
}
|
||
|
|
|
||
|
|
// ToolType ...
|
||
|
|
func (n ToolNone) ToolType() ToolType { return TypeNone }
|
||
|
|
|
||
|
|
// HarvestLevel ...
|
||
|
|
func (n ToolNone) HarvestLevel() int { return 0 }
|
||
|
|
|
||
|
|
// BaseMiningEfficiency ...
|
||
|
|
func (n ToolNone) BaseMiningEfficiency(world.Block) float64 { return 1 }
|
||
|
|
|
||
|
|
// toolTierRepairable returns true if the ToolTier passed is repairable.
|
||
|
|
func toolTierRepairable(tier ToolTier) func(Stack) bool {
|
||
|
|
return func(stack Stack) bool {
|
||
|
|
switch tier {
|
||
|
|
case ToolTierWood:
|
||
|
|
if planks, ok := stack.Item().(interface{ RepairsWoodTools() bool }); ok {
|
||
|
|
return planks.RepairsWoodTools()
|
||
|
|
}
|
||
|
|
case ToolTierStone:
|
||
|
|
if cobblestone, ok := stack.Item().(interface{ RepairsStoneTools() bool }); ok {
|
||
|
|
return cobblestone.RepairsStoneTools()
|
||
|
|
}
|
||
|
|
case ToolTierGold:
|
||
|
|
_, ok := stack.Item().(GoldIngot)
|
||
|
|
return ok
|
||
|
|
case ToolTierCopper:
|
||
|
|
_, ok := stack.Item().(CopperIngot)
|
||
|
|
return ok
|
||
|
|
case ToolTierIron:
|
||
|
|
_, ok := stack.Item().(IronIngot)
|
||
|
|
return ok
|
||
|
|
case ToolTierDiamond:
|
||
|
|
_, ok := stack.Item().(Diamond)
|
||
|
|
return ok
|
||
|
|
case ToolTierNetherite:
|
||
|
|
_, ok := stack.Item().(NetheriteIngot)
|
||
|
|
return ok
|
||
|
|
}
|
||
|
|
return false
|
||
|
|
}
|
||
|
|
}
|