Survivalcraft API 1.8.2.3 v1.8.2.3
Survivalcraft 2.4
载入中...
搜索中...
未找到
SubsystemWoodBlockBehavior.cs
浏览该文件的文档.
1using Engine;
4
5namespace Game {
7 public const int m_radius = 3;
8
9 public const int m_maxLeavesToCheck = 5000;
10
12
14
15 public HashSet<Point3> m_leavesToCheck = [];
16
17 public override int[] HandledBlocks => [];
18
20
21 public override void OnBlockRemoved(int value, int newValue, int x, int y, int z) {
22 if (m_subsystemGameInfo.WorldSettings.EnvironmentBehaviorMode != 0
23 || m_leavesToCheck.Count >= 5000
25 return;
26 }
27 int num = x - 3;
28 int num2 = MathUtils.Max(y - 3, 0);
29 int num3 = z - 3;
30 int num4 = x + 3;
31 int num5 = MathUtils.Min(y + 3, 255);
32 int num6 = z + 3;
33 for (int i = num; i <= num4; i++) {
34 for (int j = num3; j <= num6; j++) {
35 TerrainChunk chunkAtCell = SubsystemTerrain.Terrain.GetChunkAtCell(i, j);
36 if (chunkAtCell == null) {
37 continue;
38 }
39 int num7 = TerrainChunk.CalculateCellIndex(i & 0xF, 0, j & 0xF);
40 for (int k = num2; k <= num5; k++) {
41 int num8 = Terrain.ExtractContents(chunkAtCell.GetCellValueFast(num7 + k));
42 if (num8 != 0
43 && BlocksManager.Blocks[num8] is LeavesBlock) {
44 m_leavesToCheck.Add(new Point3(i, k, j));
45 }
46 }
47 }
48 }
49 }
50
51 public override void OnChunkDiscarding(TerrainChunk chunk) {
52 int num = chunk.Origin.X - 16;
53 int num2 = chunk.Origin.Y - 16;
54 int num3 = chunk.Origin.X + 32;
55 int num4 = chunk.Origin.Y + 32;
56 List<Point3> list = new();
57 foreach (Point3 item in m_leavesToCheck) {
58 if (item.X >= num
59 && item.X < num3
60 && item.Z >= num2
61 && item.Z < num4) {
62 list.Add(item);
63 }
64 }
65 foreach (Point3 item2 in list) {
67 }
68 }
69
70 public virtual void Update(float dt) {
71 if (m_leavesToCheck.Count <= 0
72 || !m_subsystemTime.PeriodicGameTimeEvent(20.0, 0.0)) {
73 return;
74 }
75 int num = MathUtils.Min(MathUtils.Max((int)(m_leavesToCheck.Count * 0.1f), 10), 200);
76 for (int i = 0; i < num; i++) {
77 if (m_leavesToCheck.Count <= 0) {
78 break;
79 }
81 }
82 }
83
84 public override void Load(ValuesDictionary valuesDictionary) {
85 base.Load(valuesDictionary);
86 m_subsystemTime = Project.FindSubsystem<SubsystemTime>(true);
87 m_subsystemGameInfo = Project.FindSubsystem<SubsystemGameInfo>(true);
88 string value = valuesDictionary.GetValue<string>("LeavesToCheck");
89 Point3[] array = HumanReadableConverter.ValuesListFromString<Point3>(';', value);
90 foreach (Point3 item in array) {
91 m_leavesToCheck.Add(item);
92 }
93 }
94
95 public override void Save(ValuesDictionary valuesDictionary) {
96 base.Save(valuesDictionary);
97 string value = HumanReadableConverter.ValuesListToString(';', m_leavesToCheck.ToArray());
98 valuesDictionary.SetValue("LeavesToCheck", value);
99 }
100
102 m_leavesToCheck.Remove(p);
103 if (!(BlocksManager.Blocks[SubsystemTerrain.Terrain.GetCellContents(p.X, p.Y, p.Z)] is LeavesBlock)) {
104 return;
105 }
106 bool flag = false;
107 int num = p.X - 3;
108 int num2 = MathUtils.Max(p.Y - 3, 0);
109 int num3 = p.Z - 3;
110 int num4 = p.X + 3;
111 int num5 = MathUtils.Min(p.Y + 3, 255);
112 int num6 = p.Z + 3;
113 for (int i = num; i <= num4; i++) {
114 for (int j = num3; j <= num6; j++) {
115 TerrainChunk chunkAtCell = SubsystemTerrain.Terrain.GetChunkAtCell(i, j);
116 if (chunkAtCell == null) {
117 continue;
118 }
119 int num7 = TerrainChunk.CalculateCellIndex(i & 0xF, 0, j & 0xF);
120 int num8 = num2;
121 while (num8 <= num5) {
122 int num9 = Terrain.ExtractContents(chunkAtCell.GetCellValueFast(num7 + num8));
123 if (num9 == 0
124 || !(BlocksManager.Blocks[num9] is WoodBlock)) {
125 num8++;
126 continue;
127 }
128 goto IL_00e8;
129 }
130 }
131 continue;
132 IL_00e8:
133 flag = true;
134 break;
135 }
136 if (!flag) {
137 SubsystemTerrain.ChangeCell(p.X, p.Y, p.Z, 0);
138 }
139 }
140 }
141}
static int Min(int x1, int x2)
static int Max(int x1, int x2)
override void OnChunkDiscarding(TerrainChunk chunk)
override void OnBlockRemoved(int value, int newValue, int x, int y, int z)
override void Save(ValuesDictionary valuesDictionary)
override void Load(ValuesDictionary valuesDictionary)
static int CalculateCellIndex(int x, int y, int z)
virtual int GetCellValueFast(int index)
static int ExtractContents(int value)
ValuesDictionary ValuesDictionary