Survivalcraft API 1.8.2.3 v1.8.2.3
Survivalcraft 2.4
载入中...
搜索中...
未找到
DoorBlock.cs
浏览该文件的文档.
1using Engine;
3
4namespace Game {
5 public abstract class DoorBlock : Block, IElectricElementBlock {
6 public float m_pivotDistance;
7
8 public string m_modelName;
9
11
13
15
16 public DoorBlock(string modelName, float pivotDistance) {
17 m_modelName = modelName;
18 m_pivotDistance = pivotDistance;
19 }
20
21 public override void Initialize() {
23 Matrix boneAbsoluteTransform = BlockMesh.GetBoneAbsoluteTransform(model.FindMesh("Door").ParentBone);
24 for (int i = 0; i < 16; i++) {
25 int rotation = GetRotation(i);
26 bool open = GetOpen(i);
27 bool rightHanded = GetRightHanded(i);
28 float num = !rightHanded ? 1 : -1;
30 Matrix identity = Matrix.Identity;
31 identity *= Matrix.CreateScale(0f - num, 1f, 1f);
32 identity *= Matrix.CreateTranslation((0.5f - m_pivotDistance) * num, 0f, 0f)
33 * Matrix.CreateRotationY(open ? num * (float)Math.PI / 2f : 0f)
34 * Matrix.CreateTranslation((0f - (0.5f - m_pivotDistance)) * num, 0f, 0f);
35 identity *= Matrix.CreateTranslation(0f, 0f, 0.5f - m_pivotDistance)
36 * Matrix.CreateRotationY(rotation * (float)Math.PI / 2f)
37 * Matrix.CreateTranslation(0.5f, 0f, 0.5f);
39 .AppendModelMeshPart(
40 model.FindMesh("Door").MeshParts[0],
41 boneAbsoluteTransform * identity,
42 false,
43 !rightHanded,
44 false,
45 false,
47 );
48 BoundingBox boundingBox = m_blockMeshesByData[i].CalculateBoundingBox();
49 boundingBox.Max.Y = 1f;
50 m_collisionBoxesByData[i] = [boundingBox];
51 }
52 m_standaloneBlockMesh.AppendModelMeshPart(
53 model.FindMesh("Door").MeshParts[0],
54 boneAbsoluteTransform * Matrix.CreateTranslation(0f, -1f, 0f),
55 false,
56 false,
57 false,
58 false,
60 );
61 base.Initialize();
62 }
63
64 public override void GenerateTerrainVertices(BlockGeometryGenerator generator, TerrainGeometry geometry, int value, int x, int y, int z) {
65 int num = Terrain.ExtractData(value);
66 if (IsBottomPart(generator.Terrain, x, y, z)
67 && num < m_blockMeshesByData.Length) {
68 generator.GenerateMeshVertices(
69 this,
70 x,
71 y,
72 z,
75 null,
76 geometry.SubsetAlphaTest
77 );
78 }
79 Vector2 centerOffset = GetRightHanded(num) ? new Vector2(-0.45f, 0f) : new Vector2(0.45f, 0f);
80 generator.GenerateWireVertices(
81 value,
82 x,
83 y,
84 z,
85 GetHingeFace(num),
86 0.01f,
87 centerOffset,
88 geometry.SubsetOpaque
89 );
90 }
91
92 public override void DrawBlock(PrimitivesRenderer3D primitivesRenderer,
93 int value,
94 Color color,
95 float size,
96 ref Matrix matrix,
97 DrawBlockEnvironmentData environmentData) {
98 BlocksManager.DrawMeshBlock(primitivesRenderer, m_standaloneBlockMesh, color, 0.75f * size, ref matrix, environmentData);
99 }
100
101 public override int GetShadowStrength(int value) {
102 if (!GetOpen(Terrain.ExtractData(value))) {
104 }
105 return 4;
106 }
107
108 public override BlockPlacementData GetPlacementValue(SubsystemTerrain subsystemTerrain,
109 ComponentMiner componentMiner,
110 int value,
111 TerrainRaycastResult raycastResult) {
113 float num = Vector3.Dot(forward, Vector3.UnitZ);
114 float num2 = Vector3.Dot(forward, Vector3.UnitX);
115 float num3 = Vector3.Dot(forward, -Vector3.UnitZ);
116 float num4 = Vector3.Dot(forward, -Vector3.UnitX);
117 int num5 = 0;
118 if (num == MathUtils.Max(num, num2, num3, num4)) {
119 num5 = 2;
120 }
121 else if (num2 == MathUtils.Max(num, num2, num3, num4)) {
122 num5 = 3;
123 }
124 else if (num3 == MathUtils.Max(num, num2, num3, num4)) {
125 num5 = 0;
126 }
127 else if (num4 == MathUtils.Max(num, num2, num3, num4)) {
128 num5 = 1;
129 }
130 Point3 point = CellFace.FaceToPoint3(raycastResult.CellFace.Face);
131 int num6 = raycastResult.CellFace.X + point.X;
132 int y = raycastResult.CellFace.Y + point.Y;
133 int num7 = raycastResult.CellFace.Z + point.Z;
134 bool rightHanded = true;
135 switch (num5) {
136 case 0:
137 int cellValue = subsystemTerrain.Terrain.GetCellValue(num6 - 1, y, num7);
138 rightHanded = BlocksManager.Blocks[Terrain.ExtractContents(cellValue)].IsNonAttachable(cellValue);
139 break;
140 case 1:
141 cellValue = subsystemTerrain.Terrain.GetCellValue(num6, y, num7 + 1);
142 rightHanded = BlocksManager.Blocks[Terrain.ExtractContents(cellValue)].IsNonAttachable(cellValue);
143 break;
144 case 2:
145 cellValue = subsystemTerrain.Terrain.GetCellValue(num6 + 1, y, num7);
146 rightHanded = BlocksManager.Blocks[Terrain.ExtractContents(cellValue)].IsNonAttachable(cellValue);
147 break;
148 case 3:
149 cellValue = subsystemTerrain.Terrain.GetCellValue(num6, y, num7 - 1);
150 rightHanded = BlocksManager.Blocks[Terrain.ExtractContents(cellValue)].IsNonAttachable(cellValue);
151 break;
152 }
153 int data = SetRightHanded(SetOpen(SetRotation(0, num5), false), rightHanded);
154 BlockPlacementData result = default;
156 result.CellFace = raycastResult.CellFace;
157 return result;
158 }
159
160 public override BoundingBox[] GetCustomCollisionBoxes(SubsystemTerrain terrain, int value) {
161 int num = Terrain.ExtractData(value);
162 if (num < m_collisionBoxesByData.Length) {
163 return m_collisionBoxesByData[num];
164 }
165 return null;
166 }
167
168 public override bool IsHeatBlocker(int value) => !GetOpen(Terrain.ExtractData(value));
169
170 public ElectricElement CreateElectricElement(SubsystemElectricity subsystemElectricity, int value, int x, int y, int z) {
171 int data = Terrain.ExtractData(value);
172 return new DoorElectricElement(subsystemElectricity, new CellFace(x, y, z, GetHingeFace(data)));
173 }
174
176 int value,
177 int face,
178 int connectorFace,
179 int x,
180 int y,
181 int z) {
182 int hingeFace = GetHingeFace(Terrain.ExtractData(value));
183 if (face == hingeFace) {
184 ElectricConnectorDirection? connectorDirection = SubsystemElectricity.GetConnectorDirection(hingeFace, 0, connectorFace);
185 if (connectorDirection == ElectricConnectorDirection.Right
186 || connectorDirection == ElectricConnectorDirection.Left
187 || connectorDirection == ElectricConnectorDirection.In) {
188 return ElectricConnectorType.Input;
189 }
190 }
191 return null;
192 }
193
194 public int GetConnectionMask(int value) => int.MaxValue;
195
196 public static int GetRotation(int data) => data & 3;
197
198 public static bool GetOpen(int data) => (data & 4) != 0;
199
200 public static bool GetRightHanded(int data) => (data & 8) == 0;
201
202 public static int SetRotation(int data, int rotation) => (data & -4) | (rotation & 3);
203
204 public static int SetOpen(int data, bool open) {
205 if (!open) {
206 return data & -5;
207 }
208 return data | 4;
209 }
210
211 public static int SetRightHanded(int data, bool rightHanded) {
212 if (rightHanded) {
213 return data & -9;
214 }
215 return data | 8;
216 }
217
218 public static bool IsTopPart(Terrain terrain, int x, int y, int z) => BlocksManager.Blocks[terrain.GetCellContents(x, y - 1, z)] is DoorBlock;
219
220 public static bool IsBottomPart(Terrain terrain, int x, int y, int z) =>
221 BlocksManager.Blocks[terrain.GetCellContents(x, y + 1, z)] is DoorBlock;
222
223 public static int GetHingeFace(int data) {
224 int rotation = GetRotation(data);
225 int num = rotation - 1 < 0 ? 3 : rotation - 1;
226 if (!GetRightHanded(data)) {
227 num = CellFace.OppositeFace(num);
228 }
229 return num;
230 }
231
232 public override bool IsMovableByPiston(int value, int pistonFace, int y, out bool isEnd) {
233 isEnd = false;
234 return false;
235 }
236 }
237}
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
virtual bool IsNonAttachable(int value)
int DefaultShadowStrength
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 void Initialize()
override BoundingBox[] GetCustomCollisionBoxes(SubsystemTerrain terrain, int value)
BlockMesh m_standaloneBlockMesh
BlockMesh[] m_blockMeshesByData
static int SetOpen(int data, bool open)
static bool GetRightHanded(int data)
static int GetRotation(int data)
override void DrawBlock(PrimitivesRenderer3D primitivesRenderer, int value, Color color, float size, ref Matrix matrix, DrawBlockEnvironmentData environmentData)
override BlockPlacementData GetPlacementValue(SubsystemTerrain subsystemTerrain, ComponentMiner componentMiner, int value, TerrainRaycastResult raycastResult)
方块放置方向
override bool IsMovableByPiston(int value, int pistonFace, int y, out bool isEnd)
static int SetRightHanded(int data, bool rightHanded)
ElectricConnectorType? GetConnectorType(SubsystemTerrain terrain, int value, int face, int connectorFace, int x, int y, int z)
ElectricElement CreateElectricElement(SubsystemElectricity subsystemElectricity, int value, int x, int y, int z)
BoundingBox[][] m_collisionBoxesByData
static int SetRotation(int data, int rotation)
static bool IsBottomPart(Terrain terrain, int x, int y, int z)
static bool GetOpen(int data)
override bool IsHeatBlocker(int value)
static int GetHingeFace(int data)
int GetConnectionMask(int value)
static bool IsTopPart(Terrain terrain, int x, int y, int z)
override void GenerateTerrainVertices(BlockGeometryGenerator generator, TerrainGeometry geometry, int value, int x, int y, int z)
override int GetShadowStrength(int value)
DoorBlock(string modelName, float pivotDistance)
static ? ElectricConnectorDirection GetConnectorDirection(int mountingFace, int rotation, int connectorFace)
TerrainGeometrySubset SubsetAlphaTest
TerrainGeometrySubset SubsetOpaque
static int ExtractContents(int value)
static int ReplaceData(int value, int data)
virtual int GetCellValue(int x, int y, int z)
virtual int GetCellContents(int x, int y, int z)
static int ReplaceContents(int value, int contents)
方块值的最低10位,替换为目标Content
static int ExtractData(int value)
static Color White
static Matrix CreateFromQuaternion(Quaternion quaternion)
static Matrix CreateTranslation(float x, float y, float z)
static readonly Matrix Identity
static Matrix CreateRotationY(float radians)
Vector3 Forward
static Matrix CreateScale(float scale)
static readonly Vector3 UnitX
static readonly Vector3 UnitZ
static float Dot(Vector3 v1, Vector3 v2)
static int OppositeFace(int face)
static Point3 FaceToPoint3(int face)