Survivalcraft API 1.8.2.3 v1.8.2.3
Survivalcraft 2.4
载入中...
搜索中...
未找到
SpikedPlankBlock.cs
浏览该文件的文档.
1using Engine;
3
4namespace Game {
6 public static int Index = 86;
7
9
11
13
14 public override void Initialize() {
15 Model model = ContentManager.Get<Model>("Models/SpikedPlanks");
16 string[] array = ["SpikedPlankRetracted", "SpikedPlank"];
17 for (int i = 0; i < 2; i++) {
18 string name = array[i];
19 Matrix boneAbsoluteTransform = BlockMesh.GetBoneAbsoluteTransform(model.FindMesh(name).ParentBone);
20 for (int j = 0; j < 6; j++) {
21 int num = SetMountingFace(SetSpikesState(0, i != 0), j);
22 Matrix m = j >= 4
23 ? j != 4
24 ? Matrix.CreateRotationX((float)Math.PI) * Matrix.CreateTranslation(0.5f, 1f, 0.5f)
25 : Matrix.CreateTranslation(0.5f, 0f, 0.5f)
26 : Matrix.CreateRotationX((float)Math.PI / 2f)
27 * Matrix.CreateTranslation(0f, 0f, -0.5f)
28 * Matrix.CreateRotationY(j * (float)Math.PI / 2f)
29 * Matrix.CreateTranslation(0.5f, 0.5f, 0.5f);
30 m_blockMeshesByData[num] = new BlockMesh();
32 .AppendModelMeshPart(
33 model.FindMesh(name).MeshParts[0],
34 boneAbsoluteTransform * m,
35 false,
36 false,
37 false,
38 false,
40 );
41 m_collisionBoxesByData[num] = [m_blockMeshesByData[num].CalculateBoundingBox()];
42 }
43 Matrix identity = Matrix.Identity;
44 m_standaloneBlockMesh.AppendModelMeshPart(
45 model.FindMesh(name).MeshParts[0],
46 boneAbsoluteTransform * identity,
47 false,
48 false,
49 false,
50 false,
52 );
53 }
54 }
55
56 public override bool IsFaceTransparent(SubsystemTerrain subsystemTerrain, int face, int value) {
57 int mountingFace = GetMountingFace(Terrain.ExtractData(value));
58 return face != CellFace.OppositeFace(mountingFace);
59 }
60
61 public override bool ShouldAvoid(int value) => GetSpikesState(Terrain.ExtractData(value));
62
63 public static bool GetSpikesState(int data) => (data & 1) == 0;
64
65 public static int SetSpikesState(int data, bool spikesState) {
66 if (spikesState) {
67 return data & -2;
68 }
69 return data | 1;
70 }
71
72 public static int GetMountingFace(int data) => ((data >> 1) + 4) % 6;
73
74 public static int SetMountingFace(int data, int face) {
75 data &= -15;
76 data |= (((face + 2) % 6) & 7) << 1;
77 return data;
78 }
79
80 public override int GetFace(int value) => GetMountingFace(Terrain.ExtractData(value));
81
82 public override BlockPlacementData GetPlacementValue(SubsystemTerrain subsystemTerrain,
83 ComponentMiner componentMiner,
84 int value,
85 TerrainRaycastResult raycastResult) {
86 int data = SetMountingFace(SetSpikesState(Terrain.ExtractData(value), true), raycastResult.CellFace.Face);
87 BlockPlacementData result = default;
88 result.Value = Terrain.ReplaceData(value, data);
89 result.CellFace = raycastResult.CellFace;
90 return result;
91 }
92
93 public override BoundingBox[] GetCustomCollisionBoxes(SubsystemTerrain terrain, int value) {
94 int num = Terrain.ExtractData(value);
95 if (num >= m_collisionBoxesByData.Length) {
96 return base.GetCustomCollisionBoxes(terrain, value);
97 }
98 return m_collisionBoxesByData[num];
99 }
100
101 public override void GenerateTerrainVertices(BlockGeometryGenerator generator, TerrainGeometry geometry, int value, int x, int y, int z) {
102 int num = Terrain.ExtractData(value);
103 if (num < m_blockMeshesByData.Length
104 && m_blockMeshesByData[num] != null) {
106 this,
107 x,
108 y,
109 z,
111 Color.White,
112 null,
113 null,
114 geometry.SubsetOpaque
115 );
116 generator.GenerateWireVertices(
117 value,
118 x,
119 y,
120 z,
121 GetFace(value),
122 1f,
124 geometry.SubsetOpaque
125 );
126 }
127 }
128
129 public override void DrawBlock(PrimitivesRenderer3D primitivesRenderer,
130 int value,
131 Color color,
132 float size,
133 ref Matrix matrix,
134 DrawBlockEnvironmentData environmentData) {
135 BlocksManager.DrawMeshBlock(primitivesRenderer, m_standaloneBlockMesh, color, 1f * size, ref matrix, environmentData);
136 }
137
138 public override ElectricElement CreateElectricElement(SubsystemElectricity subsystemElectricity, int value, int x, int y, int z) =>
139 new SpikedPlankElectricElement(subsystemElectricity, new CellFace(x, y, z, GetFace(value)));
140
142 int value,
143 int face,
144 int connectorFace,
145 int x,
146 int y,
147 int z) {
148 int face2 = GetFace(value);
149 if (face == face2
150 && SubsystemElectricity.GetConnectorDirection(face2, 0, connectorFace).HasValue) {
151 return ElectricConnectorType.Input;
152 }
153 return null;
154 }
155 }
156}
ModelMesh FindMesh(string name, bool throwIfNotFound=true)
ReadOnlyList< ModelMeshPart > MeshParts
virtual void GenerateShadedMeshVertices(Block block, int x, int y, int z, BlockMesh blockMesh, Color color, Matrix? matrix, int[] facesMap, 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)
override void DrawBlock(PrimitivesRenderer3D primitivesRenderer, int value, Color color, float size, ref Matrix matrix, DrawBlockEnvironmentData environmentData)
override bool IsFaceTransparent(SubsystemTerrain subsystemTerrain, int face, int value)
override BoundingBox[] GetCustomCollisionBoxes(SubsystemTerrain terrain, int value)
override int GetFace(int value)
static int GetMountingFace(int data)
override bool ShouldAvoid(int value)
override BlockPlacementData GetPlacementValue(SubsystemTerrain subsystemTerrain, ComponentMiner componentMiner, int value, TerrainRaycastResult raycastResult)
方块放置方向
static int SetMountingFace(int data, int face)
static int SetSpikesState(int data, bool spikesState)
override void GenerateTerrainVertices(BlockGeometryGenerator generator, TerrainGeometry geometry, int value, int x, int y, int z)
override ElectricElement CreateElectricElement(SubsystemElectricity subsystemElectricity, int value, int x, int y, int z)
static bool GetSpikesState(int data)
BoundingBox[][] m_collisionBoxesByData
override? ElectricConnectorType GetConnectorType(SubsystemTerrain terrain, int value, int face, int connectorFace, int x, int y, int z)
static ? ElectricConnectorDirection GetConnectorDirection(int mountingFace, int rotation, int connectorFace)
TerrainGeometrySubset SubsetOpaque
static int ReplaceData(int value, int data)
static int ExtractData(int value)
static Color White
static Matrix CreateRotationX(float radians)
static Matrix CreateTranslation(float x, float y, float z)
static readonly Matrix Identity
static Matrix CreateRotationY(float radians)
static readonly Vector2 Zero
static int OppositeFace(int face)