Survivalcraft API 1.8.2.3 v1.8.2.3
Survivalcraft 2.4
载入中...
搜索中...
未找到
GravestoneBlock.cs
浏览该文件的文档.
1using System.Globalization;
2using Engine;
4
5namespace Game {
6 public class GravestoneBlock : Block {
7 public static int Index = 189;
8
10
11 public BlockMesh[] m_blockMeshes = new BlockMesh[16];
12
14
15 public override void Initialize() {
16 Model model = ContentManager.Get<Model>("Models/Graves");
17 for (int i = 0; i < 16; i++) {
18 int variant = GetVariant(i);
19 float radians = GetRotation(i) == 0 ? 0f : (float)Math.PI / 2f;
20 string name = $"Grave{(variant % 4 + 1).ToString(CultureInfo.InvariantCulture)}";
21 bool num = variant >= 4;
22 Matrix boneAbsoluteTransform = BlockMesh.GetBoneAbsoluteTransform(model.FindMesh(name).ParentBone);
23 m_blockMeshes[i] = new BlockMesh();
25 .AppendModelMeshPart(
26 model.FindMesh(name).MeshParts[0],
27 boneAbsoluteTransform * Matrix.CreateRotationY(radians) * Matrix.CreateTranslation(0.5f, 0f, 0.5f),
28 false,
29 false,
30 false,
31 false,
33 );
36 .AppendModelMeshPart(
37 model.FindMesh(name).MeshParts[0],
38 boneAbsoluteTransform * Matrix.CreateTranslation(0f, -0.5f, 0f),
39 false,
40 false,
41 false,
42 false,
44 );
45 if (num) {
46 Matrix boneAbsoluteTransform2 = BlockMesh.GetBoneAbsoluteTransform(model.FindMesh("Plinth").ParentBone);
48 .AppendModelMeshPart(
49 model.FindMesh("Plinth").MeshParts[0],
50 boneAbsoluteTransform2 * Matrix.CreateRotationY(radians) * Matrix.CreateTranslation(0.5f, 0f, 0.5f),
51 false,
52 false,
53 false,
54 false,
56 );
58 .AppendModelMeshPart(
59 model.FindMesh("Plinth").MeshParts[0],
60 boneAbsoluteTransform2 * Matrix.CreateTranslation(0f, -0.5f, 0f),
61 false,
62 false,
63 false,
64 false,
66 );
67 }
68 m_collisionBoxes[i] = [m_blockMeshes[i].CalculateBoundingBox()];
69 }
70 base.Initialize();
71 }
72
73 public override void GenerateTerrainVertices(BlockGeometryGenerator generator, TerrainGeometry geometry, int value, int x, int y, int z) {
74 int num = Terrain.ExtractData(value);
75 if (num < m_blockMeshes.Length) {
76 int num2 = Terrain.ExtractContents(y > 0 ? generator.Terrain.GetCellValueFast(x, y - 1, z) : 0);
77 bool num3 = BlocksManager.Blocks[num2].DigMethod != BlockDigMethod.Shovel;
78 bool flag = num2 == 7 || num2 == 4 || num2 == 52;
79 int num4 = (int)(MathUtils.Hash((uint)(x + 172 * y + 18271 * z)) & 0xFFFF);
80 Matrix value2 = Matrix.Identity;
81 if (!num3) {
82 float radians = 0.2f * (num4 % 16 / 7.5f - 1f);
83 float radians2 = 0.1f * ((num4 >> 4) % 16 / 7.5f - 1f);
84 value2 = GetRotation(num) != 0
85 ? Matrix.CreateTranslation(-0.5f, 0f, -0.5f)
86 * Matrix.CreateRotationZ(radians)
87 * Matrix.CreateRotationY(radians2)
88 * Matrix.CreateTranslation(0.5f, 0f, 0.5f)
89 : Matrix.CreateTranslation(-0.5f, 0f, -0.5f)
90 * Matrix.CreateRotationX(radians)
91 * Matrix.CreateRotationY(radians2)
92 * Matrix.CreateTranslation(0.5f, 0f, 0.5f);
93 }
94 float f = num3 ? 0f : MathUtils.Sqr((num4 >> 8) % 16 / 15f);
95 generator.GenerateMeshVertices(
96 color: !flag
97 ? Color.Lerp(Color.White, new Color(255, 233, 199), f)
98 : Color.Lerp(new Color(217, 206, 123), new Color(229, 206, 123), f),
99 block: this,
100 x: x,
101 y: y,
102 z: z,
103 blockMesh: m_blockMeshes[num],
104 matrix: value2,
105 subset: geometry.SubsetOpaque
106 );
107 }
108 }
109
110 public override void DrawBlock(PrimitivesRenderer3D primitivesRenderer,
111 int value,
112 Color color,
113 float size,
114 ref Matrix matrix,
115 DrawBlockEnvironmentData environmentData) {
116 int num = Terrain.ExtractData(value);
117 if (num < m_blockMeshes.Length) {
118 BlocksManager.DrawMeshBlock(primitivesRenderer, m_standaloneBlockMeshes[num], color, size, ref matrix, environmentData);
119 }
120 }
121
122 public override BoundingBox[] GetCustomCollisionBoxes(SubsystemTerrain terrain, int value) {
123 int num = Terrain.ExtractData(value);
124 if (num < m_collisionBoxes.Length) {
125 return m_collisionBoxes[num];
126 }
127 return base.GetCustomCollisionBoxes(terrain, value);
128 }
129
130 public override BlockPlacementData GetPlacementValue(SubsystemTerrain subsystemTerrain,
131 ComponentMiner componentMiner,
132 int value,
133 TerrainRaycastResult raycastResult) {
134 int data = Terrain.ExtractData(value);
136 float num = MathF.Abs(Vector3.Dot(forward, Vector3.UnitX));
137 BlockPlacementData result;
138 if (MathF.Abs(Vector3.Dot(forward, Vector3.UnitZ)) > num) {
139 result = default;
140 result.Value = Terrain.MakeBlockValue(189, 0, SetRotation(data, 0));
141 result.CellFace = raycastResult.CellFace;
142 return result;
143 }
144 result = default;
145 result.Value = Terrain.MakeBlockValue(189, 0, SetRotation(data, 1));
146 result.CellFace = raycastResult.CellFace;
147 return result;
148 }
149
150 public override IEnumerable<int> GetCreativeValues() {
151 int i = 0;
152 while (i < 8) {
153 int data = SetVariant(0, i);
154 yield return Terrain.MakeBlockValue(189, 0, data);
155 int num = i + 1;
156 i = num;
157 }
158 }
159
160 public override void GetDropValues(SubsystemTerrain subsystemTerrain,
161 int oldValue,
162 int newValue,
163 int toolLevel,
164 List<BlockDropValue> dropValues,
165 out bool showDebris) {
166 showDebris = true;
167 dropValues.Add(new BlockDropValue { Value = Terrain.MakeBlockValue(189, 0, Terrain.ExtractData(oldValue)), Count = 1 });
168 }
169
170 public static int GetRotation(int data) => (data & 8) >> 3;
171
172 public static int SetRotation(int data, int rotation) => (data & -9) | ((rotation << 3) & 8);
173
174 public static int GetVariant(int data) => data & 7;
175
176 public static int SetVariant(int data, int variant) => (data & -8) | (variant & 7);
177 }
178}
Engine.Color Color
ModelMesh FindMesh(string name, bool throwIfNotFound=true)
void Initialize(ModelData modelData, bool keepSourceVertexDataInTags)
ReadOnlyList< ModelMeshPart > MeshParts
static int Hash(int key)
static int Sqr(int x)
virtual void GenerateMeshVertices(Block block, int x, int y, int z, BlockMesh blockMesh, Color color, Matrix? matrix, TerrainGeometrySubset subset)
BlockDigMethod DigMethod
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 int GetRotation(int data)
override BlockPlacementData GetPlacementValue(SubsystemTerrain subsystemTerrain, ComponentMiner componentMiner, int value, TerrainRaycastResult raycastResult)
方块放置方向
override void DrawBlock(PrimitivesRenderer3D primitivesRenderer, int value, Color color, float size, ref Matrix matrix, DrawBlockEnvironmentData environmentData)
static int SetVariant(int data, int variant)
BoundingBox[][] m_collisionBoxes
static int GetVariant(int data)
override void GenerateTerrainVertices(BlockGeometryGenerator generator, TerrainGeometry geometry, int value, int x, int y, int z)
override BoundingBox[] GetCustomCollisionBoxes(SubsystemTerrain terrain, int value)
override IEnumerable< int > GetCreativeValues()
static int SetRotation(int data, int rotation)
override void GetDropValues(SubsystemTerrain subsystemTerrain, int oldValue, int newValue, int toolLevel, List< BlockDropValue > dropValues, out bool showDebris)
TerrainGeometrySubset SubsetOpaque
static int ExtractContents(int value)
virtual int GetCellValueFast(int x, int y, int z)
static int MakeBlockValue(int contents)
static int ExtractData(int value)
static Color Lerp(Color c1, Color c2, float f)
static Color White
static Matrix CreateRotationX(float radians)
static Matrix CreateFromQuaternion(Quaternion quaternion)
static Matrix CreateTranslation(float x, float y, float z)
static Matrix CreateRotationZ(float radians)
static readonly Matrix Identity
static Matrix CreateRotationY(float radians)
Vector3 Forward
static readonly Vector3 UnitX
static readonly Vector3 UnitZ
static float Dot(Vector3 v1, Vector3 v2)