67 lines
1.6 KiB
Go
67 lines
1.6 KiB
Go
|
|
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"
|
||
|
|
)
|
||
|
|
|
||
|
|
// Cobweb is a non-solid block that drastically slows entities passing through it. It is broken
|
||
|
|
// quickly with a sword or shears and drops string when broken without silk touch.
|
||
|
|
type Cobweb struct {
|
||
|
|
empty
|
||
|
|
transparent
|
||
|
|
}
|
||
|
|
|
||
|
|
// Cobweb is implemented because the item package needs to identify this block but cannot implement the block package.
|
||
|
|
func (Cobweb) Cobweb() {}
|
||
|
|
|
||
|
|
// EntityInside slows the entity's velocity and resets its fall distance while it is inside the cobweb.
|
||
|
|
func (Cobweb) EntityInside(_ cube.Pos, _ *world.Tx, e world.Entity) {
|
||
|
|
if fallEntity, ok := e.(fallDistanceEntity); ok {
|
||
|
|
fallEntity.ResetFallDistance()
|
||
|
|
}
|
||
|
|
if v, ok := e.(velocityEntity); ok {
|
||
|
|
vel := v.Velocity()
|
||
|
|
vel[0] *= 0.25
|
||
|
|
vel[1] *= 0.05
|
||
|
|
vel[2] *= 0.25
|
||
|
|
v.SetVelocity(vel)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// BreakInfo ...
|
||
|
|
func (c Cobweb) BreakInfo() BreakInfo {
|
||
|
|
return newBreakInfo(
|
||
|
|
4,
|
||
|
|
alwaysHarvestable,
|
||
|
|
func(t item.Tool) bool {
|
||
|
|
return swordEffective(t) || shearsEffective(t)
|
||
|
|
},
|
||
|
|
func(t item.Tool, enchantments []item.Enchantment) []item.Stack {
|
||
|
|
if t.ToolType() == item.TypeShears {
|
||
|
|
return oneOf(c)(t, enchantments)
|
||
|
|
}
|
||
|
|
if t.ToolType() == item.TypeSword {
|
||
|
|
return oneOf(String{})(t, enchantments)
|
||
|
|
}
|
||
|
|
return nil
|
||
|
|
},
|
||
|
|
).withBlastResistance(4)
|
||
|
|
}
|
||
|
|
|
||
|
|
// HasLiquidDrops ...
|
||
|
|
func (Cobweb) HasLiquidDrops() bool {
|
||
|
|
return true
|
||
|
|
}
|
||
|
|
|
||
|
|
// EncodeItem ...
|
||
|
|
func (Cobweb) EncodeItem() (name string, meta int16) {
|
||
|
|
return "minecraft:web", 0
|
||
|
|
}
|
||
|
|
|
||
|
|
// EncodeBlock ...
|
||
|
|
func (Cobweb) EncodeBlock() (string, map[string]any) {
|
||
|
|
return "minecraft:web", nil
|
||
|
|
}
|