Survivalcraft API 1.8.2.3 v1.8.2.3
Survivalcraft 2.4
载入中...
搜索中...
未找到
TrapdoorBlock.cs
浏览该文件的文档.
1using Engine;
3
4namespace Game {
5 public abstract class TrapdoorBlock : Block, IElectricElementBlock {
6 public string m_modelName;
7
9
11
13
14 public TrapdoorBlock(string modelName) => m_modelName = modelName;
15
16 public override void Initialize() {
18 Matrix boneAbsoluteTransform = BlockMesh.GetBoneAbsoluteTransform(model.FindMesh("Trapdoor").ParentBone);
19 for (int i = 0; i < 16; i++) {
20 int rotation = GetRotation(i);
21 bool open = GetOpen(i);
22 bool upsideDown = GetUpsideDown(i);
24 Matrix identity = Matrix.Identity;
25 identity *= Matrix.CreateTranslation(0f, -0.0625f, 0.4375f)
26 * Matrix.CreateRotationX(open ? -(float)Math.PI / 2f : 0f)
27 * Matrix.CreateTranslation(0f, 0.0625f, -0.4375f);
28 identity *= Matrix.CreateRotationZ(upsideDown ? (float)Math.PI : 0f);
29 identity *= Matrix.CreateRotationY(rotation * (float)Math.PI / 2f);
30 identity *= Matrix.CreateTranslation(new Vector3(0.5f, upsideDown ? 1 : 0, 0.5f));
32 .AppendModelMeshPart(
33 model.FindMesh("Trapdoor").MeshParts[0],
34 boneAbsoluteTransform * identity,
35 false,
36 false,
37 false,
38 false,
40 );
41 m_blockMeshesByData[i].GenerateSidesData();
42 m_collisionBoxesByData[i] = [m_blockMeshesByData[i].CalculateBoundingBox()];
43 }
44 m_standaloneBlockMesh.AppendModelMeshPart(
45 model.FindMesh("Trapdoor").MeshParts[0],
46 boneAbsoluteTransform * Matrix.CreateTranslation(0f, 0f, 0f),
47 false,
48 false,
49 false,
50 false,
52 );
53 base.Initialize();
54 }
55
56 public override void GenerateTerrainVertices(BlockGeometryGenerator generator, TerrainGeometry geometry, int value, int x, int y, int z) {
57 int num = Terrain.ExtractData(value);
58 if (num < m_blockMeshesByData.Length) {
60 this,
61 x,
62 y,
63 z,
66 null,
67 null,
68 geometry.SubsetAlphaTest
69 );
70 }
71 }
72
73 public override void DrawBlock(PrimitivesRenderer3D primitivesRenderer,
74 int value,
75 Color color,
76 float size,
77 ref Matrix matrix,
78 DrawBlockEnvironmentData environmentData) {
79 BlocksManager.DrawMeshBlock(primitivesRenderer, m_standaloneBlockMesh, color, size, ref matrix, environmentData);
80 }
81
82 public override BlockPlacementData GetPlacementValue(SubsystemTerrain subsystemTerrain,
83 ComponentMiner componentMiner,
84 int value,
85 TerrainRaycastResult raycastResult) {
86 int rotation;
87 bool upsideDown;
88 if (raycastResult.CellFace.Face < 4) {
89 rotation = raycastResult.CellFace.Face;
90 upsideDown = raycastResult.HitPoint().Y - raycastResult.CellFace.Y > 0.5f;
91 }
92 else {
94 float num = Vector3.Dot(forward, Vector3.UnitZ);
95 float num2 = Vector3.Dot(forward, Vector3.UnitX);
96 float num3 = Vector3.Dot(forward, -Vector3.UnitZ);
97 float num4 = Vector3.Dot(forward, -Vector3.UnitX);
98 rotation = num == MathUtils.Max(num, num2, num3, num4) ? 2 :
99 num2 == MathUtils.Max(num, num2, num3, num4) ? 3 :
100 num3 != MathUtils.Max(num, num2, num3, num4) ? num4 == MathUtils.Max(num, num2, num3, num4) ? 1 : 0 : 0;
101 upsideDown = raycastResult.CellFace.Face == 5;
102 }
103 int data = SetOpen(SetRotation(SetUpsideDown(0, upsideDown), rotation), false);
104 BlockPlacementData result = default;
106 result.CellFace = raycastResult.CellFace;
107 return result;
108 }
109
110 public override BoundingBox[] GetCustomCollisionBoxes(SubsystemTerrain terrain, int value) {
111 int num = Terrain.ExtractData(value);
112 if (num < m_collisionBoxesByData.Length) {
113 return m_collisionBoxesByData[num];
114 }
115 return base.GetCustomCollisionBoxes(terrain, value);
116 }
117
118 public ElectricElement CreateElectricElement(SubsystemElectricity subsystemElectricity, int value, int x, int y, int z) {
119 int data = Terrain.ExtractData(value);
120 return new TrapDoorElectricElement(subsystemElectricity, new CellFace(x, y, z, GetMountingFace(data)));
121 }
122
124 int value,
125 int face,
126 int connectorFace,
127 int x,
128 int y,
129 int z) {
130 int data = Terrain.ExtractData(value);
131 if (face == GetMountingFace(data)) {
132 int rotation = GetRotation(data);
133 if (SubsystemElectricity.GetConnectorDirection(4, (4 - rotation) % 4, connectorFace) == ElectricConnectorDirection.Top) {
134 return ElectricConnectorType.Input;
135 }
136 }
137 return null;
138 }
139
140 public int GetConnectionMask(int value) => int.MaxValue;
141
142 public static int GetRotation(int data) => data & 3;
143
144 public static bool GetOpen(int data) => (data & 4) != 0;
145
146 public static bool GetUpsideDown(int data) => (data & 8) != 0;
147
148 public static int SetRotation(int data, int rotation) => (data & -4) | (rotation & 3);
149
150 public static int SetOpen(int data, bool open) {
151 if (!open) {
152 return data & -5;
153 }
154 return data | 4;
155 }
156
157 public static int SetUpsideDown(int data, bool upsideDown) {
158 if (!upsideDown) {
159 return data & -9;
160 }
161 return data | 8;
162 }
163
164 public static int GetMountingFace(int data) {
165 if (!GetUpsideDown(data)) {
166 return 4;
167 }
168 return 5;
169 }
170
171 public override bool IsCollapseSupportBlock(SubsystemTerrain subsystemTerrain, int value) {
172 int data = Terrain.ExtractData(value);
173 if (GetUpsideDown(data)) {
174 return !GetOpen(data);
175 }
176 return false;
177 }
178
179 public override bool IsCollapseDestructibleBlock(int value) {
180 int data = Terrain.ExtractData(value);
181 if (GetUpsideDown(data)
182 && GetOpen(data)) {
183 return false;
184 }
185 return true;
186 }
187
188 public override bool IsMovableByPiston(int value, int pistonFace, int y, out bool isEnd) {
189 isEnd = false;
190 return false;
191 }
192 }
193}
Engine.Vector3 Vector3
ModelMesh FindMesh(string name, bool throwIfNotFound=true)
ReadOnlyList< ModelMeshPart > MeshParts
static int Max(int x1, int x2)
virtual void GenerateShadedMeshVertices(Block block, int x, int y, int z, BlockMesh blockMesh, Color color, Matrix? matrix, int[] facesMap, 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)
static ? ElectricConnectorDirection GetConnectorDirection(int mountingFace, int rotation, int connectorFace)
TerrainGeometrySubset SubsetAlphaTest
static int ReplaceData(int value, int data)
static int ReplaceContents(int value, int contents)
方块值的最低10位,替换为目标Content
static int ExtractData(int value)
static int SetUpsideDown(int data, bool upsideDown)
override BoundingBox[] GetCustomCollisionBoxes(SubsystemTerrain terrain, int value)
static bool GetUpsideDown(int data)
override void GenerateTerrainVertices(BlockGeometryGenerator generator, TerrainGeometry geometry, int value, int x, int y, int z)
override bool IsCollapseSupportBlock(SubsystemTerrain subsystemTerrain, int value)
static int SetOpen(int data, bool open)
BoundingBox[][] m_collisionBoxesByData
int GetConnectionMask(int value)
BlockMesh[] m_blockMeshesByData
TrapdoorBlock(string modelName)
override BlockPlacementData GetPlacementValue(SubsystemTerrain subsystemTerrain, ComponentMiner componentMiner, int value, TerrainRaycastResult raycastResult)
方块放置方向
ElectricElement CreateElectricElement(SubsystemElectricity subsystemElectricity, int value, int x, int y, int z)
static int GetMountingFace(int data)
static int GetRotation(int data)
static bool GetOpen(int data)
override bool IsMovableByPiston(int value, int pistonFace, int y, out bool isEnd)
override void Initialize()
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 bool IsCollapseDestructibleBlock(int value)
static int SetRotation(int data, int rotation)
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 readonly Matrix Identity
static Matrix CreateRotationY(float radians)
Vector3 Forward
static readonly Vector3 UnitX
static readonly Vector3 UnitZ
static float Dot(Vector3 v1, Vector3 v2)
Vector3 HitPoint(float offsetFromSurface=0f)