Survivalcraft API 1.8.2.3 v1.8.2.3
Survivalcraft 2.4
载入中...
搜索中...
未找到
LightbulbBlock.cs
浏览该文件的文档.
1using Engine;
3
4namespace Game {
6 public static int Index = 139;
7
9
11
13
15
17
19 public static string fName = "LightbulbBlock";
20 public Color m_copperColor = new(118, 56, 32);
21
22 public override void Initialize() {
23 Model model = ContentManager.Get<Model>("Models/Lightbulbs");
24 Matrix boneAbsoluteTransform = BlockMesh.GetBoneAbsoluteTransform(model.FindMesh("Top").ParentBone);
25 Matrix boneAbsoluteTransform2 = BlockMesh.GetBoneAbsoluteTransform(model.FindMesh("Sides").ParentBone);
26 for (int i = 0; i < 6; i++) {
27 Matrix m = i >= 4
28 ? i != 4
29 ? Matrix.CreateRotationX((float)Math.PI) * Matrix.CreateTranslation(0.5f, 1f, 0.5f)
30 : Matrix.CreateTranslation(0.5f, 0f, 0.5f)
31 : Matrix.CreateRotationX((float)Math.PI / 2f)
32 * Matrix.CreateTranslation(0f, 0f, -0.5f)
33 * Matrix.CreateRotationY(i * (float)Math.PI / 2f)
34 * Matrix.CreateTranslation(0.5f, 0.5f, 0.5f);
37 .AppendModelMeshPart(
38 model.FindMesh("Top").MeshParts[0],
39 boneAbsoluteTransform * m,
40 false,
41 false,
42 false,
43 false,
45 );
46 m_bulbBlockMeshes[i].TransformTextureCoordinates(Matrix.CreateTranslation(0.1875f, 0.25f, 0f));
49 .AppendModelMeshPart(
50 model.FindMesh("Top").MeshParts[0],
51 boneAbsoluteTransform * m,
52 true,
53 false,
54 false,
55 false,
56 new Color(255, 255, 230)
57 );
58 m_bulbBlockMeshesLit[i].TransformTextureCoordinates(Matrix.CreateTranslation(0.9375f, 0f, 0f));
61 .AppendModelMeshPart(
62 model.FindMesh("Sides").MeshParts[0],
63 boneAbsoluteTransform2 * m,
64 false,
65 false,
66 true,
67 false,
69 );
70 m_sidesBlockMeshes[i].TransformTextureCoordinates(Matrix.CreateTranslation(0.9375f, 0.1875f, 0f));
71 m_collisionBoxes[i] = [m_sidesBlockMeshes[i].CalculateBoundingBox()];
72 }
73 Matrix m2 = Matrix.CreateRotationY(-(float)Math.PI / 2f) * Matrix.CreateRotationZ((float)Math.PI / 2f);
74 m_standaloneBulbBlockMesh.AppendModelMeshPart(
75 model.FindMesh("Top").MeshParts[0],
76 boneAbsoluteTransform * m2,
77 false,
78 false,
79 true,
80 false,
82 );
83 m_standaloneBulbBlockMesh.TransformTextureCoordinates(Matrix.CreateTranslation(0.1875f, 0.25f, 0f));
84 m_standaloneSidesBlockMesh.AppendModelMeshPart(
85 model.FindMesh("Sides").MeshParts[0],
86 boneAbsoluteTransform2 * m2,
87 false,
88 false,
89 true,
90 false,
92 );
93 m_standaloneSidesBlockMesh.TransformTextureCoordinates(Matrix.CreateTranslation(0.9375f, 0.1875f, 0f));
94 }
95
96 public override IEnumerable<int> GetCreativeValues() {
97 yield return Terrain.MakeBlockValue(139);
98 int i = 0;
99 while (i < 16) {
100 yield return Terrain.MakeBlockValue(139, 0, SetColor(0, i));
101 int num = i + 1;
102 i = num;
103 }
104 }
105
106 public override string GetDisplayName(SubsystemTerrain subsystemTerrain, int value) {
107 int? color = GetColor(Terrain.ExtractData(value));
108 return SubsystemPalette.GetName(subsystemTerrain, color, LanguageControl.Get(fName, 1));
109 }
110
111 public override string GetCategory(int value) {
112 if (!GetColor(Terrain.ExtractData(value)).HasValue) {
113 return base.GetCategory(value);
114 }
115 return "Painted";
116 }
117
118 public override int GetFace(int value) => GetMountingFace(Terrain.ExtractData(value));
119
120 public override int GetEmittedLightAmount(int value) => GetLightIntensity(Terrain.ExtractData(value));
121
122 public override int GetShadowStrength(int value) {
123 int lightIntensity = GetLightIntensity(Terrain.ExtractData(value));
124 return DefaultShadowStrength - 10 * lightIntensity;
125 }
126
127 public override BlockPlacementData GetPlacementValue(SubsystemTerrain subsystemTerrain,
128 ComponentMiner componentMiner,
129 int value,
130 TerrainRaycastResult raycastResult) {
131 BlockPlacementData result = default;
132 result.Value = Terrain.MakeBlockValue(139, 0, SetMountingFace(Terrain.ExtractData(value), raycastResult.CellFace.Face));
133 result.CellFace = raycastResult.CellFace;
134 return result;
135 }
136
137 public override void GetDropValues(SubsystemTerrain subsystemTerrain,
138 int oldValue,
139 int newValue,
140 int toolLevel,
141 List<BlockDropValue> dropValues,
142 out bool showDebris) {
143 int? color = GetColor(Terrain.ExtractData(oldValue));
144 dropValues.Add(new BlockDropValue { Value = Terrain.MakeBlockValue(139, 0, SetColor(0, color)), Count = 1 });
145 showDebris = true;
146 }
147
148 public override BoundingBox[] GetCustomCollisionBoxes(SubsystemTerrain terrain, int value) {
149 int mountingFace = GetMountingFace(Terrain.ExtractData(value));
150 if (mountingFace >= m_collisionBoxes.Length) {
151 return null;
152 }
153 return m_collisionBoxes[mountingFace];
154 }
155
156 public override void GenerateTerrainVertices(BlockGeometryGenerator generator, TerrainGeometry geometry, int value, int x, int y, int z) {
157 int data = Terrain.ExtractData(value);
158 int mountingFace = GetMountingFace(data);
159 int lightIntensity = GetLightIntensity(data);
160 int? color = GetColor(data);
161 Color color2 = color.HasValue ? SubsystemPalette.GetColor(generator, color) : m_copperColor;
162 if (mountingFace < m_bulbBlockMeshes.Length) {
163 if (lightIntensity <= 0) {
164 generator.GenerateMeshVertices(
165 this,
166 x,
167 y,
168 z,
169 m_bulbBlockMeshes[mountingFace],
170 Color.White,
171 null,
172 geometry.SubsetAlphaTest
173 );
174 }
175 else {
176 byte r = (byte)(195 + lightIntensity * 4);
177 byte g = (byte)(180 + lightIntensity * 5);
178 byte b = (byte)(165 + lightIntensity * 6);
179 generator.GenerateMeshVertices(
180 this,
181 x,
182 y,
183 z,
184 m_bulbBlockMeshesLit[mountingFace],
185 new Color(r, g, b),
186 null,
187 geometry.SubsetOpaque
188 );
189 }
190 generator.GenerateMeshVertices(
191 this,
192 x,
193 y,
194 z,
195 m_sidesBlockMeshes[mountingFace],
196 color2,
197 null,
198 geometry.SubsetOpaque
199 );
200 generator.GenerateWireVertices(
201 value,
202 x,
203 y,
204 z,
205 mountingFace,
206 0.875f,
208 geometry.SubsetOpaque
209 );
210 }
211 }
212
213 public override void DrawBlock(PrimitivesRenderer3D primitivesRenderer,
214 int value,
215 Color color,
216 float size,
217 ref Matrix matrix,
218 DrawBlockEnvironmentData environmentData) {
219 int? color2 = GetColor(Terrain.ExtractData(value));
220 Color c = color2.HasValue ? SubsystemPalette.GetColor(environmentData, color2) : m_copperColor;
221 BlocksManager.DrawMeshBlock(primitivesRenderer, m_standaloneSidesBlockMesh, color * c, 2f * size, ref matrix, environmentData);
222 BlocksManager.DrawMeshBlock(primitivesRenderer, m_standaloneBulbBlockMesh, color, 2f * size, ref matrix, environmentData);
223 }
224
225 public int? GetPaintColor(int value) => GetColor(Terrain.ExtractData(value));
226
227 public int Paint(SubsystemTerrain subsystemTerrain, int value, int? color) {
228 int data = Terrain.ExtractData(value);
229 return Terrain.ReplaceData(value, SetColor(data, color));
230 }
231
232 public override ElectricElement CreateElectricElement(SubsystemElectricity subsystemElectricity, int value, int x, int y, int z) =>
233 new LightBulbElectricElement(subsystemElectricity, new CellFace(x, y, z, GetFace(value)), value);
234
236 int value,
237 int face,
238 int connectorFace,
239 int x,
240 int y,
241 int z) {
242 int face2 = GetFace(value);
243 if (face == face2
244 && SubsystemElectricity.GetConnectorDirection(face2, 0, connectorFace).HasValue) {
245 return ElectricConnectorType.Input;
246 }
247 return null;
248 }
249
250 public static int GetMountingFace(int data) => data & 7;
251
252 public static int SetMountingFace(int data, int face) => (data & -8) | (face & 7);
253
254 public static int GetLightIntensity(int data) => (data >> 3) & 0xF;
255
256 public static int SetLightIntensity(int data, int intensity) => (data & -121) | ((intensity & 0xF) << 3);
257
258 public static int? GetColor(int data) {
259 if ((data & 0x80) != 0) {
260 return (data >> 8) & 0xF;
261 }
262 return null;
263 }
264
265 public static int SetColor(int data, int? color) {
266 if (color.HasValue) {
267 return (data & -3969) | 0x80 | ((color.Value & 0xF) << 8);
268 }
269 return data & -3969;
270 }
271 }
272}
Engine.Color Color
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)
int DefaultShadowStrength
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 void GenerateTerrainVertices(BlockGeometryGenerator generator, TerrainGeometry geometry, int value, int x, int y, int z)
static int GetMountingFace(int data)
int? GetPaintColor(int value)
BoundingBox[][] m_collisionBoxes
static int SetColor(int data, int? color)
override int GetShadowStrength(int value)
override int GetEmittedLightAmount(int value)
override int GetFace(int value)
override void GetDropValues(SubsystemTerrain subsystemTerrain, int oldValue, int newValue, int toolLevel, List< BlockDropValue > dropValues, out bool showDebris)
static ? int GetColor(int data)
override string GetDisplayName(SubsystemTerrain subsystemTerrain, int value)
static int SetMountingFace(int data, int face)
override? ElectricConnectorType GetConnectorType(SubsystemTerrain terrain, int value, int face, int connectorFace, int x, int y, int z)
int Paint(SubsystemTerrain subsystemTerrain, int value, int? color)
static int SetLightIntensity(int data, int intensity)
override BlockPlacementData GetPlacementValue(SubsystemTerrain subsystemTerrain, ComponentMiner componentMiner, int value, TerrainRaycastResult raycastResult)
方块放置方向
override ElectricElement CreateElectricElement(SubsystemElectricity subsystemElectricity, int value, int x, int y, int z)
override IEnumerable< int > GetCreativeValues()
override BoundingBox[] GetCustomCollisionBoxes(SubsystemTerrain terrain, int value)
static int GetLightIntensity(int data)
override string GetCategory(int value)
override void DrawBlock(PrimitivesRenderer3D primitivesRenderer, int value, Color color, float size, ref Matrix matrix, DrawBlockEnvironmentData environmentData)
static ? ElectricConnectorDirection GetConnectorDirection(int mountingFace, int rotation, int connectorFace)
TerrainGeometrySubset SubsetAlphaTest
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