1use crate::{comp::Pos, shared_server_config::ServerConstants, time::DayPeriod};
2use serde::{Deserialize, Serialize};
3use specs::Entity;
4use std::ops::{Mul, MulAssign};
5use vek::Vec3;
6
7pub const DAY: f64 = 3600.0 * 24.0;
8
9#[derive(Copy, Clone, Debug, Serialize, Deserialize, Default)]
11pub struct TimeOfDay(pub f64);
12impl TimeOfDay {
13 pub fn new(t: f64) -> Self { TimeOfDay(t) }
14
15 fn get_angle_rad(self) -> f32 {
16 const TIME_FACTOR: f64 = (std::f64::consts::PI * 2.0) / (3600.0 * 24.0);
17 ((self.0 * TIME_FACTOR) % (std::f64::consts::PI * 2.0)) as f32
18 }
19
20 pub fn get_sun_dir(self) -> Vec3<f32> {
22 let angle_rad = self.get_angle_rad();
23 Vec3::new(-angle_rad.sin(), 0.0, angle_rad.cos())
24 }
25
26 pub fn get_moon_dir(self) -> Vec3<f32> {
28 let moon_phase = crate::time::MoonPeriod::from(self.0);
29 let phase_angle = moon_phase.0 as f32 * 2.0 * std::f32::consts::PI;
30 const MOON_ORBIT_AXIS: Vec3<f32> = Vec3::new(0.09901, 0.99015, 0.09901);
31
32 vek::Quaternion::rotation_3d(phase_angle, MOON_ORBIT_AXIS)
33 * vek::Quaternion::rotation_y(-self.get_angle_rad() + std::f32::consts::PI)
34 * Vec3::unit_z()
35 }
36
37 pub fn day_period(&self) -> DayPeriod { DayPeriod::from(self.0) }
39}
40
41impl TimeOfDay {
42 pub fn day(&self) -> f64 { self.0.rem_euclid(24.0 * 3600.0) }
43}
44
45#[derive(Copy, Clone, Debug, Default, Serialize, Deserialize, PartialEq, PartialOrd)]
47pub struct Time(pub f64);
48
49impl Time {
50 pub fn add_seconds(self, seconds: f64) -> Self { Self(self.0 + seconds) }
51
52 pub fn add_minutes(self, minutes: f64) -> Self { Self(self.0 + minutes * 60.0) }
53
54 pub fn add_days(self, days: f64, server_constants: &ServerConstants) -> Self {
57 self.add_seconds(days * DAY / server_constants.day_cycle_coefficient)
58 }
59}
60
61#[derive(Copy, Clone, Debug, Default, Serialize, Deserialize, PartialEq)]
63pub struct ProgramTime(pub f64);
64
65#[derive(Copy, Clone, Debug, Serialize, Deserialize)]
66pub struct TimeScale(pub f64);
67
68impl Default for TimeScale {
69 fn default() -> Self { Self(1.0) }
70}
71
72#[derive(Default)]
74pub struct DeltaTime(pub f32);
75
76#[derive(Copy, Clone, Debug, Default, Serialize, Deserialize, PartialEq)]
78#[serde(transparent)]
79pub struct Secs(pub f64);
80
81impl Mul<f64> for Secs {
82 type Output = Self;
83
84 fn mul(self, mult: f64) -> Self { Self(self.0 * mult) }
85}
86impl MulAssign<f64> for Secs {
87 fn mul_assign(&mut self, mult: f64) { *self = *self * mult; }
88}
89
90#[derive(Default)]
91pub struct EntitiesDiedLastTick(pub Vec<(Entity, Pos)>);
92
93#[derive(Copy, Clone, Debug, Serialize, Deserialize, PartialEq, Eq)]
95pub enum GameMode {
96 Server,
99 Client,
102 Singleplayer,
106}
107
108#[derive(Copy, Clone, Default, Debug)]
111pub struct PlayerEntity(pub Option<Entity>);
112
113#[derive(Copy, Clone, Debug, Default, Eq, PartialEq)]
114pub struct PlayerPhysicsSetting {
115 pub client_optin: bool,
118}
119
120impl PlayerPhysicsSetting {
121 pub fn server_authoritative_physics_optin(&self) -> bool { self.client_optin }
127}
128
129#[derive(Copy, Clone, Debug, Deserialize, Serialize, PartialEq, Eq, enum_map::Enum)]
131pub enum MapKind {
132 Square,
134 Circle,
136}
137
138impl std::fmt::Display for MapKind {
139 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
140 match self {
141 MapKind::Square => f.write_str("Square"),
142 MapKind::Circle => f.write_str("Circle"),
143 }
144 }
145}
146
147#[derive(Clone, Default, Debug)]
151pub struct PlayerPhysicsSettings {
152 pub settings: hashbrown::HashMap<uuid::Uuid, PlayerPhysicsSetting>,
153}
154
155#[derive(PartialEq, Eq, Copy, Clone, Debug, Deserialize, Serialize)]
160pub enum BattleMode {
161 PvP,
162 PvE,
163}