func allLogs() (logs []world.Block) {
	for _, w := range WoodTypes() {
		for axis := cube.Axis(0); axis < 3; axis++ {
			logs = append(logs, Log{Axis: axis, Stripped: true, Wood: w})
			logs = append(logs, Log{Axis: axis, Stripped: false, Wood: w})
		}
	}
	return
}
allLogs returns a list of all possible log states.
package block
import (
	"github.com/df-mc/dragonfly/server/block/cube"
	"github.com/df-mc/dragonfly/server/item"
	"github.com/df-mc/dragonfly/server/world"
	"github.com/go-gl/mathgl/mgl64"
)
type Log struct {
	solid
	bass
	Wood WoodType
	Stripped bool
	Axis cube.Axis
}
func (l Log) FlammabilityInfo() FlammabilityInfo {
	if !l.Wood.Flammable() {
		return newFlammabilityInfo(0, 0, false)
	}
	return newFlammabilityInfo(5, 5, true)
}
func (l Log) UseOnBlock(pos cube.Pos, face cube.Face, _ mgl64.Vec3, w *world.World, user item.User, ctx *item.UseContext) (used bool) {
	pos, face, used = firstReplaceable(w, pos, face, l)
	if !used {
		return
	}
	l.Axis = face.Axis()
	place(w, pos, l, user, ctx)
	return placed(ctx)
}
func (l Log) BreakInfo() BreakInfo {
	return newBreakInfo(2, alwaysHarvestable, axeEffective, oneOf(l))
}
func (l Log) Strip() (world.Block, bool) {
	return Log{Axis: l.Axis, Wood: l.Wood, Stripped: true}, !l.Stripped
}
func (l Log) EncodeItem() (name string, meta int16) {
	if !l.Stripped {
		switch l.Wood {
		case OakWood(), SpruceWood(), BirchWood(), JungleWood():
			return "minecraft:log", int16(l.Wood.Uint8())
		case AcaciaWood(), DarkOakWood():
			return "minecraft:log2", int16(l.Wood.Uint8()) - 4
		case CrimsonWood(), WarpedWood():
			return "minecraft:" + l.Wood.String() + "_stem", 0
		}
	}
	switch l.Wood {
	case OakWood(), SpruceWood(), BirchWood(), JungleWood(), AcaciaWood(), DarkOakWood():
		return "minecraft:stripped_" + l.Wood.String() + "_log", 0
	case CrimsonWood(), WarpedWood():
		return "minecraft:stripped_" + l.Wood.String() + "_stem", 0
	}
	panic("invalid wood type")
}
func (l Log) EncodeBlock() (name string, properties map[string]interface{}) {
	if !l.Stripped {
		switch l.Wood {
		case OakWood(), SpruceWood(), BirchWood(), JungleWood():
			return "minecraft:log", map[string]interface{}{"pillar_axis": l.Axis.String(), "old_log_type": l.Wood.String()}
		case AcaciaWood(), DarkOakWood():
			return "minecraft:log2", map[string]interface{}{"pillar_axis": l.Axis.String(), "new_log_type": l.Wood.String()}
		case CrimsonWood(), WarpedWood():
			return "minecraft:" + l.Wood.String() + "_stem", map[string]interface{}{"pillar_axis": l.Axis.String()}
		}
	}
	switch l.Wood {
	case OakWood(), SpruceWood(), BirchWood(), JungleWood(), AcaciaWood(), DarkOakWood():
		return "minecraft:stripped_" + l.Wood.String() + "_log", map[string]interface{}{"pillar_axis": l.Axis.String()}
	case CrimsonWood(), WarpedWood():
		return "minecraft:stripped_" + l.Wood.String() + "_stem", map[string]interface{}{"pillar_axis": l.Axis.String()}
	}
	panic("invalid wood type")
}