Survivalcraft API 1.8.2.3 v1.8.2.3
Survivalcraft 2.4
载入中...
搜索中...
未找到
ComponentVitalStats.cs
浏览该文件的文档.
1using System.Globalization;
2using Engine;
3using Engine.Audio;
6
7namespace Game {
10
12
14
16
18
20
21 public Random m_random = new();
22
24
25 public float m_food;
26
27 public float m_stamina;
28
29 public float m_sleep;
30
31 public float m_temperature;
32
33 public float m_wetness;
34
35 public float m_lastFood;
36
37 public float m_lastStamina;
38
39 public float m_lastSleep;
40
41 public float m_lastTemperature;
42
43 public float m_lastWetness;
44
45 public Dictionary<int, float> m_satiation = [];
46
47 public List<KeyValuePair<int, float>> m_satiationList = [];
48
50
51 public double? m_lastAttackedTime;
52
54
56
58
59 public float m_targetTemperature;
60
62
64
67
68 public static string fName = "ComponentVitalStats";
69
70 public Action<int> FoodEaten { get; set; }
71
78
79 public float Food {
80 get => m_food;
81 set => m_food = MathUtils.Saturate(value);
82 }
83
84 public float Stamina {
85 get => m_stamina;
86 set => m_stamina = MathUtils.Saturate(value);
87 }
88
89 public float Sleep {
90 get => m_sleep;
91 set => m_sleep = MathUtils.Saturate(value);
92 }
93
94 public float Temperature {
95 get => m_temperature;
96 set => m_temperature = Math.Clamp(value, 0f, 24f);
97 }
98
99 public float Wetness {
100 get => m_wetness;
101 set => m_wetness = MathUtils.Saturate(value);
102 }
103
105
106 public virtual bool Eat(int value) {
107 bool skipVanilla = false;
108 bool eatSuccess = false;
109 int modifiedValue = value;
110
112 "OnVitalStatsEat",
113 loader => {
114 loader.OnVitalStatsEat(this, ref modifiedValue, ref skipVanilla, out eatSuccess);
115 return false;
116 }
117 );
118
119 // 如果Mod标记跳过原有逻辑,直接返回Mod的结果
120 if (skipVanilla) {
121 return eatSuccess;
122 }
123
124 int num = Terrain.ExtractContents(modifiedValue);
125 Block obj = BlocksManager.Blocks[num];
126 float num2 = obj.GetNutritionalValue(modifiedValue);
127 float sicknessProbability = obj.GetSicknessProbability(modifiedValue);
128 if (num2 > 0f) {
129 if (m_componentPlayer.ComponentSickness.IsSick
130 && sicknessProbability > 0f) {
131 m_componentPlayer.ComponentGui.DisplaySmallMessage(LanguageControl.Get(fName, 1), Color.White, true, true);
132 return false;
133 }
134 if (Food >= 0.98f) {
135 m_componentPlayer.ComponentGui.DisplaySmallMessage(LanguageControl.Get(fName, 2), Color.White, true, true);
136 return false;
137 }
138 m_subsystemAudio.PlayRandomSound(
139 "Audio/Creatures/HumanEat",
140 1f,
141 m_random.Float(-0.2f, 0.2f),
142 m_componentPlayer.ComponentBody.Position,
143 2f,
144 0f
145 );
146 if (m_componentPlayer.ComponentSickness.IsSick) {
147 num2 *= 0.75f;
148 }
149 Food += num2;
150 FoodEaten?.Invoke(modifiedValue);
151 m_satiation.TryGetValue(num, out float value2);
152 value2 += MathF.Max(num2, 0.5f);
153 m_satiation[num] = value2;
154 if (m_componentPlayer.ComponentSickness.IsSick) {
155 m_componentPlayer.ComponentSickness.NauseaEffect();
156 }
157 else if (sicknessProbability >= 0.5f) {
158 m_componentPlayer.ComponentGui.DisplaySmallMessage(LanguageControl.Get(fName, 3), Color.White, true, true);
159 }
160 else if (sicknessProbability > 0f) {
161 m_componentPlayer.ComponentGui.DisplaySmallMessage(LanguageControl.Get(fName, 4), Color.White, true, true);
162 }
163 else if (value2 > 2.5f) {
164 m_componentPlayer.ComponentGui.DisplaySmallMessage(LanguageControl.Get(fName, 5), Color.White, true, true);
165 }
166 else if (value2 > 2f) {
167 m_componentPlayer.ComponentGui.DisplaySmallMessage(LanguageControl.Get(fName, 6), Color.White, true, true);
168 }
169 else if (Food > 0.85f) {
170 m_componentPlayer.ComponentGui.DisplaySmallMessage(LanguageControl.Get(fName, 7), Color.White, true, true);
171 }
172 else {
173 m_componentPlayer.ComponentGui.DisplaySmallMessage(LanguageControl.Get(fName, 8), Color.White, true, false);
174 }
175 if (m_random.Bool(sicknessProbability)
176 || value2 > 3.5f) {
177 m_componentPlayer.ComponentSickness.StartSickness();
178 }
179 m_componentPlayer.PlayerStats.FoodItemsEaten++;
180 return true;
181 }
182 return false;
183 }
184
185 public virtual void MakeSleepy(float sleepValue) {
186 Sleep = MathF.Min(Sleep, sleepValue);
187 }
188
189 public virtual void Update(float dt) {
190 if (m_componentPlayer.ComponentHealth.Health > 0f) {
191 UpdateFood();
193 UpdateSleep();
196 }
197 else {
198 m_pantingSound.Stop();
199 }
200 }
201
202 public override void Load(ValuesDictionary valuesDictionary, IdToEntityMap idToEntityMap) {
203 m_subsystemGameInfo = Project.FindSubsystem<SubsystemGameInfo>(true);
204 m_subsystemTime = Project.FindSubsystem<SubsystemTime>(true);
205 m_subsystemAudio = Project.FindSubsystem<SubsystemAudio>(true);
207 m_subsystemWeather = Project.FindSubsystem<SubsystemWeather>(true);
208 m_componentPlayer = Entity.FindComponent<ComponentPlayer>(true);
209 m_pantingSound = m_subsystemAudio.CreateSound("Audio/HumanPanting");
210 m_pantingSound.IsLooped = true;
211 Food = valuesDictionary.GetValue<float>("Food");
212 Stamina = valuesDictionary.GetValue<float>("Stamina");
213 Sleep = valuesDictionary.GetValue<float>("Sleep");
214 Temperature = valuesDictionary.GetValue<float>("Temperature");
215 Wetness = valuesDictionary.GetValue<float>("Wetness");
223 m_componentPlayer.ComponentBody.Attacked += delegate { m_lastAttackedTime = m_subsystemTime.GameTime; };
224 foreach (KeyValuePair<string, object> item in valuesDictionary.GetValue<ValuesDictionary>("Satiation")) {
225 m_satiation[int.Parse(item.Key, CultureInfo.InvariantCulture)] = (float)item.Value;
226 }
227 }
228
229 public override void Save(ValuesDictionary valuesDictionary, EntityToIdMap entityToIdMap) {
230 valuesDictionary.SetValue("Food", Food);
231 valuesDictionary.SetValue("Stamina", Stamina);
232 valuesDictionary.SetValue("Sleep", Sleep);
233 valuesDictionary.SetValue("Temperature", Temperature);
234 valuesDictionary.SetValue("Wetness", Wetness);
235 ValuesDictionary valuesDictionary2 = new();
236 valuesDictionary.SetValue("Satiation", valuesDictionary2);
237 foreach (KeyValuePair<int, float> item in m_satiation) {
238 if (item.Value > 0f) {
239 valuesDictionary2.SetValue(item.Key.ToString(CultureInfo.InvariantCulture), item.Value);
240 }
241 }
242 }
243
244 public override void OnEntityRemoved() {
245 m_pantingSound.Stop();
246 }
247
248 public virtual void UpdateFood() {
249 bool skipVanilla = false;
250 float modifiedFood = Food;
251 float gameTimeDelta = m_subsystemTime.GameTimeDelta;
252
254 "OnVitalStatsUpdateFood",
255 loader => {
256 loader.OnVitalStatsUpdateFood(this, ref modifiedFood, ref gameTimeDelta, ref skipVanilla);
257 return false;
258 }
259 );
260
261 if (skipVanilla) return;
262
263 float num = m_componentPlayer.ComponentLocomotion.LastWalkOrder?.Length() ?? 0f;
264 float lastJumpOrder = m_componentPlayer.ComponentLocomotion.LastJumpOrder;
265 float num2 = m_componentPlayer.ComponentCreatureModel.EyePosition.Y - m_componentPlayer.ComponentBody.Position.Y;
266 bool flag = m_componentPlayer.ComponentBody.ImmersionDepth > num2;
267 bool flag2 = m_componentPlayer.ComponentBody.ImmersionFactor > 0.33f && !m_componentPlayer.ComponentBody.StandingOnValue.HasValue;
268 bool flag3 = m_subsystemTime.PeriodicGameTimeEvent(240.0, 13.0) && !m_componentPlayer.ComponentSickness.IsSick;
269 if (m_subsystemGameInfo.WorldSettings.GameMode != 0
270 && m_subsystemGameInfo.WorldSettings.AreAdventureSurvivalMechanicsEnabled) {
271 float hungerFactor = m_componentPlayer.ComponentLevel.HungerFactor;
272 Food -= hungerFactor * gameTimeDelta / 2880f;
273 if (flag2 | flag) {
274 Food -= hungerFactor * gameTimeDelta * num / 1440f;
275 }
276 else {
277 Food -= hungerFactor * gameTimeDelta * num / 2880f;
278 }
279 Food -= hungerFactor * lastJumpOrder / 1200f;
280 if (m_componentPlayer.ComponentMiner.DigCellFace.HasValue) {
281 Food -= hungerFactor * gameTimeDelta / 2880f;
282 }
283 if (!m_componentPlayer.ComponentSleep.IsSleeping) {
284 if (Food <= 0f) {
285 if (m_subsystemTime.PeriodicGameTimeEvent(50.0, 0.0)) {
286 m_componentPlayer.ComponentHealth.Injure(0.05f, null, false, LanguageControl.Get(fName, 9));
287 m_componentPlayer.ComponentGui.DisplaySmallMessage(LanguageControl.Get(fName, 10), Color.White, true, false);
288 m_componentPlayer.ComponentGui.FoodBarWidget.Flash(10);
289 }
290 }
291 else if (Food < 0.1f
292 && (m_lastFood >= 0.1f) | flag3) {
293 m_componentPlayer.ComponentGui.DisplaySmallMessage(LanguageControl.Get(fName, 11), Color.White, true, true);
294 }
295 else if (Food < 0.25f
296 && (m_lastFood >= 0.25f) | flag3) {
297 m_componentPlayer.ComponentGui.DisplaySmallMessage(LanguageControl.Get(fName, 12), Color.White, true, true);
298 }
299 else if (Food < 0.5f
300 && (m_lastFood >= 0.5f) | flag3) {
301 m_componentPlayer.ComponentGui.DisplaySmallMessage(LanguageControl.Get(fName, 13), Color.White, true, false);
302 }
303 }
304 }
305 else {
306 Food = 0.9f;
307 }
308 if (m_subsystemTime.PeriodicGameTimeEvent(1.0, -0.01)) {
309 m_satiationList.Clear();
311 m_satiation.Clear();
312 foreach (KeyValuePair<int, float> satiation in m_satiationList) {
313 float num3 = MathF.Max(satiation.Value - 0.000416666677f, 0f);
314 if (num3 > 0f) {
315 m_satiation.Add(satiation.Key, num3);
316 }
317 }
318 }
320 m_componentPlayer.ComponentGui.FoodBarWidget.Value = Food;
321 }
322
323 public virtual void UpdateStamina() {
324 bool skipVanilla = false;
325 float modifiedStamina = Stamina;
326 float gameTimeDelta = m_subsystemTime.GameTimeDelta;
327
329 "OnVitalStatsUpdateStamina",
330 loader => {
331 loader.OnVitalStatsUpdateStamina(this, ref modifiedStamina, ref gameTimeDelta, ref skipVanilla);
332 return false;
333 }
334 );
335
336 if (skipVanilla) return;
337
338 float lastWalkOrder = m_componentPlayer.ComponentLocomotion.LastWalkOrder?.Length() ?? 0f;
339 float lastJumpOrder = m_componentPlayer.ComponentLocomotion.LastJumpOrder;
340 float playerHeight = m_componentPlayer.ComponentCreatureModel.EyePosition.Y - m_componentPlayer.ComponentBody.Position.Y;
341 bool IsImmersedCompletely = m_componentPlayer.ComponentBody.ImmersionDepth > playerHeight;
342 bool IsImmersed = m_componentPlayer.ComponentBody.ImmersionFactor > 0.33f && !m_componentPlayer.ComponentBody.StandingOnValue.HasValue;
343 if (m_subsystemGameInfo.WorldSettings.GameMode >= GameMode.Survival
344 && m_subsystemGameInfo.WorldSettings.AreAdventureSurvivalMechanicsEnabled) {
345 float num3 = 1f / MathF.Max(m_componentPlayer.ComponentLevel.SpeedFactor, 0.75f);
346 if (m_componentPlayer.ComponentSickness.IsSick
347 || m_componentPlayer.ComponentFlu.HasFlu) {
348 num3 *= 5f;
349 }
350 Stamina += gameTimeDelta * 0.07f;
351 Stamina -= 0.025f * lastJumpOrder * num3;
352 if (IsImmersed | IsImmersedCompletely) {
353 Stamina -= gameTimeDelta * (0.07f + 0.006f * num3 + 0.008f * lastWalkOrder);
354 }
355 else {
356 Stamina -= gameTimeDelta * (0.07f + 0.006f * num3) * lastWalkOrder;
357 }
358 if (!IsImmersed
359 && !IsImmersedCompletely
360 && Stamina < 0.33f
361 && m_lastStamina >= 0.33f) {
362 m_componentPlayer.ComponentGui.DisplaySmallMessage(LanguageControl.Get(fName, 14), Color.White, true, false);
363 }
364 if (IsImmersed | IsImmersedCompletely
365 && Stamina < 0.4f
366 && m_lastStamina >= 0.4f) {
367 m_componentPlayer.ComponentGui.DisplaySmallMessage(LanguageControl.Get(fName, 15), Color.White, true, true);
368 }
369 if (Stamina < 0.1f) {
370 if (IsImmersed | IsImmersedCompletely) {
371 if (m_subsystemTime.PeriodicGameTimeEvent(5.0, 0.0)) {
372 m_componentPlayer.ComponentHealth.Injure(0.05f, null, false, LanguageControl.Get(fName, 16));
373 m_componentPlayer.ComponentGui.DisplaySmallMessage(LanguageControl.Get(fName, 17), Color.White, true, false);
374 }
375 if (m_random.Float(0f, 1f) < 1f * gameTimeDelta) {
376 m_componentPlayer.ComponentLocomotion.JumpOrder = 1f;
377 }
378 }
379 else if (m_subsystemTime.PeriodicGameTimeEvent(5.0, 0.0)) {
380 m_componentPlayer.ComponentGui.DisplaySmallMessage(LanguageControl.Get(fName, 18), Color.White, true, true);
381 }
382 }
384 float num4 = MathUtils.Saturate(2f * (0.5f - Stamina));
385 if (!IsImmersedCompletely
386 && num4 > 0f) {
387 float num5 = m_componentPlayer.PlayerData.PlayerClass == PlayerClass.Female ? 0.2f : 0f;
388 m_pantingSound.Volume = 1f
390 * MathUtils.Saturate(1f * num4)
391 * MathUtils.Lerp(0.8f, 1f, SimplexNoise.Noise((float)MathUtils.Remainder(3.0 * Time.RealTime + 100.0, 1000.0)));
392 m_pantingSound.Pitch = AudioManager.ToEnginePitch(
393 num5
394 + MathUtils.Lerp(-0.15f, 0.05f, num4)
395 * MathUtils.Lerp(0.8f, 1.2f, SimplexNoise.Noise((float)MathUtils.Remainder(3.0 * Time.RealTime + 200.0, 1000.0)))
396 );
397 m_pantingSound.Play();
398 }
399 else {
400 m_pantingSound.Stop();
401 }
402 float num6 = MathUtils.Saturate(3f * (0.33f - Stamina));
403 if (num6 > 0f
404 && SimplexNoise.Noise((float)MathUtils.Remainder(Time.RealTime, 1000.0)) < num6) {
406 }
407 else {
409 }
410 }
411 else {
412 Stamina = 1f;
414 }
415 }
416
417 public virtual void UpdateSleep() {
418 bool skipVanilla = false;
419 float modifiedSleep = Sleep;
420 float gameTimeDelta = m_subsystemTime.GameTimeDelta;
421
423 "OnVitalStatsUpdateSleep",
424 loader => {
425 loader.OnVitalStatsUpdateSleep(this, ref modifiedSleep, ref gameTimeDelta, ref skipVanilla);
426 return false;
427 }
428 );
429
430 if (skipVanilla) return;
431
432 bool flag = m_componentPlayer.ComponentBody.ImmersionFactor > 0.05f;
433 bool flag2 = m_subsystemTime.PeriodicGameTimeEvent(240.0, 9.0);
434 if (m_subsystemGameInfo.WorldSettings.GameMode != 0
435 && m_subsystemGameInfo.WorldSettings.AreAdventureSurvivalMechanicsEnabled) {
436 if (m_componentPlayer.ComponentSleep.SleepFactor == 1f) {
437 Sleep += 0.05f * gameTimeDelta;
438 }
439 else if (!flag
440 && (!m_lastAttackedTime.HasValue || m_subsystemTime.GameTime - m_lastAttackedTime > 10.0)) {
441 Sleep -= gameTimeDelta / 1800f;
442 if (Sleep < 0.075f
443 && (m_lastSleep >= 0.075f) | flag2) {
444 m_componentPlayer.ComponentGui.DisplaySmallMessage(LanguageControl.Get(fName, 19), Color.White, true, true);
445 m_componentPlayer.ComponentCreatureSounds.PlayMoanSound();
446 }
447 else if (Sleep < 0.2f
448 && (m_lastSleep >= 0.2f) | flag2) {
449 m_componentPlayer.ComponentGui.DisplaySmallMessage(LanguageControl.Get(fName, 20), Color.White, true, true);
450 m_componentPlayer.ComponentCreatureSounds.PlayMoanSound();
451 }
452 else if (Sleep < 0.33f
453 && (m_lastSleep >= 0.33f) | flag2) {
454 m_componentPlayer.ComponentGui.DisplaySmallMessage(LanguageControl.Get(fName, 21), Color.White, true, false);
455 }
456 else if (Sleep < 0.5f
457 && (m_lastSleep >= 0.5f) | flag2) {
458 m_componentPlayer.ComponentGui.DisplaySmallMessage(LanguageControl.Get(fName, 22), Color.White, true, false);
459 }
460 if (Sleep < 0.075f) {
461 float num = MathUtils.Lerp(0.05f, 0.2f, (0.075f - Sleep) / 0.075f);
462 float x = Sleep < 0.0375f ? m_random.Float(3f, 6f) : m_random.Float(2f, 4f);
463 if (m_random.Float(0f, 1f) < num * gameTimeDelta) {
465 m_componentPlayer.ComponentCreatureSounds.PlayMoanSound();
466 }
467 }
468 if (Sleep <= 0f
469 && !m_componentPlayer.ComponentSleep.IsSleeping) {
470 m_componentPlayer.ComponentSleep.Sleep(false);
471 m_componentPlayer.ComponentGui.DisplaySmallMessage(LanguageControl.Get(fName, 23), Color.White, true, true);
472 m_componentPlayer.ComponentCreatureSounds.PlayMoanSound();
473 }
474 }
475 }
476 else {
477 Sleep = 0.9f;
478 }
480 m_sleepBlackoutDuration -= gameTimeDelta;
481 float num2 = MathUtils.Saturate(0.5f * m_sleepBlackoutDuration);
483 if (!m_componentPlayer.ComponentSleep.IsSleeping) {
484 m_componentPlayer.ComponentScreenOverlays.BlackoutFactor = MathF.Max(
486 m_componentPlayer.ComponentScreenOverlays.BlackoutFactor
487 );
488 if (m_sleepBlackoutFactor > 0.01) {
489 m_componentPlayer.ComponentScreenOverlays.FloatingMessage = LanguageControl.Get(fName, 24);
490 m_componentPlayer.ComponentScreenOverlays.FloatingMessageFactor = MathUtils.Saturate(10f * (m_sleepBlackoutFactor - 0.9f));
491 }
492 }
493 }
494
495 public virtual void UpdateTemperature() {
496 bool skipVanilla = false;
497 float modifiedTemperature = Temperature;
498 float gameTimeDelta = m_subsystemTime.GameTimeDelta;
499
501 "OnVitalStatsUpdateTemperature",
502 loader => {
503 loader.OnVitalStatsUpdateTemperature(this, ref modifiedTemperature, ref gameTimeDelta, ref skipVanilla);
504 return false;
505 }
506 );
507
508 if (skipVanilla) return;
509
510 bool flag = m_subsystemTime.PeriodicGameTimeEvent(300.0, 17.0);
511 float num = m_componentPlayer.ComponentClothing.Insulation * MathUtils.Lerp(1f, 0.05f, MathUtils.Saturate(4f * Wetness));
512 if (m_subsystemGameInfo.WorldSettings.GameMode <= GameMode.Survival) {
513 num = num * 1.5f + 1f;
514 }
515 string arg;
516 ClothingSlot leastInsulatedSlot = m_componentPlayer.ComponentClothing.LeastInsulatedSlot;
517 arg = leastInsulatedSlot.MessageWhenLeastInsulated;
518 if (m_subsystemTime.PeriodicGameTimeEvent(1.0, 1.0 * (GetHashCode() % 1000 / 1000.0))) {
519 int x = Terrain.ToCell(m_componentPlayer.ComponentBody.Position.X);
520 int y = Terrain.ToCell(m_componentPlayer.ComponentBody.Position.Y + 0.1f);
521 int z = Terrain.ToCell(m_componentPlayer.ComponentBody.Position.Z);
522 m_subsystemMetersBlockBehavior.CalculateTemperature(
523 x,
524 y,
525 z,
526 12f,
527 num,
531 );
532 }
533 if (m_subsystemGameInfo.WorldSettings.GameMode != 0
534 && m_subsystemGameInfo.WorldSettings.AreAdventureSurvivalMechanicsEnabled) {
535 float num2 = m_targetTemperature - Temperature;
536 Temperature += MathUtils.Saturate(m_targetTemperatureFlux * gameTimeDelta) * num2;
537 }
538 else {
539 Temperature = 12f;
540 }
541 if (Temperature <= 0f) {
542 m_componentPlayer.ComponentHealth.Injure(1f, null, false, LanguageControl.Get(fName, 25));
543 }
544 else if (Temperature < 3f) {
545 if (m_subsystemTime.PeriodicGameTimeEvent(10.0, 0.0)) {
546 m_componentPlayer.ComponentHealth.Injure(0.05f, null, false, LanguageControl.Get(fName, 26));
547 string text = Wetness > 0f ? string.Format(LanguageControl.Get(fName, 27), arg) :
548 !(num < 1f) ? string.Format(LanguageControl.Get(fName, 28), arg) : string.Format(LanguageControl.Get(fName, 29), arg);
549 m_componentPlayer.ComponentGui.DisplaySmallMessage(text, Color.White, true, false);
550 m_componentPlayer.ComponentGui.TemperatureBarWidget.Flash(10);
551 }
552 }
553 else if (Temperature < 6f
554 && (m_lastTemperature >= 6f) | flag) {
555 string text2 = Wetness > 0f ? string.Format(LanguageControl.Get(fName, 30), arg) :
556 !(num < 1f) ? string.Format(LanguageControl.Get(fName, 31), arg) : string.Format(LanguageControl.Get(fName, 32), arg);
557 m_componentPlayer.ComponentGui.DisplaySmallMessage(text2, Color.White, true, true);
558 m_componentPlayer.ComponentGui.TemperatureBarWidget.Flash(10);
559 }
560 else if (Temperature < 8f
561 && (m_lastTemperature >= 8f) | flag) {
562 m_componentPlayer.ComponentGui.DisplaySmallMessage(LanguageControl.Get(fName, 33), Color.White, false, false);
563 m_componentPlayer.ComponentGui.TemperatureBarWidget.Flash(10);
564 }
565 if (Temperature >= 24f) {
566 if (m_subsystemTime.PeriodicGameTimeEvent(10.0, 0.0)) {
567 m_componentPlayer.ComponentGui.DisplaySmallMessage(LanguageControl.Get(fName, 34), Color.White, true, false);
568 m_componentPlayer.ComponentHealth.Injure(0.05f, null, false, LanguageControl.Get(fName, 35));
569 m_componentPlayer.ComponentGui.TemperatureBarWidget.Flash(10);
570 }
571 if (m_subsystemTime.PeriodicGameTimeEvent(8.0, 0.0)) {
573 m_componentPlayer.ComponentCreatureSounds.PlayMoanSound();
574 }
575 }
576 else if (Temperature > 20f
577 && m_subsystemTime.PeriodicGameTimeEvent(10.0, 0.0)) {
578 m_componentPlayer.ComponentGui.DisplaySmallMessage(LanguageControl.Get(fName, 36), Color.White, true, false);
580 m_componentPlayer.ComponentGui.TemperatureBarWidget.Flash(10);
581 m_componentPlayer.ComponentCreatureSounds.PlayMoanSound();
582 }
584 m_componentPlayer.ComponentScreenOverlays.IceFactor = MathUtils.Saturate(1f - Temperature / 6f);
585 m_temperatureBlackoutDuration -= gameTimeDelta;
588 m_componentPlayer.ComponentScreenOverlays.BlackoutFactor = MathF.Max(
590 m_componentPlayer.ComponentScreenOverlays.BlackoutFactor
591 );
592 if (m_temperatureBlackoutFactor > 0.01) {
593 m_componentPlayer.ComponentScreenOverlays.FloatingMessage = LanguageControl.Get(fName, 37);
594 m_componentPlayer.ComponentScreenOverlays.FloatingMessageFactor = MathUtils.Saturate(10f * (m_temperatureBlackoutFactor - 0.9f));
595 }
596 if (m_targetTemperature > 22f) {
597 m_componentPlayer.ComponentGui.TemperatureBarWidget.BarSubtexture = ContentManager.Get<Subtexture>("Textures/Atlas/Temperature6");
598 }
599 else if (m_targetTemperature > 18f) {
600 m_componentPlayer.ComponentGui.TemperatureBarWidget.BarSubtexture = ContentManager.Get<Subtexture>("Textures/Atlas/Temperature5");
601 }
602 else if (m_targetTemperature > 14f) {
603 m_componentPlayer.ComponentGui.TemperatureBarWidget.BarSubtexture = ContentManager.Get<Subtexture>("Textures/Atlas/Temperature4");
604 }
605 else if (m_targetTemperature > 10f) {
606 m_componentPlayer.ComponentGui.TemperatureBarWidget.BarSubtexture = ContentManager.Get<Subtexture>("Textures/Atlas/Temperature3");
607 }
608 else if (m_targetTemperature > 6f) {
609 m_componentPlayer.ComponentGui.TemperatureBarWidget.BarSubtexture = ContentManager.Get<Subtexture>("Textures/Atlas/Temperature2");
610 }
611 else {
612 m_componentPlayer.ComponentGui.TemperatureBarWidget.BarSubtexture = m_targetTemperature > 2f
613 ? ContentManager.Get<Subtexture>("Textures/Atlas/Temperature1")
614 : ContentManager.Get<Subtexture>("Textures/Atlas/Temperature0");
615 }
616 }
617
618 public virtual void UpdateWetness() {
619 bool skipVanilla = false;
620 float modifiedWetness = Wetness;
621 float gameTimeDelta = m_subsystemTime.GameTimeDelta;
622
624 "OnVitalStatsUpdateWetness",
625 loader => {
626 loader.OnVitalStatsUpdateWetness(this, ref modifiedWetness, ref gameTimeDelta, ref skipVanilla);
627 return false;
628 }
629 );
630
631 if (skipVanilla) return;
632
633 Wetness += gameTimeDelta * m_componentPlayer.ComponentLevel.GetOtherFactorResult("Wetness");
634 if (m_subsystemGameInfo.WorldSettings.GameMode != 0
635 && m_subsystemGameInfo.WorldSettings.AreAdventureSurvivalMechanicsEnabled) {
636 if (Wetness > 0.8f
637 && m_lastWetness <= 0.8f) {
639 Time.FrameStartTime + 2.0,
640 delegate {
641 if (Wetness > 0.8f) {
642 m_componentPlayer.ComponentGui.DisplaySmallMessage(LanguageControl.Get(fName, 38), Color.White, true, true);
643 }
644 }
645 );
646 }
647 else if (Wetness > 0.2f
648 && m_lastWetness <= 0.2f) {
650 Time.FrameStartTime + 2.0,
651 delegate {
652 if (Wetness > 0.2f
653 && Wetness <= 0.8f
654 && Wetness > m_lastWetness) {
655 m_componentPlayer.ComponentGui.DisplaySmallMessage(LanguageControl.Get(fName, 39), Color.White, true, true);
656 }
657 }
658 );
659 }
660 else if (Wetness <= 0f
661 && m_lastWetness > 0f) {
663 Time.FrameStartTime + 2.0,
664 delegate {
665 if (Wetness <= 0f) {
666 m_componentPlayer.ComponentGui.DisplaySmallMessage(LanguageControl.Get(fName, 40), Color.White, true, true);
667 }
668 }
669 );
670 }
671 }
672 m_lastWetness = Wetness;
673 }
674
675 public virtual void ApplyDensityModifier(float modifier) {
676 float num = modifier - m_densityModifierApplied;
677 if (num != 0f) {
678 m_densityModifierApplied = modifier;
679 m_componentPlayer.ComponentBody.Density += num;
680 }
681 }
682 }
683}
static float Remainder(float x, float y)
static float Saturate(float x)
static float Lerp(float x1, float x2, float f)
static double RealTime
定义 Time.cs:38
static void QueueTimeDelayedExecution(double time, Action action)
定义 Time.cs:69
static double FrameStartTime
定义 Time.cs:42
static float ToEnginePitch(float pitch)
virtual float GetNutritionalValue(int value)
virtual float GetSicknessProbability(int value)
virtual string MessageWhenLeastInsulated
virtual void MakeSleepy(float sleepValue)
Dictionary< int, float > m_satiation
override void Save(ValuesDictionary valuesDictionary, EntityToIdMap entityToIdMap)
List< KeyValuePair< int, float > > m_satiationList
SubsystemMetersBlockBehavior m_subsystemMetersBlockBehavior
override void Load(ValuesDictionary valuesDictionary, IdToEntityMap idToEntityMap)
virtual void ApplyDensityModifier(float modifier)
ValuesDictionary VitalStatsForMods
1.8.1.2添加: 用于多模组控制同一项参数 例如:VitalStatsForMods["Water"]表示水份值
static object Get(Type type, string name)
static string Get(string className, int key)
获取在当前语言类名键对应的字符串
static float Noise(float x)
static int ExtractContents(int value)
static int ToCell(float x)
ValuesDictionary ValuesDictionary
static void HookAction(string HookName, Func< ModLoader, bool > action)
执行Hook
static Color White