Survivalcraft API 1.8.2.3 v1.8.2.3
Survivalcraft 2.4
载入中...
搜索中...
未找到
SevenSegmentDisplayBlock.cs
浏览该文件的文档.
1using System.Globalization;
2using Engine;
4
5namespace Game {
7 public static int Index = 185;
8
10
12
14
15 public override void Initialize() {
16 ModelMesh modelMesh = ContentManager.Get<Model>("Models/Gates").FindMesh("SevenSegmentDisplay");
17 Matrix boneAbsoluteTransform = BlockMesh.GetBoneAbsoluteTransform(modelMesh.ParentBone);
18 for (int i = 0; i < 4; i++) {
19 Matrix m = Matrix.CreateRotationX((float)Math.PI / 2f)
20 * Matrix.CreateTranslation(0f, 0f, -0.5f)
21 * Matrix.CreateRotationY(i * (float)Math.PI / 2f)
22 * Matrix.CreateTranslation(0.5f, 0.5f, 0.5f);
25 .AppendModelMeshPart(
26 modelMesh.MeshParts[0],
27 boneAbsoluteTransform * m,
28 false,
29 false,
30 false,
31 false,
33 );
34 m_collisionBoxesByFace[i] = [m_blockMeshesByFace[i].CalculateBoundingBox()];
35 }
36 Matrix m2 = Matrix.CreateRotationY(-(float)Math.PI / 2f) * Matrix.CreateRotationZ((float)Math.PI / 2f);
38 m_standaloneBlockMesh.AppendModelMeshPart(
39 modelMesh.MeshParts[0],
40 boneAbsoluteTransform * m2,
41 false,
42 false,
43 false,
44 false,
46 );
47 }
48
49 public override IEnumerable<CraftingRecipe> GetProceduralCraftingRecipes() {
50 int color = 0;
51 while (color < 8) {
52 CraftingRecipe craftingRecipe = new() {
53 ResultCount = 4,
54 ResultValue = Terrain.MakeBlockValue(185, 0, SetColor(0, color)),
55 RemainsCount = 1,
56 RemainsValue = Terrain.MakeBlockValue(90),
57 RequiredHeatLevel = 0f,
58 Description = LanguageControl.Get("SevenSegmentDisplayBlock", 1),
59 Ingredients = {
60 [0] = "glass",
61 [2] = "glass",
62 [4] = $"paintbucket:{color.ToString(CultureInfo.InvariantCulture)}",
63 [6] = "copperingot",
64 [7] = "copperingot",
65 [8] = "copperingot"
66 }
67 };
68 yield return craftingRecipe;
69 int num = color + 1;
70 color = num;
71 }
72 }
73
74 public override bool IsFaceTransparent(SubsystemTerrain subsystemTerrain, int face, int value) {
75 int mountingFace = GetMountingFace(Terrain.ExtractData(value));
76 return face != CellFace.OppositeFace(mountingFace);
77 }
78
79 public override int GetFace(int value) => GetMountingFace(Terrain.ExtractData(value));
80
81 public override string GetDisplayName(SubsystemTerrain subsystemTerrain, int value) {
82 int data = Terrain.ExtractData(value);
83 int color = GetColor(data);
84 return string.Format(
85 LanguageControl.Get("LedBlock", "Format"),
86 LanguageControl.Get("LedBlock", color),
87 LanguageControl.GetBlock($"{GetType().Name}:{data.ToString()}", "DisplayName")
88 );
89 }
90
91 public override IEnumerable<int> GetCreativeValues() {
92 int i = 0;
93 while (i < 8) {
94 yield return Terrain.MakeBlockValue(185, 0, SetColor(0, i));
95 int num = i + 1;
96 i = num;
97 }
98 }
99
100 public override BlockPlacementData GetPlacementValue(SubsystemTerrain subsystemTerrain,
101 ComponentMiner componentMiner,
102 int value,
103 TerrainRaycastResult raycastResult) {
104 BlockPlacementData result;
105 if (raycastResult.CellFace.Face < 4) {
106 int data = SetMountingFace(Terrain.ExtractData(value), raycastResult.CellFace.Face);
107 int value2 = Terrain.ReplaceData(value, data);
108 result = default;
109 result.Value = value2;
110 result.CellFace = raycastResult.CellFace;
111 return result;
112 }
113 result = default;
114 return result;
115 }
116
117 public override void GetDropValues(SubsystemTerrain subsystemTerrain,
118 int oldValue,
119 int newValue,
120 int toolLevel,
121 List<BlockDropValue> dropValues,
122 out bool showDebris) {
123 int color = GetColor(Terrain.ExtractData(oldValue));
124 dropValues.Add(new BlockDropValue { Value = Terrain.MakeBlockValue(185, 0, SetColor(0, color)), Count = 1 });
125 showDebris = true;
126 }
127
128 public override BoundingBox[] GetCustomCollisionBoxes(SubsystemTerrain terrain, int value) {
129 int mountingFace = GetMountingFace(Terrain.ExtractData(value));
130 if (mountingFace >= m_collisionBoxesByFace.Length) {
131 return null;
132 }
133 return m_collisionBoxesByFace[mountingFace];
134 }
135
136 public override void GenerateTerrainVertices(BlockGeometryGenerator generator, TerrainGeometry geometry, int value, int x, int y, int z) {
137 int mountingFace = GetMountingFace(Terrain.ExtractData(value));
138 if (mountingFace < m_blockMeshesByFace.Length) {
139 generator.GenerateMeshVertices(
140 this,
141 x,
142 y,
143 z,
144 m_blockMeshesByFace[mountingFace],
145 Color.White,
146 null,
147 geometry.SubsetOpaque
148 );
149 generator.GenerateWireVertices(
150 value,
151 x,
152 y,
153 z,
154 mountingFace,
155 1f,
157 geometry.SubsetOpaque
158 );
159 }
160 }
161
162 public override void DrawBlock(PrimitivesRenderer3D primitivesRenderer,
163 int value,
164 Color color,
165 float size,
166 ref Matrix matrix,
167 DrawBlockEnvironmentData environmentData) {
168 BlocksManager.DrawMeshBlock(primitivesRenderer, m_standaloneBlockMesh, color, 2f * size, ref matrix, environmentData);
169 }
170
171 public override ElectricElement CreateElectricElement(SubsystemElectricity subsystemElectricity, int value, int x, int y, int z) =>
172 new SevenSegmentDisplayElectricElement(subsystemElectricity, new CellFace(x, y, z, GetFace(value)));
173
175 int value,
176 int face,
177 int connectorFace,
178 int x,
179 int y,
180 int z) {
181 int face2 = GetFace(value);
182 if (face == face2
183 && SubsystemElectricity.GetConnectorDirection(face2, 0, connectorFace).HasValue) {
184 return ElectricConnectorType.Input;
185 }
186 return null;
187 }
188
189 public static int GetMountingFace(int data) => data & 3;
190
191 public static int SetMountingFace(int data, int face) => (data & -4) | (face & 3);
192
193 public static int GetColor(int data) => (data >> 3) & 7;
194
195 public static int SetColor(int data, int color) => (data & -57) | ((color & 7) << 3);
196 }
197}
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)
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 GetBlock(string blockName, string prop)
static string Get(string className, int key)
获取在当前语言类名键对应的字符串
override? ElectricConnectorType GetConnectorType(SubsystemTerrain terrain, int value, int face, int connectorFace, int x, int y, int z)
override IEnumerable< CraftingRecipe > GetProceduralCraftingRecipes()
static int SetColor(int data, int color)
override void GenerateTerrainVertices(BlockGeometryGenerator generator, TerrainGeometry geometry, int value, int x, int y, int z)
override BoundingBox[] GetCustomCollisionBoxes(SubsystemTerrain terrain, int value)
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 IEnumerable< int > GetCreativeValues()
static int SetMountingFace(int data, int face)
override void GetDropValues(SubsystemTerrain subsystemTerrain, int oldValue, int newValue, int toolLevel, List< BlockDropValue > dropValues, out bool showDebris)
override ElectricElement CreateElectricElement(SubsystemElectricity subsystemElectricity, int value, int x, int y, int z)
override string GetDisplayName(SubsystemTerrain subsystemTerrain, int value)
override BlockPlacementData GetPlacementValue(SubsystemTerrain subsystemTerrain, ComponentMiner componentMiner, int value, TerrainRaycastResult raycastResult)
方块放置方向
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 Matrix CreateRotationZ(float radians)
static Matrix CreateRotationY(float radians)
static readonly Vector2 Zero
static int OppositeFace(int face)