Survivalcraft API 1.8.2.3 v1.8.2.3
Survivalcraft 2.4
载入中...
搜索中...
未找到
PistonBlock.cs
浏览该文件的文档.
1using Engine;
3
4namespace Game {
6 public static int Index = 237;
7
9
11
12 public override void Initialize() {
13 Model model = ContentManager.Get<Model>("Models/Pistons");
14 for (PistonMode pistonMode = PistonMode.Pushing; pistonMode <= PistonMode.StrictPulling; pistonMode++) {
15 for (int i = 0; i < 2; i++) {
16 string name = i == 0 ? "PistonRetracted" : "PistonExtended";
17 Matrix boneAbsoluteTransform = BlockMesh.GetBoneAbsoluteTransform(model.FindMesh(name).ParentBone);
18 for (int j = 0; j < 6; j++) {
19 int num = SetFace(SetIsExtended(SetMode(0, pistonMode), i != 0), j);
20 Matrix m = j < 4 ? Matrix.CreateTranslation(0f, -0.5f, 0f)
21 * Matrix.CreateRotationY(j * (float)Math.PI / 2f + (float)Math.PI)
22 * Matrix.CreateTranslation(0.5f, 0.5f, 0.5f) :
23 j != 4 ?
24 Matrix.CreateTranslation(0f, -0.5f, 0f)
25 * Matrix.CreateRotationX(-(float)Math.PI / 2f)
26 * Matrix.CreateTranslation(0.5f, 0.5f, 0.5f) :
27 Matrix.CreateTranslation(0f, -0.5f, 0f)
28 * Matrix.CreateRotationX((float)Math.PI / 2f)
29 * Matrix.CreateTranslation(0.5f, 0.5f, 0.5f);
30 m_blockMeshesByData[num] = new BlockMesh();
32 .AppendModelMeshPart(
33 model.FindMesh(name).MeshParts[0],
34 boneAbsoluteTransform * m,
35 false,
36 false,
37 false,
38 false,
40 );
41 if (i == 0) {
42 switch (pistonMode) {
43 case PistonMode.Pulling:
44 m_blockMeshesByData[num].TransformTextureCoordinates(Matrix.CreateTranslation(0f, 0.0625f, 0f), 1 << j); break;
45 case PistonMode.StrictPulling:
46 m_blockMeshesByData[num].TransformTextureCoordinates(Matrix.CreateTranslation(0f, 0.125f, 0f), 1 << j); break;
47 }
48 }
49 }
50 }
51 Matrix boneAbsoluteTransform2 = BlockMesh.GetBoneAbsoluteTransform(model.FindMesh("PistonRetracted").ParentBone);
52 m_standaloneBlockMeshes[(int)pistonMode] = new BlockMesh();
53 m_standaloneBlockMeshes[(int)pistonMode]
54 .AppendModelMeshPart(
55 model.FindMesh("PistonRetracted").MeshParts[0],
56 boneAbsoluteTransform2 * Matrix.CreateTranslation(0f, -0.5f, 0f),
57 false,
58 false,
59 false,
60 false,
62 );
63 switch (pistonMode) {
64 case PistonMode.Pulling:
65 m_standaloneBlockMeshes[(int)pistonMode].TransformTextureCoordinates(Matrix.CreateTranslation(0f, 0.0625f, 0f), 4); break;
66 case PistonMode.StrictPulling:
67 m_standaloneBlockMeshes[(int)pistonMode].TransformTextureCoordinates(Matrix.CreateTranslation(0f, 0.125f, 0f), 4); break;
68 }
69 }
70 }
71
72 public override bool IsCollapseSupportBlock(SubsystemTerrain subsystemTerrain, int value) => !IsFaceTransparent(subsystemTerrain, 4, value);
73
74 public override bool IsFaceTransparent(SubsystemTerrain subsystemTerrain, int face, int value) {
75 int data = Terrain.ExtractData(value);
76 int face2 = GetFace(data);
77 if (GetIsExtended(data)) {
78 if (face != face2) {
79 return face != CellFace.OppositeFace(face2);
80 }
81 }
82 return false;
83 }
84
85 public override bool IsFaceNonAttachable(SubsystemTerrain subsystemTerrain, int face, int value, int attachBlockValue) =>
86 IsFaceTransparent(subsystemTerrain, face, value);
87
88 public override void GenerateTerrainVertices(BlockGeometryGenerator generator, TerrainGeometry geometry, int value, int x, int y, int z) {
89 int num = Terrain.ExtractData(value) & 0x3F;
90 if (num < m_blockMeshesByData.Length
91 && m_blockMeshesByData[num] != null) {
93 this,
94 x,
95 y,
96 z,
99 null,
100 null,
101 geometry.SubsetOpaque
102 );
103 }
104 }
105
106 public override void DrawBlock(PrimitivesRenderer3D primitivesRenderer,
107 int value,
108 Color color,
109 float size,
110 ref Matrix matrix,
111 DrawBlockEnvironmentData environmentData) {
112 int mode = (int)GetMode(Terrain.ExtractData(value));
113 if (mode < m_standaloneBlockMeshes.Length
114 && m_standaloneBlockMeshes[mode] != null) {
115 BlocksManager.DrawMeshBlock(primitivesRenderer, m_standaloneBlockMeshes[mode], color, 1f * size, ref matrix, environmentData);
116 }
117 }
118
119 public ElectricElement CreateElectricElement(SubsystemElectricity subsystemElectricity, int value, int x, int y, int z) =>
120 new PistonElectricElement(subsystemElectricity, new Point3(x, y, z));
121
123 int value,
124 int face,
125 int connectorFace,
126 int x,
127 int y,
128 int z) => ElectricConnectorType.Input;
129
130 public int GetConnectionMask(int value) => int.MaxValue;
131
132 public override IEnumerable<int> GetCreativeValues() {
133 yield return Terrain.MakeBlockValue(237, 0, SetMode(SetMaxExtension(0, 7), PistonMode.Pushing));
134 yield return Terrain.MakeBlockValue(237, 0, SetMode(SetMaxExtension(0, 7), PistonMode.Pulling));
135 yield return Terrain.MakeBlockValue(237, 0, SetMode(SetMaxExtension(0, 7), PistonMode.StrictPulling));
136 }
137
138 public override string GetDisplayName(SubsystemTerrain subsystemTerrain, int value) =>
139 LanguageControl.Get("PistonBlock", (int)GetMode(Terrain.ExtractData(value)));
140
141 public override BlockPlacementData GetPlacementValue(SubsystemTerrain subsystemTerrain,
142 ComponentMiner componentMiner,
143 int value,
144 TerrainRaycastResult raycastResult) {
146 float num = float.PositiveInfinity;
147 int face = 0;
148 for (int i = 0; i < 6; i++) {
149 float num2 = Vector3.Dot(CellFace.FaceToVector3(i), forward);
150 if (num2 < num) {
151 num = num2;
152 face = i;
153 }
154 }
155 int data = Terrain.ExtractData(value);
156 BlockPlacementData result = default;
157 result.Value = Terrain.MakeBlockValue(BlockIndex, 0, SetFace(data, face));
158 result.CellFace = raycastResult.CellFace;
159 return result;
160 }
161
162 public override void GetDropValues(SubsystemTerrain subsystemTerrain,
163 int oldValue,
164 int newValue,
165 int toolLevel,
166 List<BlockDropValue> dropValues,
167 out bool showDebris) {
168 int data = Terrain.ExtractData(oldValue);
169 dropValues.Add(new BlockDropValue { Value = Terrain.MakeBlockValue(237, 0, SetFace(SetIsExtended(data, false), 0)), Count = 1 });
170 showDebris = true;
171 }
172
173 public static bool GetIsExtended(int data) => (data & 1) != 0;
174
175 public static int SetIsExtended(int data, bool isExtended) => (data & -2) | (isExtended ? 1 : 0);
176
177 public static PistonMode GetMode(int data) => (PistonMode)((data >> 1) & 3);
178
179 public static int SetMode(int data, PistonMode mode) => (data & -7) | ((int)(mode & (PistonMode)3) << 1);
180
181 public static int GetFace(int data) => (data >> 3) & 7;
182
183 public static int SetFace(int data, int face) => (data & -57) | ((face & 7) << 3);
184
185 public static int GetMaxExtension(int data) => (data >> 6) & 7;
186
187 public static int SetMaxExtension(int data, int maxExtension) => (data & -449) | ((maxExtension & 7) << 6);
188
189 public static int GetPullCount(int data) => (data >> 9) & 7;
190
191 public static int SetPullCount(int data, int pullCount) => (data & -3585) | ((pullCount & 7) << 9);
192
193 public static int GetSpeed(int data) => (data >> 12) & 7;
194
195 public static int SetSpeed(int data, int speed) => (data & -12289) | ((speed & 3) << 12);
196
197 public override bool IsMovableByPiston(int value, int pistonFace, int y, out bool isEnd) {
198 int data = Terrain.ExtractData(value);
199 isEnd = false;
200 return !GetIsExtended(data);
201 }
202 }
203}
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)
int BlockIndex
定义 Block.cs:6
static Matrix GetBoneAbsoluteTransform(ModelBone modelBone)
static void DrawMeshBlock(PrimitivesRenderer3D primitivesRenderer, BlockMesh blockMesh, float size, ref Matrix matrix, DrawBlockEnvironmentData environmentData)
ComponentCreatureModel ComponentCreatureModel
ComponentCreature ComponentCreature
static object Get(Type type, string name)
static string Get(string className, int key)
获取在当前语言类名键对应的字符串
override bool IsFaceNonAttachable(SubsystemTerrain subsystemTerrain, int face, int value, int attachBlockValue)
BlockMesh[] m_blockMeshesByData
static int SetPullCount(int data, int pullCount)
override void Initialize()
static int SetMode(int data, PistonMode mode)
static PistonMode GetMode(int data)
static int GetPullCount(int data)
BlockMesh[] m_standaloneBlockMeshes
override void GetDropValues(SubsystemTerrain subsystemTerrain, int oldValue, int newValue, int toolLevel, List< BlockDropValue > dropValues, out bool showDebris)
static int SetMaxExtension(int data, int maxExtension)
override bool IsCollapseSupportBlock(SubsystemTerrain subsystemTerrain, int value)
ElectricConnectorType? GetConnectorType(SubsystemTerrain terrain, int value, int face, int connectorFace, int x, int y, int z)
override BlockPlacementData GetPlacementValue(SubsystemTerrain subsystemTerrain, ComponentMiner componentMiner, int value, TerrainRaycastResult raycastResult)
方块放置方向
static int GetFace(int data)
static int GetMaxExtension(int data)
override string GetDisplayName(SubsystemTerrain subsystemTerrain, int value)
static int SetSpeed(int data, int speed)
override bool IsMovableByPiston(int value, int pistonFace, int y, out bool isEnd)
override void DrawBlock(PrimitivesRenderer3D primitivesRenderer, int value, Color color, float size, ref Matrix matrix, DrawBlockEnvironmentData environmentData)
static int SetIsExtended(int data, bool isExtended)
ElectricElement CreateElectricElement(SubsystemElectricity subsystemElectricity, int value, int x, int y, int z)
override bool IsFaceTransparent(SubsystemTerrain subsystemTerrain, int face, int value)
static int GetSpeed(int data)
int GetConnectionMask(int value)
override IEnumerable< int > GetCreativeValues()
static int SetFace(int data, int face)
override void GenerateTerrainVertices(BlockGeometryGenerator generator, TerrainGeometry geometry, int value, int x, int y, int z)
static bool GetIsExtended(int data)
TerrainGeometrySubset SubsetOpaque
static int MakeBlockValue(int contents)
static int ExtractData(int value)
static Color White
static Matrix CreateRotationX(float radians)
static Matrix CreateFromQuaternion(Quaternion quaternion)
static Matrix CreateTranslation(float x, float y, float z)
static Matrix CreateRotationY(float radians)
Vector3 Forward
static float Dot(Vector3 v1, Vector3 v2)
static int OppositeFace(int face)
static Vector3 FaceToVector3(int face)