Survivalcraft API 1.8.2.3 v1.8.2.3
Survivalcraft 2.4
载入中...
搜索中...
未找到
RotateableMountedElectricElementBlock.cs
浏览该文件的文档.
1using Engine;
3
4namespace Game {
6 public string m_modelName;
7
8 public string m_meshName;
9
10 public float m_centerBoxSize;
11
12 public BlockMesh[] m_blockMeshes = new BlockMesh[24];
13
15
17
18 public RotateableMountedElectricElementBlock(string modelName, string meshName, float centerBoxSize) {
19 m_modelName = modelName;
20 m_meshName = meshName;
21 m_centerBoxSize = centerBoxSize;
22 }
23
24 public override void Initialize() {
27 for (int i = 0; i < 6; i++) {
28 float radians;
29 bool flag;
30 if (i < 4) {
31 radians = i * (float)Math.PI / 2f;
32 flag = false;
33 }
34 else if (i == 4) {
35 radians = -(float)Math.PI / 2f;
36 flag = true;
37 }
38 else {
39 radians = (float)Math.PI / 2f;
40 flag = true;
41 }
42 for (int j = 0; j < 4; j++) {
43 float radians2 = -j * (float)Math.PI / 2f;
44 int num = (i << 2) + j;
45 Matrix m = Matrix.CreateRotationX((float)Math.PI / 2f)
46 * Matrix.CreateRotationZ(radians2)
47 * Matrix.CreateTranslation(0f, 0f, -0.5f)
48 * (flag ? Matrix.CreateRotationX(radians) : Matrix.CreateRotationY(radians))
49 * Matrix.CreateTranslation(0.5f, 0.5f, 0.5f);
50 m_blockMeshes[num] = new BlockMesh();
51 m_blockMeshes[num]
52 .AppendModelMeshPart(
54 boneAbsoluteTransform * m,
55 false,
56 false,
57 false,
58 false,
60 );
61 m_collisionBoxes[num] = [m_blockMeshes[num].CalculateBoundingBox()];
62 }
63 }
64 Matrix m2 = Matrix.CreateRotationY(-(float)Math.PI / 2f) * Matrix.CreateRotationZ((float)Math.PI / 2f);
65 m_standaloneBlockMesh.AppendModelMeshPart(
67 boneAbsoluteTransform * m2,
68 false,
69 false,
70 false,
71 false,
73 );
74 }
75
76 public override int GetFace(int value) => (Terrain.ExtractData(value) >> 2) & 7;
77
78 public override void DrawBlock(PrimitivesRenderer3D primitivesRenderer,
79 int value,
80 Color color,
81 float size,
82 ref Matrix matrix,
83 DrawBlockEnvironmentData environmentData) {
84 BlocksManager.DrawMeshBlock(primitivesRenderer, m_standaloneBlockMesh, color, 2f * size, ref matrix, environmentData);
85 }
86
87 public override void GenerateTerrainVertices(BlockGeometryGenerator generator, TerrainGeometry geometry, int value, int x, int y, int z) {
88 int num = Terrain.ExtractData(value) & 0x1F;
89 generator.GenerateMeshVertices(
90 this,
91 x,
92 y,
93 z,
94 m_blockMeshes[num],
96 null,
97 geometry.SubsetOpaque
98 );
99 generator.GenerateWireVertices(
100 value,
101 x,
102 y,
103 z,
104 GetFace(value),
107 geometry.SubsetOpaque
108 );
109 }
110
111 public override BlockPlacementData GetPlacementValue(SubsystemTerrain subsystemTerrain,
112 ComponentMiner componentMiner,
113 int value,
114 TerrainRaycastResult raycastResult) {
115 int rotation = 0;
116 if (raycastResult.CellFace.Face >= 4) {
118 float num = Vector3.Dot(forward, Vector3.UnitZ);
119 float num2 = Vector3.Dot(forward, Vector3.UnitX);
120 float num3 = Vector3.Dot(forward, -Vector3.UnitZ);
121 float num4 = Vector3.Dot(forward, -Vector3.UnitX);
122 if (num == MathUtils.Max(num, num2, num3, num4)) {
123 rotation = 2;
124 }
125 else if (num2 == MathUtils.Max(num, num2, num3, num4)) {
126 rotation = 1;
127 }
128 else if (num3 == MathUtils.Max(num, num2, num3, num4)) {
129 rotation = 0;
130 }
131 else if (num4 == MathUtils.Max(num, num2, num3, num4)) {
132 rotation = 3;
133 }
134 }
135 int num5 = Terrain.ExtractData(value);
136 num5 &= -29;
137 num5 |= raycastResult.CellFace.Face << 2;
138 BlockPlacementData result = default;
139 result.Value = Terrain.MakeBlockValue(BlockIndex, 0, SetRotation(num5, rotation));
140 result.CellFace = raycastResult.CellFace;
141 return result;
142 }
143
144 public override BoundingBox[] GetCustomCollisionBoxes(SubsystemTerrain terrain, int value) {
145 int num = Terrain.ExtractData(value) & 0x1F;
146 return m_collisionBoxes[num];
147 }
148
149 public static int GetRotation(int data) => data & 3;
150
151 public static int SetRotation(int data, int rotation) => (data & -4) | (rotation & 3);
152 }
153}
ModelMesh FindMesh(string name, bool throwIfNotFound=true)
ReadOnlyList< ModelMeshPart > MeshParts
static int Max(int x1, int x2)
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)
int BlockIndex
定义 Block.cs:6
static Matrix GetBoneAbsoluteTransform(ModelBone modelBone)
static void DrawMeshBlock(PrimitivesRenderer3D primitivesRenderer, BlockMesh blockMesh, float size, ref Matrix matrix, DrawBlockEnvironmentData environmentData)
ComponentCreatureModel ComponentCreatureModel
ComponentCreature ComponentCreature
static object Get(Type type, string name)
override BlockPlacementData GetPlacementValue(SubsystemTerrain subsystemTerrain, ComponentMiner componentMiner, int value, TerrainRaycastResult raycastResult)
方块放置方向
RotateableMountedElectricElementBlock(string modelName, string meshName, float centerBoxSize)
override void DrawBlock(PrimitivesRenderer3D primitivesRenderer, int value, Color color, float size, ref Matrix matrix, DrawBlockEnvironmentData environmentData)
override BoundingBox[] GetCustomCollisionBoxes(SubsystemTerrain terrain, int value)
override void GenerateTerrainVertices(BlockGeometryGenerator generator, TerrainGeometry geometry, int value, int x, int y, int z)
TerrainGeometrySubset SubsetOpaque
static int MakeBlockValue(int contents)
static int ExtractData(int value)
static Color White
static Matrix CreateRotationX(float radians)
static Matrix CreateFromQuaternion(Quaternion quaternion)
static Matrix CreateTranslation(float x, float y, float z)
static Matrix CreateRotationZ(float radians)
static Matrix CreateRotationY(float radians)
Vector3 Forward
static readonly Vector2 Zero
static readonly Vector3 UnitX
static readonly Vector3 UnitZ
static float Dot(Vector3 v1, Vector3 v2)