Survivalcraft API 1.8.2.3 v1.8.2.3
Survivalcraft 2.4
载入中...
搜索中...
未找到
PistonHeadBlock.cs
浏览该文件的文档.
1using Engine;
3
4namespace Game {
5 public class PistonHeadBlock : Block {
6 public static int Index = 238;
7
9
10 public override void Initialize() {
11 Model model = ContentManager.Get<Model>("Models/Pistons");
12 for (int i = 0; i < 2; i++) {
13 string name = i == 0 ? "PistonHead" : "PistonShaft";
14 Matrix boneAbsoluteTransform = BlockMesh.GetBoneAbsoluteTransform(model.FindMesh(name).ParentBone);
15 for (PistonMode pistonMode = PistonMode.Pushing; pistonMode <= PistonMode.StrictPulling; pistonMode++) {
16 for (int j = 0; j < 6; j++) {
17 int num = SetFace(SetMode(SetIsShaft(0, i != 0), pistonMode), j);
18 Matrix m = j < 4 ? Matrix.CreateTranslation(0f, -0.5f, 0f)
19 * Matrix.CreateRotationY(j * (float)Math.PI / 2f + (float)Math.PI)
20 * Matrix.CreateTranslation(0.5f, 0.5f, 0.5f) :
21 j != 4 ?
22 Matrix.CreateTranslation(0f, -0.5f, 0f)
23 * Matrix.CreateRotationX(-(float)Math.PI / 2f)
24 * Matrix.CreateTranslation(0.5f, 0.5f, 0.5f) :
25 Matrix.CreateTranslation(0f, -0.5f, 0f)
26 * Matrix.CreateRotationX((float)Math.PI / 2f)
27 * Matrix.CreateTranslation(0.5f, 0.5f, 0.5f);
28 m_blockMeshesByData[num] = new BlockMesh();
30 .AppendModelMeshPart(
31 model.FindMesh(name).MeshParts[0],
32 boneAbsoluteTransform * m,
33 false,
34 false,
35 false,
36 false,
38 );
39 switch (pistonMode) {
40 case PistonMode.Pulling:
41 m_blockMeshesByData[num].TransformTextureCoordinates(Matrix.CreateTranslation(0f, 0.0625f, 0f), 1 << j); break;
42 case PistonMode.StrictPulling:
43 m_blockMeshesByData[num].TransformTextureCoordinates(Matrix.CreateTranslation(0f, 0.125f, 0f), 1 << j); break;
44 }
45 }
46 }
47 }
48 }
49
50 public override bool IsFaceTransparent(SubsystemTerrain subsystemTerrain, int face, int value) {
51 int data = Terrain.ExtractData(value);
52 return face != GetFace(data);
53 }
54
55 public override bool IsFaceNonAttachable(SubsystemTerrain subsystemTerrain, int face, int value, int attachBlockValue) =>
56 IsFaceTransparent(subsystemTerrain, face, value);
57
58 public override int GetShadowStrength(int value) {
59 if (!GetIsShaft(Terrain.ExtractData(value))) {
60 return base.GetShadowStrength(value);
61 }
62 return 0;
63 }
64
65 public override void GenerateTerrainVertices(BlockGeometryGenerator generator, TerrainGeometry geometry, int value, int x, int y, int z) {
66 int num = Terrain.ExtractData(value);
67 if (num < m_blockMeshesByData.Length
68 && m_blockMeshesByData[num] != null) {
70 this,
71 x,
72 y,
73 z,
76 null,
77 null,
78 geometry.SubsetOpaque
79 );
80 }
81 }
82
83 public override void DrawBlock(PrimitivesRenderer3D primitivesRenderer,
84 int value,
85 Color color,
86 float size,
87 ref Matrix matrix,
88 DrawBlockEnvironmentData environmentData) { }
89
90 public static PistonMode GetMode(int data) => (PistonMode)(data & 3);
91
92 public static int SetMode(int data, PistonMode mode) => (data & -4) | (int)(mode & (PistonMode)3);
93
94 public static bool GetIsShaft(int data) => (data & 4) != 0;
95
96 public static int SetIsShaft(int data, bool isShaft) => (data & -5) | (isShaft ? 4 : 0);
97
98 public static int GetFace(int data) => (data >> 3) & 7;
99
100 public static int SetFace(int data, int face) => (data & -57) | ((face & 7) << 3);
101
102 public override bool IsCollapseSupportBlock(SubsystemTerrain subsystemTerrain, int value) => true;
103
104 public override bool IsMovableByPiston(int value, int pistonFace, int y, out bool isEnd) {
105 isEnd = false;
106 return false;
107 }
108 }
109}
ModelMesh FindMesh(string name, bool throwIfNotFound=true)
ReadOnlyList< ModelMeshPart > MeshParts
virtual void GenerateShadedMeshVertices(Block block, int x, int y, int z, BlockMesh blockMesh, Color color, Matrix? matrix, int[] facesMap, TerrainGeometrySubset subset)
static Matrix GetBoneAbsoluteTransform(ModelBone modelBone)
static object Get(Type type, string name)
override bool IsCollapseSupportBlock(SubsystemTerrain subsystemTerrain, int value)
override void GenerateTerrainVertices(BlockGeometryGenerator generator, TerrainGeometry geometry, int value, int x, int y, int z)
static int GetFace(int data)
override int GetShadowStrength(int value)
override bool IsMovableByPiston(int value, int pistonFace, int y, out bool isEnd)
override bool IsFaceTransparent(SubsystemTerrain subsystemTerrain, int face, int value)
static PistonMode GetMode(int data)
static int SetFace(int data, int face)
override bool IsFaceNonAttachable(SubsystemTerrain subsystemTerrain, int face, int value, int attachBlockValue)
static bool GetIsShaft(int data)
static int SetMode(int data, PistonMode mode)
static int SetIsShaft(int data, bool isShaft)
override void DrawBlock(PrimitivesRenderer3D primitivesRenderer, int value, Color color, float size, ref Matrix matrix, DrawBlockEnvironmentData environmentData)
TerrainGeometrySubset SubsetOpaque
static int ExtractData(int value)
static Color White
static Matrix CreateRotationX(float radians)
static Matrix CreateTranslation(float x, float y, float z)
static Matrix CreateRotationY(float radians)