Survivalcraft API 1.8.2.3 v1.8.2.3
Survivalcraft 2.4
载入中...
搜索中...
未找到
FurnitureBlock.cs
浏览该文件的文档.
1using Engine;
3
4namespace Game {
6 public static int Index = 227;
7 public Matrix[] m_matrices = new Matrix[4];
8 public int[][] m_facesMaps = [[0, 1, 2, 3, 4, 5], [1, 2, 3, 0, 4, 5], [2, 3, 0, 1, 4, 5], [3, 0, 1, 2, 4, 5]];
9 public int[][] m_reverseFacesMaps = [[0, 1, 2, 3, 4, 5], [3, 0, 1, 2, 4, 5], [2, 3, 0, 1, 4, 5], [1, 2, 3, 0, 4, 5]];
10 public const string fName = "FurnitureBlock";
11
12 public override void Initialize() {
13 for (int i = 0; i < 4; i++) {
14 m_matrices[i] = Matrix.CreateTranslation(new Vector3(-0.5f, 0f, -0.5f))
15 * Matrix.CreateRotationY(i * (float)Math.PI / 2f)
16 * Matrix.CreateTranslation(new Vector3(0.5f, 0f, 0.5f));
17 }
18 base.Initialize();
19 }
20
21 public override void GenerateTerrainVertices(BlockGeometryGenerator generator, TerrainGeometry geometry, int value, int x, int y, int z) {
22 if (generator.SubsystemFurnitureBlockBehavior == null) {
23 return;
24 }
25 int data = Terrain.ExtractData(value);
26 int designIndex = GetDesignIndex(data);
27 int rotation = GetRotation(data);
28 FurnitureDesign design = generator.SubsystemFurnitureBlockBehavior.GetDesign(designIndex);
29 if (design == null) {
30 return;
31 }
32 FurnitureGeometry geometry2 = design.Geometry;
33 int mountingFacesMask = design.MountingFacesMask;
34 for (int i = 0; i < 6; i++) {
35 int num = CellFace.OppositeFace(i < 4 ? (i + rotation) % 4 : i);
36 byte b = (byte)(LightingManager.LightIntensityByLightValueAndFace[15 + 16 * num] * 255f);
37 Color color = new(b, b, b);
38 if (geometry2.SubsetOpaqueByFace[i] != null) {
40 this,
41 x,
42 y,
43 z,
44 geometry2.SubsetOpaqueByFace[i],
45 color,
46 m_matrices[rotation],
47 m_facesMaps[rotation],
48 geometry.OpaqueSubsetsByFace[num]
49 );
50 }
51 if (geometry2.SubsetAlphaTestByFace[i] != null) {
53 this,
54 x,
55 y,
56 z,
57 geometry2.SubsetAlphaTestByFace[i],
58 color,
59 m_matrices[rotation],
60 m_facesMaps[rotation],
61 geometry.AlphaTestSubsetsByFace[num]
62 );
63 }
64 int num2 = CellFace.OppositeFace(i < 4 ? (i - rotation + 4) % 4 : i);
65 if ((mountingFacesMask & (1 << num2)) != 0) {
66 generator.GenerateWireVertices(
67 value,
68 x,
69 y,
70 z,
71 i,
72 0f,
74 geometry.SubsetOpaque
75 );
76 }
77 }
78 }
79
80 public override void DrawBlock(PrimitivesRenderer3D primitivesRenderer,
81 int value,
82 Color color,
83 float size,
84 ref Matrix matrix,
85 DrawBlockEnvironmentData environmentData) {
86 if (environmentData.SubsystemTerrain == null) {
87 return;
88 }
89 int designIndex = GetDesignIndex(Terrain.ExtractData(value));
91 if (design == null) {
92 return;
93 }
94 Vector3 v = default;
95 v.X = -0.5f * (design.Box.Left + design.Box.Right) / design.Resolution;
96 v.Y = -0.5f * (design.Box.Top + design.Box.Bottom) / design.Resolution;
97 v.Z = -0.5f * (design.Box.Near + design.Box.Far) / design.Resolution;
98 Matrix matrix2 = Matrix.CreateTranslation(v * size) * matrix;
99 FurnitureGeometry geometry = design.Geometry;
100 for (int i = 0; i < 6; i++) {
101 float s = LightingManager.LightIntensityByLightValueAndFace[environmentData.Light + 16 * CellFace.OppositeFace(i)];
102 Color color2 = Color.MultiplyColorOnly(color, s);
103 if (geometry.SubsetOpaqueByFace[i] != null) {
104 BlocksManager.DrawMeshBlock(primitivesRenderer, geometry.SubsetOpaqueByFace[i], color2, size, ref matrix2, environmentData);
105 }
106 if (geometry.SubsetAlphaTestByFace[i] != null) {
107 BlocksManager.DrawMeshBlock(primitivesRenderer, geometry.SubsetAlphaTestByFace[i], color2, size, ref matrix2, environmentData);
108 }
109 }
110 }
111
112 public override bool IsFaceTransparent(SubsystemTerrain subsystemTerrain, int face, int value) {
113 if (subsystemTerrain != null) {
114 int data = Terrain.ExtractData(value);
115 int rotation = GetRotation(data);
116 int designIndex = GetDesignIndex(data);
117 FurnitureDesign design = subsystemTerrain.SubsystemFurnitureBlockBehavior.GetDesign(designIndex);
118 if (design != null) {
119 return ((1 << m_reverseFacesMaps[rotation][face]) & design.TransparentFacesMask) != 0;
120 }
121 }
122 return false;
123 }
124
125 public override int GetShadowStrength(int value) {
126 int data = Terrain.ExtractData(value);
127 if (GetIsLightEmitter(data)) {
128 return -99;
129 }
130 return GetShadowStrengthFactor(data) * 3 + 1;
131 }
132
133 public override int GetEmittedLightAmount(int value) {
135 return 0;
136 }
137 return 15;
138 }
139
140 public override string GetDisplayName(SubsystemTerrain subsystemTerrain, int value) {
141 if (subsystemTerrain != null) {
142 int designIndex = GetDesignIndex(Terrain.ExtractData(value));
143 FurnitureDesign design = subsystemTerrain.SubsystemFurnitureBlockBehavior.GetDesign(designIndex);
144 if (design != null) {
145 if (!string.IsNullOrEmpty(design.Name)) {
146 return design.Name;
147 }
148 return design.GetDefaultName();
149 }
150 }
151 return "Furniture";
152 }
153
154 public override bool IsInteractive(SubsystemTerrain subsystemTerrain, int value) {
155 if (subsystemTerrain != null) {
156 int designIndex = GetDesignIndex(Terrain.ExtractData(value));
157 FurnitureDesign design = subsystemTerrain.SubsystemFurnitureBlockBehavior.GetDesign(designIndex);
158 if (design != null) {
159 if (design.InteractionMode != FurnitureInteractionMode.Multistate
160 && design.InteractionMode != FurnitureInteractionMode.ElectricButton
161 && design.InteractionMode != FurnitureInteractionMode.ElectricSwitch) {
162 return design.InteractionMode == FurnitureInteractionMode.ConnectedMultistate;
163 }
164 return true;
165 }
166 }
167 return base.IsInteractive(subsystemTerrain, value);
168 }
169
170 public override string GetSoundMaterialName(SubsystemTerrain subsystemTerrain, int value) {
171 if (subsystemTerrain != null) {
172 int designIndex = GetDesignIndex(Terrain.ExtractData(value));
173 FurnitureDesign design = subsystemTerrain.SubsystemFurnitureBlockBehavior.GetDesign(designIndex);
174 if (design != null) {
175 int mainValue = design.MainValue;
176 int num = Terrain.ExtractContents(mainValue);
177 return BlocksManager.Blocks[num].GetSoundMaterialName(subsystemTerrain, mainValue);
178 }
179 }
180 return base.GetSoundMaterialName(subsystemTerrain, value);
181 }
182
183 public override BoundingBox[] GetCustomCollisionBoxes(SubsystemTerrain subsystemTerrain, int value) {
184 if (subsystemTerrain != null) {
185 int data = Terrain.ExtractData(value);
186 int designIndex = GetDesignIndex(data);
187 int rotation = GetRotation(data);
188 FurnitureDesign design = subsystemTerrain.SubsystemFurnitureBlockBehavior.GetDesign(designIndex);
189 if (design != null) {
190 return design.GetCollisionBoxes(rotation);
191 }
192 }
193 return base.GetCustomCollisionBoxes(subsystemTerrain, value);
194 }
195
196 public override BoundingBox[] GetCustomInteractionBoxes(SubsystemTerrain subsystemTerrain, int value) {
197 if (subsystemTerrain != null) {
198 int data = Terrain.ExtractData(value);
199 int designIndex = GetDesignIndex(data);
200 int rotation = GetRotation(data);
201 FurnitureDesign design = subsystemTerrain.SubsystemFurnitureBlockBehavior.GetDesign(designIndex);
202 if (design != null) {
203 return design.GetInteractionBoxes(rotation);
204 }
205 }
206 return base.GetCustomInteractionBoxes(subsystemTerrain, value);
207 }
208
210 Vector3 position,
211 int value,
212 float strength) {
213 int faceTextureSlot = GetFaceTextureSlot(4, value);
214 int designIndex = GetDesignIndex(Terrain.ExtractData(value));
215 FurnitureDesign design = subsystemTerrain.SubsystemFurnitureBlockBehavior.GetDesign(designIndex);
216 if (design != null) {
217 int mainValue = design.MainValue;
218 int num = Terrain.ExtractContents(mainValue);
219 return BlocksManager.Blocks[num].CreateDebrisParticleSystem(subsystemTerrain, position, mainValue, strength);
220 }
221 return new BlockDebrisParticleSystem(subsystemTerrain, position, strength, DestructionDebrisScale, Color.White, faceTextureSlot);
222 }
223
224 public override BlockPlacementData GetPlacementValue(SubsystemTerrain subsystemTerrain,
225 ComponentMiner componentMiner,
226 int value,
227 TerrainRaycastResult raycastResult) {
228 int rotation = 0;
229 if (raycastResult.CellFace.Face < 4) {
230 rotation = CellFace.OppositeFace(raycastResult.CellFace.Face);
231 }
232 else {
234 float num = Vector3.Dot(forward, Vector3.UnitZ);
235 float num2 = Vector3.Dot(forward, Vector3.UnitX);
236 float num3 = Vector3.Dot(forward, -Vector3.UnitZ);
237 float num4 = Vector3.Dot(forward, -Vector3.UnitX);
238 if (num == MathUtils.Max(num, num2, num3, num4)) {
239 rotation = 0;
240 }
241 else if (num2 == MathUtils.Max(num, num2, num3, num4)) {
242 rotation = 1;
243 }
244 else if (num3 == MathUtils.Max(num, num2, num3, num4)) {
245 rotation = 2;
246 }
247 else if (num4 == MathUtils.Max(num, num2, num3, num4)) {
248 rotation = 3;
249 }
250 }
251 int data = SetRotation(Terrain.ExtractData(value), rotation);
252 BlockPlacementData result = default;
253 result.CellFace = raycastResult.CellFace;
254 result.Value = Terrain.ReplaceData(value, data);
255 return result;
256 }
257
258 public override void GetDropValues(SubsystemTerrain subsystemTerrain,
259 int oldValue,
260 int newValue,
261 int toolLevel,
262 List<BlockDropValue> dropValues,
263 out bool showDebris) {
264 showDebris = true;
265 int data = Terrain.ExtractData(oldValue);
266 data = SetRotation(data, 0);
267 dropValues.Add(new BlockDropValue { Value = Terrain.MakeBlockValue(227, 0, data), Count = 1 });
268 }
269
270 public override float GetIconViewScale(int value, DrawBlockEnvironmentData environmentData) {
271 if (environmentData.SubsystemTerrain != null) {
272 int designIndex = GetDesignIndex(Terrain.ExtractData(value));
274 if (design != null) {
275 float num = design.Resolution / (float)MathUtils.Max(design.Box.Width, design.Box.Height, design.Box.Depth);
276 return DefaultIconViewScale * num;
277 }
278 }
279 return base.GetIconViewScale(value, environmentData);
280 }
281
282 public int? GetPaintColor(int value) => null;
283
284 public int Paint(SubsystemTerrain terrain, int value, int? color) {
285 int data = Terrain.ExtractData(value);
286 int designIndex = GetDesignIndex(data);
287 FurnitureDesign design = terrain.SubsystemFurnitureBlockBehavior.GetDesign(designIndex);
288 if (design != null) {
289 List<FurnitureDesign> list = design.CloneChain();
290 foreach (FurnitureDesign item in list) {
291 item.Paint(color);
292 }
293 FurnitureDesign furnitureDesign = terrain.SubsystemFurnitureBlockBehavior.TryAddDesignChain(list[0], true);
294 if (furnitureDesign != null) {
295 int data2 = SetDesignIndex(data, furnitureDesign.Index, furnitureDesign.ShadowStrengthFactor, furnitureDesign.IsLightEmitter);
296 return Terrain.ReplaceData(value, data2);
297 }
298 DisplayError();
299 }
300 return value;
301 }
302
303 public override CraftingRecipe GetAdHocCraftingRecipe(SubsystemTerrain terrain, string[] ingredients, float heatLevel, float playerLevel) {
304 if (heatLevel != 0f) {
305 return null;
306 }
307 int num = 0;
308 int num2 = 0;
309 int num3 = 0;
310 List<FurnitureDesign> list = new();
311 for (int i = 0; i < ingredients.Length; i++) {
312 if (string.IsNullOrEmpty(ingredients[i])) {
313 continue;
314 }
315 CraftingRecipesManager.DecodeIngredient(ingredients[i], out string craftingId, out int? data);
316 if (craftingId == BlocksManager.Blocks[227].CraftingId) {
317 FurnitureDesign design = terrain.SubsystemFurnitureBlockBehavior.GetDesign(GetDesignIndex(data.GetValueOrDefault()));
318 if (design == null) {
319 return null;
320 }
321 list.Add(design);
322 }
323 else if (craftingId == BlocksManager.Blocks[142].CraftingId) {
324 num++;
325 }
326 else if (craftingId == BlocksManager.Blocks[141].CraftingId) {
327 num2++;
328 }
329 else {
330 if (craftingId != BlocksManager.Blocks[133].CraftingId) {
331 return null;
332 }
333 num3++;
334 }
335 }
336 if (list.Count == 1
337 && num == 1
338 && num2 == 0
339 && num3 == 0) {
340 FurnitureDesign furnitureDesign = list[0].Clone();
341 furnitureDesign.InteractionMode = FurnitureInteractionMode.ElectricButton;
342 FurnitureDesign furnitureDesign2 = terrain.SubsystemFurnitureBlockBehavior.TryAddDesignChain(furnitureDesign, true);
343 if (furnitureDesign2 == null) {
344 DisplayError();
345 return null;
346 }
347 return new CraftingRecipe {
348 ResultValue = Terrain.MakeBlockValue(
349 227,
350 0,
351 SetDesignIndex(0, furnitureDesign2.Index, furnitureDesign2.ShadowStrengthFactor, furnitureDesign2.IsLightEmitter)
352 ),
353 ResultCount = 1,
354 Description = LanguageControl.Get(fName, 0),
355 Ingredients = (string[])ingredients.Clone()
356 };
357 }
358 if (list.Count == 2
359 && num == 0
360 && num2 == 1
361 && num3 == 0) {
362 List<FurnitureDesign> list2 = list.Select(d => d.Clone()).ToList();
363 for (int j = 0; j < list2.Count; j++) {
364 list2[j].InteractionMode = FurnitureInteractionMode.ElectricSwitch;
365 list2[j].LinkedDesign = list2[(j + 1) % list2.Count];
366 }
367 FurnitureDesign furnitureDesign3 = terrain.SubsystemFurnitureBlockBehavior.TryAddDesignChain(list2[0], true);
368 if (furnitureDesign3 == null) {
369 DisplayError();
370 return null;
371 }
372 return new CraftingRecipe {
373 ResultValue = Terrain.MakeBlockValue(
374 227,
375 0,
376 SetDesignIndex(0, furnitureDesign3.Index, furnitureDesign3.ShadowStrengthFactor, furnitureDesign3.IsLightEmitter)
377 ),
378 ResultCount = 1,
379 Description = LanguageControl.Get(fName, 0),
380 Ingredients = (string[])ingredients.Clone()
381 };
382 }
383 if (list.Count >= 2
384 && num == 0
385 && num2 == 0
386 && num3 <= 1) {
387 List<FurnitureDesign> list3 = list.Select(d => d.Clone()).ToList();
388 for (int k = 0; k < list3.Count; k++) {
389 list3[k].InteractionMode = num3 == 0 ? FurnitureInteractionMode.Multistate : FurnitureInteractionMode.ConnectedMultistate;
390 list3[k].LinkedDesign = list3[(k + 1) % list3.Count];
391 }
392 FurnitureDesign furnitureDesign4 = terrain.SubsystemFurnitureBlockBehavior.TryAddDesignChain(list3[0], true);
393 if (furnitureDesign4 == null) {
394 DisplayError();
395 return null;
396 }
397 return new CraftingRecipe {
398 ResultValue = Terrain.MakeBlockValue(
399 227,
400 0,
401 SetDesignIndex(0, furnitureDesign4.Index, furnitureDesign4.ShadowStrengthFactor, furnitureDesign4.IsLightEmitter)
402 ),
403 ResultCount = 1,
404 Description = LanguageControl.Get(fName, 0),
405 Ingredients = (string[])ingredients.Clone()
406 };
407 }
408 return null;
409 }
410
411 public ElectricElement CreateElectricElement(SubsystemElectricity subsystemElectricity, int value, int x, int y, int z) {
412 int designIndex = GetDesignIndex(Terrain.ExtractData(value));
413 FurnitureDesign design = subsystemElectricity.SubsystemTerrain.SubsystemFurnitureBlockBehavior.GetDesign(designIndex);
414 if (design != null) {
415 if (design.InteractionMode == FurnitureInteractionMode.Multistate
416 || design.InteractionMode == FurnitureInteractionMode.ConnectedMultistate) {
417 return new MultistateFurnitureElectricElement(subsystemElectricity, new Point3(x, y, z));
418 }
419 if (design.InteractionMode == FurnitureInteractionMode.ElectricButton) {
420 return new ButtonFurnitureElectricElement(subsystemElectricity, new Point3(x, y, z));
421 }
422 if (design.InteractionMode == FurnitureInteractionMode.ElectricSwitch) {
423 return new SwitchFurnitureElectricElement(subsystemElectricity, new Point3(x, y, z), value);
424 }
425 }
426 return null;
427 }
428
430 int value,
431 int face,
432 int connectorFace,
433 int x,
434 int y,
435 int z) {
436 int data = Terrain.ExtractData(value);
437 int rotation = GetRotation(data);
438 int designIndex = GetDesignIndex(data);
439 FurnitureDesign design = terrain.SubsystemFurnitureBlockBehavior.GetDesign(designIndex);
440 if (design != null) {
441 int num = CellFace.OppositeFace(face < 4 ? (face - rotation + 4) % 4 : face);
442 if ((design.MountingFacesMask & (1 << num)) != 0
443 && SubsystemElectricity.GetConnectorDirection(face, 0, connectorFace).HasValue) {
444 Point3 point = CellFace.FaceToPoint3(face);
445 int cellValue = terrain.Terrain.GetCellValue(x - point.X, y - point.Y, z - point.Z);
447 .IsFaceNonAttachable(terrain, CellFace.OppositeFace(num), cellValue, value)) {
448 if (design.InteractionMode == FurnitureInteractionMode.Multistate
449 || design.InteractionMode == FurnitureInteractionMode.ConnectedMultistate) {
450 return ElectricConnectorType.Input;
451 }
452 if (design.InteractionMode == FurnitureInteractionMode.ElectricButton
453 || design.InteractionMode == FurnitureInteractionMode.ElectricSwitch) {
454 return ElectricConnectorType.Output;
455 }
456 }
457 }
458 }
459 return null;
460 }
461
462 public int GetConnectionMask(int value) => int.MaxValue;
463
464 public void DisplayError() {
466 null,
468 );
469 }
470
471 public static int GetRotation(int data) => data & 3;
472
473 public static int SetRotation(int data, int rotation) => (data & -4) | (rotation & 3);
474
475 public static int GetDesignIndex(int data) => (((data >> 15) & 7) << 10) | ((data >> 2) & 1023);
476
477 public static int SetDesignIndex(int data, int designIndex, int shadowStrengthFactor, bool isLightEmitter) {
478 int IndexI3 = designIndex >> 10;
479 int IndexI10 = designIndex & 1023;
480 data = (data & 3) | ((IndexI10 & 1023) << 2); //设置旋转,和方块索引前10位
481 data = (data & 4095) | ((shadowStrengthFactor & 3) << 12); //设置光强
482 data = (data & 16383) | ((isLightEmitter ? 1 : 0) << 14); //设置是否发光
483 data = (data & 32767) | (IndexI3 << 15); //设置索引后3位
484 return data;
485 }
486
487 public static FurnitureDesign GetDesign(SubsystemFurnitureBlockBehavior subsystemFurnitureBlockBehavior, int value) {
488 int designIndex = GetDesignIndex(Terrain.ExtractData(value));
489 return subsystemFurnitureBlockBehavior.GetDesign(designIndex);
490 }
491
492 public static int GetShadowStrengthFactor(int data) => (data >> 12) & 3;
493
494 public static bool GetIsLightEmitter(int data) => ((data >> 14) & 1) != 0;
495
496 public override bool IsMovableByPiston(int value, int pistonFace, int y, out bool isEnd) {
497 isEnd = false;
498 return true;
499 }
500 }
501}
Engine.Vector3 Vector3
static int Max(int x1, int x2)
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)
SubsystemFurnitureBlockBehavior SubsystemFurnitureBlockBehavior
virtual BlockDebrisParticleSystem CreateDebrisParticleSystem(SubsystemTerrain subsystemTerrain, Vector3 position, int value, float strength)
float DefaultIconViewScale
virtual string GetSoundMaterialName(SubsystemTerrain subsystemTerrain, int value)
float DestructionDebrisScale
string CraftingId
virtual bool IsFaceNonAttachable(SubsystemTerrain subsystemTerrain, int face, int value, int attachBlockValue)
virtual int GetFaceTextureSlot(int face, int value)
static void DrawMeshBlock(PrimitivesRenderer3D primitivesRenderer, BlockMesh blockMesh, float size, ref Matrix matrix, DrawBlockEnvironmentData environmentData)
ComponentCreatureModel ComponentCreatureModel
ComponentCreature ComponentCreature
static void DecodeIngredient(string ingredient, out string craftingId, out int? data)
static void ShowDialog(ContainerWidget parentWidget, Dialog dialog)
int Paint(SubsystemTerrain terrain, int value, int? color)
static int SetRotation(int data, int rotation)
static FurnitureDesign GetDesign(SubsystemFurnitureBlockBehavior subsystemFurnitureBlockBehavior, int value)
static int GetShadowStrengthFactor(int data)
static int GetRotation(int data)
override bool IsInteractive(SubsystemTerrain subsystemTerrain, int value)
ElectricConnectorType? GetConnectorType(SubsystemTerrain terrain, int value, int face, int connectorFace, int x, int y, int z)
static int SetDesignIndex(int data, int designIndex, int shadowStrengthFactor, bool isLightEmitter)
override BlockDebrisParticleSystem CreateDebrisParticleSystem(SubsystemTerrain subsystemTerrain, Vector3 position, int value, float strength)
override BoundingBox[] GetCustomInteractionBoxes(SubsystemTerrain subsystemTerrain, int value)
override BlockPlacementData GetPlacementValue(SubsystemTerrain subsystemTerrain, ComponentMiner componentMiner, int value, TerrainRaycastResult raycastResult)
方块放置方向
override void GetDropValues(SubsystemTerrain subsystemTerrain, int oldValue, int newValue, int toolLevel, List< BlockDropValue > dropValues, out bool showDebris)
static bool GetIsLightEmitter(int data)
int? GetPaintColor(int value)
override int GetEmittedLightAmount(int value)
override BoundingBox[] GetCustomCollisionBoxes(SubsystemTerrain subsystemTerrain, int value)
override string GetDisplayName(SubsystemTerrain subsystemTerrain, int value)
override string GetSoundMaterialName(SubsystemTerrain subsystemTerrain, int value)
override int GetShadowStrength(int value)
override void GenerateTerrainVertices(BlockGeometryGenerator generator, TerrainGeometry geometry, int value, int x, int y, int z)
static int GetDesignIndex(int data)
ElectricElement CreateElectricElement(SubsystemElectricity subsystemElectricity, int value, int x, int y, int z)
override bool IsFaceTransparent(SubsystemTerrain subsystemTerrain, int face, int value)
override float GetIconViewScale(int value, DrawBlockEnvironmentData environmentData)
override CraftingRecipe GetAdHocCraftingRecipe(SubsystemTerrain terrain, string[] ingredients, float heatLevel, float playerLevel)
override void DrawBlock(PrimitivesRenderer3D primitivesRenderer, int value, Color color, float size, ref Matrix matrix, DrawBlockEnvironmentData environmentData)
override bool IsMovableByPiston(int value, int pistonFace, int y, out bool isEnd)
int GetConnectionMask(int value)
FurnitureInteractionMode InteractionMode
BoundingBox[] GetCollisionBoxes(int rotation)
List< FurnitureDesign > CloneChain()
BoundingBox[] GetInteractionBoxes(int rotation)
static string Get(string className, int key)
获取在当前语言类名键对应的字符串
static readonly float[] LightIntensityByLightValueAndFace
static ? ElectricConnectorDirection GetConnectorDirection(int mountingFace, int rotation, int connectorFace)
FurnitureDesign TryAddDesignChain(FurnitureDesign design, bool garbageCollectIfNeeded)
virtual SubsystemFurnitureBlockBehavior SubsystemFurnitureBlockBehavior
TerrainGeometrySubset SubsetOpaque
TerrainGeometrySubset[] AlphaTestSubsetsByFace
TerrainGeometrySubset[] OpaqueSubsetsByFace
static int ExtractContents(int value)
static int ReplaceData(int value, int data)
virtual int GetCellValue(int x, int y, int z)
static int MakeBlockValue(int contents)
static int ExtractData(int value)
int Width
定义 Box.cs:9
static Color White
static Color MultiplyColorOnly(Color c, float s)
static Matrix CreateFromQuaternion(Quaternion quaternion)
static Matrix CreateTranslation(float x, float y, float z)
static Matrix CreateRotationY(float radians)
Vector3 Forward
static readonly Vector2 Zero
static readonly Vector3 UnitX
static readonly Vector3 UnitZ
static float Dot(Vector3 v1, Vector3 v2)
static int OppositeFace(int face)
static Point3 FaceToPoint3(int face)