Survivalcraft API 1.8.2.3 v1.8.2.3
Survivalcraft 2.4
载入中...
搜索中...
未找到
FenceBlock.cs
浏览该文件的文档.
1using Engine;
3
4namespace Game {
5 public abstract class FenceBlock : Block, IPaintableBlock {
6 public string m_modelName;
7
8 public bool m_doubleSidedPlanks;
9
10 public bool m_useAlphaTest;
11
13
15
17
19
21
22 public BlockMesh[] m_blockMeshes = new BlockMesh[16];
23
25
27
28 public FenceBlock(string modelName,
29 bool doubleSidedPlanks,
30 bool useAlphaTest,
31 int coloredTextureSlot,
32 Color postColor,
33 Color unpaintedColor) {
34 m_modelName = modelName;
35 m_doubleSidedPlanks = doubleSidedPlanks;
36 m_useAlphaTest = useAlphaTest;
37 m_coloredTextureSlot = coloredTextureSlot;
38 m_postColor = postColor;
39 m_unpaintedColor = unpaintedColor;
40 }
41
42 public override void Initialize() {
44 Matrix boneAbsoluteTransform = BlockMesh.GetBoneAbsoluteTransform(model.FindMesh("Post").ParentBone);
45 Matrix boneAbsoluteTransform2 = BlockMesh.GetBoneAbsoluteTransform(model.FindMesh("Planks").ParentBone);
46 for (int i = 0; i < 16; i++) {
47 bool num = (i & 1) != 0;
48 bool flag = (i & 2) != 0;
49 bool flag2 = (i & 4) != 0;
50 bool flag3 = (i & 8) != 0;
51 List<BoundingBox> list = new();
52 Matrix m = Matrix.CreateTranslation(0.5f, 0f, 0.5f);
53 BlockMesh blockMesh = new();
54 blockMesh.AppendModelMeshPart(
55 model.FindMesh("Post").MeshParts[0],
56 boneAbsoluteTransform * m,
57 false,
58 false,
59 false,
60 false,
62 );
63 BoundingBox item = blockMesh.CalculateBoundingBox();
64 item.Min.X -= 0.1f;
65 item.Min.Z -= 0.1f;
66 item.Max.X += 0.1f;
67 item.Max.Z += 0.1f;
68 list.Add(item);
69 BlockMesh blockMesh2 = new();
70 if (num) {
71 BlockMesh blockMesh3 = new();
72 Matrix m2 = Matrix.CreateRotationY(0f) * Matrix.CreateTranslation(0.5f, 0f, 0.5f);
73 blockMesh3.AppendModelMeshPart(
74 model.FindMesh("Planks").MeshParts[0],
75 boneAbsoluteTransform2 * m2,
76 false,
77 false,
78 false,
79 false,
81 );
83 blockMesh3.AppendModelMeshPart(
84 model.FindMesh("Planks").MeshParts[0],
85 boneAbsoluteTransform2 * m2,
86 false,
87 true,
88 false,
89 true,
91 );
92 }
93 blockMesh2.AppendBlockMesh(blockMesh3);
94 BoundingBox item2 = blockMesh3.CalculateBoundingBox();
95 list.Add(item2);
96 }
97 if (flag) {
98 BlockMesh blockMesh4 = new();
99 Matrix m3 = Matrix.CreateRotationY((float)Math.PI) * Matrix.CreateTranslation(0.5f, 0f, 0.5f);
100 blockMesh4.AppendModelMeshPart(
101 model.FindMesh("Planks").MeshParts[0],
102 boneAbsoluteTransform2 * m3,
103 false,
104 false,
105 false,
106 false,
108 );
110 blockMesh4.AppendModelMeshPart(
111 model.FindMesh("Planks").MeshParts[0],
112 boneAbsoluteTransform2 * m3,
113 false,
114 true,
115 false,
116 true,
118 );
119 }
120 blockMesh2.AppendBlockMesh(blockMesh4);
121 BoundingBox item3 = blockMesh4.CalculateBoundingBox();
122 list.Add(item3);
123 }
124 if (flag2) {
125 BlockMesh blockMesh5 = new();
126 Matrix m4 = Matrix.CreateRotationY(4.712389f) * Matrix.CreateTranslation(0.5f, 0f, 0.5f);
127 blockMesh5.AppendModelMeshPart(
128 model.FindMesh("Planks").MeshParts[0],
129 boneAbsoluteTransform2 * m4,
130 false,
131 false,
132 false,
133 false,
135 );
137 blockMesh5.AppendModelMeshPart(
138 model.FindMesh("Planks").MeshParts[0],
139 boneAbsoluteTransform2 * m4,
140 false,
141 true,
142 false,
143 true,
145 );
146 }
147 blockMesh2.AppendBlockMesh(blockMesh5);
148 BoundingBox item4 = blockMesh5.CalculateBoundingBox();
149 list.Add(item4);
150 }
151 if (flag3) {
152 BlockMesh blockMesh6 = new();
153 Matrix m5 = Matrix.CreateRotationY((float)Math.PI / 2f) * Matrix.CreateTranslation(0.5f, 0f, 0.5f);
154 blockMesh6.AppendModelMeshPart(
155 model.FindMesh("Planks").MeshParts[0],
156 boneAbsoluteTransform2 * m5,
157 false,
158 false,
159 false,
160 false,
162 );
164 blockMesh6.AppendModelMeshPart(
165 model.FindMesh("Planks").MeshParts[0],
166 boneAbsoluteTransform2 * m5,
167 false,
168 true,
169 false,
170 true,
172 );
173 }
174 blockMesh2.AppendBlockMesh(blockMesh6);
175 BoundingBox item5 = blockMesh6.CalculateBoundingBox();
176 list.Add(item5);
177 }
178 blockMesh.ModulateColor(m_postColor);
179 m_blockMeshes[i] = new BlockMesh();
180 m_blockMeshes[i].AppendBlockMesh(blockMesh);
181 m_blockMeshes[i].AppendBlockMesh(blockMesh2);
183 .TransformTextureCoordinates(Matrix.CreateTranslation(DefaultTextureSlot % 16 / 16f, DefaultTextureSlot / 16 / 16f, 0f));
184 m_blockMeshes[i].GenerateSidesData();
186 m_coloredBlockMeshes[i].AppendBlockMesh(blockMesh);
187 m_coloredBlockMeshes[i].AppendBlockMesh(blockMesh2);
189 .TransformTextureCoordinates(Matrix.CreateTranslation(m_coloredTextureSlot % 16 / 16f, m_coloredTextureSlot / 16 / 16f, 0f));
190 m_coloredBlockMeshes[i].GenerateSidesData();
191 m_collisionBoxes[i] = list.ToArray();
192 }
193 m_standaloneBlockMesh.AppendModelMeshPart(
194 model.FindMesh("Post").MeshParts[0],
195 boneAbsoluteTransform * Matrix.CreateTranslation(-0.5f, -0.5f, 0f),
196 false,
197 false,
198 false,
199 false,
201 );
202 m_standaloneBlockMesh.AppendModelMeshPart(
203 model.FindMesh("Post").MeshParts[0],
204 boneAbsoluteTransform * Matrix.CreateTranslation(0.5f, -0.5f, 0f),
205 false,
206 false,
207 false,
208 false,
210 );
211 m_standaloneBlockMesh.AppendModelMeshPart(
212 model.FindMesh("Planks").MeshParts[0],
213 boneAbsoluteTransform2 * Matrix.CreateRotationY(0f) * Matrix.CreateTranslation(-0.5f, -0.5f, 0f),
214 false,
215 false,
216 false,
217 false,
219 );
221 m_standaloneBlockMesh.AppendModelMeshPart(
222 model.FindMesh("Planks").MeshParts[0],
223 boneAbsoluteTransform2 * Matrix.CreateRotationY(0f) * Matrix.CreateTranslation(-0.5f, -0.5f, 0f),
224 false,
225 true,
226 false,
227 true,
229 );
230 }
231 m_standaloneBlockMesh.AppendModelMeshPart(
232 model.FindMesh("Planks").MeshParts[0],
233 boneAbsoluteTransform2 * Matrix.CreateRotationY((float)Math.PI) * Matrix.CreateTranslation(0.5f, -0.5f, 0f),
234 false,
235 false,
236 false,
237 false,
239 );
241 m_standaloneBlockMesh.AppendModelMeshPart(
242 model.FindMesh("Planks").MeshParts[0],
243 boneAbsoluteTransform2 * Matrix.CreateRotationY((float)Math.PI) * Matrix.CreateTranslation(0.5f, -0.5f, 0f),
244 false,
245 true,
246 false,
247 true,
249 );
250 }
252 m_standaloneBlockMesh.TransformTextureCoordinates(
254 );
255 m_standaloneColoredBlockMesh.TransformTextureCoordinates(
257 );
258 base.Initialize();
259 }
260
261 public override string GetDisplayName(SubsystemTerrain subsystemTerrain, int value) {
262 int? color = GetColor(Terrain.ExtractData(value));
263 return SubsystemPalette.GetName(subsystemTerrain, color, base.GetDisplayName(subsystemTerrain, value));
264 }
265
266 public override string GetCategory(int value) {
267 if (!GetColor(Terrain.ExtractData(value)).HasValue) {
268 return base.GetCategory(value);
269 }
270 return "Painted";
271 }
272
273 public override IEnumerable<int> GetCreativeValues() {
274 yield return Terrain.MakeBlockValue(BlockIndex, 0, SetColor(0, null));
275 int i = 0;
276 while (i < 16) {
277 yield return Terrain.MakeBlockValue(BlockIndex, 0, SetColor(0, i));
278 int num = i + 1;
279 i = num;
280 }
281 }
282
283 public override void GetDropValues(SubsystemTerrain subsystemTerrain,
284 int oldValue,
285 int newValue,
286 int toolLevel,
287 List<BlockDropValue> dropValues,
288 out bool showDebris) {
289 showDebris = true;
290 int data = SetVariant(Terrain.ExtractData(oldValue), 0);
291 dropValues.Add(new BlockDropValue { Value = Terrain.MakeBlockValue(BlockIndex, 0, data), Count = 1 });
292 }
293
295 Vector3 position,
296 int value,
297 float strength) {
298 int? color = GetColor(Terrain.ExtractData(value));
299 if (color.HasValue) {
300 return new BlockDebrisParticleSystem(
301 subsystemTerrain,
302 position,
303 strength,
305 SubsystemPalette.GetColor(subsystemTerrain, color),
307 );
308 }
309 return new BlockDebrisParticleSystem(subsystemTerrain, position, strength, DestructionDebrisScale, Color.White, DefaultTextureSlot);
310 }
311
312 public override void GenerateTerrainVertices(BlockGeometryGenerator generator, TerrainGeometry geometry, int value, int x, int y, int z) {
313 int data = Terrain.ExtractData(value);
314 int variant = GetVariant(data);
315 int? color = GetColor(data);
316 if (color.HasValue) {
317 generator.GenerateMeshVertices(
318 this,
319 x,
320 y,
321 z,
322 m_coloredBlockMeshes[variant],
323 SubsystemPalette.GetColor(generator, color),
324 null,
325 m_useAlphaTest ? geometry.SubsetAlphaTest : geometry.SubsetOpaque
326 );
327 }
328 else {
329 generator.GenerateMeshVertices(
330 this,
331 x,
332 y,
333 z,
334 m_blockMeshes[variant],
336 null,
337 m_useAlphaTest ? geometry.SubsetAlphaTest : geometry.SubsetOpaque
338 );
339 }
340 }
341
342 public override bool IsFaceNonAttachable(SubsystemTerrain subsystemTerrain, int face, int value, int attachBlockValue) {
343 Block block = BlocksManager.Blocks[Terrain.ExtractContents(attachBlockValue)];
344 if (block is BasePumpkinBlock) {
345 return false;
346 }
347 return base.IsFaceNonAttachable(subsystemTerrain, face, value, attachBlockValue);
348 }
349
350 public override void DrawBlock(PrimitivesRenderer3D primitivesRenderer,
351 int value,
352 Color color,
353 float size,
354 ref Matrix matrix,
355 DrawBlockEnvironmentData environmentData) {
356 int? color2 = GetColor(Terrain.ExtractData(value));
357 if (color2.HasValue) {
359 primitivesRenderer,
361 color * SubsystemPalette.GetColor(environmentData, color2),
362 size,
363 ref matrix,
364 environmentData
365 );
366 }
367 else {
368 BlocksManager.DrawMeshBlock(primitivesRenderer, m_standaloneBlockMesh, color * m_unpaintedColor, size, ref matrix, environmentData);
369 }
370 }
371
372 public int? GetPaintColor(int value) => GetColor(Terrain.ExtractData(value));
373
374 public int Paint(SubsystemTerrain terrain, int value, int? color) {
375 int data = Terrain.ExtractData(value);
376 return Terrain.ReplaceData(value, SetColor(data, color));
377 }
378
379 public override BoundingBox[] GetCustomCollisionBoxes(SubsystemTerrain terrain, int value) {
380 int variant = GetVariant(Terrain.ExtractData(value));
381 return m_collisionBoxes[variant];
382 }
383
384 public virtual bool ShouldConnectTo(int value) {
385 int num = Terrain.ExtractContents(value);
386 Block block = BlocksManager.Blocks[num];
387 if (!(block is FenceBlock)) {
388 return block is FenceGateBlock;
389 }
390 return true;
391 }
392
393 public static int GetVariant(int data) => data & 0xF;
394
395 public static int SetVariant(int data, int variant) => (data & -16) | (variant & 0xF);
396
397 public static int? GetColor(int data) {
398 if ((data & 0x10) != 0) {
399 return (data >> 5) & 0xF;
400 }
401 return null;
402 }
403
404 public static int SetColor(int data, int? color) {
405 if (color.HasValue) {
406 return (data & -497) | 0x10 | ((color.Value & 0xF) << 5);
407 }
408 return data & -497;
409 }
410 }
411}
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)
int BlockIndex
定义 Block.cs:6
float DestructionDebrisScale
virtual bool IsFaceNonAttachable(SubsystemTerrain subsystemTerrain, int face, int value, int attachBlockValue)
int DefaultTextureSlot
virtual void ModulateColor(Color color, int facesMask=-1)
virtual BoundingBox CalculateBoundingBox()
static Matrix GetBoneAbsoluteTransform(ModelBone modelBone)
virtual void AppendBlockMesh(BlockMesh blockMesh)
virtual void AppendModelMeshPart(ModelMeshPart meshPart, Matrix matrix, bool makeEmissive, bool flipWindingOrder, bool doubleSided, bool flipNormals, Color color)
static void DrawMeshBlock(PrimitivesRenderer3D primitivesRenderer, BlockMesh blockMesh, float size, ref Matrix matrix, DrawBlockEnvironmentData environmentData)
static object Get(Type type, string name)
static int SetVariant(int data, int variant)
override BoundingBox[] GetCustomCollisionBoxes(SubsystemTerrain terrain, int value)
override void GetDropValues(SubsystemTerrain subsystemTerrain, int oldValue, int newValue, int toolLevel, List< BlockDropValue > dropValues, out bool showDebris)
override void DrawBlock(PrimitivesRenderer3D primitivesRenderer, int value, Color color, float size, ref Matrix matrix, DrawBlockEnvironmentData environmentData)
override IEnumerable< int > GetCreativeValues()
virtual bool ShouldConnectTo(int value)
override bool IsFaceNonAttachable(SubsystemTerrain subsystemTerrain, int face, int value, int attachBlockValue)
int? GetPaintColor(int value)
static int SetColor(int data, int? color)
override void Initialize()
static int GetVariant(int data)
int Paint(SubsystemTerrain terrain, int value, int? color)
BlockMesh m_standaloneColoredBlockMesh
override BlockDebrisParticleSystem CreateDebrisParticleSystem(SubsystemTerrain subsystemTerrain, Vector3 position, int value, float strength)
static ? int GetColor(int data)
BlockMesh[] m_blockMeshes
override string GetCategory(int value)
BlockMesh[] m_coloredBlockMeshes
BoundingBox[][] m_collisionBoxes
override string GetDisplayName(SubsystemTerrain subsystemTerrain, int value)
FenceBlock(string modelName, bool doubleSidedPlanks, bool useAlphaTest, int coloredTextureSlot, Color postColor, Color unpaintedColor)
override void GenerateTerrainVertices(BlockGeometryGenerator generator, TerrainGeometry geometry, int value, int x, int y, int z)
BlockMesh m_standaloneBlockMesh
TerrainGeometrySubset SubsetAlphaTest
TerrainGeometrySubset SubsetOpaque
static int ExtractContents(int value)
static int ReplaceData(int value, int data)
static int MakeBlockValue(int contents)
static int ExtractData(int value)
static Color White
static Matrix CreateTranslation(float x, float y, float z)
static Matrix CreateRotationY(float radians)