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