103 public virtual float Mass {
get;
set; }
131 [Obsolete(
"Use IsCrouching")]
195 position -
new Vector3(stanceBoxSize.
X / 2f, 0f, stanceBoxSize.
Z / 2f),
196 position +
new Vector3(stanceBoxSize.
X / 2f, stanceBoxSize.
Y, stanceBoxSize.
Z / 2f)
227 return m_parentBody.FloatUpdateOrder + 0.01f;
234 public virtual Action<Attackment>
Attacked {
get;
set; }
237 List<Vector3> list = [];
238 for (
int i = -2; i <= 2; i++) {
239 for (
int j = -2; j <= 2; j++) {
240 for (
int k = -2; k <= 2; k++) {
241 Vector3 item =
new(0.25f * i, 0.25f * j, 0.25f * k);
246 list.Sort((o1, o2) => Comparer<float>.
Default.Compare(o1.LengthSquared(), o2.LengthSquared()));
265 return ParentBody.IsChildOfBody(componentBody);
274 float num2 = 5f * MathF.Sqrt(explosionPressure);
275 float num3 = 1f * MathF.Sqrt(explosionPressure);
276 float strength = num2 / (num / num3 + 1f);
278 "OnComponentBodyExplodedStart",
280 loader.OnComponentBodyExplodedStart(
this, explosionCenter, explosionPressure, ref strength);
290 bool setOnFire =
true;
291 float fluctuation = 0.5f;
293 damage /= explosionResilience;
294 impulse /= explosionResilience;
297 "OnComponentBodyExploded",
300 loader.OnComponentBodyExploded(
this, ref explosionInjury, ref impulse, ref setOnFire, ref fluctuation);
305 impulse *=
m_random.Float(1f - fluctuation, 1f + fluctuation);
306 damage *=
m_random.Float(1f - fluctuation, 1f + fluctuation);
311 if (explosionInjury.
Amount > 0f) {
316 if (componentOnFire !=
null
324 base.Load(valuesDictionary, idToEntityMap);
337 Mass = valuesDictionary.GetValue<
float>(
"Mass");
338 Density = valuesDictionary.GetValue<
float>(
"Density");
341 WaterSwayAngle = valuesDictionary.GetValue<
float>(
"WaterSwayAngle");
342 WaterTurnSpeed = valuesDictionary.GetValue<
float>(
"WaterTurnSpeed");
343 CanEmbedInIce = valuesDictionary.GetValue<
bool>(
"CanEmbedInIce");
360 base.Save(valuesDictionary, entityToIdMap);
362 valuesDictionary.SetValue(
"Velocity",
Velocity.FixNaN());
367 valuesDictionary.SetValue(
"ParentBody", value);
376 for (
int i = 0; i < array.Length; i++) {
382 bool skipVanilla_ =
false;
384 "UpdateComponentBody",
386 loader.UpdateComponentBody(
this, dt, skipVanilla_, out
bool skipVanilla);
387 skipVanilla_ |= skipVanilla;
409 ||
m_velocity.LengthSquared() > 9.99999944E-11f
431 if (chunkAtCell ==
null
463 m_velocity.Y -= 10f * dt;
467 m_velocity.Y += 10f * (1f /
Density * num) * dt;
472 m_velocity.X *= 1f - num2;
473 m_velocity.Y *= 1f - num3;
474 m_velocity.Z *= 1f - num2;
488 ? ImmersionFluidBlock.FrictionFactor
525 float x = 0.45f *
MathUtils.
Min(stanceBoxSize.
X, stanceBoxSize.
Y, stanceBoxSize.
Z) / num6;
573 if (surfaceHeight.HasValue) {
622 needToTeleport =
false;
634 positionToDetect -
new Vector3(stanceBoxSize.
X / 2f, 0f, stanceBoxSize.
Z / 2f),
635 positionToDetect +
new Vector3(stanceBoxSize.
X / 2f, stanceBoxSize.
Y, stanceBoxSize.
Z / 2f)
639 boxThere.Max -=
new Vector3(0.01f);
650 float pushBackXLength = pushBack_X * pushBack_X;
651 float pushBackYLength = pushBack_Y * pushBack_Y;
652 float pushBackZLength = pushBack_Z * pushBack_Z;
653 List<Vector3> list =
new();
655 if (pushBackXLength <= pushBackYLength
656 && pushBackXLength <= pushBackZLength) {
657 list.Add(positionToDetect +
new Vector3(pushBack_X, 0f, 0f));
658 if (pushBackYLength <= pushBackZLength) {
659 list.Add(positionToDetect +
new Vector3(0f, pushBack_Y, 0f));
660 list.Add(positionToDetect +
new Vector3(0f, 0f, pushBack_Z));
663 list.Add(positionToDetect +
new Vector3(0f, 0f, pushBack_Z));
664 list.Add(positionToDetect +
new Vector3(0f, pushBack_Y, 0f));
667 else if (pushBackYLength <= pushBackXLength
668 && pushBackYLength <= pushBackZLength) {
669 list.Add(positionToDetect +
new Vector3(0f, pushBack_Y, 0f));
670 if (pushBackXLength <= pushBackZLength) {
671 list.Add(positionToDetect +
new Vector3(pushBack_X, 0f, 0f));
672 list.Add(positionToDetect +
new Vector3(0f, 0f, pushBack_Z));
675 list.Add(positionToDetect +
new Vector3(0f, 0f, pushBack_Z));
676 list.Add(positionToDetect +
new Vector3(pushBack_X, 0f, 0f));
680 list.Add(positionToDetect +
new Vector3(0f, 0f, pushBack_Z));
681 if (pushBackXLength <= pushBackYLength) {
682 list.Add(positionToDetect +
new Vector3(pushBack_X, 0f, 0f));
683 list.Add(positionToDetect +
new Vector3(0f, pushBack_Y, 0f));
686 list.Add(positionToDetect +
new Vector3(0f, pushBack_Y, 0f));
687 list.Add(positionToDetect +
new Vector3(pushBack_X, 0f, 0f));
690 foreach (
Vector3 item
in list) {
691 if (!(MathF.Abs(item.
X - position.
X) > stanceBoxSize.
X * maxMoveFraction)
692 && !(MathF.Abs(item.
Y - position.
Y) > stanceBoxSize.
Y * maxMoveFraction)
693 && !(MathF.Abs(item.
Z - position.
Z) > stanceBoxSize.
Z * maxMoveFraction)) {
695 item -
new Vector3(stanceBoxSize.
X / 2f, 0f, stanceBoxSize.
Z / 2f),
696 item +
new Vector3(stanceBoxSize.
X / 2f, stanceBoxSize.
Y, stanceBoxSize.
Z / 2f)
699 boxThere.Max -=
new Vector3(0.02f);
706 needToTeleport =
true;
714 vector = positionToDetect;
716 if (vector.HasValue) {
717 freePosition = vector.Value;
726 if (freePosition.HasValue) {
745 position -
new Vector3(stanceBoxSize.
X / 2f, 0f, stanceBoxSize.
Z / 2f),
746 position +
new Vector3(stanceBoxSize.
X / 2f, stanceBoxSize.
Y, stanceBoxSize.
Z / 2f)
748 box.Min +=
new Vector3(0.04f, 0f, 0.04f);
749 box.Max -=
new Vector3(0.04f, 0f, 0.04f);
779 vector =
new Vector3(0f, 0.04f, 0.04f);
783 vector =
new Vector3(0.04f, 0f, 0.04f);
787 vector =
new Vector3(0.04f, 0.04f, 0f);
791 position -
new Vector3(stanceBoxSize.
X / 2f, 0f, stanceBoxSize.
Z / 2f) + vector,
792 position +
new Vector3(stanceBoxSize.
X / 2f, stanceBoxSize.
Y, stanceBoxSize.
Z / 2f) - vector
798 if (axis != 1 || isSmoothRising) {
807 position -
new Vector3(stanceBoxSize.
X / 2f, 0f, stanceBoxSize.
Z / 2f) + vector,
808 position +
new Vector3(stanceBoxSize.
X / 2f, stanceBoxSize.
Y, stanceBoxSize.
Z / 2f) - vector
811 if (MathF.Abs(num) > MathF.Abs(num2)) {
818 for (
int i = 0; i < blockBehaviors.Length; i++) {
819 Vector3 vector2 = (pushingCollisionBox.Box.Min + pushingCollisionBox.
Box.
Max) / 2f;
854 ComponentBody componentBody = pushingCollisionBox2.ComponentBody;
855 float targetMass = componentBody.CanBePushedByOtherBodies ? componentBody.Mass : 1e9f;
912 if (componentBody !=
this
923 position -
new Vector3(stanceBoxSize.
X / 2f, 0f, stanceBoxSize.
Z / 2f),
924 position +
new Vector3(stanceBoxSize.
X / 2f, stanceBoxSize.
Y, stanceBoxSize.
Z / 2f)
926 boundingBox.Min -=
new Vector3(1f);
927 boundingBox.Max +=
new Vector3(1f);
933 for (
int j = 0; j < movingBlockSet.
Blocks.Count; j++) {
940 for (
int k = 0; k < customCollisionBoxes.Length; k++) {
943 Box =
new BoundingBox(vector + customCollisionBoxes[k].Min, vector + customCollisionBoxes[k].Max),
944 BlockValue = movingBlock.
Value,
945 BlockVelocity = movingBlockSet.CurrentVelocity
962 if (point.
Y > point2.
Y) {
965 for (
int i = point.
X; i <= point2.
X; i++) {
966 for (
int j = point.
Z; j <= point2.
Z; j++) {
968 if (chunkAtCell ==
null) {
973 while (num2 <= point2.
Y) {
980 Vector3 vector =
new(i, num2, j);
981 for (
int k = 0; k < customCollisionBoxes.Length; k++) {
984 Box =
new BoundingBox(vector + customCollisionBoxes[k].Min, vector + customCollisionBoxes[k].Max),
985 BlockValue = cellValueFast
1006 bool num4 = position.X < num + 0.5f;
1007 bool flag = position.Z < num3 + 0.5f;
1017 if ((isCollidable && !isCollidable2)
1018 || (!isCollidable && !isCollidable2 && isCollidable3)) {
1024 if ((!isCollidable && isCollidable2)
1025 || (!isCollidable && !isCollidable2 && isCollidable3)) {
1031 if (isCollidable && isCollidable2) {
1046 if ((isCollidable4 && !isCollidable5)
1047 || (!isCollidable4 && !isCollidable5 && isCollidable6)) {
1053 if ((!isCollidable4 && isCollidable5)
1054 || (!isCollidable4 && !isCollidable5 && isCollidable6)) {
1060 if (isCollidable4 && isCollidable5) {
1076 if ((isCollidable7 && !isCollidable8)
1077 || (!isCollidable7 && !isCollidable8 && isCollidable9)) {
1083 if ((!isCollidable7 && isCollidable8)
1084 || (!isCollidable7 && !isCollidable8 && isCollidable9)) {
1090 if (isCollidable7 && isCollidable8) {
1105 if ((isCollidable10 && !isCollidable11)
1106 || (!isCollidable10 && !isCollidable11 && isCollidable12)) {
1112 if ((!isCollidable10 && isCollidable11)
1113 || (!isCollidable10 && !isCollidable11 && isCollidable12)) {
1119 if (isCollidable10 && isCollidable11) {
1130 for (
int i = 0; i < collisionBoxes.
Count; i++) {
1139 for (
int i = 0; i < collisionBoxes.
Count; i++) {
1151 DynamicArray<CollisionBox> collisionBoxes,
1153 pushingCollisionBox =
default;
1155 for (
int i = 0; i < collisionBoxes.
Count; i++) {
1157 if (MathF.Abs(num2) > MathF.Abs(num)) {
1159 pushingCollisionBox = collisionBoxes.
Array[i];
1168 DynamicArray<CollisionBox> collisionBoxes,
1170 pushingCollisionBox =
default;
1172 for (
int i = 0; i < collisionBoxes.
Count; i++) {
1176 if (MathF.Abs(num2) > MathF.Abs(num)) {
1178 pushingCollisionBox = collisionBoxes.
Array[i];
1185 if (b1.Max.X <= b2.Min.X
1186 || b1.Min.X >= b2.Max.X
1187 || b1.Max.Y <= b2.Min.Y
1188 || b1.Min.Y >= b2.Max.Y
1189 || b1.Max.Z <= b2.Min.Z
1190 || b1.Min.Z >= b2.Max.Z) {
1195 float num13 = b1.Min.X + b1.Max.X;
1196 float num14 = b2.Min.X + b2.Max.X;
1197 float num15 = b1.Max.X - b1.Min.X;
1198 float num16 = b2.Max.X - b2.Min.X;
1199 float num17 = num14 - num13;
1200 float num18 = num15 + num16;
1201 return 0.5f * (num17 > 0f ? num17 - num18 : num17 + num18);
1204 float num7 = b1.Min.Y + b1.Max.Y;
1205 float num8 = b2.Min.Y + b2.Max.Y;
1206 float num9 = b1.Max.Y - b1.Min.Y;
1207 float num10 = b2.Max.Y - b2.Min.Y;
1208 float num11 = num8 - num7;
1209 float num12 = num9 + num10;
1210 return 0.5f * (num11 > 0f ? num11 - num12 : num11 + num12);
1213 float num = b1.Min.Z + b1.Max.Z;
1214 float num2 = b2.Min.Z + b2.Max.Z;
1215 float num3 = b1.Max.Z - b1.Min.Z;
1216 float num4 = b2.Max.Z - b2.Min.Z;
1217 float num5 = num2 - num;
1218 float num6 = num3 + num4;
1219 return 0.5f * (num5 > 0f ? num5 - num6 : num5 + num6);
1228 default:
return v.
Z;
1238 out
float result2) {
1239 float num = 1f / (m1 + m2);
1240 result1 = (cr * m2 * (v2 - v1) + m1 * v1 + m2 * v2) * num;
1241 result2 = (cr * m1 * (v1 - v2) + m1 * v1 + m2 * v2) * num;
1254 vector2 -
new Vector3(boxSize.
X / 2f, 0f, boxSize.
Z / 2f),
1255 vector2 +
new Vector3(boxSize.
X / 2f, boxSize.
Y, boxSize.
Z / 2f)
1258 box.Max -=
new Vector3(0.01f);
1271 float num4 = num * num;
1272 float num5 = num2 * num2;
1273 float num6 = num3 * num3;
1274 List<Vector3> list =
new();
1277 list.Add(vector2 +
new Vector3(num, 0f, 0f));
1279 list.Add(vector2 +
new Vector3(0f, num2, 0f));
1280 list.Add(vector2 +
new Vector3(0f, 0f, num3));
1283 list.Add(vector2 +
new Vector3(0f, 0f, num3));
1284 list.Add(vector2 +
new Vector3(0f, num2, 0f));
1287 else if (num5 <= num4
1289 list.Add(vector2 +
new Vector3(0f, num2, 0f));
1291 list.Add(vector2 +
new Vector3(num, 0f, 0f));
1292 list.Add(vector2 +
new Vector3(0f, 0f, num3));
1295 list.Add(vector2 +
new Vector3(0f, 0f, num3));
1296 list.Add(vector2 +
new Vector3(num, 0f, 0f));
1300 list.Add(vector2 +
new Vector3(0f, 0f, num3));
1302 list.Add(vector2 +
new Vector3(num, 0f, 0f));
1303 list.Add(vector2 +
new Vector3(0f, num2, 0f));
1306 list.Add(vector2 +
new Vector3(0f, num2, 0f));
1307 list.Add(vector2 +
new Vector3(num, 0f, 0f));
1310 foreach (
Vector3 item
in list) {
1312 item -
new Vector3(boxSize.
X / 2f, 0f, boxSize.
Z / 2f),
1313 item +
new Vector3(boxSize.
X / 2f, boxSize.
Y, boxSize.
Z / 2f)
1316 box.Max -=
new Vector3(0.02f);
1327 if (vector.HasValue) {
1343 bool num4 = position.X < num + 0.5f;
1344 bool flag = position.Z < num3 + 0.5f;
1354 if ((isCollidable && !isCollidable2)
1355 || (!isCollidable && !isCollidable2) & isCollidable3) {
1361 if ((!isCollidable && isCollidable2)
1362 || (!isCollidable && !isCollidable2) & isCollidable3) {
1368 if (isCollidable && isCollidable2) {
1383 if ((isCollidable4 && !isCollidable5)
1384 || (!isCollidable4 && !isCollidable5) & isCollidable6) {
1390 if ((!isCollidable4 && isCollidable5)
1391 || (!isCollidable4 && !isCollidable5) & isCollidable6) {
1397 if (isCollidable4 && isCollidable5) {
1413 if ((isCollidable7 && !isCollidable8)
1414 || (!isCollidable7 && !isCollidable8) & isCollidable9) {
1420 if ((!isCollidable7 && isCollidable8)
1421 || (!isCollidable7 && !isCollidable8) & isCollidable9) {
1427 if (isCollidable7 && isCollidable8) {
1442 if ((isCollidable10 && !isCollidable11)
1443 || (!isCollidable10 && !isCollidable11) & isCollidable12) {
1449 if ((!isCollidable10 && isCollidable11)
1450 || (!isCollidable10 && !isCollidable11) & isCollidable12) {
1456 if (isCollidable10 && isCollidable11) {
static float Remainder(float x, float y)
static int Min(int x1, int x2)
static float Saturate(float x)
static int Max(int x1, int x2)
static float Lerp(float x1, float x2, float f)
static bool PeriodicEvent(double period, double offset)
static double FrameStartTime
bool HasCollisionBehavior
virtual bool IsCollidable_(int value)
virtual BoundingBox[] GetCustomCollisionBoxes(SubsystemTerrain terrain, int value)
static FluidBlock[] FluidBlocks
bool IsRaycastTransparent
DynamicArray< CollisionBox > m_bodiesCollisionBoxes
virtual void HandleAxisCollision(int axis, float move, ref Vector3 position, bool isSmoothRising)
virtual Vector3 ParentBodyPositionOffset
virtual void Update(float dt)
virtual float ImmersionFactor
static float CalculateBoxBoxOverlap(ref BoundingBox b1, ref BoundingBox b2, int axis)
SubsystemTime m_subsystemTime
DynamicArray< IMovingBlockSet > m_movingBlockSets
SubsystemFluidBlockBehavior m_subsystemFluidBlockBehavior
virtual ComponentBody ParentBody
SubsystemAudio m_subsystemAudio
List< ComponentBody > m_childBodies
SubsystemBlockBehaviors m_subsystemBlockBehaviors
virtual float CalculateSmoothRisePushBack(BoundingBox normalBox, BoundingBox smoothRiseBox, int axis, DynamicArray< CollisionBox > collisionBoxes, out CollisionBox pushingCollisionBox)
virtual Vector3 StandingOnVelocity
virtual float CalculatePushBack(BoundingBox box, int axis, DynamicArray< CollisionBox > collisionBoxes, out CollisionBox pushingCollisionBox)
virtual void ApplyImpulse(Vector3 impulse)
virtual void ApplyDirectMove(Vector3 directMove)
virtual ReadOnlyList< ComponentBody > ChildBodies
ComponentBody m_parentBody
virtual bool CanBePushedByOtherBodies
virtual float CrouchFactor
virtual Action< Attackment > Attacked
virtual float TargetCrouchFactor
virtual void FindTerrainCollisionBoxes(BoundingBox box, DynamicArray< CollisionBox > result)
virtual Quaternion ParentBodyRotationOffset
ComponentHealth m_componentHealth
SubsystemParticles m_subsystemParticles
const float SleepThresholdSpeed
virtual Vector3 CollisionVelocityChange
virtual void FindSneakCollisionBoxes(Vector3 position, Vector2 overhang, DynamicArray< CollisionBox > result)
DynamicArray< CollisionBox > m_collisionBoxes
virtual bool FixCollisionOnRidingBug
virtual BoundingBox BoundingBox
float m_targetCrouchFactor
virtual bool HandleSmoothRise(ref Vector3 move, Vector3 position, float dt)
override void OnEntityRemoved()
virtual float FloatUpdateOrder
override void Save(ValuesDictionary valuesDictionary, EntityToIdMap entityToIdMap)
virtual void UpdateImmersionData()
virtual ComponentBody StandingOnBody
virtual void MoveToFreeSpace(float dt)
bool m_fluidEffectsPlayed
virtual float MaxSmoothRiseHeight
virtual bool IsCollidingWithIce(BoundingBox box, DynamicArray< CollisionBox > collisionBoxes)
virtual void FindBodiesCollisionBoxes(Vector3 position, DynamicArray< CollisionBox > result)
void ApplyShaking(float strength)
static float GetVectorComponent(Vector3 v, int axis)
virtual bool MoveToFreeSpace()
virtual ? int StandingOnValue
virtual bool IsSmoothRiseEnabled
virtual float ImmersionDepth
virtual Vector2 WaterDrag
virtual void FindCrouchCollisionBoxes(Vector3 position, Vector2 overhang, DynamicArray< CollisionBox > result)
bool IsSpaceFreeToMove(float maxMoveFraction, out Vector3? freePosition, out bool needToTeleport)
virtual float WaterTurnSpeed
virtual bool CrouchPreventsFalling
virtual bool IsWaterDragEnabled
DynamicArray< CollisionBox > m_movingBlocksCollisionBoxes
virtual void MoveWithCollision(float dt, Vector3 move)
bool MoveToFreeSpaceHelper(float maxMoveFraction)
static bool DrawBodiesBounds
virtual void FindMovingBlocksCollisionBoxes(Vector3 position, DynamicArray< CollisionBox > result)
static bool ResetVelocityOnProjectLoad
virtual float WaterSwayAngle
virtual bool IsChildOfBody(ComponentBody componentBody)
virtual bool IsGravityEnabled
virtual bool IsColliding(BoundingBox box, DynamicArray< CollisionBox > collisionBoxes)
int m_embeddedInIceCounter
SubsystemTerrain m_subsystemTerrain
SubsystemMovingBlocks m_subsystemMovingBlocks
override void Load(ValuesDictionary valuesDictionary, IdToEntityMap idToEntityMap)
SubsystemPlayers m_subsystemPlayers
virtual bool IsGroundDragEnabled
static Vector3[] m_freeSpaceOffsets
virtual Action< IMovingBlockSet > CollidedWithMovingBlock
SubsystemBodies m_subsystemBodies
DynamicArray< ComponentBody > m_componentBodies
virtual Vector3 StanceBoxSize
virtual void UnderExplosionStart(Vector3 explosionCenter, float explosionPressure)
virtual FluidBlock ImmersionFluidBlock
virtual Action< ComponentBody > CollidedWithBody
static void InelasticCollision(float v1, float v2, float m1, float m2, float cr, out float result1, out float result2)
virtual void UnderExplosion(Vector3 impulse, float damage)
virtual void SetOnFire(ComponentCreature attacker, float duration)
static float Noise(float x)
virtual void OnCollide(CellFace cellFace, float velocity, ComponentBody componentBody)
static int CalculateCellIndex(int x, int y, int z)
virtual int GetCellValueFast(int index)
static int ExtractContents(int value)
static int ToCell(float x)
ValuesDictionary ValuesDictionary
static void HookAction(string HookName, Func< ModLoader, bool > action)
执行Hook
List< MovingBlock > Blocks
bool Intersection(BoundingBox box)
static Quaternion CreateFromAxisAngle(Vector3 axis, float angle)
static Vector2 Normalize(Vector2 v)
static Vector3 Lerp(Vector3 v1, Vector3 v2, float f)
static Vector3 Transform(Vector3 v, Matrix m)
static Vector3 Normalize(Vector3 v)
static readonly Vector3 Zero
static float Distance(Vector3 v1, Vector3 v2)
static readonly Vector3 UnitX
static readonly Vector3 UnitY
static CellFace FromAxisAndDirection(int x, int y, int z, int axis, float direction)
ValuesDictionary ValuesDictionaryForMods
模组如果需要添加或使用额外信息,可以在这个ValuesDictionary读写元素
ComponentBody ComponentBody
static EntityReference FromId(Component component)