X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Fcontent_abm.cpp;h=ccd9ca19ce326884d10f46b4ac45d4fd39ba514c;hb=0e07a7157f4865c26b4d7d0ba6fb12f1de59373c;hp=63867b78b6baff9b8e07f2e386fc66e72031b100;hpb=ccfec0400f1da96ffc7c6fb6f30f4afbd26db535;p=dragonfireclient.git diff --git a/src/content_abm.cpp b/src/content_abm.cpp index 63867b78b..ccd9ca19c 100644 --- a/src/content_abm.cpp +++ b/src/content_abm.cpp @@ -1,18 +1,18 @@ /* -Minetest-c55 -Copyright (C) 2011 celeron55, Perttu Ahola +Minetest +Copyright (C) 2013 celeron55, Perttu Ahola This program is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2 of the License, or +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. +GNU Lesser General Public License for more details. -You should have received a copy of the GNU General Public License along +You should have received a copy of the GNU Lesser General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ @@ -25,7 +25,9 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "content_sao.h" #include "settings.h" #include "mapblock.h" // For getNodeBlockPos -#include "mapgen.h" // For mapgen::make_tree +#include "treegen.h" // For treegen::make_tree +#include "main.h" // for g_settings +#include "map.h" #define PP(x) "("<<(x).X<<","<<(x).Y<<","<<(x).Z<<")" @@ -36,7 +38,7 @@ class GrowGrassABM : public ActiveBlockModifier virtual std::set getTriggerContents() { std::set s; - s.insert("dirt"); + s.insert("mapgen_dirt"); return s; } virtual float getTriggerInterval() @@ -53,7 +55,7 @@ class GrowGrassABM : public ActiveBlockModifier !ndef->get(n_top).isLiquid() && n_top.getLightBlend(env->getDayNightRatio(), ndef) >= 13) { - n.setContent(ndef->getId("dirt_with_grass")); + n.setContent(ndef->getId("mapgen_dirt_with_grass")); map->addNodeWithEvent(p, n); } } @@ -66,7 +68,7 @@ class RemoveGrassABM : public ActiveBlockModifier virtual std::set getTriggerContents() { std::set s; - s.insert("dirt_with_grass"); + s.insert("mapgen_dirt_with_grass"); return s; } virtual float getTriggerInterval() @@ -79,136 +81,35 @@ class RemoveGrassABM : public ActiveBlockModifier ServerMap *map = &env->getServerMap(); MapNode n_top = map->getNodeNoEx(p+v3s16(0,1,0)); - if(!ndef->get(n_top).light_propagates || + if((!ndef->get(n_top).light_propagates && + n_top.getContent() != CONTENT_IGNORE) || ndef->get(n_top).isLiquid()) { - n.setContent(ndef->getId("dirt")); + n.setContent(ndef->getId("mapgen_dirt")); map->addNodeWithEvent(p, n); } } }; -class SpawnRatsAroundTreesABM : public ActiveBlockModifier +class MakeTreesFromSaplingsABM : public ActiveBlockModifier { private: + content_t c_junglesapling; + content_t c_dirt; + content_t c_dirt_with_grass; + public: - virtual std::set getTriggerContents() - { - std::set s; - s.insert("tree"); - s.insert("jungletree"); - return s; - } - virtual float getTriggerInterval() - { return 10.0; } - virtual u32 getTriggerChance() - { return 200; } - virtual void trigger(ServerEnvironment *env, v3s16 p, MapNode n, - u32 active_object_count, u32 active_object_count_wider) - { - if(active_object_count_wider != 0) - return; - - INodeDefManager *ndef = env->getGameDef()->ndef(); - ServerMap *map = &env->getServerMap(); - - v3s16 p1 = p + v3s16(myrand_range(-2, 2), - 0, myrand_range(-2, 2)); - MapNode n1 = map->getNodeNoEx(p1); - MapNode n1b = map->getNodeNoEx(p1+v3s16(0,-1,0)); - if(n1b.getContent() == ndef->getId("dirt_with_grass") && - n1.getContent() == CONTENT_AIR) - { - v3f pos = intToFloat(p1, BS); - ServerActiveObject *obj = new RatSAO(env, pos); - env->addActiveObject(obj); - } + MakeTreesFromSaplingsABM(ServerEnvironment *env, INodeDefManager *nodemgr) { + c_junglesapling = nodemgr->getId("junglesapling"); + c_dirt = nodemgr->getId("mapgen_dirt"); + c_dirt_with_grass = nodemgr->getId("mapgen_dirt_with_grass"); } -}; -static void getMob_dungeon_master(Settings &properties) -{ - properties.set("looks", "dungeon_master"); - properties.setFloat("yaw", 1.57); - properties.setFloat("hp", 30); - properties.setBool("bright_shooting", true); - properties.set("shoot_type", "fireball"); - properties.set("shoot_y", "0.7"); - properties.set("player_hit_damage", "1"); - properties.set("player_hit_distance", "1.0"); - properties.set("player_hit_interval", "0.5"); - properties.setBool("mindless_rage", myrand_range(0,100)==0); -} - -class SpawnInCavesABM : public ActiveBlockModifier -{ -private: -public: - virtual std::set getTriggerContents() - { - std::set s; - s.insert("stone"); - s.insert("mossycobble"); - return s; - } - virtual float getTriggerInterval() - { return 2.0; } - virtual u32 getTriggerChance() - { return 1000; } - virtual void trigger(ServerEnvironment *env, v3s16 p, MapNode n, - u32 active_object_count, u32 active_object_count_wider) - { - if(active_object_count_wider != 0) - return; - - INodeDefManager *ndef = env->getGameDef()->ndef(); - ServerMap *map = &env->getServerMap(); - - v3s16 p1 = p + v3s16(0,1,0); - MapNode n1a = map->getNodeNoEx(p1+v3s16(0,0,0)); - if(n1a.getLightBlend(env->getDayNightRatio(), ndef) <= 3){ - MapNode n1b = map->getNodeNoEx(p1+v3s16(0,1,0)); - if(n1a.getContent() == CONTENT_AIR && - n1b.getContent() == CONTENT_AIR) - { - v3f pos = intToFloat(p1, BS); - int i = myrand()%5; - if(i == 0 || i == 1){ - actionstream<<"A dungeon master spawns at " - <addActiveObject(obj); - } else if(i == 2 || i == 3){ - actionstream<<"Rats spawn at " - <addActiveObject(obj); - } - } else { - actionstream<<"An oerkki spawns at " - <addActiveObject(obj); - } - } - } - } -}; - -class MakeTreesFromSaplingsABM : public ActiveBlockModifier -{ -private: -public: virtual std::set getTriggerContents() { std::set s; s.insert("sapling"); + s.insert("junglesapling"); return s; } virtual float getTriggerInterval() @@ -221,49 +122,87 @@ class MakeTreesFromSaplingsABM : public ActiveBlockModifier INodeDefManager *ndef = env->getGameDef()->ndef(); ServerMap *map = &env->getServerMap(); - actionstream<<"A sapling grows into a tree at " - <getNodeNoEx(p - v3s16(0, 1, 0)); + if (n_below.getContent() != c_dirt && + n_below.getContent() != c_dirt_with_grass) + return; + + bool is_jungle_tree = n.getContent() == c_junglesapling; + + actionstream <<"A " << (is_jungle_tree ? "jungle " : "") + << "sapling grows into a tree at " + << PP(p) << std::endl; - core::map modified_blocks; + std::map modified_blocks; v3s16 tree_p = p; ManualMapVoxelManipulator vmanip(map); v3s16 tree_blockp = getNodeBlockPos(tree_p); vmanip.initialEmerge(tree_blockp - v3s16(1,1,1), tree_blockp + v3s16(1,1,1)); - bool is_apple_tree = myrand()%4 == 0; - mapgen::make_tree(vmanip, tree_p, is_apple_tree, ndef); + + if (is_jungle_tree) { + treegen::make_jungletree(vmanip, tree_p, ndef, myrand()); + } else { + bool is_apple_tree = myrand() % 4 == 0; + treegen::make_tree(vmanip, tree_p, is_apple_tree, ndef, myrand()); + } + vmanip.blitBackAll(&modified_blocks); // update lighting - core::map lighting_modified_blocks; - for(core::map::Iterator - i = modified_blocks.getIterator(); - i.atEnd() == false; i++) - { - lighting_modified_blocks.insert(i.getNode()->getKey(), i.getNode()->getValue()); - } + std::map lighting_modified_blocks; + lighting_modified_blocks.insert(modified_blocks.begin(), modified_blocks.end()); map->updateLighting(lighting_modified_blocks, modified_blocks); // Send a MEET_OTHER event MapEditEvent event; event.type = MEET_OTHER; - for(core::map::Iterator - i = modified_blocks.getIterator(); - i.atEnd() == false; i++) +// event.modified_blocks.insert(modified_blocks.begin(), modified_blocks.end()); + for(std::map::iterator + i = modified_blocks.begin(); + i != modified_blocks.end(); ++i) { - v3s16 p = i.getNode()->getKey(); - event.modified_blocks.insert(p, true); + event.modified_blocks.insert(i->first); } map->dispatchEvent(&event); } }; +class LiquidFlowABM : public ActiveBlockModifier +{ +private: + std::set contents; + +public: + LiquidFlowABM(ServerEnvironment *env, INodeDefManager *nodemgr) + { + std::set liquids; + nodemgr->getIds("group:liquid", liquids); + for(std::set::const_iterator k = liquids.begin(); k != liquids.end(); k++) + contents.insert(nodemgr->get(*k).liquid_alternative_flowing); + + } + virtual std::set getTriggerContents() + { + return contents; + } + virtual float getTriggerInterval() + { return 10.0; } + virtual u32 getTriggerChance() + { return 10; } + virtual void trigger(ServerEnvironment *env, v3s16 p, MapNode n) + { + ServerMap *map = &env->getServerMap(); + if (map->transforming_liquid_size() < 500) + map->transforming_liquid_add(p); + //if ((*map).m_transforming_liquid.size() < 500) (*map).m_transforming_liquid.push_back(p); + } +}; + void add_legacy_abms(ServerEnvironment *env, INodeDefManager *nodedef) { env->addActiveBlockModifier(new GrowGrassABM()); env->addActiveBlockModifier(new RemoveGrassABM()); - env->addActiveBlockModifier(new SpawnRatsAroundTreesABM()); - env->addActiveBlockModifier(new SpawnInCavesABM()); - env->addActiveBlockModifier(new MakeTreesFromSaplingsABM()); + env->addActiveBlockModifier(new MakeTreesFromSaplingsABM(env, nodedef)); + if (g_settings->getBool("liquid_finite")) + env->addActiveBlockModifier(new LiquidFlowABM(env, nodedef)); } - -