Survivalcraft API 1.8.2.3 v1.8.2.3
Survivalcraft 2.4
载入中...
搜索中...
未找到
ComponentSickness.cs
浏览该文件的文档.
1using Engine;
4
5namespace Game {
13
14 public float m_sicknessDuration;
15 public float m_greenoutDuration;
16 public float m_greenoutFactor;
17 public double? m_lastNauseaTime;
18 public double? m_lastMessageTime;
19 public double? m_lastPukeTime;
20 public const string fName = "ComponentSickness";
21
22 public bool IsSick => m_sicknessDuration > 0f;
23
24 public bool IsPuking => m_pukeParticleSystem != null;
25
27
28 public virtual void StartSickness() {
29 if (m_sicknessDuration == 0f) {
30 m_componentPlayer.PlayerStats.TimesWasSick++;
31 }
32 m_sicknessDuration = 900f;
33 }
34
35 public virtual void NauseaEffect() {
37 m_componentPlayer.ComponentCreatureSounds.PlayMoanSound();
38 float injury = MathUtils.Min(0.1f, m_componentPlayer.ComponentHealth.Health - 0.075f);
39 if (injury > 0f) {
40 m_subsystemTime.QueueGameTimeDelayedExecution(
41 m_subsystemTime.GameTime + 0.75,
42 delegate { m_componentPlayer.ComponentHealth.Injure(injury, null, false, LanguageControl.Get(fName, 1)); }
43 );
44 }
45 if (m_pukeParticleSystem == null
46 && (!m_lastPukeTime.HasValue || m_subsystemTime.GameTime - m_lastPukeTime > 50.0)) {
50 m_componentPlayer.ComponentCreatureSounds.PlayPukeSound();
51 Project.FindSubsystem<SubsystemNoise>(true).MakeNoise(m_componentPlayer.ComponentBody.Position, 0.25f, 10f);
52 m_greenoutDuration = 0.8f;
53 m_componentPlayer.PlayerStats.TimesPuked++;
54 }
55 else {
56 m_greenoutDuration = MathUtils.Lerp(4f, 2f, m_componentPlayer.ComponentHealth.Health);
57 if (!m_lastMessageTime.HasValue
60 m_subsystemTime.QueueGameTimeDelayedExecution(
61 m_subsystemTime.GameTime + 1.5,
62 delegate {
63 m_componentPlayer.ComponentGui.DisplaySmallMessage(LanguageControl.Get(fName, 2), Color.White, true, true);
64 }
65 );
66 }
67 }
68 }
69
70 public virtual void Update(float dt) {
71 if (m_subsystemGameInfo.WorldSettings.GameMode == GameMode.Creative
72 || !m_subsystemGameInfo.WorldSettings.AreAdventureSurvivalMechanicsEnabled) {
74 return;
75 }
76 if (m_sicknessDuration > 0f) {
78 if (m_componentPlayer.ComponentHealth.Health > 0f
79 && !m_componentPlayer.ComponentSleep.IsSleeping
80 && m_subsystemTime.PeriodicGameTimeEvent(3.0, -0.0099999997764825821)
81 && (!m_lastNauseaTime.HasValue || m_subsystemTime.GameTime - m_lastNauseaTime > 15.0)) {
83 }
84 }
85 if (m_pukeParticleSystem != null) {
86 float num = MathUtils.DegToRad(
87 MathUtils.Lerp(-35f, -60f, SimplexNoise.Noise(2f * (float)MathUtils.Remainder(m_subsystemTime.GameTime, 10000.0)))
88 );
89 m_componentPlayer.ComponentLocomotion.LookOrder = new Vector2(
90 m_componentPlayer.ComponentLocomotion.LookOrder.X,
91 Math.Clamp(num - m_componentPlayer.ComponentLocomotion.LookAngles.Y, -2f, 2f)
92 );
93 Vector3 upVector = m_componentPlayer.ComponentCreatureModel.EyeRotation.GetUpVector();
94 Vector3 forwardVector = m_componentPlayer.ComponentCreatureModel.EyeRotation.GetForwardVector();
95 m_pukeParticleSystem.Position = m_componentPlayer.ComponentCreatureModel.EyePosition - 0.08f * upVector + 0.3f * forwardVector;
96 m_pukeParticleSystem.Direction = Vector3.Normalize(forwardVector + 0.5f * upVector);
97 if (m_pukeParticleSystem.IsStopped) {
99 }
100 }
101 if (m_greenoutDuration > 0f) {
103 m_greenoutFactor = MathUtils.Min(m_greenoutFactor + 0.5f * dt, 0.95f);
104 }
105 else if (m_greenoutFactor > 0f) {
107 }
108 m_componentPlayer.ComponentScreenOverlays.GreenoutFactor = MathUtils.Max(
110 m_componentPlayer.ComponentScreenOverlays.GreenoutFactor
111 );
112 }
113
114 public override void Load(ValuesDictionary valuesDictionary, IdToEntityMap idToEntityMap) {
115 m_subsystemGameInfo = Project.FindSubsystem<SubsystemGameInfo>(true);
116 m_subsystemTerrain = Project.FindSubsystem<SubsystemTerrain>(true);
117 m_subsystemTime = Project.FindSubsystem<SubsystemTime>(true);
118 m_subsystemParticles = Project.FindSubsystem<SubsystemParticles>(true);
119 m_componentPlayer = Entity.FindComponent<ComponentPlayer>(true);
120 m_sicknessDuration = valuesDictionary.GetValue<float>("SicknessDuration");
121 }
122
123 public override void Save(ValuesDictionary valuesDictionary, EntityToIdMap entityToIdMap) {
124 valuesDictionary.SetValue("SicknessDuration", m_sicknessDuration);
125 }
126 }
127}
static float Remainder(float x, float y)
static int Min(int x1, int x2)
static int Max(int x1, int x2)
static float DegToRad(float degrees)
static float Lerp(float x1, float x2, float f)
static double FrameStartTime
定义 Time.cs:42
SubsystemParticles m_subsystemParticles
SubsystemTerrain m_subsystemTerrain
SubsystemGameInfo m_subsystemGameInfo
override void Load(ValuesDictionary valuesDictionary, IdToEntityMap idToEntityMap)
override void Save(ValuesDictionary valuesDictionary, EntityToIdMap entityToIdMap)
PukeParticleSystem m_pukeParticleSystem
virtual void Update(float dt)
static float Noise(float x)
ValuesDictionary ValuesDictionary
static Vector3 Normalize(Vector3 v)