Survivalcraft API 1.8.2.3 v1.8.2.3
Survivalcraft 2.4
载入中...
搜索中...
未找到
HygrometerBlock.cs
浏览该文件的文档.
1using Engine;
3
4namespace Game {
6 public static int Index = 121;
7
8 public BlockMesh m_caseMesh = new();
9
10 public BlockMesh m_pointerMesh = new();
11
13
15
16 public Matrix[] m_matricesByData = new Matrix[4];
17
19
20 public override void Initialize() {
21 Model model = ContentManager.Get<Model>("Models/Hygrometer");
22 Matrix boneAbsoluteTransform = BlockMesh.GetBoneAbsoluteTransform(model.FindMesh("Case").ParentBone);
25 m_caseMesh.AppendModelMeshPart(
26 model.FindMesh("Case").MeshParts[0],
27 boneAbsoluteTransform,
28 false,
29 false,
30 true,
31 false,
33 );
34 m_pointerMesh.AppendModelMeshPart(
35 model.FindMesh("Pointer").MeshParts[0],
36 matrix,
37 false,
38 false,
39 false,
40 false,
42 );
43 for (int i = 0; i < 4; i++) {
45 * Matrix.CreateTranslation(0.95f, 0.15f, 0.5f)
46 * Matrix.CreateTranslation(-0.5f, 0f, -0.5f)
47 * Matrix.CreateRotationY((i + 1) * (float)Math.PI / 2f)
48 * Matrix.CreateTranslation(0.5f, 0f, 0.5f);
49 m_collisionBoxesByData[i] = [m_caseMesh.CalculateBoundingBox(m_matricesByData[i])];
50 }
51 base.Initialize();
52 }
53
54 public ElectricElement CreateElectricElement(SubsystemElectricity subsystemElectricity, int value, int x, int y, int z) {
55 int num = Terrain.ExtractData(value);
56 return new HygrometerElectricElement(subsystemElectricity, new CellFace(x, y, z, num & 3));
57 }
58
60 int value,
61 int face,
62 int connectorFace,
63 int x,
64 int y,
65 int z) {
66 if ((Terrain.ExtractData(value) & 3) == face) {
67 return ElectricConnectorType.Output;
68 }
69 return null;
70 }
71
72 public int GetConnectionMask(int value) => int.MaxValue;
73
74 public override BoundingBox[] GetCustomCollisionBoxes(SubsystemTerrain terrain, int value) {
75 int num = Terrain.ExtractData(value);
76 if (num < m_collisionBoxesByData.Length) {
77 return m_collisionBoxesByData[num];
78 }
79 return null;
80 }
81
82 public override BlockPlacementData GetPlacementValue(SubsystemTerrain subsystemTerrain,
83 ComponentMiner componentMiner,
84 int value,
85 TerrainRaycastResult raycastResult) {
86 int value2 = 0;
87 if (raycastResult.CellFace.Face == 0) {
89 }
90 else if (raycastResult.CellFace.Face == 1) {
92 }
93 else if (raycastResult.CellFace.Face == 2) {
95 }
96 else if (raycastResult.CellFace.Face == 3) {
98 }
99 BlockPlacementData result = default;
100 result.Value = value2;
101 result.CellFace = raycastResult.CellFace;
102 return result;
103 }
104
105 public override void GenerateTerrainVertices(BlockGeometryGenerator generator, TerrainGeometry geometry, int value, int x, int y, int z) {
106 int num = Terrain.ExtractData(value);
107 if (num < m_matricesByData.Length) {
108 int humidity = generator.Terrain.GetHumidity(x, z);
109 float radians = MathUtils.Lerp(1.5f, -1.5f, humidity / 15f);
110 Matrix matrix = m_matricesByData[num];
111 Matrix value2 = m_invPointerMatrix * Matrix.CreateRotationX(radians) * m_pointerMatrix * matrix;
112 generator.GenerateMeshVertices(
113 this,
114 x,
115 y,
116 z,
118 Color.White,
119 matrix,
120 geometry.SubsetOpaque
121 );
122 generator.GenerateMeshVertices(
123 this,
124 x,
125 y,
126 z,
128 Color.White,
129 value2,
130 geometry.SubsetOpaque
131 );
132 generator.GenerateWireVertices(
133 value,
134 x,
135 y,
136 z,
137 num & 3,
138 0.25f,
140 geometry.SubsetOpaque
141 );
142 }
143 }
144
145 public override void DrawBlock(PrimitivesRenderer3D primitivesRenderer,
146 int value,
147 Color color,
148 float size,
149 ref Matrix matrix,
150 DrawBlockEnvironmentData environmentData) {
151 float num = 8f;
152 if (environmentData != null
153 && environmentData.SubsystemTerrain != null) {
154 Vector3 translation = environmentData.InWorldMatrix.Translation;
155 int num2 = Terrain.ToCell(translation.X);
156 int num3 = Terrain.ToCell(translation.Z);
157 float f = translation.X - num2;
158 float f2 = translation.Z - num3;
159 float x = environmentData.SubsystemTerrain.Terrain.GetSeasonalHumidity(num2, num3);
160 float x2 = environmentData.SubsystemTerrain.Terrain.GetSeasonalHumidity(num2, num3 + 1);
161 float x3 = environmentData.SubsystemTerrain.Terrain.GetSeasonalHumidity(num2 + 1, num3);
162 float x4 = environmentData.SubsystemTerrain.Terrain.GetSeasonalHumidity(num2 + 1, num3 + 1);
163 float x5 = MathUtils.Lerp(x, x2, f2);
164 float x6 = MathUtils.Lerp(x3, x4, f2);
165 num = MathUtils.Lerp(x5, x6, f);
166 }
167 float radians = MathUtils.Lerp(1.5f, -1.5f, num / 15f);
168 Matrix matrix2 = Matrix.CreateScale(7f * size) * Matrix.CreateTranslation(0f, -0.1f, 0f) * matrix;
169 Matrix matrix3 = m_invPointerMatrix * Matrix.CreateRotationX(radians) * m_pointerMatrix * matrix2;
170 BlocksManager.DrawMeshBlock(primitivesRenderer, m_caseMesh, color, 1f, ref matrix2, environmentData);
171 BlocksManager.DrawMeshBlock(primitivesRenderer, m_pointerMesh, color, 1f, ref matrix3, environmentData);
172 }
173 }
174}
ModelMesh FindMesh(string name, bool throwIfNotFound=true)
ReadOnlyList< ModelMeshPart > MeshParts
static float Lerp(float x1, float x2, float f)
virtual void GenerateMeshVertices(Block block, int x, int y, int z, BlockMesh blockMesh, Color color, Matrix? matrix, TerrainGeometrySubset subset)
virtual void GenerateWireVertices(int value, int x, int y, int z, int mountingFace, float centerBoxSize, Vector2 centerOffset, TerrainGeometrySubset subset)
static Matrix GetBoneAbsoluteTransform(ModelBone modelBone)
static void DrawMeshBlock(PrimitivesRenderer3D primitivesRenderer, BlockMesh blockMesh, float size, ref Matrix matrix, DrawBlockEnvironmentData environmentData)
static object Get(Type type, string name)
BoundingBox[][] m_collisionBoxesByData
ElectricElement CreateElectricElement(SubsystemElectricity subsystemElectricity, int value, int x, int y, int z)
override void GenerateTerrainVertices(BlockGeometryGenerator generator, TerrainGeometry geometry, int value, int x, int y, int z)
override BlockPlacementData GetPlacementValue(SubsystemTerrain subsystemTerrain, ComponentMiner componentMiner, int value, TerrainRaycastResult raycastResult)
方块放置方向
ElectricConnectorType? GetConnectorType(SubsystemTerrain terrain, int value, int face, int connectorFace, int x, int y, int z)
override void DrawBlock(PrimitivesRenderer3D primitivesRenderer, int value, Color color, float size, ref Matrix matrix, DrawBlockEnvironmentData environmentData)
override BoundingBox[] GetCustomCollisionBoxes(SubsystemTerrain terrain, int value)
TerrainGeometrySubset SubsetOpaque
static int ReplaceData(int value, int data)
virtual int GetHumidity(int x, int z)
static int ToCell(float x)
virtual int GetSeasonalHumidity(int x, int z)
static int ReplaceContents(int value, int contents)
方块值的最低10位,替换为目标Content
static int ExtractData(int value)
static Color White
static Matrix Invert(Matrix m)
static Matrix CreateRotationX(float radians)
static Matrix CreateTranslation(float x, float y, float z)
static Matrix CreateRotationY(float radians)
Vector3 Translation
static Matrix CreateScale(float scale)
static readonly Vector2 Zero