Survivalcraft API 1.8.2.3 v1.8.2.3
Survivalcraft 2.4
载入中...
搜索中...
未找到
SubsystemPlantBlockBehavior.cs
浏览该文件的文档.
1using Engine;
3
4namespace Game {
7
9
11
13
14 public Random m_random = new();
15
16 public override int[] HandledBlocks => [
17 19,
18 20,
19 24,
20 25,
21 28,
22 99,
23 131,
24 244,
25 132,
26 174,
27 204
28 ];
29
42 public sealed override void OnNeighborBlockChanged(int x, int y, int z, int neighborX, int neighborY, int neighborZ) {
43 bool destroyCell = false;
44 int plantValue = SubsystemTerrain.Terrain.GetCellValue(x, y, z);
45 int plantContents = Terrain.ExtractContents(plantValue);
46 int cellValue = SubsystemTerrain.Terrain.GetCellValue(x, y - 1, z);
47 Block blockUnder = BlocksManager.Blocks[Terrain.ExtractContents(cellValue)];
48 if (plantContents == 132) { //JackOLanternBlock
49 if (blockUnder.IsFaceTransparent(SubsystemTerrain, 4, cellValue)
50 && blockUnder is not FenceBlock) {
51 destroyCell = true;
52 }
53 }
54 else if (!blockUnder.IsSuitableForPlants(cellValue, plantValue)) {
55 destroyCell = true;
56 }
57 if (destroyCell) {
59 0,
60 x,
61 y,
62 z,
63 0,
64 false,
65 false
66 );
67 }
68 }
69
70 public override void OnBlockGenerated(int value, int x, int y, int z, bool isLoaded) {
71 Lifecycle(value, x, y, z, true);
72 }
73
74 public override void OnPoll(int value, int x, int y, int z, int pollPass) {
75 if (m_subsystemGameInfo.WorldSettings.EnvironmentBehaviorMode == EnvironmentBehaviorMode.Living) {
76 Grow(value, x, y, z, pollPass);
77 Lifecycle(value, x, y, z, false);
78 }
79 }
80
81 public virtual void Grow(int value, int x, int y, int z, int pollPass) {
82 if (y <= 0
83 || y >= 255) {
84 return;
85 }
86 bool skipVanilla = false;
88 "GrowPlant",
89 modLoader => {
90 modLoader.GrowPlant(this, x, y, z, pollPass, out bool skip);
91 skipVanilla |= skip;
92 return false;
93 }
94 );
95 if (!skipVanilla) {
96 int num = Terrain.ExtractContents(value);
97 Block block = BlocksManager.Blocks[num];
98 if (num == 19) {
99 GrowTallGrass(value, x, y, z, pollPass);
100 return;
101 }
102 if (block is FlowerBlock) {
103 GrowFlower(value, x, y, z, pollPass);
104 return;
105 }
106 switch (num) {
107 case 174: GrowRye(value, x, y, z, pollPass); break;
108 case 204: GrowCotton(value, x, y, z, pollPass); break;
109 case 131: GrowPumpkin(value, x, y, z, pollPass); break;
110 }
111 }
112 }
113
114 public override void Load(ValuesDictionary valuesDictionary) {
115 base.Load(valuesDictionary);
116 m_subsystemTime = Project.FindSubsystem<SubsystemTime>(true);
118 m_subsystemGameInfo = Project.FindSubsystem<SubsystemGameInfo>(true);
119 m_subsystemSeasons = Project.FindSubsystem<SubsystemSeasons>(true);
120 }
121
122 public void GrowTallGrass(int value, int x, int y, int z, int pollPass) {
123 int data = Terrain.ExtractData(value);
124 if (TallGrassBlock.GetIsSmall(data)
126 int data2 = TallGrassBlock.SetIsSmall(data, false);
127 int value2 = Terrain.ReplaceData(value, data2);
128 m_subsystemCellChangeQueue.QueueCellChange(x, y, z, value2);
129 }
130 }
131
132 public void GrowFlower(int value, int x, int y, int z, int pollPass) {
133 int data = Terrain.ExtractData(value);
134 if (FlowerBlock.GetIsSmall(data)
136 int data2 = FlowerBlock.SetIsSmall(data, false);
137 int value2 = Terrain.ReplaceData(value, data2);
138 m_subsystemCellChangeQueue.QueueCellChange(x, y, z, value2);
139 }
140 }
141
142 public void GrowRye(int value, int x, int y, int z, int pollPass) {
144 return;
145 }
146 int data = Terrain.ExtractData(value);
147 int size = RyeBlock.GetSize(data);
148 if (size == 7) {
149 return;
150 }
151 if (RyeBlock.GetIsWild(data)) {
152 if (size < 7) {
153 int data2 = RyeBlock.SetSize(RyeBlock.SetIsWild(data, true), size + 1);
154 int value2 = Terrain.ReplaceData(value, data2);
155 m_subsystemCellChangeQueue.QueueCellChange(x, y, z, value2);
156 }
157 return;
158 }
159 int cellValueFast = SubsystemTerrain.Terrain.GetCellValueFast(x, y - 1, z);
160 if (Terrain.ExtractContents(cellValueFast) == 168) {
161 int data3 = Terrain.ExtractData(cellValueFast);
162 bool hydration = SoilBlock.GetHydration(data3);
163 int nitrogen = SoilBlock.GetNitrogen(data3);
165 int num2 = 4;
166 float num3 = 0.8f;
167 if (nitrogen > 0) {
168 num2--;
169 num3 -= 0.4f;
170 }
171 if (hydration) {
172 num2--;
173 num3 -= 0.4f;
174 }
175 if (num <= 4) {
176 num2 += 4;
177 }
178 if (pollPass % MathUtils.Max(num2, 1) == 0
179 || !(num3 < 1f)) {
180 int data4 = RyeBlock.SetSize(data, MathUtils.Min(size + 1, 7));
181 if (m_random.Float(0f, 1f) < num3
182 && size == 3) {
183 data4 = RyeBlock.SetIsWild(data4, true);
184 }
185 int value3 = Terrain.ReplaceData(value, data4);
186 m_subsystemCellChangeQueue.QueueCellChange(x, y, z, value3);
187 if (size + 1 == 7) {
188 int data5 = SoilBlock.SetNitrogen(data3, MathUtils.Max(nitrogen - 1, 0));
189 int value4 = Terrain.ReplaceData(cellValueFast, data5);
190 m_subsystemCellChangeQueue.QueueCellChange(x, y - 1, z, value4);
191 }
192 }
193 }
194 else {
195 int value5 = Terrain.ReplaceData(value, RyeBlock.SetIsWild(data, true));
196 m_subsystemCellChangeQueue.QueueCellChange(x, y, z, value5);
197 }
198 }
199
200 public void GrowCotton(int value, int x, int y, int z, int pollPass) {
202 return;
203 }
204 int data = Terrain.ExtractData(value);
205 int size = CottonBlock.GetSize(data);
206 if (size >= 2) {
207 return;
208 }
209 if (CottonBlock.GetIsWild(data)) {
210 int data2 = CottonBlock.SetSize(CottonBlock.SetIsWild(data, true), size + 1);
211 int value2 = Terrain.ReplaceData(value, data2);
212 m_subsystemCellChangeQueue.QueueCellChange(x, y, z, value2);
213 return;
214 }
215 int cellValueFast = SubsystemTerrain.Terrain.GetCellValueFast(x, y - 1, z);
216 if (Terrain.ExtractContents(cellValueFast) == 168) {
217 int data3 = Terrain.ExtractData(cellValueFast);
218 bool hydration = SoilBlock.GetHydration(data3);
219 int nitrogen = SoilBlock.GetNitrogen(data3);
221 int num2 = 8;
222 float num3 = 0.8f;
223 if (nitrogen > 0) {
224 num2 -= 2;
225 num3 -= 0.4f;
226 }
227 if (hydration) {
228 num2 -= 2;
229 num3 -= 0.4f;
230 }
231 if (num <= 4) {
232 num2 += 8;
233 }
234 if (pollPass % MathUtils.Max(num2, 1) == 0
235 || !(num3 < 1f)) {
236 int data4 = CottonBlock.SetSize(data, MathUtils.Min(size + 1, 2));
237 if (m_random.Float(0f, 1f) < num3
238 && size == 1) {
239 data4 = CottonBlock.SetIsWild(data4, true);
240 }
241 int value3 = Terrain.ReplaceData(value, data4);
242 m_subsystemCellChangeQueue.QueueCellChange(x, y, z, value3);
243 if (size + 1 == 2) {
244 int data5 = SoilBlock.SetNitrogen(data3, MathUtils.Max(nitrogen - 1, 0));
245 int value4 = Terrain.ReplaceData(cellValueFast, data5);
246 m_subsystemCellChangeQueue.QueueCellChange(x, y - 1, z, value4);
247 }
248 }
249 }
250 else {
251 int value5 = Terrain.ReplaceData(value, CottonBlock.SetIsWild(data, true));
252 m_subsystemCellChangeQueue.QueueCellChange(x, y, z, value5);
253 }
254 }
255
256 public void GrowPumpkin(int value, int x, int y, int z, int pollPass) {
258 return;
259 }
260 int data = Terrain.ExtractData(value);
261 int size = BasePumpkinBlock.GetSize(data);
263 || size >= 7) {
264 return;
265 }
266 int cellValueFast = SubsystemTerrain.Terrain.GetCellValueFast(x, y - 1, z);
267 int num = Terrain.ExtractContents(cellValueFast);
268 int data2 = Terrain.ExtractData(cellValueFast);
269 bool flag = num == 168 && SoilBlock.GetHydration(data2);
270 int num2 = num == 168 ? SoilBlock.GetNitrogen(data2) : 0;
272 int num4 = 4;
273 float num5 = 0.15f;
274 if (num == 168) {
275 num4--;
276 num5 -= 0.05f;
277 }
278 if (num2 > 0) {
279 num4--;
280 num5 -= 0.05f;
281 }
282 if (flag) {
283 num4--;
284 num5 -= 0.05f;
285 }
286 if (num3 <= 8) {
287 num4 += 5;
288 }
289 if (pollPass % MathUtils.Max(num4, 1) == 0
290 || !(num5 < 1f)) {
291 int data3 = BasePumpkinBlock.SetSize(data, MathUtils.Min(size + 1, 7));
292 if (m_random.Float(0f, 1f) < num5) {
293 data3 = BasePumpkinBlock.SetIsDead(data3, true);
294 }
295 int value2 = Terrain.ReplaceData(value, data3);
296 m_subsystemCellChangeQueue.QueueCellChange(x, y, z, value2);
297 if (num == 168
298 && size + 1 == 7) {
299 int data4 = SoilBlock.SetNitrogen(data2, MathUtils.Max(num2 - 3, 0));
300 int value3 = Terrain.ReplaceData(cellValueFast, data4);
301 m_subsystemCellChangeQueue.QueueCellChange(x, y - 1, z, value3);
302 }
303 }
304 }
305
306 public virtual void Lifecycle(int value, int x, int y, int z, bool applyImmediately) { }
307 }
308}
static int Min(int x1, int x2)
static int Max(int x1, int x2)
static int GetSize(int data)
static int SetIsDead(int data, bool isDead)
static bool GetIsDead(int data)
static int SetSize(int data, int size)
virtual bool IsFaceTransparent(SubsystemTerrain subsystemTerrain, int face, int value)
virtual bool IsSuitableForPlants(int value, int plantValue)
static bool GetIsWild(int data)
static int GetSize(int data)
static int SetSize(int data, int size)
static int SetIsWild(int data, bool isWild)
static int SetIsSmall(int data, bool isSmall)
static bool GetIsSmall(int data)
static int SetIsWild(int data, bool isWild)
static int SetSize(int data, int size)
static bool GetIsWild(int data)
static int GetSize(int data)
static int GetNitrogen(int data)
static bool GetHydration(int data)
static int SetNitrogen(int data, int nitrogen)
void GrowPumpkin(int value, int x, int y, int z, int pollPass)
void GrowRye(int value, int x, int y, int z, int pollPass)
override void OnNeighborBlockChanged(int x, int y, int z, int neighborX, int neighborY, int neighborZ)
该方法进行封装,不再允许覆盖 添加新的放置植物的逻辑: 如果是添加新植物,则建议自己添加新的ModPlantBlockBehavior,只负责属于自己模组的植物的生长 如果是添加新的能种植植物的土质(如...
void GrowTallGrass(int value, int x, int y, int z, int pollPass)
void GrowFlower(int value, int x, int y, int z, int pollPass)
virtual void Lifecycle(int value, int x, int y, int z, bool applyImmediately)
void GrowCotton(int value, int x, int y, int z, int pollPass)
override void Load(ValuesDictionary valuesDictionary)
override void OnPoll(int value, int x, int y, int z, int pollPass)
override void OnBlockGenerated(int value, int x, int y, int z, bool isLoaded)
virtual void Grow(int value, int x, int y, int z, int pollPass)
virtual void DestroyCell(int toolLevel, int x, int y, int z, int newValue, bool noDrop, bool noParticleSystem, MovingBlock movingBlock=null)
static Func< int, int > GetTemperatureAdjustmentAtHeight
static int SetIsSmall(int data, bool isSmall)
static bool GetIsSmall(int data)
static int ExtractContents(int value)
static int ReplaceData(int value, int data)
virtual int GetCellValueFast(int x, int y, int z)
virtual int GetCellValue(int x, int y, int z)
static int ExtractLight(int value)
virtual int GetSeasonalTemperature(int x, int z)
static int ExtractData(int value)
ValuesDictionary ValuesDictionary
static void HookAction(string HookName, Func< ModLoader, bool > action)
执行Hook