Files
mc/server/world/sleep.go
T
TarnaWijaya 26ed99fda6
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
up3
2026-07-09 08:33:57 +08:00

65 lines
1.3 KiB
Go

package world
import (
"github.com/df-mc/dragonfly/server/block/cube"
"github.com/df-mc/dragonfly/server/player/chat"
"github.com/google/uuid"
)
// Sleeper represents an entity that can sleep.
type Sleeper interface {
Entity
Name() string
UUID() uuid.UUID
Messaget(t chat.Translation, a ...any)
SendSleepingIndicator(sleeping, max int)
Sleep(pos cube.Pos)
Sleeping() (cube.Pos, bool)
Wake()
}
// Time constants for sleep usage.
const (
TimeSleep = 12542
TimeWake = 23459
TimeSleepWithRain = 12010
TimeWakeWithRain = 23991
TimeFull = 24000
)
// tryAdvanceDay attempts to advance the day of the world, by first ensuring that all sleepers are sleeping, and then
// updating the time of day.
func (ticker) tryAdvanceDay(tx *Tx, timeCycle bool) {
sleepers := tx.Sleepers()
time := tx.w.Time() % TimeFull
for s := range sleepers {
if !tx.Thundering() {
if !tx.Raining() && (time <= TimeSleep || time >= TimeWake) {
return
}
if time <= TimeSleepWithRain || time >= TimeWakeWithRain {
return
}
}
if _, ok := s.Sleeping(); !ok {
// We can't advance the time - not everyone is sleeping.
return
}
}
for s := range sleepers {
s.Wake()
}
totalTime := tx.w.Time()
if timeCycle {
tx.w.SetTime(totalTime + TimeFull - time)
}
tx.w.StopRaining()
}