Survivalcraft API 1.8.2.3 v1.8.2.3
Survivalcraft 2.4
载入中...
搜索中...
未找到
SubsystemTime.cs
浏览该文件的文档.
1using Engine;
4
5namespace Game {
6 public class SubsystemTime : Subsystem {
7 public struct DelayedExecutionRequest {
8 public double GameTime;
9
10 public Action Action;
11 }
12
13 public float? m_maxGameTimeDelta;
15
16 public float MaxGameTimeDelta {
18 set => m_maxGameTimeDelta = value;
19 }
20
25
26 public float DefaultFixedTimeStep = 0.05f;
27 public int DefaultFixedUpdateStep = 20;
28
29 public float GameMenuDialogTimeFactor = 0f;
30
31 public double m_gameTime;
32
33 public float m_gameTimeDelta;
34
35 public float m_prevGameTimeDelta;
36
37 public float m_gameTimeFactor = 1f;
38
39 public float BasicGameTimeFactor { get; set; } = 1f;
40
41 public float? m_gameTimeFactorSleep = 60f;
42
43 public HashSet<DelayedExecutionRequest> m_delayedExecutionsRequests = [];
44
46
48
49 public double GameTime => m_gameTime;
50
52
54
55 public float GameTimeFactor {
56 get => m_gameTimeFactor;
57 set => m_gameTimeFactor = Math.Clamp(value, 0f, 256f);
58 }
59
60 public float? FixedTimeStep { get; private set; }
61
68
69 public virtual bool IsAllPlayerLivingSleeping() {
70 try {
71 int numSleepingPlayers = 0;
72 int numDeadPlayers = 0;
73 foreach (ComponentPlayer componentPlayer in m_subsystemPlayers.ComponentPlayers) {
74 if (componentPlayer.ComponentHealth.Health == 0f) {
75 numDeadPlayers++;
76 }
77 else if (componentPlayer.ComponentSleep.SleepFactor == 1f) {
78 numSleepingPlayers++;
79 }
80 }
81 return numSleepingPlayers + numDeadPlayers == m_subsystemPlayers.ComponentPlayers.Count && numSleepingPlayers >= 1;
82 }
83 catch (Exception) {
84 return false;
85 }
86 }
87
88 public virtual void NextFrame() {
92 "ChangeGameTimeDelta",
93 loader => {
94 loader.ChangeGameTimeDelta(this, ref m_gameTimeDelta);
95 return false;
96 }
97 );
99 HashSet<DelayedExecutionRequest> toRemove = [];
100 foreach (DelayedExecutionRequest delayedExecutionRequest in m_delayedExecutionsRequests) {
101 if (delayedExecutionRequest.GameTime >= 0
102 && GameTime >= delayedExecutionRequest.GameTime) {
103 toRemove.Add(delayedExecutionRequest);
104 delayedExecutionRequest.Action();
105 }
106 }
107 foreach (DelayedExecutionRequest delayedExecutionRequest in toRemove) {
108 m_delayedExecutionsRequests.Remove(delayedExecutionRequest);
109 }
112 if (m_gameTimeFactorSleep != null) {
114 }
115 }
116 else {
118 m_subsystemUpdate.UpdatesPerFrame = DefaultFixedUpdateStep;
119 }
120 }
121 else {
122 FixedTimeStep = null;
123 m_subsystemUpdate.UpdatesPerFrame = 1;
124 if (m_gameTimeFactorSleep != null) {
126 }
127 }
128 bool flag = true;
129 foreach (ComponentPlayer componentPlayer2 in m_subsystemPlayers.ComponentPlayers) {
130 if (!componentPlayer2.ComponentGui.IsGameMenuDialogVisible()) {
131 flag = false;
132 break;
133 }
134 }
135 if (flag) {
137 }
140 }
141 }
142
143 public void QueueGameTimeDelayedExecution(double gameTime, Action action) {
144 m_delayedExecutionsRequests.Add(new DelayedExecutionRequest { GameTime = gameTime, Action = action });
145 }
146
147 public bool PeriodicGameTimeEvent(double period, double offset) {
148 double num = GameTime - offset;
149 double num2 = Math.Floor(num / period) * period;
150 if (num >= num2) {
151 return num - GameTimeDelta < num2;
152 }
153 return false;
154 }
155
156 public override void Load(ValuesDictionary valuesDictionary) {
157 m_subsystemPlayers = Project.FindSubsystem<SubsystemPlayers>(true);
158 m_subsystemUpdate = Project.FindSubsystem<SubsystemUpdate>(true);
159 }
160 }
161}
static int Min(int x1, int x2)
static float FrameDuration
定义 Time.cs:46
virtual bool IsGameMenuDialogVisible()
virtual float CalculateGameTimeDalta()
SubsystemUpdate m_subsystemUpdate
virtual bool IsAllPlayerLivingSleeping()
HashSet< DelayedExecutionRequest > m_delayedExecutionsRequests
void QueueGameTimeDelayedExecution(double gameTime, Action action)
override void Load(ValuesDictionary valuesDictionary)
SubsystemPlayers m_subsystemPlayers
bool PeriodicGameTimeEvent(double period, double offset)
ValuesDictionary ValuesDictionary
static void HookAction(string HookName, Func< ModLoader, bool > action)
执行Hook