Survivalcraft API 1.8.2.3 v1.8.2.3
Survivalcraft 2.4
载入中...
搜索中...
未找到
ComponentRider.cs
浏览该文件的文档.
1using Engine;
4
5namespace Game {
8
10
11 public DynamicArray<ComponentBody> m_componentBodies = [];
12
14
15 public float m_animationTime;
16
17 public bool m_isAnimating;
18
19 public bool m_isDismounting;
20
22
24
25 public float m_outOfMountTime;
26
27 public float DetectSurroundingMountRange = 2.5f;
29
31 get {
32 if (ComponentCreature.ComponentBody.ParentBody != null) {
33 return ComponentCreature.ComponentBody.ParentBody.Entity.FindComponent<ComponentMount>();
34 }
35 return null;
36 }
37 }
38
40
42 Vector2 point = new(ComponentCreature.ComponentBody.Position.X, ComponentCreature.ComponentBody.Position.Z);
43 m_componentBodies.Clear();
45 float num = 0f;
46 ComponentMount result = null;
47 foreach (ComponentMount item in from b in m_componentBodies
48 select b.Entity.FindComponent<ComponentMount>()
49 into m
50 where m != null && m.Entity != Entity
51 select m) {
52 float allowToStartRange = item.MountAllowToStartRange;
53 float num2 = ScoreMount(item, allowToStartRange);
54 if (num2 > num) {
55 num = num2;
56 result = item;
57 }
58 }
59 return result;
60 }
61
62 public virtual void StartMounting(ComponentMount componentMount) {
63 if (!m_isAnimating
64 && Mount == null) {
65 m_isAnimating = true;
66 m_animationTime = 0f;
67 m_isDismounting = false;
68 ComponentCreature.ComponentBody.ParentBody = componentMount.ComponentBody;
69 ComponentCreature.ComponentBody.ParentBodyPositionOffset = Vector3.Transform(
70 ComponentCreature.ComponentBody.Position - componentMount.ComponentBody.Position,
72 );
73 ComponentCreature.ComponentBody.ParentBodyRotationOffset = Quaternion.Conjugate(componentMount.ComponentBody.Rotation)
74 * ComponentCreature.ComponentBody.Rotation;
75 m_targetPositionOffset = componentMount.MountOffset + m_riderOffset;
77 ComponentCreature.ComponentLocomotion.IsCreativeFlyEnabled = false;
78 }
79 }
80
81 public virtual void StartDismounting() {
82 if (!m_isAnimating
83 && Mount != null) {
84 float x = 0f;
85 if (Mount.DismountOffset.X > 0f) {
86 float s = Mount.DismountOffset.X + 0.5f;
87 Vector3 vector = 0.5f * (ComponentCreature.ComponentBody.BoundingBox.Min + ComponentCreature.ComponentBody.BoundingBox.Max);
88 TerrainRaycastResult? terrainRaycastResult = m_subsystemTerrain.Raycast(
89 vector,
90 vector - s * ComponentCreature.ComponentBody.Matrix.Right,
91 false,
92 true,
93 null
94 );
95 TerrainRaycastResult? terrainRaycastResult2 = m_subsystemTerrain.Raycast(
96 vector,
97 vector + s * ComponentCreature.ComponentBody.Matrix.Right,
98 false,
99 true,
100 null
101 );
102 x = !terrainRaycastResult.HasValue ? 0f - Mount.DismountOffset.X :
103 !terrainRaycastResult2.HasValue ? Mount.DismountOffset.X :
104 !(terrainRaycastResult.Value.Distance > terrainRaycastResult2.Value.Distance) ?
105 MathUtils.Min(terrainRaycastResult2.Value.Distance, Mount.DismountOffset.X) :
106 0f - MathUtils.Min(terrainRaycastResult.Value.Distance, Mount.DismountOffset.X);
107 }
108 m_isAnimating = true;
109 m_animationTime = 0f;
110 m_isDismounting = true;
111 m_targetPositionOffset = Mount.MountOffset + m_riderOffset + new Vector3(x, Mount.DismountOffset.Y, Mount.DismountOffset.Z);
113 }
114 }
115
116 public virtual void Update(float dt) {
117 if (m_isAnimating) {
118 float f = 8f * dt;
119 ComponentBody componentBody = ComponentCreature.ComponentBody;
120 componentBody.ParentBodyPositionOffset = Vector3.Lerp(componentBody.ParentBodyPositionOffset, m_targetPositionOffset, f);
121 componentBody.ParentBodyRotationOffset = Quaternion.Slerp(componentBody.ParentBodyRotationOffset, m_targetRotationOffset, f);
122 m_animationTime += dt;
124 || m_animationTime > 0.75f) {
125 m_isAnimating = false;
126 if (m_isDismounting) {
127 if (componentBody.ParentBody != null) {
128 componentBody.Velocity = componentBody.ParentBody.Velocity;
129 componentBody.ParentBody = null;
130 }
131 }
132 else {
133 componentBody.ParentBodyPositionOffset = m_targetPositionOffset;
134 componentBody.ParentBodyRotationOffset = m_targetRotationOffset;
135 m_outOfMountTime = 0f;
136 }
137 }
138 }
139 ComponentMount mount = Mount;
140 if (mount != null
141 && !m_isAnimating) {
142 ComponentBody componentBody2 = ComponentCreature.ComponentBody;
143 ComponentBody parentBody = ComponentCreature.ComponentBody.ParentBody;
145 parentBody.Position + Vector3.Transform(componentBody2.ParentBodyPositionOffset, parentBody.Rotation),
146 componentBody2.Position
147 )
148 > 0.160000011f) {
149 m_outOfMountTime += dt;
150 }
151 else {
152 m_outOfMountTime = 0f;
153 }
154 ComponentHealth componentHealth = mount.Entity.FindComponent<ComponentHealth>();
155 if (m_outOfMountTime > 0.1f
156 || (componentHealth != null && componentHealth.Health <= 0f)
157 || ComponentCreature.ComponentHealth.Health <= 0f) {
159 }
160 ComponentCreature.ComponentBody.ParentBodyPositionOffset = mount.MountOffset + m_riderOffset;
161 ComponentCreature.ComponentBody.ParentBodyRotationOffset = Quaternion.Identity;
162 }
163 }
164
165 public override void Load(ValuesDictionary valuesDictionary, IdToEntityMap idToEntityMap) {
166 m_subsystemBodies = Project.FindSubsystem<SubsystemBodies>(true);
167 m_subsystemTerrain = Project.FindSubsystem<SubsystemTerrain>(true);
168 ComponentCreature = Entity.FindComponent<ComponentCreature>(true);
169 m_riderOffset = valuesDictionary.GetValue<Vector3>("RiderOffset");
170 }
171
172 public virtual float ScoreMount(ComponentMount componentMount, float maxDistance) {
173 float? score = null;
174 bool modDisallows = false;
176 "ScoreMount",
177 modLoader => {
178 modLoader.ScoreMount(this, componentMount, out float? scoreByMod);
179 if (scoreByMod.HasValue
180 && scoreByMod < 0) {
181 modDisallows = true;
182 }
183 if (scoreByMod.HasValue) {
184 score = MathUtils.Max(score ?? float.MinValue, scoreByMod.Value);
185 }
186 return false;
187 }
188 );
189 if (modDisallows) {
190 return -1;
191 }
192 if (score.HasValue) {
193 return score.Value;
194 }
195 if (componentMount.ComponentBody.Velocity.LengthSquared() < 1f) {
196 Vector3 v = componentMount.ComponentBody.Position
197 + Vector3.Transform(componentMount.MountOffset, componentMount.ComponentBody.Rotation)
198 - ComponentCreature.ComponentCreatureModel.EyePosition;
199 if (v.Length() < maxDistance) {
200 Vector3 forward = Matrix.CreateFromQuaternion(ComponentCreature.ComponentCreatureModel.EyeRotation).Forward;
201 if (Vector3.Dot(Vector3.Normalize(v), forward) > 0.33f) {
202 return maxDistance - v.Length();
203 }
204 }
205 }
206 return 0f;
207 }
208 }
209}
Engine.Vector3 Vector3
static int Min(int x1, int x2)
static int Max(int x1, int x2)
static float DegToRad(float degrees)
virtual Vector3 ParentBodyPositionOffset
virtual ComponentBody ParentBody
virtual Quaternion ParentBodyRotationOffset
virtual ComponentMount FindNearestMount()
SubsystemBodies m_subsystemBodies
ComponentCreature ComponentCreature
virtual float ScoreMount(ComponentMount componentMount, float maxDistance)
virtual void StartMounting(ComponentMount componentMount)
DynamicArray< ComponentBody > m_componentBodies
override void Load(ValuesDictionary valuesDictionary, IdToEntityMap idToEntityMap)
virtual void StartDismounting()
virtual void Update(float dt)
SubsystemTerrain m_subsystemTerrain
ValuesDictionary ValuesDictionary
Component FindComponent(Type type, string name, bool throwOnError)
static void HookAction(string HookName, Func< ModLoader, bool > action)
执行Hook
static Matrix CreateFromQuaternion(Quaternion quaternion)
Vector3 Forward
static readonly Quaternion Identity
static Quaternion Conjugate(Quaternion q)
static Quaternion Slerp(Quaternion q1, Quaternion q2, float f)
static Quaternion CreateFromAxisAngle(Vector3 axis, float angle)
static float DistanceSquared(Vector3 v1, Vector3 v2)
static Vector3 Lerp(Vector3 v1, Vector3 v2, float f)
static Vector3 Transform(Vector3 v, Matrix m)
static Vector3 Normalize(Vector3 v)
float LengthSquared()
static readonly Vector3 UnitY
static float Dot(Vector3 v1, Vector3 v2)