Survivalcraft API 1.8.2.3 v1.8.2.3
Survivalcraft 2.4
载入中...
搜索中...
未找到
ComponentSteedBehavior.cs
浏览该文件的文档.
1using Engine;
4
5namespace Game {
8
10
12
14
16
18
19 public float m_importanceLevel;
20
21 public bool m_isEnabled;
22
23 public Random m_random = new();
24
25 public DynamicArray<ComponentBody> m_bodies = [];
26
27 public float[] m_speedLevels = [-0.33f, 0f, 0.33f, 0.66f, 1f];
28
29 public int m_speedLevel;
30
31 public float m_speed;
32
33 public float m_turnSpeed;
34
35 public float m_speedChangeFactor;
36
38
39 public double m_lastNotBlockedTime;
40
41 public int SpeedOrder { get; set; }
42
43 public float TurnOrder { get; set; }
44
45 public float JumpOrder { get; set; }
46
47 public bool WasOrderIssued { get; set; }
48
50
51 public override float ImportanceLevel => m_importanceLevel;
52
53 public virtual void Update(float dt) {
54 m_stateMachine.Update();
55 if (SpeedOrder != 0
56 || TurnOrder != 0f
57 || JumpOrder != 0f) {
58 SpeedOrder = 0;
59 TurnOrder = 0f;
60 JumpOrder = 0f;
61 WasOrderIssued = true;
62 }
63 else {
64 WasOrderIssued = false;
65 }
66 if (m_subsystemTime.PeriodicGameTimeEvent(1.0, GetHashCode() % 100 * 0.01f)) {
68 if (m_isEnabled) {
69 if (m_componentMount.Rider != null) {
70 m_importanceLevel = 275f;
71 }
72 else if (FindNearbyRider(7f) != null) {
74 }
75 }
76 }
77 if (!IsActive) {
78 m_stateMachine.TransitionTo("Inactive");
79 }
80 }
81
82 public override void Load(ValuesDictionary valuesDictionary, IdToEntityMap idToEntityMap) {
83 m_subsystemTime = Project.FindSubsystem<SubsystemTime>(true);
84 m_subsystemBodies = Project.FindSubsystem<SubsystemBodies>(true);
85 m_componentCreature = Entity.FindComponent<ComponentCreature>(true);
87 m_componentMount = Entity.FindComponent<ComponentMount>(true);
88 m_isEnabled = Entity.ValuesDictionary.DatabaseObject.Name.EndsWith("_Saddled");
89 m_stateMachine.AddState(
90 "Inactive",
91 null,
92 delegate {
93 if (IsActive) {
94 m_stateMachine.TransitionTo("Wait");
95 }
96 },
97 null
98 );
99 m_stateMachine.AddState(
100 "Wait",
101 delegate {
102 ComponentRider componentRider = FindNearbyRider(6f);
103 if (componentRider != null) {
104 m_componentPathfinding.SetDestination(
106 m_random.Float(0.2f, 0.3f),
107 3.25f,
108 0,
109 false,
110 true,
111 false,
112 null
113 );
114 if (m_random.Float(0f, 1f) < 0.5f) {
115 m_componentCreature.ComponentCreatureSounds.PlayIdleSound(true);
116 }
117 }
118 },
119 delegate {
120 if (m_componentMount.Rider != null) {
121 m_stateMachine.TransitionTo("Steed");
122 }
123 m_componentCreature.ComponentCreatureModel.LookRandomOrder = true;
124 },
125 null
126 );
127 m_stateMachine.AddState(
128 "Steed",
129 delegate {
131 m_speed = 0f;
132 m_speedLevel = 1;
133 },
134 delegate { ProcessRidingOrders(); },
135 null
136 );
137 m_stateMachine.TransitionTo("Inactive");
138 }
139
140 public virtual ComponentRider FindNearbyRider(float range) {
141 m_bodies.Clear();
142 m_subsystemBodies.FindBodiesAroundPoint(
143 new Vector2(m_componentCreature.ComponentBody.Position.X, m_componentCreature.ComponentBody.Position.Z),
144 range,
146 );
147 foreach (ComponentBody body in m_bodies) {
148 if (Vector3.DistanceSquared(m_componentCreature.ComponentBody.Position, body.Position) < range * range) {
149 ComponentRider componentRider = body.Entity.FindComponent<ComponentRider>();
150 if (componentRider != null) {
151 return componentRider;
152 }
153 }
154 }
155 return null;
156 }
157
158 public virtual void ProcessRidingOrders() {
159 m_speedLevel = Math.Clamp(m_speedLevel + SpeedOrder, 0, m_speedLevels.Length - 1);
160 if (m_speedLevel == m_speedLevels.Length - 1
161 && SpeedOrder > 0) {
162 m_timeToSpeedReduction = m_random.Float(8f, 12f);
163 }
164 if (m_speedLevel == 0
165 && SpeedOrder < 0) {
167 }
169 if (m_timeToSpeedReduction <= 0f
170 && m_speedLevel == m_speedLevels.Length - 1) {
171 m_speedLevel--;
172 m_speedChangeFactor = 0.25f;
173 }
174 else if (m_timeToSpeedReduction <= 0f
175 && m_speedLevel == 0) {
176 m_speedLevel = 1;
177 m_speedChangeFactor = 100f;
178 }
179 else {
180 m_speedChangeFactor = 100f;
181 }
182 if (m_subsystemTime.PeriodicGameTimeEvent(0.25, 0.0)) {
183 float num = new Vector2(
184 m_componentCreature.ComponentBody.CollisionVelocityChange.X,
185 m_componentCreature.ComponentBody.CollisionVelocityChange.Z
186 ).Length();
187 if (m_speedLevel == 0
188 || num < 0.1f
189 || m_componentCreature.ComponentBody.Velocity.Length()
190 > MathF.Abs(0.5f * m_speed * m_componentCreature.ComponentLocomotion.WalkSpeed)) {
192 }
193 else if (m_subsystemTime.GameTime - m_lastNotBlockedTime > 0.75) {
194 m_speedLevel = 1;
195 }
196 }
198 m_turnSpeed += 2f * m_subsystemTime.GameTimeDelta * (Math.Clamp(TurnOrder, -0.5f, 0.5f) - m_turnSpeed);
199 m_componentCreature.ComponentLocomotion.TurnOrder = new Vector2(m_turnSpeed, 0f);
200 m_componentCreature.ComponentLocomotion.WalkOrder = new Vector2(0f, m_speed);
201 if (MathF.Abs(m_speed) > 0.01f
202 || MathF.Abs(m_turnSpeed) > 0.01f) {
203 m_componentCreature.ComponentLocomotion.LookOrder = new Vector2(2f * m_turnSpeed, 0f)
204 - m_componentCreature.ComponentLocomotion.LookAngles;
205 }
206 m_componentCreature.ComponentLocomotion.JumpOrder = MathF.Max(m_componentCreature.ComponentLocomotion.JumpOrder, JumpOrder);
207 }
208 }
209}
static float Saturate(float x)
ComponentCreature ComponentCreature
DynamicArray< ComponentBody > m_bodies
override void Load(ValuesDictionary valuesDictionary, IdToEntityMap idToEntityMap)
virtual ComponentRider FindNearbyRider(float range)
ValuesDictionary ValuesDictionary
Component FindComponent(Type type, string name, bool throwOnError)
static float DistanceSquared(Vector3 v1, Vector3 v2)