Survivalcraft API 1.8.2.3 v1.8.2.3
Survivalcraft 2.4
载入中...
搜索中...
未找到
ComponentFishOutOfWaterBehavior.cs
浏览该文件的文档.
1using Engine;
4
5namespace Game {
8
10
12
14
16
17 public float m_importanceLevel;
18
19 public float m_outOfWaterTime;
20
22
23 public Random m_random = new();
24
26
27 public override float ImportanceLevel => m_importanceLevel;
28
29 public virtual void Update(float dt) {
30 m_stateMachine.Update();
31 }
32
33 public override void Load(ValuesDictionary valuesDictionary, IdToEntityMap idToEntityMap) {
34 m_subsystemTerrain = Project.FindSubsystem<SubsystemTerrain>(true);
35 m_subsystemTime = Project.FindSubsystem<SubsystemTime>(true);
36 m_componentCreature = Entity.FindComponent<ComponentCreature>(true);
37 m_componentFishModel = Entity.FindComponent<ComponentFishModel>(true);
38 m_stateMachine.AddState(
39 "Inactive",
40 null,
41 delegate {
42 if (IsOutOfWater()) {
43 m_outOfWaterTime += m_subsystemTime.GameTimeDelta;
44 }
45 else {
47 }
48 if (m_outOfWaterTime > 3f) {
49 m_importanceLevel = 1000f;
50 }
51 if (IsActive) {
52 m_stateMachine.TransitionTo("Jump");
53 }
54 },
55 null
56 );
57 m_stateMachine.AddState(
58 "Jump",
59 null,
60 delegate {
61 m_componentFishModel.BendOrder = 2f
62 * (2f
65 (float)MathUtils.Remainder(m_subsystemTime.GameTime, 1000.0),
66 1.2f * m_componentCreature.ComponentLocomotion.TurnSpeed,
67 1,
68 1f,
69 1f
70 )
71 )
72 - 1f);
73 if (!IsActive) {
74 m_stateMachine.TransitionTo("Inactive");
75 }
76 if (!IsOutOfWater()) {
78 }
79 if (m_random.Float(0f, 1f) < 2.5f * m_subsystemTime.GameTimeDelta) {
80 m_componentCreature.ComponentLocomotion.JumpOrder = m_random.Float(0.33f, 1f);
81 m_direction = new Vector2(MathF.Sign(m_componentFishModel.BendOrder.Value), 0f);
82 }
83 if (!m_componentCreature.ComponentBody.StandingOnValue.HasValue) {
84 m_componentCreature.ComponentLocomotion.TurnOrder = new Vector2(0f - m_componentFishModel.BendOrder.Value, 0f);
85 m_componentCreature.ComponentLocomotion.WalkOrder = m_direction;
86 }
87 },
88 null
89 );
90 m_stateMachine.TransitionTo("Inactive");
91 }
92
93 public virtual bool IsOutOfWater() => m_componentCreature.ComponentBody.ImmersionFactor < 0.33f;
94
95 public virtual Vector3? FindDestination() {
96 for (int i = 0; i < 8; i++) {
97 Vector2 vector = m_random.Vector2(1f, 1f);
98 float y = 0.2f * m_random.Float(-0.8f, 1f);
99 Vector3 v = Vector3.Normalize(new Vector3(vector.X, y, vector.Y));
100 Vector3 vector2 = m_componentCreature.ComponentBody.Position + m_random.Float(8f, 16f) * v;
101 TerrainRaycastResult? terrainRaycastResult = m_subsystemTerrain.Raycast(
102 m_componentCreature.ComponentBody.Position,
103 vector2,
104 false,
105 false,
106 delegate(int value, float _) {
107 int num = Terrain.ExtractContents(value);
108 return !(BlocksManager.Blocks[num] is WaterBlock);
109 }
110 );
111 if (!terrainRaycastResult.HasValue) {
112 return vector2;
113 }
114 if (terrainRaycastResult.Value.Distance > 4f) {
115 return m_componentCreature.ComponentBody.Position + v * terrainRaycastResult.Value.Distance;
116 }
117 }
118 return null;
119 }
120 }
121}
Engine.Vector3 Vector3
static float Remainder(float x, float y)
static float Saturate(float x)
override void Load(ValuesDictionary valuesDictionary, IdToEntityMap idToEntityMap)
static float OctavedNoise(float x, float frequency, int octaves, float frequencyStep, float amplitudeStep, bool ridged=false)
static int ExtractContents(int value)
ValuesDictionary ValuesDictionary
static Vector3 Normalize(Vector3 v)