65 lines
1.3 KiB
Go
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()
|
||
|
|
}
|