Survivalcraft API 1.8.2.3 v1.8.2.3
Survivalcraft 2.4
载入中...
搜索中...
未找到
PressurePlateBlock.cs
浏览该文件的文档.
1using Engine;
3
4namespace Game {
6 public static int Index = 144;
7
9
11
13
15
16 public int[] m_textureSlotsByMaterial = [4, 1];
17
18 public override void Initialize() {
19 Model model = ContentManager.Get<Model>("Models/PressurePlate");
20 for (int i = 0; i < 2; i++) {
21 Matrix boneAbsoluteTransform = BlockMesh.GetBoneAbsoluteTransform(model.FindMesh("PressurePlate").ParentBone);
22 int num = m_textureSlotsByMaterial[i];
23 for (int j = 0; j < 6; j++) {
24 int num2 = SetMountingFace(SetMaterial(0, i), j);
25 Matrix matrix = j >= 4
26 ? j != 4
27 ? Matrix.CreateRotationX((float)Math.PI) * Matrix.CreateTranslation(0.5f, 1f, 0.5f)
28 : Matrix.CreateTranslation(0.5f, 0f, 0.5f)
29 : Matrix.CreateRotationX((float)Math.PI / 2f)
30 * Matrix.CreateTranslation(0f, 0f, -0.5f)
31 * Matrix.CreateRotationY(j * (float)Math.PI / 2f)
32 * Matrix.CreateTranslation(0.5f, 0.5f, 0.5f);
33 m_blockMeshesByData[num2] = new BlockMesh();
35 .AppendModelMeshPart(
36 model.FindMesh("PressurePlate").MeshParts[0],
37 boneAbsoluteTransform * matrix,
38 false,
39 false,
40 false,
41 false,
43 );
44 m_blockMeshesByData[num2].TransformTextureCoordinates(Matrix.CreateTranslation(num % 16 / 16f, num / 16 / 16f, 0f));
45 m_blockMeshesByData[num2].GenerateSidesData();
46 Vector3 vector = Vector3.Transform(new Vector3(-0.5f, 0f, -0.5f), matrix);
47 Vector3 vector2 = Vector3.Transform(new Vector3(0.5f, 0.0625f, 0.5f), matrix);
48 vector.X = MathF.Round(vector.X * 100f) / 100f;
49 vector.Y = MathF.Round(vector.Y * 100f) / 100f;
50 vector.Z = MathF.Round(vector.Z * 100f) / 100f;
51 vector2.X = MathF.Round(vector2.X * 100f) / 100f;
52 vector2.Y = MathF.Round(vector2.Y * 100f) / 100f;
53 vector2.Z = MathF.Round(vector2.Z * 100f) / 100f;
55 new BoundingBox(
56 new Vector3(MathF.Min(vector.X, vector2.X), MathF.Min(vector.Y, vector2.Y), MathF.Min(vector.Z, vector2.Z)),
57 new Vector3(MathF.Max(vector.X, vector2.X), MathF.Max(vector.Y, vector2.Y), MathF.Max(vector.Z, vector2.Z))
58 )
59 ];
60 }
61 Matrix identity = Matrix.Identity;
64 .AppendModelMeshPart(
65 model.FindMesh("PressurePlate").MeshParts[0],
66 boneAbsoluteTransform * identity,
67 false,
68 false,
69 false,
70 false,
72 );
73 m_standaloneBlockMeshesByMaterial[i].TransformTextureCoordinates(Matrix.CreateTranslation(num % 16 / 16f, num / 16 / 16f, 0f));
74 }
75 }
76
77 public override string GetDisplayName(SubsystemTerrain subsystemTerrain, int value) {
78 int material = GetMaterial(Terrain.ExtractData(value));
79 return LanguageControl.Get("PressurePlateBlock", material);
80 }
81
82 public override IEnumerable<int> GetCreativeValues() => m_creativeValuesByMaterial;
83
85 Vector3 position,
86 int value,
87 float strength) {
88 int material = GetMaterial(Terrain.ExtractData(value));
90 subsystemTerrain,
91 position,
92 strength,
96 );
97 }
98
99 public override BlockPlacementData GetPlacementValue(SubsystemTerrain subsystemTerrain,
100 ComponentMiner componentMiner,
101 int value,
102 TerrainRaycastResult raycastResult) {
103 int data = SetMountingFace(Terrain.ExtractData(value), raycastResult.CellFace.Face);
104 int value2 = Terrain.ReplaceData(value, data);
105 BlockPlacementData result = default;
106 result.Value = value2;
107 result.CellFace = raycastResult.CellFace;
108 return result;
109 }
110
111 public override void GetDropValues(SubsystemTerrain subsystemTerrain,
112 int oldValue,
113 int newValue,
114 int toolLevel,
115 List<BlockDropValue> dropValues,
116 out bool showDebris) {
117 int material = GetMaterial(Terrain.ExtractData(oldValue));
118 dropValues.Add(new BlockDropValue { Value = Terrain.MakeBlockValue(144, 0, SetMaterial(0, material)), Count = 1 });
119 showDebris = true;
120 }
121
122 public override BoundingBox[] GetCustomCollisionBoxes(SubsystemTerrain terrain, int value) {
123 int num = Terrain.ExtractData(value);
124 if (num >= m_collisionBoxesByData.Length) {
125 return null;
126 }
127 return m_collisionBoxesByData[num];
128 }
129
130 public override bool IsFaceTransparent(SubsystemTerrain subsystemTerrain, int face, int value) =>
131 face != CellFace.OppositeFace(GetFace(value));
132
133 public override void GenerateTerrainVertices(BlockGeometryGenerator generator, TerrainGeometry geometry, int value, int x, int y, int z) {
134 int num = Terrain.ExtractData(value);
135 if (num < m_blockMeshesByData.Length
136 && m_blockMeshesByData[num] != null) {
137 generator.GenerateMeshVertices(
138 this,
139 x,
140 y,
141 z,
143 Color.White,
144 null,
145 geometry.SubsetOpaque
146 );
147 generator.GenerateWireVertices(
148 value,
149 x,
150 y,
151 z,
152 GetFace(value),
153 0.8125f,
155 geometry.SubsetOpaque
156 );
157 }
158 }
159
160 public override void DrawBlock(PrimitivesRenderer3D primitivesRenderer,
161 int value,
162 Color color,
163 float size,
164 ref Matrix matrix,
165 DrawBlockEnvironmentData environmentData) {
166 int material = GetMaterial(Terrain.ExtractData(value));
168 primitivesRenderer,
170 color,
171 2f * size,
172 ref matrix,
173 environmentData
174 );
175 }
176
177 public override ElectricElement CreateElectricElement(SubsystemElectricity subsystemElectricity, int value, int x, int y, int z) =>
178 new PressurePlateElectricElement(subsystemElectricity, new CellFace(x, y, z, GetFace(value)));
179
181 int value,
182 int face,
183 int connectorFace,
184 int x,
185 int y,
186 int z) {
187 int face2 = GetFace(value);
188 if (face == face2
189 && SubsystemElectricity.GetConnectorDirection(face2, 0, connectorFace).HasValue) {
190 return ElectricConnectorType.Output;
191 }
192 return null;
193 }
194
195 public static int GetMaterial(int data) => data & 1;
196
197 public static int SetMaterial(int data, int material) => (data & -2) | (material & 1);
198
199 public static int GetMountingFace(int data) => (data >> 1) & 7;
200
201 public static int SetMountingFace(int data, int face) => (data & -15) | ((face & 7) << 1);
202
203 public override int GetFace(int value) => GetMountingFace(Terrain.ExtractData(value));
204 }
205}
Engine.Vector3 Vector3
ModelMesh FindMesh(string name, bool throwIfNotFound=true)
ReadOnlyList< ModelMeshPart > MeshParts
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)
float DestructionDebrisScale
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)
static string Get(string className, int key)
获取在当前语言类名键对应的字符串
override IEnumerable< int > GetCreativeValues()
override BlockPlacementData GetPlacementValue(SubsystemTerrain subsystemTerrain, ComponentMiner componentMiner, int value, TerrainRaycastResult raycastResult)
方块放置方向
override int GetFace(int value)
override? ElectricConnectorType GetConnectorType(SubsystemTerrain terrain, int value, int face, int connectorFace, int x, int y, int z)
override string GetDisplayName(SubsystemTerrain subsystemTerrain, int value)
override bool IsFaceTransparent(SubsystemTerrain subsystemTerrain, int face, int value)
static int SetMaterial(int data, int material)
override void DrawBlock(PrimitivesRenderer3D primitivesRenderer, int value, Color color, float size, ref Matrix matrix, DrawBlockEnvironmentData environmentData)
static int SetMountingFace(int data, int face)
override void GetDropValues(SubsystemTerrain subsystemTerrain, int oldValue, int newValue, int toolLevel, List< BlockDropValue > dropValues, out bool showDebris)
static int GetMountingFace(int data)
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)
override BlockDebrisParticleSystem CreateDebrisParticleSystem(SubsystemTerrain subsystemTerrain, Vector3 position, int value, float strength)
override BoundingBox[] GetCustomCollisionBoxes(SubsystemTerrain terrain, int value)
static ? ElectricConnectorDirection GetConnectorDirection(int mountingFace, int rotation, int connectorFace)
TerrainGeometrySubset SubsetOpaque
static int ReplaceData(int value, int data)
static int MakeBlockValue(int contents)
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 Vector3 Round(Vector3 v)
static Vector3 Transform(Vector3 v, Matrix m)
static int OppositeFace(int face)