Survivalcraft API 1.8.2.3 v1.8.2.3
Survivalcraft 2.4
载入中...
搜索中...
未找到
FenceGateBlock.cs
浏览该文件的文档.
1using Engine;
3
4namespace Game {
6 public float m_pivotDistance;
7
8 public string m_modelName;
9
10 public bool m_doubleSided;
11
12 public bool m_useAlphaTest;
13
15
17
19
21
23
24 public BlockMesh[] m_blockMeshes = new BlockMesh[16];
25
27
29
30 public FenceGateBlock(string modelName,
31 float pivotDistance,
32 bool doubleSided,
33 bool useAlphaTest,
34 int coloredTextureSlot,
35 Color postColor,
36 Color unpaintedColor) {
37 m_modelName = modelName;
38 m_pivotDistance = pivotDistance;
39 m_doubleSided = doubleSided;
40 m_useAlphaTest = useAlphaTest;
41 m_coloredTextureSlot = coloredTextureSlot;
42 m_postColor = postColor;
43 m_unpaintedColor = unpaintedColor;
44 }
45
46 public override void Initialize() {
48 Matrix boneAbsoluteTransform = BlockMesh.GetBoneAbsoluteTransform(model.FindMesh("Post").ParentBone);
49 Matrix boneAbsoluteTransform2 = BlockMesh.GetBoneAbsoluteTransform(model.FindMesh("Planks").ParentBone);
50 for (int i = 0; i < 16; i++) {
51 int rotation = GetRotation(i);
52 bool open = GetOpen(i);
53 bool rightHanded = GetRightHanded(i);
54 float num = !rightHanded ? 1 : -1;
55 Matrix identity = Matrix.Identity;
56 identity *= Matrix.CreateScale(0f - num, 1f, 1f);
57 identity *= Matrix.CreateTranslation((0.5f - m_pivotDistance) * num, 0f, 0f)
58 * Matrix.CreateRotationY(open ? num * (float)Math.PI / 2f : 0f)
59 * Matrix.CreateTranslation((0f - (0.5f - m_pivotDistance)) * num, 0f, 0f);
60 identity *= Matrix.CreateTranslation(0f, 0f, 0f)
61 * Matrix.CreateRotationY(rotation * (float)Math.PI / 2f)
62 * Matrix.CreateTranslation(0.5f, 0f, 0.5f);
63 m_blockMeshes[i] = new BlockMesh();
65 .AppendModelMeshPart(
66 model.FindMesh("Post").MeshParts[0],
67 boneAbsoluteTransform * identity,
68 false,
69 !rightHanded,
70 false,
71 false,
73 );
75 .AppendModelMeshPart(
76 model.FindMesh("Planks").MeshParts[0],
77 boneAbsoluteTransform2 * identity,
78 false,
79 !rightHanded,
80 false,
81 false,
83 );
84 if (m_doubleSided) {
86 .AppendModelMeshPart(
87 model.FindMesh("Planks").MeshParts[0],
88 boneAbsoluteTransform2 * identity,
89 false,
90 rightHanded,
91 false,
92 true,
94 );
95 }
97 m_coloredBlockMeshes[i].AppendBlockMesh(m_blockMeshes[i]);
99 .TransformTextureCoordinates(Matrix.CreateTranslation(DefaultTextureSlot % 16 / 16f, DefaultTextureSlot / 16 / 16f, 0f));
101 .TransformTextureCoordinates(Matrix.CreateTranslation(m_coloredTextureSlot % 16 / 16f, m_coloredTextureSlot / 16 / 16f, 0f));
102 BoundingBox boundingBox = m_blockMeshes[i].CalculateBoundingBox();
103 boundingBox.Min.X = MathUtils.Saturate(boundingBox.Min.X);
104 boundingBox.Min.Y = MathUtils.Saturate(boundingBox.Min.Y);
105 boundingBox.Min.Z = MathUtils.Saturate(boundingBox.Min.Z);
106 boundingBox.Max.X = MathUtils.Saturate(boundingBox.Max.X);
107 boundingBox.Max.Y = MathUtils.Saturate(boundingBox.Max.Y);
108 boundingBox.Max.Z = MathUtils.Saturate(boundingBox.Max.Z);
109 m_collisionBoxes[i] = [boundingBox];
110 }
111 m_standaloneBlockMesh.AppendModelMeshPart(
112 model.FindMesh("Post").MeshParts[0],
113 boneAbsoluteTransform * Matrix.CreateTranslation(0f, -0.5f, 0f),
114 false,
115 false,
116 false,
117 false,
119 );
120 m_standaloneBlockMesh.AppendModelMeshPart(
121 model.FindMesh("Planks").MeshParts[0],
122 boneAbsoluteTransform2 * Matrix.CreateTranslation(0f, -0.5f, 0f),
123 false,
124 false,
125 false,
126 false,
128 );
129 if (m_doubleSided) {
130 m_standaloneBlockMesh.AppendModelMeshPart(
131 model.FindMesh("Planks").MeshParts[0],
132 boneAbsoluteTransform2 * Matrix.CreateTranslation(0f, -0.5f, 0f),
133 false,
134 true,
135 false,
136 true,
138 );
139 }
141 m_standaloneBlockMesh.TransformTextureCoordinates(
143 );
144 m_standaloneColoredBlockMesh.TransformTextureCoordinates(
146 );
147 base.Initialize();
148 }
149
150 public override string GetDisplayName(SubsystemTerrain subsystemTerrain, int value) {
151 int? color = GetColor(Terrain.ExtractData(value));
152 return SubsystemPalette.GetName(subsystemTerrain, color, base.GetDisplayName(subsystemTerrain, value));
153 }
154
155 public override string GetCategory(int value) {
156 if (!GetColor(Terrain.ExtractData(value)).HasValue) {
157 return base.GetCategory(value);
158 }
159 return "Painted";
160 }
161
162 public override IEnumerable<int> GetCreativeValues() {
163 yield return Terrain.MakeBlockValue(BlockIndex, 0, SetColor(0, null));
164 int i = 0;
165 while (i < 16) {
166 yield return Terrain.MakeBlockValue(BlockIndex, 0, SetColor(0, i));
167 int num = i + 1;
168 i = num;
169 }
170 }
171
172 public override void GetDropValues(SubsystemTerrain subsystemTerrain,
173 int oldValue,
174 int newValue,
175 int toolLevel,
176 List<BlockDropValue> dropValues,
177 out bool showDebris) {
178 showDebris = true;
179 int data = SetVariant(Terrain.ExtractData(oldValue), 0);
180 dropValues.Add(new BlockDropValue { Value = Terrain.MakeBlockValue(BlockIndex, 0, data), Count = 1 });
181 }
182
183 public override BlockPlacementData GetPlacementValue(SubsystemTerrain subsystemTerrain,
184 ComponentMiner componentMiner,
185 int value,
186 TerrainRaycastResult raycastResult) {
188 float num = Vector3.Dot(forward, Vector3.UnitZ);
189 float num2 = Vector3.Dot(forward, Vector3.UnitX);
190 float num3 = Vector3.Dot(forward, -Vector3.UnitZ);
191 float num4 = Vector3.Dot(forward, -Vector3.UnitX);
192 int num5 = 0;
193 if (num == MathUtils.Max(num, num2, num3, num4)) {
194 num5 = 2;
195 }
196 else if (num2 == MathUtils.Max(num, num2, num3, num4)) {
197 num5 = 3;
198 }
199 else if (num3 == MathUtils.Max(num, num2, num3, num4)) {
200 num5 = 0;
201 }
202 else if (num4 == MathUtils.Max(num, num2, num3, num4)) {
203 num5 = 1;
204 }
205 Point3 point = CellFace.FaceToPoint3(raycastResult.CellFace.Face);
206 int num6 = raycastResult.CellFace.X + point.X;
207 int y = raycastResult.CellFace.Y + point.Y;
208 int num7 = raycastResult.CellFace.Z + point.Z;
209 int num8 = 0;
210 int num9 = 0;
211 switch (num5) {
212 case 0: num8 = -1; break;
213 case 1: num9 = 1; break;
214 case 2: num8 = 1; break;
215 default: num9 = -1; break;
216 }
217 int cellValue = subsystemTerrain.Terrain.GetCellValue(num6 + num8, y, num7 + num9);
218 int cellValue2 = subsystemTerrain.Terrain.GetCellValue(num6 - num8, y, num7 - num9);
220 Block block2 = BlocksManager.Blocks[Terrain.ExtractContents(cellValue2)];
221 int data = Terrain.ExtractData(cellValue);
222 int data2 = Terrain.ExtractData(cellValue2);
223 int data3 = SetRightHanded(
224 rightHanded: (block is FenceGateBlock && GetRotation(data) == num5)
225 || ((!(block2 is FenceGateBlock) || GetRotation(data2) != num5) && !block.IsCollidable_(cellValue)),
226 data: SetOpen(SetRotation(Terrain.ExtractData(value), num5), false)
227 );
228 BlockPlacementData result = default;
229 result.Value = Terrain.ReplaceData(Terrain.ReplaceContents(BlockIndex), data3);
230 result.CellFace = raycastResult.CellFace;
231 return result;
232 }
233
235 Vector3 position,
236 int value,
237 float strength) {
238 int? color = GetColor(Terrain.ExtractData(value));
239 if (color.HasValue) {
240 return new BlockDebrisParticleSystem(
241 subsystemTerrain,
242 position,
243 strength,
245 SubsystemPalette.GetColor(subsystemTerrain, color),
247 );
248 }
249 return new BlockDebrisParticleSystem(subsystemTerrain, position, strength, DestructionDebrisScale, Color.White, DefaultTextureSlot);
250 }
251
252 public override void GenerateTerrainVertices(BlockGeometryGenerator generator, TerrainGeometry geometry, int value, int x, int y, int z) {
253 int data = Terrain.ExtractData(value);
254 int variant = GetVariant(data);
255 int? color = GetColor(data);
256 if (color.HasValue) {
257 generator.GenerateMeshVertices(
258 this,
259 x,
260 y,
261 z,
262 m_coloredBlockMeshes[variant],
263 SubsystemPalette.GetColor(generator, color),
264 null,
265 m_useAlphaTest ? geometry.SubsetAlphaTest : geometry.SubsetOpaque
266 );
267 }
268 else {
269 generator.GenerateMeshVertices(
270 this,
271 x,
272 y,
273 z,
274 m_blockMeshes[variant],
276 null,
277 m_useAlphaTest ? geometry.SubsetAlphaTest : geometry.SubsetOpaque
278 );
279 }
280 generator.GenerateWireVertices(
281 value,
282 x,
283 y,
284 z,
285 GetHingeFace(data),
286 m_pivotDistance * 2f,
288 geometry.SubsetOpaque
289 );
290 }
291
292 public override void DrawBlock(PrimitivesRenderer3D primitivesRenderer,
293 int value,
294 Color color,
295 float size,
296 ref Matrix matrix,
297 DrawBlockEnvironmentData environmentData) {
298 int? color2 = GetColor(Terrain.ExtractData(value));
299 if (color2.HasValue) {
301 primitivesRenderer,
303 color * SubsystemPalette.GetColor(environmentData, color2),
304 size,
305 ref matrix,
306 environmentData
307 );
308 }
309 else {
310 BlocksManager.DrawMeshBlock(primitivesRenderer, m_standaloneBlockMesh, color * m_unpaintedColor, size, ref matrix, environmentData);
311 }
312 }
313
314 public int? GetPaintColor(int value) => GetColor(Terrain.ExtractData(value));
315
316 public int Paint(SubsystemTerrain terrain, int value, int? color) {
317 int data = Terrain.ExtractData(value);
318 return Terrain.ReplaceData(value, SetColor(data, color));
319 }
320
321 public override BoundingBox[] GetCustomCollisionBoxes(SubsystemTerrain terrain, int value) {
322 int variant = GetVariant(Terrain.ExtractData(value));
323 return m_collisionBoxes[variant];
324 }
325
326 public ElectricElement CreateElectricElement(SubsystemElectricity subsystemElectricity, int value, int x, int y, int z) {
327 int data = Terrain.ExtractData(value);
328 return new FenceGateElectricElement(subsystemElectricity, new CellFace(x, y, z, GetHingeFace(data)));
329 }
330
332 int value,
333 int face,
334 int connectorFace,
335 int x,
336 int y,
337 int z) {
338 int hingeFace = GetHingeFace(Terrain.ExtractData(value));
339 if (face == hingeFace) {
340 return ElectricConnectorType.Input;
341 }
342 return null;
343 }
344
345 public int GetConnectionMask(int value) => int.MaxValue;
346
347 public static int GetRotation(int data) => data & 3;
348
349 public static bool GetOpen(int data) => (data & 4) != 0;
350
351 public static bool GetRightHanded(int data) => (data & 8) == 0;
352
353 public static int SetRotation(int data, int rotation) => (data & -4) | (rotation & 3);
354
355 public static int SetOpen(int data, bool open) {
356 if (!open) {
357 return data & -5;
358 }
359 return data | 4;
360 }
361
362 public static int SetRightHanded(int data, bool rightHanded) {
363 if (rightHanded) {
364 return data & -9;
365 }
366 return data | 8;
367 }
368
369 public static int GetHingeFace(int data) {
370 int rotation = GetRotation(data);
371 int num = rotation - 1 < 0 ? 3 : rotation - 1;
372 if (!GetRightHanded(data)) {
373 num = CellFace.OppositeFace(num);
374 }
375 return num;
376 }
377
378 public static int GetVariant(int data) => data & 0xF;
379
380 public static int SetVariant(int data, int variant) => (data & -16) | (variant & 0xF);
381
382 public static int? GetColor(int data) {
383 if ((data & 0x10) != 0) {
384 return (data >> 5) & 0xF;
385 }
386 return null;
387 }
388
389 public static int SetColor(int data, int? color) {
390 if (color.HasValue) {
391 return (data & -497) | 0x10 | ((color.Value & 0xF) << 5);
392 }
393 return data & -497;
394 }
395 }
396}
ModelMesh FindMesh(string name, bool throwIfNotFound=true)
ReadOnlyList< ModelMeshPart > MeshParts
static float Saturate(float x)
static int Max(int x1, int x2)
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 BlockIndex
定义 Block.cs:6
float DestructionDebrisScale
int DefaultTextureSlot
virtual bool IsCollidable_(int value)
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 bool GetRightHanded(int data)
static int SetVariant(int data, int variant)
int GetConnectionMask(int value)
static int SetColor(int data, int? color)
int Paint(SubsystemTerrain terrain, int value, int? color)
ElectricElement CreateElectricElement(SubsystemElectricity subsystemElectricity, int value, int x, int y, int z)
BoundingBox[][] m_collisionBoxes
static int SetRightHanded(int data, bool rightHanded)
static int GetVariant(int data)
static ? int GetColor(int data)
override void GenerateTerrainVertices(BlockGeometryGenerator generator, TerrainGeometry geometry, int value, int x, int y, int z)
static int GetHingeFace(int data)
override void GetDropValues(SubsystemTerrain subsystemTerrain, int oldValue, int newValue, int toolLevel, List< BlockDropValue > dropValues, out bool showDebris)
override BlockDebrisParticleSystem CreateDebrisParticleSystem(SubsystemTerrain subsystemTerrain, Vector3 position, int value, float strength)
static bool GetOpen(int data)
override string GetDisplayName(SubsystemTerrain subsystemTerrain, int value)
static int SetRotation(int data, int rotation)
static int SetOpen(int data, bool open)
override string GetCategory(int value)
override IEnumerable< int > GetCreativeValues()
override BoundingBox[] GetCustomCollisionBoxes(SubsystemTerrain terrain, int value)
override BlockPlacementData GetPlacementValue(SubsystemTerrain subsystemTerrain, ComponentMiner componentMiner, int value, TerrainRaycastResult raycastResult)
方块放置方向
ElectricConnectorType? GetConnectorType(SubsystemTerrain terrain, int value, int face, int connectorFace, int x, int y, int z)
FenceGateBlock(string modelName, float pivotDistance, bool doubleSided, bool useAlphaTest, int coloredTextureSlot, Color postColor, Color unpaintedColor)
override void DrawBlock(PrimitivesRenderer3D primitivesRenderer, int value, Color color, float size, ref Matrix matrix, DrawBlockEnvironmentData environmentData)
int? GetPaintColor(int value)
static int GetRotation(int data)
TerrainGeometrySubset SubsetAlphaTest
TerrainGeometrySubset SubsetOpaque
static int ExtractContents(int value)
static int ReplaceData(int value, int data)
virtual int GetCellValue(int x, int y, int z)
static int ReplaceContents(int value, int contents)
方块值的最低10位,替换为目标Content
static int MakeBlockValue(int contents)
static int ExtractData(int value)
static Color White
static Matrix CreateFromQuaternion(Quaternion quaternion)
static Matrix CreateTranslation(float x, float y, float z)
static readonly Matrix Identity
static Matrix CreateRotationY(float radians)
Vector3 Forward
static Matrix CreateScale(float scale)
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)