Survivalcraft API 1.8.2.3 v1.8.2.3
Survivalcraft 2.4
载入中...
搜索中...
未找到
SubsystemSaplingBlockBehavior.cs
浏览该文件的文档.
1using System.Globalization;
2using System.Text;
3using Engine;
6
7namespace Game {
9 public class SaplingData {
10 public Point3 Point;
11
12 public TreeType Type;
13
14 public double MatureTime;
15 }
16
18
20
21 public Dictionary<Point3, SaplingData> m_saplings = [];
22
23 public Dictionary<Point3, SaplingData>.ValueCollection.Enumerator m_enumerator;
24
25 public Random m_random = new();
26
27 public StringBuilder m_stringBuilder = new();
28
29 public override int[] HandledBlocks => [119];
30
32
33 public override void OnNeighborBlockChanged(int x, int y, int z, int neighborX, int neighborY, int neighborZ) {
34 int cellValue = SubsystemTerrain.Terrain.GetCellValue(x, y - 1, z);
35 if (BlocksManager.Blocks[Terrain.ExtractContents(cellValue)].IsNonAttachable(cellValue)) {
36 SubsystemTerrain.DestroyCell(
37 0,
38 x,
39 y,
40 z,
41 0,
42 false,
43 false
44 );
45 }
46 }
47
48 public override void OnBlockAdded(int value, int oldValue, int x, int y, int z) {
49 float num = m_subsystemGameInfo.WorldSettings.GameMode == GameMode.Creative ? m_random.Float(8f, 12f) : m_random.Float(480f, 600f);
51 new SaplingData {
52 Point = new Point3(x, y, z),
53 Type = (TreeType)Terrain.ExtractData(value),
54 MatureTime = m_subsystemGameInfo.TotalElapsedGameTime + num
55 }
56 );
57 }
58
59 public override void OnBlockRemoved(int value, int newValue, int x, int y, int z) {
60 RemoveSapling(new Point3(x, y, z));
61 }
62
63 public override void Load(ValuesDictionary valuesDictionary) {
64 base.Load(valuesDictionary);
65 m_subsystemGameInfo = Project.FindSubsystem<SubsystemGameInfo>(true);
66 m_subsystemTimeOfDay = Project.FindSubsystem<SubsystemTimeOfDay>(true);
67 m_enumerator = m_saplings.Values.GetEnumerator();
68 foreach (string value in valuesDictionary.GetValue<ValuesDictionary>("Saplings").Values) {
70 }
71 }
72
73 public override void Save(ValuesDictionary valuesDictionary) {
74 ValuesDictionary valuesDictionary2 = new();
75 valuesDictionary.SetValue("Saplings", valuesDictionary2);
76 int num = 0;
77 foreach (SaplingData value in m_saplings.Values) {
78 valuesDictionary2.SetValue(num++.ToString(CultureInfo.InvariantCulture), SaveSaplingData(value));
79 }
80 }
81
82 public virtual void Update(float dt) {
83 int num = 0;
84 while (true) {
85 if (num < 10) {
86 if (!m_enumerator.MoveNext()) {
87 break;
88 }
90 num++;
91 continue;
92 }
93 return;
94 }
95 m_enumerator = m_saplings.Values.GetEnumerator();
96 }
97
98 public SaplingData LoadSaplingData(string data) {
99 string[] array = data.Split([";"], StringSplitOptions.None);
100 if (array.Length != 3) {
101 throw new InvalidOperationException("Invalid sapling data string.");
102 }
103 return new SaplingData {
106 MatureTime = HumanReadableConverter.ConvertFromString<double>(array[2])
107 };
108 }
109
110 public string SaveSaplingData(SaplingData saplingData) {
111 m_stringBuilder.Length = 0;
113 m_stringBuilder.Append(';');
115 m_stringBuilder.Append(';');
117 return m_stringBuilder.ToString();
118 }
119
120 public void MatureSapling(SaplingData saplingData) {
121 if (!(m_subsystemGameInfo.TotalElapsedGameTime >= saplingData.MatureTime)) {
122 return;
123 }
124 int x = saplingData.Point.X;
125 int y = saplingData.Point.Y;
126 int z = saplingData.Point.Z;
127 TerrainChunk chunkAtCell = SubsystemTerrain.Terrain.GetChunkAtCell(x - 6, z - 6);
128 TerrainChunk chunkAtCell2 = SubsystemTerrain.Terrain.GetChunkAtCell(x - 6, z + 6);
129 TerrainChunk chunkAtCell3 = SubsystemTerrain.Terrain.GetChunkAtCell(x + 6, z - 6);
130 TerrainChunk chunkAtCell4 = SubsystemTerrain.Terrain.GetChunkAtCell(x + 6, z + 6);
131 if (chunkAtCell != null
132 && chunkAtCell.State == TerrainChunkState.Valid
133 && chunkAtCell2 != null
134 && chunkAtCell2.State == TerrainChunkState.Valid
135 && chunkAtCell3 != null
136 && chunkAtCell3.State == TerrainChunkState.Valid
137 && chunkAtCell4 != null
138 && chunkAtCell4.State == TerrainChunkState.Valid) {
139 int cellValue = SubsystemTerrain.Terrain.GetCellValue(x, y - 1, z);
140 int saplingValue = SubsystemTerrain.Terrain.GetCellValue(x, y, z);
141 int cellContents = Terrain.ExtractContents(cellValue);
142 Block cellBlock = BlocksManager.Blocks[cellContents];
143 if (cellBlock.IsSuitableForPlants(cellValue, saplingValue)) {
144 if (SubsystemTerrain.Terrain.GetCellLight(x, y + 1, z) >= 9) {
145 bool flag = false;
146 for (int i = x - 1; i <= x + 1; i++) {
147 for (int j = z - 1; j <= z + 1; j++) {
148 int cellContents2 = SubsystemTerrain.Terrain.GetCellContents(i, y - 1, j);
149 if (BlocksManager.Blocks[cellContents2] is WaterBlock) {
150 flag = true;
151 break;
152 }
153 }
154 }
155 float num;
156 if (m_subsystemGameInfo.WorldSettings.GameMode == GameMode.Creative) {
157 num = 1f;
158 }
159 else {
160 int num2 = SubsystemTerrain.Terrain.GetTemperature(x, z) + SubsystemWeather.GetTemperatureAdjustmentAtHeight(y);
161 int num3 = SubsystemTerrain.Terrain.GetHumidity(x, z);
162 if (flag) {
163 num2 = (num2 + 10) / 2;
164 num3 = MathUtils.Max(num3, 12);
165 }
166 num = 2f * PlantsManager.CalculateTreeProbability(saplingData.Type, num2, num3, y);
167 }
168 if (m_random.Bool(num)) {
169 SubsystemTerrain.ChangeCell(x, y, z, Terrain.MakeBlockValue(0, 0, 0));
170 if (!GrowTree(x, y, z, saplingData.Type)) {
171 SubsystemTerrain.ChangeCell(x, y, z, Terrain.MakeBlockValue(28, 0, 0));
172 }
173 }
174 else {
175 SubsystemTerrain.ChangeCell(x, y, z, Terrain.MakeBlockValue(28, 0, 0));
176 }
177 }
178 else if (m_subsystemGameInfo.TotalElapsedGameTime > saplingData.MatureTime + m_subsystemTimeOfDay.DayDuration) {
179 SubsystemTerrain.ChangeCell(x, y, z, Terrain.MakeBlockValue(28, 0, 0));
180 }
181 }
182 else {
183 SubsystemTerrain.ChangeCell(x, y, z, Terrain.MakeBlockValue(28, 0, 0));
184 }
185 }
186 else {
187 saplingData.MatureTime = m_subsystemGameInfo.TotalElapsedGameTime;
188 }
189 }
190
191 public bool GrowTree(int x, int y, int z, TreeType treeType) {
192 ReadOnlyList<TerrainBrush> treeBrushes = PlantsManager.GetTreeBrushes(treeType);
193 for (int i = 0; i < 20; i++) {
194 TerrainBrush terrainBrush = treeBrushes[m_random.Int(0, treeBrushes.Count - 1)];
195 bool flag = true;
196 TerrainBrush.Cell[] cells = terrainBrush.Cells;
197 for (int j = 0; j < cells.Length; j++) {
198 TerrainBrush.Cell cell = cells[j];
199 if (cell.Y >= 0
200 && (cell.X != 0 || cell.Y != 0 || cell.Z != 0)) {
201 int cellContents = SubsystemTerrain.Terrain.GetCellContents(cell.X + x, cell.Y + y, cell.Z + z);
202 if (cellContents != 0
203 && !(BlocksManager.Blocks[cellContents] is LeavesBlock)) {
204 flag = false;
205 break;
206 }
207 }
208 }
209 if (flag) {
210 terrainBrush.Paint(SubsystemTerrain, x, y, z);
211 return true;
212 }
213 }
214 return false;
215 }
216
217 public void AddSapling(SaplingData saplingData) {
218 m_saplings[saplingData.Point] = saplingData;
219 m_enumerator = m_saplings.Values.GetEnumerator();
220 }
221
222 public void RemoveSapling(Point3 point) {
223 m_saplings.Remove(point);
224 m_enumerator = m_saplings.Values.GetEnumerator();
225 }
226 }
227}
static int Max(int x1, int x2)
static object ConvertFromString(Type type, string data)
virtual bool IsNonAttachable(int value)
virtual bool IsSuitableForPlants(int value, int plantValue)
static ReadOnlyList< TerrainBrush > GetTreeBrushes(TreeType treeType)
static float CalculateTreeProbability(TreeType treeType, int temperature, int humidity, int y)
override void OnNeighborBlockChanged(int x, int y, int z, int neighborX, int neighborY, int neighborZ)
bool GrowTree(int x, int y, int z, TreeType treeType)
override void OnBlockAdded(int value, int oldValue, int x, int y, int z)
override void Save(ValuesDictionary valuesDictionary)
override void Load(ValuesDictionary valuesDictionary)
override void OnBlockRemoved(int value, int newValue, int x, int y, int z)
Dictionary< Point3, SaplingData >.ValueCollection.Enumerator m_enumerator
static Func< int, int > GetTemperatureAdjustmentAtHeight
void Paint(SubsystemTerrain terrain, int x, int y, int z)
TerrainChunkState State
static int ExtractContents(int value)
static int MakeBlockValue(int contents)
static int ExtractData(int value)
ValuesDictionary ValuesDictionary