Survivalcraft API 1.8.2.3 v1.8.2.3
Survivalcraft 2.4
载入中...
搜索中...
未找到
SubsystemCollapsingBlockBehavior.cs
浏览该文件的文档.
1using Engine;
3
4namespace Game {
6 public const string IdString = "CollapsingBlock";
7
9
11
13
14 public override void OnNeighborBlockChanged(int x, int y, int z, int neighborX, int neighborY, int neighborZ) {
15 if (m_subsystemGameInfo.WorldSettings.EnvironmentBehaviorMode == EnvironmentBehaviorMode.Living) {
16 TryCollapseColumn(new Point3(x, y, z));
17 }
18 }
19
20 public override void Load(ValuesDictionary valuesDictionary) {
21 base.Load(valuesDictionary);
22 m_subsystemGameInfo = Project.FindSubsystem<SubsystemGameInfo>(true);
25 m_subsystemMovingBlocks.Stopped += MovingBlocksStopped;
26 m_subsystemMovingBlocks.CollidedWithTerrain += MovingBlocksCollidedWithTerrain;
27 }
28
30 if (movingBlockSet.Id == "CollapsingBlock") {
31 int cellValue = SubsystemTerrain.Terrain.GetCellValue(p.X, p.Y, p.Z);
32 if (IsCollapseSupportBlock(cellValue)) {
33 movingBlockSet.Stop();
34 }
35 else if (IsCollapseDestructibleBlock(cellValue)) {
36 SubsystemTerrain.DestroyCell(
37 0,
38 p.X,
39 p.Y,
40 p.Z,
41 0,
42 false,
43 false
44 );
45 }
46 }
47 }
48
49 public void MovingBlocksStopped(IMovingBlockSet movingBlockSet) {
50 if (movingBlockSet.Id == "CollapsingBlock") {
52 MathF.Round(movingBlockSet.Position.X),
53 MathF.Round(movingBlockSet.Position.Y),
54 MathF.Round(movingBlockSet.Position.Z)
55 );
56 foreach (MovingBlock block in movingBlockSet.Blocks) {
57 Point3 point = p + block.Offset;
58 m_subsystemMovingBlocks.AddTerrainBlock(point.X, point.Y, point.Z, block.Value, block);
59 }
60 m_subsystemMovingBlocks.RemoveMovingBlockSet(movingBlockSet);
61 if (movingBlockSet.Blocks.Count > 0) {
62 m_subsystemSoundMaterials.PlayImpactSound(movingBlockSet.Blocks[0].Value, movingBlockSet.Position, 1f);
63 }
64 }
65 }
66
67 public void TryCollapseColumn(Point3 p) {
68 if (p.Y <= 0) {
69 return;
70 }
71 int cellValue = SubsystemTerrain.Terrain.GetCellValue(p.X, p.Y - 1, p.Z);
72 if (IsCollapseSupportBlock(cellValue)) {
73 return;
74 }
75 List<MovingBlock> list = new();
76 for (int i = p.Y; i < 256; i++) {
77 int cellValue2 = SubsystemTerrain.Terrain.GetCellValue(p.X, i, p.Z);
79 if (!block.GetIsCollapsable(cellValue2)) {
80 break;
81 }
82 list.Add(new MovingBlock { Value = cellValue2, Offset = new Point3(0, i - p.Y, 0) });
83 }
84 if (list.Count != 0) {
85 IMovingBlockSet movingBlockSet = m_subsystemMovingBlocks.AddMovingBlockSet(
86 new Vector3(p),
87 new Vector3(p.X, -list.Count - 1, p.Z),
88 0f,
89 10f,
90 0.7f,
91 new Vector2(0f),
92 list,
93 "CollapsingBlock",
94 null,
95 true
96 );
97 if (movingBlockSet != null) {
98 foreach (MovingBlock item in list) {
99 Point3 point = p + item.Offset;
100 SubsystemTerrain.ChangeCell(point.X, point.Y, point.Z, 0, true, item);
101 }
102 }
103 }
104 }
105
106 public bool IsCollapseSupportBlock(int value) {
107 int num = Terrain.ExtractContents(value);
108 Block block = BlocksManager.Blocks[num];
109 return block.IsCollapseSupportBlock(SubsystemTerrain, value);
110 }
111
112 public static bool IsCollapseDestructibleBlock(int value) {
113 int num = Terrain.ExtractContents(value);
114 Block block = BlocksManager.Blocks[num];
115 return block.IsCollapseDestructibleBlock(value);
116 }
117 }
118}
Engine.Vector3 Vector3
virtual bool IsCollapseSupportBlock(SubsystemTerrain subsystemTerrain, int value)
virtual bool IsCollapseDestructibleBlock(int value)
virtual bool GetIsCollapsable(int value)
void MovingBlocksCollidedWithTerrain(IMovingBlockSet movingBlockSet, Point3 p)
override void Load(ValuesDictionary valuesDictionary)
override void OnNeighborBlockChanged(int x, int y, int z, int neighborX, int neighborY, int neighborZ)
static int ExtractContents(int value)
static int ToCell(float x)
ValuesDictionary ValuesDictionary
List< MovingBlock > Blocks