up3
Build and deploy / Build (push) Has been cancelled
Build and deploy / Update Contributors (push) Has been cancelled
Build and deploy / Deploy (push) Has been cancelled
Build and deploy / Build (push) Has been cancelled
Build and deploy / Update Contributors (push) Has been cancelled
Build and deploy / Deploy (push) Has been cancelled
This commit is contained in:
@@ -0,0 +1,102 @@
|
||||
package block
|
||||
|
||||
import (
|
||||
"github.com/df-mc/dragonfly/server/block/cube"
|
||||
"github.com/df-mc/dragonfly/server/block/model"
|
||||
"github.com/df-mc/dragonfly/server/item"
|
||||
"github.com/df-mc/dragonfly/server/world"
|
||||
"github.com/df-mc/dragonfly/server/world/sound"
|
||||
"github.com/go-gl/mathgl/mgl64"
|
||||
)
|
||||
|
||||
// Anvil is a block that allows players to repair items, rename items, and combine enchantments.
|
||||
type Anvil struct {
|
||||
gravityAffected
|
||||
transparent
|
||||
|
||||
// Type is the type of anvil.
|
||||
Type AnvilType
|
||||
// Facing is the direction that the anvil is facing.
|
||||
Facing cube.Direction
|
||||
}
|
||||
|
||||
// Model ...
|
||||
func (a Anvil) Model() world.BlockModel {
|
||||
return model.Anvil{Facing: a.Facing}
|
||||
}
|
||||
|
||||
// BreakInfo ...
|
||||
func (a Anvil) BreakInfo() BreakInfo {
|
||||
return newBreakInfo(5, pickaxeHarvestable, pickaxeEffective, oneOf(a)).withBlastResistance(6000)
|
||||
}
|
||||
|
||||
// Activate ...
|
||||
func (Anvil) Activate(pos cube.Pos, _ cube.Face, tx *world.Tx, u item.User, _ *item.UseContext) bool {
|
||||
if opener, ok := u.(ContainerOpener); ok {
|
||||
opener.OpenBlockContainer(pos, tx)
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
// UseOnBlock ...
|
||||
func (a Anvil) UseOnBlock(pos cube.Pos, face cube.Face, _ mgl64.Vec3, tx *world.Tx, user item.User, ctx *item.UseContext) (used bool) {
|
||||
pos, _, used = firstReplaceable(tx, pos, face, a)
|
||||
if !used {
|
||||
return
|
||||
}
|
||||
a.Facing = user.Rotation().Direction().RotateLeft()
|
||||
place(tx, pos, a, user, ctx)
|
||||
return placed(ctx)
|
||||
}
|
||||
|
||||
// NeighbourUpdateTick ...
|
||||
func (a Anvil) NeighbourUpdateTick(pos, _ cube.Pos, tx *world.Tx) {
|
||||
a.fall(a, pos, tx)
|
||||
}
|
||||
|
||||
// Damage returns the damage per block fallen of the anvil and the maximum damage the anvil can deal.
|
||||
func (Anvil) Damage() (damagePerBlock, maxDamage float64) {
|
||||
return 2, 40
|
||||
}
|
||||
|
||||
// Break breaks the anvil and moves it to the next damage stage. If the anvil is at the last damage stage, it will be
|
||||
// destroyed.
|
||||
func (a Anvil) Break() world.Block {
|
||||
switch a.Type {
|
||||
case UndamagedAnvil():
|
||||
a.Type = SlightlyDamagedAnvil()
|
||||
case SlightlyDamagedAnvil():
|
||||
a.Type = VeryDamagedAnvil()
|
||||
case VeryDamagedAnvil():
|
||||
return Air{}
|
||||
}
|
||||
return a
|
||||
}
|
||||
|
||||
// Landed is called when a falling anvil hits the ground, used to, for example, play a sound.
|
||||
func (Anvil) Landed(tx *world.Tx, pos cube.Pos) {
|
||||
tx.PlaySound(pos.Vec3Centre(), sound.AnvilLand{})
|
||||
}
|
||||
|
||||
// EncodeItem ...
|
||||
func (a Anvil) EncodeItem() (name string, meta int16) {
|
||||
return "minecraft:" + a.Type.String(), 0
|
||||
}
|
||||
|
||||
// EncodeBlock ...
|
||||
func (a Anvil) EncodeBlock() (string, map[string]any) {
|
||||
return "minecraft:" + a.Type.String(), map[string]any{
|
||||
"minecraft:cardinal_direction": a.Facing.String(),
|
||||
}
|
||||
}
|
||||
|
||||
// allAnvils ...
|
||||
func allAnvils() (anvils []world.Block) {
|
||||
for _, t := range AnvilTypes() {
|
||||
for _, d := range cube.Directions() {
|
||||
anvils = append(anvils, Anvil{Type: t, Facing: d})
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
||||
Reference in New Issue
Block a user