Survivalcraft API 1.8.2.3 v1.8.2.3
Survivalcraft 2.4
载入中...
搜索中...
未找到
PostedSignBlock.cs
浏览该文件的文档.
1using Engine;
3
4namespace Game {
6 public string m_modelName;
7
9
11
13
15
16 public BlockMesh[] m_blockMeshes = new BlockMesh[16];
17
19
21
22 public Vector3[] m_surfaceNormals = new Vector3[16];
23
25
26 public Vector3[] m_directions = new Vector3[16];
27
28 public PostedSignBlock(string modelName, int coloredTextureSlot, int attachedSignBlockIndex) {
29 m_modelName = modelName;
30 m_coloredTextureSlot = coloredTextureSlot;
31 m_attachedSignBlockIndex = attachedSignBlockIndex;
32 }
33
34 public override void Initialize() {
36 Matrix boneAbsoluteTransform = BlockMesh.GetBoneAbsoluteTransform(model.FindMesh("Sign").ParentBone);
37 Matrix boneAbsoluteTransform2 = BlockMesh.GetBoneAbsoluteTransform(model.FindMesh("Post").ParentBone);
38 Matrix boneAbsoluteTransform3 = BlockMesh.GetBoneAbsoluteTransform(model.FindMesh("Surface").ParentBone);
39 for (int i = 0; i < 16; i++) {
40 bool hanging = GetHanging(i);
41 Matrix m = Matrix.CreateRotationY(GetDirection(i) * (float)Math.PI / 4f) * Matrix.CreateTranslation(0.5f, 0f, 0.5f);
42 if (hanging) {
43 m *= Matrix.CreateScale(1f, -1f, 1f) * Matrix.CreateTranslation(0f, 1f, 0f);
44 }
45 m_directions[i] = m.Forward;
46 BlockMesh blockMesh = new();
47 blockMesh.AppendModelMeshPart(
48 model.FindMesh("Sign").MeshParts[0],
49 boneAbsoluteTransform * m,
50 false,
51 hanging,
52 false,
53 false,
55 );
56 BlockMesh blockMesh2 = new();
57 blockMesh2.AppendModelMeshPart(
58 model.FindMesh("Post").MeshParts[0],
59 boneAbsoluteTransform2 * m,
60 false,
61 hanging,
62 false,
63 false,
65 );
66 m_blockMeshes[i] = new BlockMesh();
67 m_blockMeshes[i].AppendBlockMesh(blockMesh);
68 m_blockMeshes[i].AppendBlockMesh(blockMesh2);
70 m_coloredBlockMeshes[i].AppendBlockMesh(m_blockMeshes[i]);
72 .TransformTextureCoordinates(Matrix.CreateTranslation(DefaultTextureSlot % 16 / 16f, DefaultTextureSlot / 16 / 16f, 0f));
74 .TransformTextureCoordinates(Matrix.CreateTranslation(m_coloredTextureSlot % 16 / 16f, m_coloredTextureSlot / 16 / 16f, 0f));
75 m_collisionBoxes[i] = new BoundingBox[2];
76 m_collisionBoxes[i][0] = blockMesh.CalculateBoundingBox();
77 m_collisionBoxes[i][1] = blockMesh2.CalculateBoundingBox();
78 m_surfaceMeshes[i] = new BlockMesh();
80 .AppendModelMeshPart(
81 model.FindMesh("Surface").MeshParts[0],
82 boneAbsoluteTransform3 * m,
83 false,
84 hanging,
85 false,
86 false,
88 );
90 if (hanging) {
91 for (int j = 0; j < m_surfaceMeshes[i].Vertices.Count; j++) {
92 Vector2 textureCoordinates = m_surfaceMeshes[i].Vertices.Array[j].TextureCoordinates;
93 textureCoordinates.Y = 1f - textureCoordinates.Y;
94 m_surfaceMeshes[i].Vertices.Array[j].TextureCoordinates = textureCoordinates;
95 }
96 }
97 }
98 m_standaloneBlockMesh.AppendModelMeshPart(
99 model.FindMesh("Sign").MeshParts[0],
100 boneAbsoluteTransform * Matrix.CreateTranslation(0f, -0.6f, 0f),
101 false,
102 false,
103 false,
104 false,
106 );
107 m_standaloneBlockMesh.AppendModelMeshPart(
108 model.FindMesh("Post").MeshParts[0],
109 boneAbsoluteTransform2 * Matrix.CreateTranslation(0f, -0.6f, 0f),
110 false,
111 false,
112 false,
113 false,
115 );
117 m_standaloneBlockMesh.TransformTextureCoordinates(
119 );
120 m_standaloneColoredBlockMesh.TransformTextureCoordinates(
122 );
123 base.Initialize();
124 }
125
126 public override string GetDisplayName(SubsystemTerrain subsystemTerrain, int value) {
127 int? color = GetColor(Terrain.ExtractData(value));
128 return SubsystemPalette.GetName(subsystemTerrain, color, base.GetDisplayName(subsystemTerrain, value));
129 }
130
131 public override string GetCategory(int value) {
132 if (!GetColor(Terrain.ExtractData(value)).HasValue) {
133 return base.GetCategory(value);
134 }
135 return "Painted";
136 }
137
138 public override IEnumerable<int> GetCreativeValues() {
139 yield return Terrain.MakeBlockValue(BlockIndex, 0, SetColor(0, null));
140 int i = 0;
141 while (i < 16) {
142 yield return Terrain.MakeBlockValue(BlockIndex, 0, SetColor(0, i));
143 int num = i + 1;
144 i = num;
145 }
146 }
147
148 public override void GetDropValues(SubsystemTerrain subsystemTerrain,
149 int oldValue,
150 int newValue,
151 int toolLevel,
152 List<BlockDropValue> dropValues,
153 out bool showDebris) {
154 showDebris = true;
155 int? color = GetColor(Terrain.ExtractData(oldValue));
156 int data = SetColor(0, color);
157 dropValues.Add(new BlockDropValue { Value = Terrain.MakeBlockValue(BlockIndex, 0, data), Count = 1 });
158 }
159
161 Vector3 position,
162 int value,
163 float strength) {
164 int? color = GetColor(Terrain.ExtractData(value));
165 if (color.HasValue) {
166 return new BlockDebrisParticleSystem(
167 subsystemTerrain,
168 position,
169 strength,
171 SubsystemPalette.GetColor(subsystemTerrain, color),
173 );
174 }
175 return new BlockDebrisParticleSystem(subsystemTerrain, position, strength, DestructionDebrisScale, Color.White, DefaultTextureSlot);
176 }
177
178 public override void GenerateTerrainVertices(BlockGeometryGenerator generator, TerrainGeometry geometry, int value, int x, int y, int z) {
179 int data = Terrain.ExtractData(value);
180 int variant = GetVariant(data);
181 int? color = GetColor(data);
182 if (color.HasValue) {
183 generator.GenerateMeshVertices(
184 this,
185 x,
186 y,
187 z,
188 m_coloredBlockMeshes[variant],
189 SubsystemPalette.GetColor(generator, color),
190 null,
191 geometry.SubsetOpaque
192 );
193 }
194 else {
195 generator.GenerateMeshVertices(
196 this,
197 x,
198 y,
199 z,
200 m_blockMeshes[variant],
201 Color.White,
202 null,
203 geometry.SubsetOpaque
204 );
205 }
206 generator.GenerateWireVertices(
207 value,
208 x,
209 y,
210 z,
211 GetHanging(data) ? 5 : 4,
212 0.01f,
214 geometry.SubsetOpaque
215 );
216 }
217
218 public override void DrawBlock(PrimitivesRenderer3D primitivesRenderer,
219 int value,
220 Color color,
221 float size,
222 ref Matrix matrix,
223 DrawBlockEnvironmentData environmentData) {
224 int? color2 = GetColor(Terrain.ExtractData(value));
225 if (color2.HasValue) {
227 primitivesRenderer,
229 color * SubsystemPalette.GetColor(environmentData, color2),
230 1.25f * size,
231 ref matrix,
232 environmentData
233 );
234 }
235 else {
236 BlocksManager.DrawMeshBlock(primitivesRenderer, m_standaloneBlockMesh, color, 1.25f * size, ref matrix, environmentData);
237 }
238 }
239
240 public int? GetPaintColor(int value) => GetColor(Terrain.ExtractData(value));
241
242 public int Paint(SubsystemTerrain terrain, int value, int? color) {
243 int data = Terrain.ExtractData(value);
244 return Terrain.ReplaceData(value, SetColor(data, color));
245 }
246
247 public override BoundingBox[] GetCustomCollisionBoxes(SubsystemTerrain terrain, int value) {
248 int variant = GetVariant(Terrain.ExtractData(value));
249 return m_collisionBoxes[variant];
250 }
251
252 public override BlockPlacementData GetPlacementValue(SubsystemTerrain subsystemTerrain,
253 ComponentMiner componentMiner,
254 int value,
255 TerrainRaycastResult raycastResult) {
256 int? color = GetColor(Terrain.ExtractData(value));
257 BlockPlacementData result;
258 if (raycastResult.CellFace.Face < 4) {
259 int data = AttachedSignBlock.SetFace(AttachedSignBlock.SetColor(0, color), raycastResult.CellFace.Face);
260 result = default;
261 result.Value = Terrain.MakeBlockValue(m_attachedSignBlockIndex, 0, data);
262 result.CellFace = raycastResult.CellFace;
263 return result;
264 }
266 float num = float.MinValue;
267 int direction = 0;
268 for (int i = 0; i < 8; i++) {
269 float num2 = Vector3.Dot(forward, m_directions[i]);
270 if (num2 > num) {
271 num = num2;
272 direction = i;
273 }
274 }
275 int data2 = SetHanging(SetDirection(SetColor(0, color), direction), raycastResult.CellFace.Face == 5);
276 result = default;
277 result.Value = Terrain.MakeBlockValue(BlockIndex, 0, data2);
278 result.CellFace = raycastResult.CellFace;
279 return result;
280 }
281
282 public override BlockMesh GetSignSurfaceBlockMesh(int data) => m_surfaceMeshes[GetVariant(data)];
283
284 public override Vector3 GetSignSurfaceNormal(int data) => m_surfaceNormals[GetVariant(data)];
285
286 public ElectricElement CreateElectricElement(SubsystemElectricity subsystemElectricity, int value, int x, int y, int z) {
287 int data = Terrain.ExtractData(value);
288 return new SignElectricElement(subsystemElectricity, new CellFace(x, y, z, GetHanging(data) ? 5 : 4));
289 }
290
292 int value,
293 int face,
294 int connectorFace,
295 int x,
296 int y,
297 int z) {
298 if (GetHanging(Terrain.ExtractData(value))) {
299 if (face != 5
300 || !SubsystemElectricity.GetConnectorDirection(face, 0, connectorFace).HasValue) {
301 return null;
302 }
303 return ElectricConnectorType.Input;
304 }
305 if (face != 4
306 || !SubsystemElectricity.GetConnectorDirection(face, 0, connectorFace).HasValue) {
307 return null;
308 }
309 return ElectricConnectorType.Input;
310 }
311
312 public int GetConnectionMask(int value) => int.MaxValue;
313
314 public static int GetDirection(int data) => data & 7;
315
316 public static int SetDirection(int data, int direction) => (data & -8) | (direction & 7);
317
318 public static bool GetHanging(int data) => (data & 8) != 0;
319
320 public static int SetHanging(int data, bool hanging) {
321 if (!hanging) {
322 return data & -9;
323 }
324 return data | 8;
325 }
326
327 public static int GetVariant(int data) => data & 0xF;
328
329 public static int SetVariant(int data, int variant) => (data & -16) | (variant & 0xF);
330
331 public static int? GetColor(int data) {
332 if ((data & 0x10) != 0) {
333 return (data >> 5) & 0xF;
334 }
335 return null;
336 }
337
338 public static int SetColor(int data, int? color) {
339 if (color.HasValue) {
340 return (data & -497) | 0x10 | ((color.Value & 0xF) << 5);
341 }
342 return data & -497;
343 }
344 }
345}
ModelMesh FindMesh(string name, bool throwIfNotFound=true)
ReadOnlyList< ModelMeshPart > MeshParts
static int SetColor(int data, int? color)
static int SetFace(int data, int face)
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 BoundingBox CalculateBoundingBox()
static Matrix GetBoneAbsoluteTransform(ModelBone modelBone)
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)
ComponentCreatureModel ComponentCreatureModel
ComponentCreature ComponentCreature
static object Get(Type type, string name)
static bool GetHanging(int data)
override BlockDebrisParticleSystem CreateDebrisParticleSystem(SubsystemTerrain subsystemTerrain, Vector3 position, int value, float strength)
ElectricConnectorType? GetConnectorType(SubsystemTerrain terrain, int value, int face, int connectorFace, int x, int y, int z)
static int SetVariant(int data, int variant)
override string GetCategory(int value)
static int GetDirection(int data)
override BlockMesh GetSignSurfaceBlockMesh(int data)
override IEnumerable< int > GetCreativeValues()
override void DrawBlock(PrimitivesRenderer3D primitivesRenderer, int value, Color color, float size, ref Matrix matrix, DrawBlockEnvironmentData environmentData)
static int SetDirection(int data, int direction)
static int SetColor(int data, int? color)
PostedSignBlock(string modelName, int coloredTextureSlot, int attachedSignBlockIndex)
static int GetVariant(int data)
override BoundingBox[] GetCustomCollisionBoxes(SubsystemTerrain terrain, int value)
override BlockPlacementData GetPlacementValue(SubsystemTerrain subsystemTerrain, ComponentMiner componentMiner, int value, TerrainRaycastResult raycastResult)
方块放置方向
override void GetDropValues(SubsystemTerrain subsystemTerrain, int oldValue, int newValue, int toolLevel, List< BlockDropValue > dropValues, out bool showDebris)
override string GetDisplayName(SubsystemTerrain subsystemTerrain, int value)
BoundingBox[][] m_collisionBoxes
override Vector3 GetSignSurfaceNormal(int data)
ElectricElement CreateElectricElement(SubsystemElectricity subsystemElectricity, int value, int x, int y, int z)
override void GenerateTerrainVertices(BlockGeometryGenerator generator, TerrainGeometry geometry, int value, int x, int y, int z)
int Paint(SubsystemTerrain terrain, int value, int? color)
static int SetHanging(int data, bool hanging)
static ? int GetColor(int data)
static ? ElectricConnectorDirection GetConnectorDirection(int mountingFace, int rotation, int connectorFace)
TerrainGeometrySubset SubsetOpaque
static int ReplaceData(int value, int data)
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 Matrix CreateRotationY(float radians)
Vector3 Forward
static Matrix CreateScale(float scale)
static readonly Vector2 Zero
static float Dot(Vector3 v1, Vector3 v2)