@@ -191,17 +191,58 @@ class LiquidFlowABM : public ActiveBlockModifier
191
191
virtual void trigger (ServerEnvironment *env, v3s16 p, MapNode n)
192
192
{
193
193
ServerMap *map = &env->getServerMap ();
194
- if (map->transforming_liquid_size () < 500 )
195
- map->transforming_liquid_add (p);
194
+ if (map->transforming_liquid_size () > 500 )
195
+ return ;
196
+ map->transforming_liquid_add (p);
196
197
// if ((*map).m_transforming_liquid.size() < 500) (*map).m_transforming_liquid.push_back(p);
197
198
}
198
199
};
199
200
201
+ class LiquidDropABM : public ActiveBlockModifier
202
+ {
203
+ private:
204
+ std::set<std::string> contents;
205
+
206
+ public:
207
+ LiquidDropABM (ServerEnvironment *env, INodeDefManager *nodemgr)
208
+ {
209
+ std::set<content_t > liquids;
210
+ nodemgr->getIds (" group:liquid" , liquids);
211
+ for (std::set<content_t >::const_iterator k = liquids.begin (); k != liquids.end (); k++)
212
+ contents.insert (nodemgr->get (*k).liquid_alternative_source );
213
+ }
214
+ virtual std::set<std::string> getTriggerContents ()
215
+ { return contents; }
216
+ virtual std::set<std::string> getRequiredNeighbors ()
217
+ {
218
+ std::set<std::string> neighbors;
219
+ neighbors.insert (" mapgen_air" );
220
+ return neighbors;
221
+ }
222
+ virtual float getTriggerInterval ()
223
+ { return 20.0 ; }
224
+ virtual u32 getTriggerChance ()
225
+ { return 10 ; }
226
+ virtual void trigger (ServerEnvironment *env, v3s16 p, MapNode n)
227
+ {
228
+ ServerMap *map = &env->getServerMap ();
229
+ if (map->transforming_liquid_size () > 500 )
230
+ return ;
231
+ // todo: look around except top
232
+ MapNode n_below = map->getNodeNoEx (p - v3s16 (0 , 1 , 0 ));
233
+ if (n_below.getContent () != CONTENT_AIR)
234
+ return ;
235
+ map->transforming_liquid_add (p);
236
+ }
237
+ };
238
+
200
239
void add_legacy_abms (ServerEnvironment *env, INodeDefManager *nodedef)
201
240
{
202
241
env->addActiveBlockModifier (new GrowGrassABM ());
203
242
env->addActiveBlockModifier (new RemoveGrassABM ());
204
243
env->addActiveBlockModifier (new MakeTreesFromSaplingsABM (env, nodedef));
205
- if (g_settings->getBool (" liquid_finite" ))
244
+ if (g_settings->getBool (" liquid_finite" )) {
206
245
env->addActiveBlockModifier (new LiquidFlowABM (env, nodedef));
246
+ env->addActiveBlockModifier (new LiquidDropABM (env, nodedef));
247
+ }
207
248
}
0 commit comments