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