Survivalcraft API 1.8.2.3 v1.8.2.3
Survivalcraft 2.4
载入中...
搜索中...
未找到
CrossbowBlock.cs
浏览该文件的文档.
1using Engine;
3
4namespace Game {
5 public class CrossbowBlock : Block {
6 public static int Index = 200;
7
9
11
12 public override void Initialize() {
13 Model model = ContentManager.Get<Model>("Models/Crossbows");
14 Matrix boneAbsoluteTransform = BlockMesh.GetBoneAbsoluteTransform(model.FindMesh("Body").ParentBone);
15 Matrix boneAbsoluteTransform2 = BlockMesh.GetBoneAbsoluteTransform(model.FindMesh("BowRelaxed").ParentBone);
16 Matrix boneAbsoluteTransform3 = BlockMesh.GetBoneAbsoluteTransform(model.FindMesh("StringRelaxed").ParentBone);
17 Matrix boneAbsoluteTransform4 = BlockMesh.GetBoneAbsoluteTransform(model.FindMesh("BowTensed").ParentBone);
18 Matrix boneAbsoluteTransform5 = BlockMesh.GetBoneAbsoluteTransform(model.FindMesh("StringTensed").ParentBone);
19 BlockMesh blockMesh = new();
20 blockMesh.AppendModelMeshPart(
21 model.FindMesh("Body").MeshParts[0],
22 boneAbsoluteTransform * Matrix.CreateTranslation(0f, 0f, 0f),
23 false,
24 false,
25 false,
26 false,
28 );
29 blockMesh.AppendModelMeshPart(
30 model.FindMesh("BowRelaxed").MeshParts[0],
31 boneAbsoluteTransform2 * Matrix.CreateTranslation(0f, 0f, 0f),
32 false,
33 false,
34 false,
35 false,
37 );
38 blockMesh.AppendModelMeshPart(
39 model.FindMesh("StringRelaxed").MeshParts[0],
40 boneAbsoluteTransform3 * Matrix.CreateTranslation(0f, 0f, 0f),
41 false,
42 false,
43 false,
44 false,
46 );
47 BlockMesh blockMesh2 = new();
48 blockMesh2.AppendModelMeshPart(
49 model.FindMesh("Body").MeshParts[0],
50 boneAbsoluteTransform * Matrix.CreateTranslation(0f, 0f, 0f),
51 false,
52 false,
53 false,
54 false,
56 );
57 blockMesh2.AppendModelMeshPart(
58 model.FindMesh("BowTensed").MeshParts[0],
59 boneAbsoluteTransform4 * Matrix.CreateTranslation(0f, 0f, 0f),
60 false,
61 false,
62 false,
63 false,
65 );
66 blockMesh2.AppendModelMeshPart(
67 model.FindMesh("StringTensed").MeshParts[0],
68 boneAbsoluteTransform5 * Matrix.CreateTranslation(0f, 0f, 0f),
69 false,
70 false,
71 false,
72 false,
74 );
75 for (int i = 0; i < 16; i++) {
76 float factor = i / 15f;
78 m_standaloneBlockMeshes[i].AppendBlockMesh(blockMesh);
79 m_standaloneBlockMeshes[i].BlendBlockMesh(blockMesh2, factor);
80 }
81 arrowBlock = BlocksManager.GetBlockGeneral<ArrowBlock>();
82 base.Initialize();
83 }
84
85 public override void GenerateTerrainVertices(BlockGeometryGenerator generator, TerrainGeometry geometry, int value, int x, int y, int z) { }
86
87 public override void DrawBlock(PrimitivesRenderer3D primitivesRenderer,
88 int value,
89 Color color,
90 float size,
91 ref Matrix matrix,
92 DrawBlockEnvironmentData environmentData) {
93 int data = Terrain.ExtractData(value);
94 int draw = GetDraw(data);
95 ArrowBlock.ArrowType? arrowType = GetArrowType(data);
96 BlocksManager.DrawMeshBlock(primitivesRenderer, m_standaloneBlockMeshes[draw], color, 2f * size, ref matrix, environmentData);
97 if (arrowType.HasValue) {
98 Matrix matrix2 = Matrix.CreateRotationX(-(float)Math.PI / 2f) * Matrix.CreateTranslation(0f, 0.2f * size, -0.09f * size) * matrix;
99 int value2 = Terrain.MakeBlockValue(arrowBlock.BlockIndex, 0, ArrowBlock.SetArrowType(0, arrowType.Value));
100 arrowBlock.DrawBlock(primitivesRenderer, value2, color, size, ref matrix2, environmentData);
101 }
102 }
103
104 public override int GetDamage(int value) => (Terrain.ExtractData(value) >> 8) & 0xFF;
105
106 public override int SetDamage(int value, int damage) {
107 int num = Terrain.ExtractData(value);
108 num &= -65281;
109 num |= Math.Clamp(damage, 0, 255) << 8;
110 return Terrain.ReplaceData(value, num);
111 }
112
113 public override bool IsSwapAnimationNeeded(int oldValue, int newValue) {
114 int num = Terrain.ExtractContents(oldValue);
115 int data = Terrain.ExtractData(oldValue);
116 int data2 = Terrain.ExtractData(newValue);
117 if (num == BlockIndex
118 && GetArrowType(data) == GetArrowType(data2)) {
119 return false;
120 }
121 return true;
122 }
123
124 public static ArrowBlock.ArrowType? GetArrowType(int data) {
125 int num = (data >> 4) & 0xF;
126 if (num != 0) {
127 return (ArrowBlock.ArrowType)(num - 1);
128 }
129 return null;
130 }
131
132 public static int SetArrowType(int data, ArrowBlock.ArrowType? arrowType) {
133 int num = (int)(arrowType.HasValue ? arrowType.Value + 1 : ArrowBlock.ArrowType.WoodenArrow);
134 return (data & -241) | ((num & 0xF) << 4);
135 }
136
137 public static int GetDraw(int data) => data & 0xF;
138
139 public static int SetDraw(int data, int draw) => (data & -16) | (draw & 0xF);
140 }
141}
ModelMesh FindMesh(string name, bool throwIfNotFound=true)
ReadOnlyList< ModelMeshPart > MeshParts
static int SetArrowType(int data, ArrowType arrowType)
override void Initialize()
int BlockIndex
定义 Block.cs:6
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)
override int SetDamage(int value, int damage)
override int GetDamage(int value)
static ArrowBlock.? ArrowType GetArrowType(int data)
BlockMesh[] m_standaloneBlockMeshes
override void Initialize()
override bool IsSwapAnimationNeeded(int oldValue, int newValue)
override void DrawBlock(PrimitivesRenderer3D primitivesRenderer, int value, Color color, float size, ref Matrix matrix, DrawBlockEnvironmentData environmentData)
static int GetDraw(int data)
static int SetArrowType(int data, ArrowBlock.ArrowType? arrowType)
override void GenerateTerrainVertices(BlockGeometryGenerator generator, TerrainGeometry geometry, int value, int x, int y, int z)
static int SetDraw(int data, int draw)
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 CreateRotationX(float radians)
static Matrix CreateTranslation(float x, float y, float z)