65 lines
1.8 KiB
Go
65 lines
1.8 KiB
Go
|
|
package block
|
||
|
|
|
||
|
|
import "github.com/df-mc/dragonfly/server/block/cube"
|
||
|
|
|
||
|
|
// Attachment describes the attachment of a block to another block. It is either of the type WallAttachment, which can
|
||
|
|
// only have 90 degree facing values, or StandingAttachment, which has more freedom using a cube.Orientation.
|
||
|
|
type Attachment struct {
|
||
|
|
hanging bool
|
||
|
|
facing cube.Direction
|
||
|
|
o cube.Orientation
|
||
|
|
}
|
||
|
|
|
||
|
|
// WallAttachment returns an Attachment to a wall with a facing direction.
|
||
|
|
func WallAttachment(facing cube.Direction) Attachment {
|
||
|
|
return Attachment{hanging: true, facing: facing}
|
||
|
|
}
|
||
|
|
|
||
|
|
// StandingAttachment returns an Attachment to the ground with an orientation.
|
||
|
|
func StandingAttachment(o cube.Orientation) Attachment {
|
||
|
|
return Attachment{o: o}
|
||
|
|
}
|
||
|
|
|
||
|
|
// Uint8 returns the Attachment as a uint8.
|
||
|
|
func (a Attachment) Uint8() uint8 {
|
||
|
|
if !a.hanging {
|
||
|
|
return 1 | (uint8(a.o) << 1)
|
||
|
|
}
|
||
|
|
return uint8(a.facing) << 1
|
||
|
|
}
|
||
|
|
|
||
|
|
// FaceUint8 returns the facing of the Attachment as a uint8.
|
||
|
|
func (a Attachment) FaceUint8() uint8 {
|
||
|
|
if !a.hanging {
|
||
|
|
return 1
|
||
|
|
}
|
||
|
|
return uint8(a.facing) << 1
|
||
|
|
}
|
||
|
|
|
||
|
|
// RotateLeft rotates the Attachment the left way around by 90 degrees.
|
||
|
|
func (a Attachment) RotateLeft() Attachment {
|
||
|
|
return Attachment{hanging: a.hanging, facing: a.facing.RotateLeft(), o: a.o.RotateLeft()}
|
||
|
|
}
|
||
|
|
|
||
|
|
// RotateRight rotates the Attachment the right way around by 90 degrees.
|
||
|
|
func (a Attachment) RotateRight() Attachment {
|
||
|
|
return Attachment{hanging: a.hanging, facing: a.facing.RotateLeft(), o: a.o.RotateLeft()}
|
||
|
|
}
|
||
|
|
|
||
|
|
// Rotation returns the rotation of the Attachment, based on the orientation if it's a StandingAttachment, or the
|
||
|
|
// facing direction if it is a WallAttachment.
|
||
|
|
func (a Attachment) Rotation() cube.Rotation {
|
||
|
|
yaw := a.o.Yaw()
|
||
|
|
if a.hanging {
|
||
|
|
switch a.facing {
|
||
|
|
case cube.West:
|
||
|
|
yaw = 90
|
||
|
|
case cube.East:
|
||
|
|
yaw = -90
|
||
|
|
case cube.North:
|
||
|
|
yaw = 180
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return cube.Rotation{yaw}
|
||
|
|
}
|