Survivalcraft API 1.8.2.3 v1.8.2.3
Survivalcraft 2.4
载入中...
搜索中...
未找到
AttachedSignBlock.cs
浏览该文件的文档.
1using Engine;
3
4namespace Game {
6 public string m_modelName;
7
9
11
13
15
17
19
21
22 public Vector3[] m_surfaceNormals = new Vector3[4];
23
25
26 public AttachedSignBlock(string modelName, int coloredTextureSlot, int postedSignBlockIndex) {
27 m_modelName = modelName;
28 m_coloredTextureSlot = coloredTextureSlot;
29 m_postedSignBlockIndex = postedSignBlockIndex;
30 }
31
32 public override void Initialize() {
34 Matrix boneAbsoluteTransform = BlockMesh.GetBoneAbsoluteTransform(model.FindMesh("Sign").ParentBone);
35 Matrix boneAbsoluteTransform2 = BlockMesh.GetBoneAbsoluteTransform(model.FindMesh("Surface").ParentBone);
36 for (int i = 0; i < 4; i++) {
37 float radians = (float)Math.PI / 2f * i;
38 Matrix m = Matrix.CreateTranslation(0f, 0f, -15f / 32f)
39 * Matrix.CreateRotationY(radians)
40 * Matrix.CreateTranslation(0.5f, -0.3125f, 0.5f);
41 BlockMesh blockMesh = new();
42 blockMesh.AppendModelMeshPart(
43 model.FindMesh("Sign").MeshParts[0],
44 boneAbsoluteTransform * m,
45 false,
46 false,
47 false,
48 false,
50 );
51 m_blockMeshes[i] = new BlockMesh();
52 m_blockMeshes[i].AppendBlockMesh(blockMesh);
54 m_coloredBlockMeshes[i].AppendBlockMesh(m_blockMeshes[i]);
56 .TransformTextureCoordinates(Matrix.CreateTranslation(DefaultTextureSlot % 16 / 16f, DefaultTextureSlot / 16 / 16f, 0f));
58 .TransformTextureCoordinates(Matrix.CreateTranslation(m_coloredTextureSlot % 16 / 16f, m_coloredTextureSlot / 16 / 16f, 0f));
59 m_collisionBoxes[i] = new BoundingBox[1];
60 m_collisionBoxes[i][0] = blockMesh.CalculateBoundingBox();
61 m_surfaceMeshes[i] = new BlockMesh();
63 .AppendModelMeshPart(
64 model.FindMesh("Surface").MeshParts[0],
65 boneAbsoluteTransform2 * m,
66 false,
67 false,
68 false,
69 false,
71 );
73 }
74 m_standaloneBlockMesh.AppendModelMeshPart(
75 model.FindMesh("Sign").MeshParts[0],
76 boneAbsoluteTransform * Matrix.CreateTranslation(0f, -0.6f, 0f),
77 false,
78 false,
79 false,
80 false,
82 );
84 m_standaloneBlockMesh.TransformTextureCoordinates(
86 );
87 m_standaloneColoredBlockMesh.TransformTextureCoordinates(
89 );
90 base.Initialize();
91 }
92
93 public override void GetDropValues(SubsystemTerrain subsystemTerrain,
94 int oldValue,
95 int newValue,
96 int toolLevel,
97 List<BlockDropValue> dropValues,
98 out bool showDebris) {
99 showDebris = true;
100 int? color = GetColor(Terrain.ExtractData(oldValue));
101 int data = PostedSignBlock.SetColor(0, color);
102 dropValues.Add(new BlockDropValue { Value = Terrain.MakeBlockValue(m_postedSignBlockIndex, 0, data), Count = 1 });
103 }
104
106 Vector3 position,
107 int value,
108 float strength) {
109 int? color = GetColor(Terrain.ExtractData(value));
110 if (color.HasValue) {
111 return new BlockDebrisParticleSystem(
112 subsystemTerrain,
113 position,
114 strength,
116 SubsystemPalette.GetColor(subsystemTerrain, color),
118 );
119 }
120 return new BlockDebrisParticleSystem(subsystemTerrain, position, strength, DestructionDebrisScale, Color.White, DefaultTextureSlot);
121 }
122
123 public override void GenerateTerrainVertices(BlockGeometryGenerator generator, TerrainGeometry geometry, int value, int x, int y, int z) {
124 int data = Terrain.ExtractData(value);
125 int face = GetFace(data);
126 int? color = GetColor(data);
127 if (color.HasValue) {
128 generator.GenerateMeshVertices(
129 this,
130 x,
131 y,
132 z,
134 SubsystemPalette.GetColor(generator, color),
135 null,
136 geometry.SubsetOpaque
137 );
138 }
139 else {
140 generator.GenerateMeshVertices(
141 this,
142 x,
143 y,
144 z,
145 m_blockMeshes[face],
146 Color.White,
147 null,
148 geometry.SubsetOpaque
149 );
150 }
151 generator.GenerateWireVertices(
152 value,
153 x,
154 y,
155 z,
156 GetFace(data),
157 0.375f,
159 geometry.SubsetOpaque
160 );
161 }
162
163 public override void DrawBlock(PrimitivesRenderer3D primitivesRenderer,
164 int value,
165 Color color,
166 float size,
167 ref Matrix matrix,
168 DrawBlockEnvironmentData environmentData) {
169 int? color2 = GetColor(Terrain.ExtractData(value));
170 if (color2.HasValue) {
172 primitivesRenderer,
174 color * SubsystemPalette.GetColor(environmentData, color2),
175 1.25f * size,
176 ref matrix,
177 environmentData
178 );
179 }
180 else {
181 BlocksManager.DrawMeshBlock(primitivesRenderer, m_standaloneBlockMesh, color, 1.25f * size, ref matrix, environmentData);
182 }
183 }
184
185 public int? GetPaintColor(int value) => GetColor(Terrain.ExtractData(value));
186
187 public int Paint(SubsystemTerrain terrain, int value, int? color) {
188 int data = Terrain.ExtractData(value);
189 return Terrain.ReplaceData(value, SetColor(data, color));
190 }
191
192 public override BoundingBox[] GetCustomCollisionBoxes(SubsystemTerrain terrain, int value) {
193 int face = GetFace(Terrain.ExtractData(value));
194 return m_collisionBoxes[face];
195 }
196
197 public override BlockPlacementData GetPlacementValue(SubsystemTerrain subsystemTerrain,
198 ComponentMiner componentMiner,
199 int value,
200 TerrainRaycastResult raycastResult) => default;
201
202 public override BlockMesh GetSignSurfaceBlockMesh(int data) => m_surfaceMeshes[GetFace(data)];
203
204 public override Vector3 GetSignSurfaceNormal(int data) => m_surfaceNormals[GetFace(data)];
205
206 public ElectricElement CreateElectricElement(SubsystemElectricity subsystemElectricity, int value, int x, int y, int z) {
207 int data = Terrain.ExtractData(value);
208 return new SignElectricElement(subsystemElectricity, new CellFace(x, y, z, GetFace(data)));
209 }
210
212 int value,
213 int face,
214 int connectorFace,
215 int x,
216 int y,
217 int z) {
218 int data = Terrain.ExtractData(value);
219 if (face != GetFace(data)
220 || !SubsystemElectricity.GetConnectorDirection(face, 0, connectorFace).HasValue) {
221 return null;
222 }
223 return ElectricConnectorType.Input;
224 }
225
226 public int GetConnectionMask(int value) => int.MaxValue;
227
228 public static int GetFace(int data) => data & 3;
229
230 public static int SetFace(int data, int face) => (data & -4) | (face & 3);
231
232 public static int? GetColor(int data) {
233 if ((data & 4) != 0) {
234 return (data >> 3) & 0xF;
235 }
236 return null;
237 }
238
239 public static int SetColor(int data, int? color) {
240 if (color.HasValue) {
241 return (data & -125) | 4 | ((color.Value & 0xF) << 3);
242 }
243 return data & -125;
244 }
245
246 public override bool IsMovableByPiston(int value, int pistonFace, int y, out bool isEnd) {
247 isEnd = true;
248 int data = Terrain.ExtractData(value);
249 return pistonFace == GetFace(data);
250 }
251 }
252}
ModelMesh FindMesh(string name, bool throwIfNotFound=true)
ReadOnlyList< ModelMeshPart > MeshParts
static ? int GetColor(int data)
override Vector3 GetSignSurfaceNormal(int data)
static int SetColor(int data, int? color)
override BlockMesh GetSignSurfaceBlockMesh(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)
override void DrawBlock(PrimitivesRenderer3D primitivesRenderer, int value, Color color, float size, ref Matrix matrix, DrawBlockEnvironmentData environmentData)
AttachedSignBlock(string modelName, int coloredTextureSlot, int postedSignBlockIndex)
int Paint(SubsystemTerrain terrain, int value, int? color)
override void GenerateTerrainVertices(BlockGeometryGenerator generator, TerrainGeometry geometry, int value, int x, int y, int z)
override BlockPlacementData GetPlacementValue(SubsystemTerrain subsystemTerrain, ComponentMiner componentMiner, int value, TerrainRaycastResult raycastResult)
方块放置方向
override BoundingBox[] GetCustomCollisionBoxes(SubsystemTerrain terrain, int value)
ElectricConnectorType? GetConnectorType(SubsystemTerrain terrain, int value, int face, int connectorFace, int x, int y, int z)
ElectricElement CreateElectricElement(SubsystemElectricity subsystemElectricity, int value, int x, int y, int z)
static int SetFace(int data, int face)
override bool IsMovableByPiston(int value, int pistonFace, int y, out bool isEnd)
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)
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)
static object Get(Type type, string name)
static int SetColor(int data, int? color)
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 CreateTranslation(float x, float y, float z)
static Matrix CreateRotationY(float radians)
Vector3 Forward
static readonly Vector2 Zero