From 650e932ddf7352e50bba42acbc0ff4eda8aa40e2 Mon Sep 17 00:00:00 2001 From: kwolekr Date: Sat, 9 Mar 2013 21:28:19 -0500 Subject: Re-add dungeons in new dungeongen.cpp --- src/mapgen_v6.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) (limited to 'src/mapgen_v6.cpp') diff --git a/src/mapgen_v6.cpp b/src/mapgen_v6.cpp index d5405876e..bf12f3099 100644 --- a/src/mapgen_v6.cpp +++ b/src/mapgen_v6.cpp @@ -32,6 +32,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "settings.h" // For g_settings #include "main.h" // For g_profiler #include "emerge.h" +#include "dungeongen.h" #include "mapgen_v6.h" /////////////////// Mapgen V6 perlin noise default values @@ -1241,6 +1242,14 @@ void MapgenV6::makeChunk(BlockMakeData *data) END OF AGING LOOP ************************/ + /* + Add dungeons + */ + if (flags & MG_DUNGEONS) { + DungeonGen dgen(ndef, data->seed, water_level); + dgen.generate(&vmanip, blockseed, full_node_min, full_node_max); + } + /* Add top and bottom side of water to transforming_liquid queue */ -- cgit v1.2.3 From 6a1670dbc31cc0e44178bbd9ad34ff0d5981a060 Mon Sep 17 00:00:00 2001 From: Ilya Zhuravlev Date: Thu, 20 Dec 2012 21:19:49 +0400 Subject: Migrate to STL containers/algorithms. --- src/chat.cpp | 20 +-- src/chat.h | 14 +- src/client.cpp | 102 ++++++------ src/client.h | 15 +- src/clientmap.cpp | 55 +++---- src/clientmap.h | 8 +- src/clientobject.cpp | 12 +- src/clientobject.h | 5 +- src/connection.cpp | 254 +++++++++++++++--------------- src/connection.h | 23 +-- src/content_abm.cpp | 21 +-- src/content_cao.cpp | 2 +- src/content_mapblock.cpp | 12 +- src/content_sao.cpp | 2 +- src/debug.cpp | 29 ++-- src/debug.h | 29 ++-- src/emerge.cpp | 12 +- src/environment.cpp | 398 +++++++++++++++++++++++------------------------ src/environment.h | 35 +++-- src/farmesh.cpp | 8 +- src/game.h | 25 +-- src/guiChatConsole.cpp | 2 +- src/guiFormSpecMenu.h | 10 +- src/itemdef.cpp | 6 +- src/keycode.cpp | 13 +- src/localplayer.cpp | 2 +- src/localplayer.h | 3 +- src/main.cpp | 104 ++++++------- src/mainmenumanager.h | 15 +- src/map.cpp | 314 +++++++++++++++++-------------------- src/map.h | 92 +++++------ src/mapblock.cpp | 4 +- src/mapblock.h | 3 +- src/mapblock_mesh.cpp | 12 +- src/mapblock_mesh.h | 6 +- src/mapgen.cpp | 4 +- src/mapgen_v6.cpp | 4 +- src/mapsector.cpp | 41 +++-- src/mapsector.h | 8 +- src/mods.h | 4 +- src/object_properties.h | 5 +- src/profiler.h | 63 ++++---- src/scriptapi.cpp | 16 +- src/scriptapi_env.cpp | 6 +- src/server.cpp | 394 +++++++++++++++++++++++----------------------- src/server.h | 27 ++-- src/serverobject.cpp | 12 +- src/serverobject.h | 2 +- src/settings.h | 113 ++++++-------- src/shader.cpp | 36 ++--- src/staticobject.cpp | 12 +- src/staticobject.h | 14 +- src/test.cpp | 43 ++--- src/tile.cpp | 78 +++++----- src/treegen.cpp | 20 +-- src/util/container.h | 88 ++++++----- src/util/numeric.cpp | 2 +- src/util/numeric.h | 3 +- src/util/thread.h | 16 +- src/voxel.cpp | 37 ++--- src/voxel.h | 12 +- src/voxelalgorithms.cpp | 12 +- src/voxelalgorithms.h | 8 +- 63 files changed, 1330 insertions(+), 1417 deletions(-) (limited to 'src/mapgen_v6.cpp') diff --git a/src/chat.cpp b/src/chat.cpp index c3509ae49..1135ccdf7 100644 --- a/src/chat.cpp +++ b/src/chat.cpp @@ -117,8 +117,8 @@ void ChatBuffer::deleteOldest(u32 count) --count; } - m_unformatted.erase(0, del_unformatted); - m_formatted.erase(0, del_formatted); + m_unformatted.erase(m_unformatted.begin(), m_unformatted.begin() + del_unformatted); + m_formatted.erase(m_formatted.begin(), m_formatted.begin() + del_formatted); } void ChatBuffer::deleteByAge(f32 maxAge) @@ -232,10 +232,10 @@ void ChatBuffer::scrollTop() } u32 ChatBuffer::formatChatLine(const ChatLine& line, u32 cols, - core::array& destination) const + std::vector& destination) const { u32 num_added = 0; - core::array next_frags; + std::vector next_frags; ChatFormattedLine next_line; ChatFormattedFragment temp_frag; u32 out_column = 0; @@ -292,7 +292,7 @@ u32 ChatBuffer::formatChatLine(const ChatLine& line, u32 cols, frag.column = out_column; next_line.fragments.push_back(frag); out_column += frag.text.size(); - next_frags.erase(0, 1); + next_frags.erase(next_frags.begin()); } else { @@ -414,7 +414,7 @@ std::wstring ChatPrompt::submit() if (!line.empty()) m_history.push_back(line); if (m_history.size() > m_history_limit) - m_history.erase(0); + m_history.erase(m_history.begin()); m_history_index = m_history.size(); m_view = 0; m_cursor = 0; @@ -464,7 +464,7 @@ void ChatPrompt::historyNext() } } -void ChatPrompt::nickCompletion(const core::list& names, bool backwards) +void ChatPrompt::nickCompletion(const std::list& names, bool backwards) { // Two cases: // (a) m_nick_completion_start == m_nick_completion_end == 0 @@ -492,10 +492,10 @@ void ChatPrompt::nickCompletion(const core::list& names, bool back std::wstring prefix = m_line.substr(prefix_start, prefix_end - prefix_start); // find all names that start with the selected prefix - core::array completions; - for (core::list::ConstIterator + std::vector completions; + for (std::list::const_iterator i = names.begin(); - i != names.end(); i++) + i != names.end(); ++i) { if (str_starts_with(*i, prefix, true)) { diff --git a/src/chat.h b/src/chat.h index 27863922c..8a40c7ccf 100644 --- a/src/chat.h +++ b/src/chat.h @@ -22,6 +22,8 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "irrlichttypes_bloated.h" #include +#include +#include // Chat console related classes, only used by the client @@ -55,7 +57,7 @@ struct ChatFormattedFragment struct ChatFormattedLine { // Array of text fragments - core::array fragments; + std::vector fragments; // true if first line of one formatted ChatLine bool first; }; @@ -110,7 +112,7 @@ public: // Appends the formatted lines to the destination array and // returns the number of formatted lines. u32 formatChatLine(const ChatLine& line, u32 cols, - core::array& destination) const; + std::vector& destination) const; protected: s32 getTopScrollPos() const; @@ -120,7 +122,7 @@ private: // Scrollback size u32 m_scrollback; // Array of unformatted chat lines - core::array m_unformatted; + std::vector m_unformatted; // Number of character columns in console u32 m_cols; @@ -129,7 +131,7 @@ private: // Scroll position (console's top line index into m_formatted) s32 m_scroll; // Array of formatted lines - core::array m_formatted; + std::vector m_formatted; // Empty formatted line, for error returns ChatFormattedLine m_empty_formatted_line; }; @@ -158,7 +160,7 @@ public: void historyNext(); // Nick completion - void nickCompletion(const core::list& names, bool backwards); + void nickCompletion(const std::list& names, bool backwards); // Update console size and reformat the visible portion of the prompt void reformat(u32 cols); @@ -209,7 +211,7 @@ private: // Currently edited line std::wstring m_line; // History buffer - core::array m_history; + std::vector m_history; // History index (0 <= m_history_index <= m_history.size()) u32 m_history_index; // Maximum number of history entries diff --git a/src/client.cpp b/src/client.cpp index be35db5de..2ccace842 100644 --- a/src/client.cpp +++ b/src/client.cpp @@ -232,8 +232,8 @@ void * MediaFetchThread::Thread() #if USE_CURL CURL *curl; CURLcode res; - for (core::list::Iterator i = m_file_requests.begin(); - i != m_file_requests.end(); i++) { + for (std::list::iterator i = m_file_requests.begin(); + i != m_file_requests.end(); ++i) { curl = curl_easy_init(); assert(curl); curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1); @@ -360,8 +360,8 @@ Client::~Client() } } - for (core::list::Iterator i = m_media_fetch_threads.begin(); - i != m_media_fetch_threads.end(); i++) + for (std::list::iterator i = m_media_fetch_threads.begin(); + i != m_media_fetch_threads.end(); ++i) delete *i; } @@ -585,7 +585,7 @@ void Client::step(float dtime) if(m_map_timer_and_unload_interval.step(dtime, map_timer_and_unload_dtime)) { ScopeProfiler sp(g_profiler, "Client: map timer and unload"); - core::list deleted_blocks; + std::list deleted_blocks; m_env.getMap().timerUpdate(map_timer_and_unload_dtime, g_settings->getFloat("client_unload_unused_data_timeout"), &deleted_blocks); @@ -599,8 +599,8 @@ void Client::step(float dtime) NOTE: This loop is intentionally iterated the way it is. */ - core::list::Iterator i = deleted_blocks.begin(); - core::list sendlist; + std::list::iterator i = deleted_blocks.begin(); + std::list sendlist; for(;;) { if(sendlist.size() == 255 || i == deleted_blocks.end()) @@ -619,9 +619,9 @@ void Client::step(float dtime) writeU16(&reply[0], TOSERVER_DELETEDBLOCKS); reply[2] = sendlist.size(); u32 k = 0; - for(core::list::Iterator + for(std::list::iterator j = sendlist.begin(); - j != sendlist.end(); j++) + j != sendlist.end(); ++j) { writeV3S16(&reply[2+1+6*k], *j); k++; @@ -635,7 +635,7 @@ void Client::step(float dtime) } sendlist.push_back(*i); - i++; + ++i; } } @@ -727,7 +727,7 @@ void Client::step(float dtime) < 0) + while(!m_mesh_update_thread.m_queue_out.empty()) { num_processed_meshes++; MeshUpdateResult r = m_mesh_update_thread.m_queue_out.pop_front(); @@ -779,10 +779,10 @@ void Client::step(float dtime) */ if (m_media_receive_started) { bool all_stopped = true; - for (core::list::Iterator thread = m_media_fetch_threads.begin(); - thread != m_media_fetch_threads.end(); thread++) { + for (std::list::iterator thread = m_media_fetch_threads.begin(); + thread != m_media_fetch_threads.end(); ++thread) { all_stopped &= !(*thread)->IsRunning(); - while ((*thread)->m_file_data.size() > 0) { + while (!(*thread)->m_file_data.empty()) { std::pair out = (*thread)->m_file_data.pop_front(); ++m_media_received_count; @@ -803,9 +803,9 @@ void Client::step(float dtime) } { - core::map::Node *n; + std::map::iterator n; n = m_media_name_sha1_map.find(out.first); - if(n == NULL) + if(n == m_media_name_sha1_map.end()) errorstream<<"The server sent a file that has not " <<"been announced."< fetch_failed; - for (core::list::Iterator thread = m_media_fetch_threads.begin(); - thread != m_media_fetch_threads.end(); thread++) { - for (core::list::Iterator request = (*thread)->m_failed.begin(); - request != (*thread)->m_failed.end(); request++) + std::list fetch_failed; + for (std::list::iterator thread = m_media_fetch_threads.begin(); + thread != m_media_fetch_threads.end(); ++thread) { + for (std::list::iterator request = (*thread)->m_failed.begin(); + request != (*thread)->m_failed.end(); ++request) fetch_failed.push_back(*request); (*thread)->m_failed.clear(); } @@ -1015,14 +1015,14 @@ void Client::deletingPeer(con::Peer *peer, bool timeout) string name } */ -void Client::request_media(const core::list &file_requests) +void Client::request_media(const std::list &file_requests) { std::ostringstream os(std::ios_base::binary); writeU16(os, TOSERVER_REQUEST_MEDIA); writeU16(os, file_requests.size()); - for(core::list::ConstIterator i = file_requests.begin(); - i != file_requests.end(); i++) { + for(std::list::const_iterator i = file_requests.begin(); + i != file_requests.end(); ++i) { os<name); } @@ -1622,7 +1622,7 @@ void Client::ProcessData(u8 *data, u32 datasize, u16 sender_peer_id) infostream<<"Client: Received media announcement: packet size: " < file_requests; + std::list file_requests; for(int i=0; i::Iterator cur = m_media_fetch_threads.begin(); - for(core::list::Iterator i = file_requests.begin(); - i != file_requests.end(); i++) { + std::list::iterator cur = m_media_fetch_threads.begin(); + for(std::list::iterator i = file_requests.begin(); + i != file_requests.end(); ++i) { (*cur)->m_file_requests.push_back(*i); cur++; if (cur == m_media_fetch_threads.end()) cur = m_media_fetch_threads.begin(); } - for (core::list::Iterator i = m_media_fetch_threads.begin(); - i != m_media_fetch_threads.end(); i++) { + for (std::list::iterator i = m_media_fetch_threads.begin(); + i != m_media_fetch_threads.end(); ++i) { (*i)->m_remote_url = remote_media; (*i)->Start(); } @@ -1762,9 +1762,9 @@ void Client::ProcessData(u8 *data, u32 datasize, u16 sender_peer_id) } { - core::map::Node *n; + std::map::iterator n; n = m_media_name_sha1_map.find(name); - if(n == NULL) + if(n == m_media_name_sha1_map.end()) errorstream<<"The server sent a file that has not " <<"been announced."< modified_blocks; + std::map modified_blocks; try { @@ -2245,12 +2245,11 @@ void Client::removeNode(v3s16 p) // add urgent task to update the modified node addUpdateMeshTaskForNode(p, false, true); - for(core::map::Iterator - i = modified_blocks.getIterator(); - i.atEnd() == false; i++) + for(std::map::iterator + i = modified_blocks.begin(); + i != modified_blocks.end(); ++i) { - v3s16 p = i.getNode()->getKey(); - addUpdateMeshTaskWithEdge(p); + addUpdateMeshTaskWithEdge(i->first); } } @@ -2258,7 +2257,7 @@ void Client::addNode(v3s16 p, MapNode n) { TimeTaker timer1("Client::addNode()"); - core::map modified_blocks; + std::map modified_blocks; try { @@ -2268,12 +2267,11 @@ void Client::addNode(v3s16 p, MapNode n) catch(InvalidPositionException &e) {} - for(core::map::Iterator - i = modified_blocks.getIterator(); - i.atEnd() == false; i++) + for(std::map::iterator + i = modified_blocks.begin(); + i != modified_blocks.end(); ++i) { - v3s16 p = i.getNode()->getKey(); - addUpdateMeshTaskWithEdge(p); + addUpdateMeshTaskWithEdge(i->first); } } @@ -2373,7 +2371,7 @@ ClientActiveObject * Client::getSelectedActiveObject( core::line3d shootline_on_map ) { - core::array objects; + std::vector objects; m_env.getActiveObjects(from_pos_f_on_map, max_d, objects); @@ -2381,7 +2379,7 @@ ClientActiveObject * Client::getSelectedActiveObject( // Sort them. // After this, the closest object is the first in the array. - objects.sort(); + std::sort(objects.begin(), objects.end()); for(u32 i=0; i Client::getConnectedPlayerNames() +std::list Client::getConnectedPlayerNames() { - core::list players = m_env.getPlayers(true); - core::list playerNames; - for(core::list::Iterator + std::list players = m_env.getPlayers(true); + std::list playerNames; + for(std::list::iterator i = players.begin(); - i != players.end(); i++) + i != players.end(); ++i) { Player *player = *i; playerNames.push_back(narrow_to_wide(player->getName())); diff --git a/src/client.h b/src/client.h index 809e98b81..570a6b3b0 100644 --- a/src/client.h +++ b/src/client.h @@ -36,6 +36,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "server.h" #include "particles.h" #include "util/pointedthing.h" +#include struct MeshMakeData; class MapBlockMesh; @@ -142,9 +143,9 @@ public: void * Thread(); - core::list m_file_requests; + std::list m_file_requests; MutexedQueue > m_file_data; - core::list m_failed; + std::list m_failed; std::string m_remote_url; IGameDef *m_gamedef; }; @@ -282,7 +283,7 @@ public: // Prints a line or two of info void printDebugInfo(std::ostream &os); - core::list getConnectedPlayerNames(); + std::list getConnectedPlayerNames(); float getAnimationTime(); @@ -347,7 +348,7 @@ private: // Insert a media file appropriately into the appropriate manager bool loadMedia(const std::string &data, const std::string &filename); - void request_media(const core::list &file_requests); + void request_media(const std::list &file_requests); // Virtual methods from con::PeerHandler void peerAdded(con::Peer *peer); @@ -377,7 +378,7 @@ private: MtEventManager *m_event; MeshUpdateThread m_mesh_update_thread; - core::list m_media_fetch_threads; + std::list m_media_fetch_threads; ClientEnvironment m_env; con::Connection m_con; IrrlichtDevice *m_device; @@ -387,7 +388,7 @@ private: bool m_inventory_updated; Inventory *m_inventory_from_server; float m_inventory_from_server_age; - core::map m_active_blocks; + std::set m_active_blocks; PacketCounter m_packetcounter; // Block mesh animation parameters float m_animation_time; @@ -405,7 +406,7 @@ private: Queue m_client_event_queue; FileCache m_media_cache; // Mapping from media file name to SHA1 checksum - core::map m_media_name_sha1_map; + std::map m_media_name_sha1_map; bool m_media_receive_started; u32 m_media_count; u32 m_media_received_count; diff --git a/src/clientmap.cpp b/src/clientmap.cpp index aa92dfdee..c08068367 100644 --- a/src/clientmap.cpp +++ b/src/clientmap.cpp @@ -30,6 +30,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "profiler.h" #include "settings.h" #include "util/mathconstants.h" +#include #define PP(x) "("<<(x).X<<","<<(x).Y<<","<<(x).Z<<")" @@ -83,7 +84,7 @@ MapSector * ClientMap::emergeSector(v2s16 p2d) { //JMutexAutoLock lock(m_sector_mutex); // Bulk comment-out - m_sectors.insert(p2d, sector); + m_sectors[p2d] = sector; } return sector; @@ -164,11 +165,11 @@ void ClientMap::updateDrawList(video::IVideoDriver* driver) INodeDefManager *nodemgr = m_gamedef->ndef(); - for(core::map::Iterator - i = m_drawlist.getIterator(); - i.atEnd() == false; i++) + for(std::map::iterator + i = m_drawlist.begin(); + i != m_drawlist.end(); ++i) { - MapBlock *block = i.getNode()->getValue(); + MapBlock *block = i->second; block->refDrop(); } m_drawlist.clear(); @@ -215,11 +216,11 @@ void ClientMap::updateDrawList(video::IVideoDriver* driver) // Blocks from which stuff was actually drawn //u32 blocks_without_stuff = 0; - for(core::map::Iterator - si = m_sectors.getIterator(); - si.atEnd() == false; si++) + for(std::map::iterator + si = m_sectors.begin(); + si != m_sectors.end(); ++si) { - MapSector *sector = si.getNode()->getValue(); + MapSector *sector = si->second; v2s16 sp = sector->getPos(); if(m_control.range_all == false) @@ -231,7 +232,7 @@ void ClientMap::updateDrawList(video::IVideoDriver* driver) continue; } - core::list< MapBlock * > sectorblocks; + std::list< MapBlock * > sectorblocks; sector->getBlocks(sectorblocks); /* @@ -240,7 +241,7 @@ void ClientMap::updateDrawList(video::IVideoDriver* driver) u32 sector_blocks_drawn = 0; - core::list< MapBlock * >::Iterator i; + std::list< MapBlock * >::iterator i; for(i=sectorblocks.begin(); i!=sectorblocks.end(); i++) { MapBlock *block = *i; @@ -350,7 +351,7 @@ void ClientMap::updateDrawList(video::IVideoDriver* driver) } // foreach sectorblocks if(sector_blocks_drawn != 0) - m_last_drawn_sectors[sp] = true; + m_last_drawn_sectors.insert(sp); } m_control.blocks_would_have_drawn = blocks_would_have_drawn; @@ -368,12 +369,12 @@ void ClientMap::updateDrawList(video::IVideoDriver* driver) struct MeshBufList { video::SMaterial m; - core::list bufs; + std::list bufs; }; struct MeshBufListList { - core::list lists; + std::list lists; void clear() { @@ -382,8 +383,8 @@ struct MeshBufListList void add(scene::IMeshBuffer *buf) { - for(core::list::Iterator i = lists.begin(); - i != lists.end(); i++){ + for(std::list::iterator i = lists.begin(); + i != lists.end(); ++i){ MeshBufList &l = *i; if(l.m == buf->getMaterial()){ l.bufs.push_back(buf); @@ -487,11 +488,11 @@ void ClientMap::renderMap(video::IVideoDriver* driver, s32 pass) MeshBufListList drawbufs; - for(core::map::Iterator - i = m_drawlist.getIterator(); - i.atEnd() == false; i++) + for(std::map::iterator + i = m_drawlist.begin(); + i != m_drawlist.end(); ++i) { - MapBlock *block = i.getNode()->getValue(); + MapBlock *block = i->second; // If the mesh of the block happened to get deleted, ignore it if(block->mesh == NULL) @@ -569,11 +570,11 @@ void ClientMap::renderMap(video::IVideoDriver* driver, s32 pass) } } - core::list &lists = drawbufs.lists; + std::list &lists = drawbufs.lists; int timecheck_counter = 0; - for(core::list::Iterator i = lists.begin(); - i != lists.end(); i++) + for(std::list::iterator i = lists.begin(); + i != lists.end(); ++i) { { timecheck_counter++; @@ -595,8 +596,8 @@ void ClientMap::renderMap(video::IVideoDriver* driver, s32 pass) driver->setMaterial(list.m); - for(core::list::Iterator j = list.bufs.begin(); - j != list.bufs.end(); j++) + for(std::list::iterator j = list.bufs.begin(); + j != list.bufs.end(); ++j) { scene::IMeshBuffer *buf = *j; driver->drawMeshBuffer(buf); @@ -769,7 +770,7 @@ int ClientMap::getBackgroundBrightness(float max_d, u32 daylight_factor, float sunlight_min_d = max_d*0.8; if(sunlight_min_d > 35*BS) sunlight_min_d = 35*BS; - core::array values; + std::vector values; for(u32 i=0; i= 10) num_values_to_use -= num_values_to_use/2; diff --git a/src/clientmap.h b/src/clientmap.h index 786f35b77..7f63704d3 100644 --- a/src/clientmap.h +++ b/src/clientmap.h @@ -22,6 +22,8 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "irrlichttypes_extrabloated.h" #include "map.h" +#include +#include struct MapDrawControl { @@ -128,7 +130,7 @@ public: // Check if sector was drawn on last render() bool sectorWasDrawn(v2s16 p) { - return (m_last_drawn_sectors.find(p) != NULL); + return (m_last_drawn_sectors.find(p) != m_last_drawn_sectors.end()); } private: @@ -143,9 +145,9 @@ private: f32 m_camera_fov; JMutex m_camera_mutex; - core::map m_drawlist; + std::map m_drawlist; - core::map m_last_drawn_sectors; + std::set m_last_drawn_sectors; }; #endif diff --git a/src/clientobject.cpp b/src/clientobject.cpp index e7c735dac..37f693c5e 100644 --- a/src/clientobject.cpp +++ b/src/clientobject.cpp @@ -43,9 +43,9 @@ ClientActiveObject* ClientActiveObject::create(u8 type, IGameDef *gamedef, ClientEnvironment *env) { // Find factory function - core::map::Node *n; + std::map::iterator n; n = m_types.find(type); - if(n == NULL) + if(n == m_types.end()) { // If factory is not found, just return. dstream<<"WARNING: ClientActiveObject: No factory for type=" @@ -53,18 +53,18 @@ ClientActiveObject* ClientActiveObject::create(u8 type, IGameDef *gamedef, return NULL; } - Factory f = n->getValue(); + Factory f = n->second; ClientActiveObject *object = (*f)(gamedef, env); return object; } void ClientActiveObject::registerType(u16 type, Factory f) { - core::map::Node *n; + std::map::iterator n; n = m_types.find(type); - if(n) + if(n != m_types.end()) return; - m_types.insert(type, f); + m_types[type] = f; } diff --git a/src/clientobject.h b/src/clientobject.h index d1ee366cf..8cbf3d60b 100644 --- a/src/clientobject.h +++ b/src/clientobject.h @@ -22,6 +22,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "irrlichttypes_extrabloated.h" #include "activeobject.h" +#include /* @@ -96,7 +97,7 @@ protected: ClientEnvironment *m_env; private: // Used for creating objects based on type - static core::map m_types; + static std::map m_types; }; struct DistanceSortedActiveObject @@ -110,7 +111,7 @@ struct DistanceSortedActiveObject d = a_d; } - bool operator < (DistanceSortedActiveObject &other) + bool operator < (const DistanceSortedActiveObject &other) const { return d < other.d; } diff --git a/src/connection.cpp b/src/connection.cpp index 7a3018bfd..7bff5b113 100644 --- a/src/connection.cpp +++ b/src/connection.cpp @@ -76,19 +76,20 @@ SharedBuffer makeOriginalPacket( return b; } -core::list > makeSplitPacket( +std::list > makeSplitPacket( SharedBuffer data, u32 chunksize_max, u16 seqnum) { // Chunk packets, containing the TYPE_SPLIT header - core::list > chunks; + std::list > chunks; u32 chunk_header_size = 7; u32 maximum_data_size = chunksize_max - chunk_header_size; u32 start = 0; u32 end = 0; u32 chunk_num = 0; + u16 chunk_count = 0; do{ end = start + maximum_data_size - 1; if(end > data.getSize() - 1) @@ -106,16 +107,15 @@ core::list > makeSplitPacket( memcpy(&chunk[chunk_header_size], &data[start], payload_size); chunks.push_back(chunk); + chunk_count++; start = end + 1; chunk_num++; } while(end != data.getSize() - 1); - u16 chunk_count = chunks.getSize(); - - core::list >::Iterator i = chunks.begin(); - for(; i != chunks.end(); i++) + for(std::list >::iterator i = chunks.begin(); + i != chunks.end(); ++i) { // Write chunk_count writeU16(&((*i)[3]), chunk_count); @@ -124,13 +124,13 @@ core::list > makeSplitPacket( return chunks; } -core::list > makeAutoSplitPacket( +std::list > makeAutoSplitPacket( SharedBuffer data, u32 chunksize_max, u16 &split_seqnum) { u32 original_header_size = 1; - core::list > list; + std::list > list; if(data.getSize() + original_header_size > chunksize_max) { list = makeSplitPacket(data, chunksize_max, split_seqnum); @@ -170,11 +170,13 @@ SharedBuffer makeReliablePacket( ReliablePacketBuffer */ +ReliablePacketBuffer::ReliablePacketBuffer(): m_list_size(0) {} + void ReliablePacketBuffer::print() { - core::list::Iterator i; - i = m_list.begin(); - for(; i != m_list.end(); i++) + for(std::list::iterator i = m_list.begin(); + i != m_list.end(); + ++i) { u16 s = readU16(&(i->data[BASE_HEADER_SIZE+1])); dout_con<::Iterator i; - i = m_list.begin(); - for(; i != m_list.end(); i++) + std::list::iterator i = m_list.begin(); + for(; i != m_list.end(); ++i) { u16 s = readU16(&(i->data[BASE_HEADER_SIZE+1])); /*dout_con<<"findPacket(): finding seqnum="<::Iterator i = m_list.begin(); - m_list.erase(i); + m_list.erase(m_list.begin()); + --m_list_size; return p; } BufferedPacket ReliablePacketBuffer::popSeqnum(u16 seqnum) @@ -231,6 +232,7 @@ BufferedPacket ReliablePacketBuffer::popSeqnum(u16 seqnum) } BufferedPacket p = *r; m_list.erase(r); + --m_list_size; return p; } void ReliablePacketBuffer::insert(BufferedPacket &p) @@ -240,6 +242,7 @@ void ReliablePacketBuffer::insert(BufferedPacket &p) assert(type == TYPE_RELIABLE); u16 seqnum = readU16(&p.data[BASE_HEADER_SIZE+1]); + ++m_list_size; // Find the right place for the packet and insert it there // If list is empty, just add it @@ -250,12 +253,12 @@ void ReliablePacketBuffer::insert(BufferedPacket &p) return; } // Otherwise find the right place - core::list::Iterator i; - i = m_list.begin(); + std::list::iterator i = m_list.begin(); // Find the first packet in the list which has a higher seqnum - for(; i != m_list.end(); i++){ + for(; i != m_list.end(); ++i){ u16 s = readU16(&(i->data[BASE_HEADER_SIZE+1])); if(s == seqnum){ + --m_list_size; throw AlreadyExistsException("Same seqnum in list"); } if(seqnum_higher(s, seqnum)){ @@ -271,14 +274,14 @@ void ReliablePacketBuffer::insert(BufferedPacket &p) return; } // Insert before i - m_list.insert_before(i, p); + m_list.insert(i, p); } void ReliablePacketBuffer::incrementTimeouts(float dtime) { - core::list::Iterator i; - i = m_list.begin(); - for(; i != m_list.end(); i++){ + for(std::list::iterator i = m_list.begin(); + i != m_list.end(); ++i) + { i->time += dtime; i->totaltime += dtime; } @@ -286,9 +289,9 @@ void ReliablePacketBuffer::incrementTimeouts(float dtime) void ReliablePacketBuffer::resetTimedOuts(float timeout) { - core::list::Iterator i; - i = m_list.begin(); - for(; i != m_list.end(); i++){ + for(std::list::iterator i = m_list.begin(); + i != m_list.end(); ++i) + { if(i->time >= timeout) i->time = 0.0; } @@ -296,21 +299,20 @@ void ReliablePacketBuffer::resetTimedOuts(float timeout) bool ReliablePacketBuffer::anyTotaltimeReached(float timeout) { - core::list::Iterator i; - i = m_list.begin(); - for(; i != m_list.end(); i++){ + for(std::list::iterator i = m_list.begin(); + i != m_list.end(); ++i) + { if(i->totaltime >= timeout) return true; } return false; } -core::list ReliablePacketBuffer::getTimedOuts(float timeout) +std::list ReliablePacketBuffer::getTimedOuts(float timeout) { - core::list timed_outs; - core::list::Iterator i; - i = m_list.begin(); - for(; i != m_list.end(); i++) + std::list timed_outs; + for(std::list::iterator i = m_list.begin(); + i != m_list.end(); ++i) { if(i->time >= timeout) timed_outs.push_back(*i); @@ -324,11 +326,10 @@ core::list ReliablePacketBuffer::getTimedOuts(float timeout) IncomingSplitBuffer::~IncomingSplitBuffer() { - core::map::Iterator i; - i = m_buf.getIterator(); - for(; i.atEnd() == false; i++) + for(std::map::iterator i = m_buf.begin(); + i != m_buf.end(); ++i) { - delete i.getNode()->getValue(); + delete i->second; } } /* @@ -346,7 +347,7 @@ SharedBuffer IncomingSplitBuffer::insert(BufferedPacket &p, bool reliable) u16 chunk_num = readU16(&p.data[BASE_HEADER_SIZE+5]); // Add if doesn't exist - if(m_buf.find(seqnum) == NULL) + if(m_buf.find(seqnum) == m_buf.end()) { IncomingSplitPacket *sp = new IncomingSplitPacket(); sp->chunk_count = chunk_count; @@ -369,7 +370,7 @@ SharedBuffer IncomingSplitBuffer::insert(BufferedPacket &p, bool reliable) // If chunk already exists, ignore it. // Sometimes two identical packets may arrive when there is network // lag and the server re-sends stuff. - if(sp->chunks.find(chunk_num) != NULL) + if(sp->chunks.find(chunk_num) != sp->chunks.end()) return SharedBuffer(); // Cut chunk data out of packet @@ -386,11 +387,10 @@ SharedBuffer IncomingSplitBuffer::insert(BufferedPacket &p, bool reliable) // Calculate total size u32 totalsize = 0; - core::map >::Iterator i; - i = sp->chunks.getIterator(); - for(; i.atEnd() == false; i++) + for(std::map >::iterator i = sp->chunks.begin(); + i != sp->chunks.end(); ++i) { - totalsize += i.getNode()->getValue().getSize(); + totalsize += i->second.getSize(); } SharedBuffer fulldata(totalsize); @@ -407,34 +407,32 @@ SharedBuffer IncomingSplitBuffer::insert(BufferedPacket &p, bool reliable) } // Remove sp from buffer - m_buf.remove(seqnum); + m_buf.erase(seqnum); delete sp; return fulldata; } void IncomingSplitBuffer::removeUnreliableTimedOuts(float dtime, float timeout) { - core::list remove_queue; - core::map::Iterator i; - i = m_buf.getIterator(); - for(; i.atEnd() == false; i++) + std::list remove_queue; + for(std::map::iterator i = m_buf.begin(); + i != m_buf.end(); ++i) { - IncomingSplitPacket *p = i.getNode()->getValue(); + IncomingSplitPacket *p = i->second; // Reliable ones are not removed by timeout if(p->reliable == true) continue; p->time += dtime; if(p->time >= timeout) - remove_queue.push_back(i.getNode()->getKey()); + remove_queue.push_back(i->first); } - core::list::Iterator j; - j = remove_queue.begin(); - for(; j != remove_queue.end(); j++) + for(std::list::iterator j = remove_queue.begin(); + j != remove_queue.end(); ++j) { dout_con<<"NOTE: Removing timed out unreliable split packet" <::Iterator - j = m_peers.getIterator(); - j.atEnd() == false; j++) + for(std::map::iterator + j = m_peers.begin(); + j != m_peers.end(); ++j) { - Peer *peer = j.getNode()->getValue(); - delete peer; + delete j->second; } } @@ -591,7 +588,7 @@ void * Connection::Thread() runTimeouts(dtime); - while(m_command_queue.size() != 0){ + while(!m_command_queue.empty()){ ConnectionCommand c = m_command_queue.pop_front(); processCommand(c); } @@ -648,18 +645,18 @@ void Connection::processCommand(ConnectionCommand &c) void Connection::send(float dtime) { - for(core::map::Iterator - j = m_peers.getIterator(); - j.atEnd() == false; j++) + for(std::map::iterator + j = m_peers.begin(); + j != m_peers.end(); ++j) { - Peer *peer = j.getNode()->getValue(); + Peer *peer = j->second; peer->m_sendtime_accu += dtime; peer->m_num_sent = 0; peer->m_max_num_sent = peer->m_sendtime_accu * peer->m_max_packets_per_second; } Queue postponed_packets; - while(m_outgoing_queue.size() != 0){ + while(!m_outgoing_queue.empty()){ OutgoingPacket packet = m_outgoing_queue.pop_front(); Peer *peer = getPeerNoEx(packet.peer_id); if(!peer) @@ -674,14 +671,14 @@ void Connection::send(float dtime) postponed_packets.push_back(packet); } } - while(postponed_packets.size() != 0){ + while(!postponed_packets.empty()){ m_outgoing_queue.push_back(postponed_packets.pop_front()); } - for(core::map::Iterator - j = m_peers.getIterator(); - j.atEnd() == false; j++) + for(std::map::iterator + j = m_peers.begin(); + j != m_peers.end(); ++j) { - Peer *peer = j.getNode()->getValue(); + Peer *peer = j->second; peer->m_sendtime_accu -= (float)peer->m_num_sent / peer->m_max_packets_per_second; if(peer->m_sendtime_accu > 10. / peer->m_max_packets_per_second) @@ -751,11 +748,11 @@ void Connection::receive() Allow only entries that have has_sent_with_id==false. */ - core::map::Iterator j; - j = m_peers.getIterator(); - for(; j.atEnd() == false; j++) + std::map::iterator j; + j = m_peers.begin(); + for(; j != m_peers.end(); ++j) { - Peer *peer = j.getNode()->getValue(); + Peer *peer = j->second; if(peer->has_sent_with_id) continue; if(peer->address == sender) @@ -766,14 +763,14 @@ void Connection::receive() If no peer was found with the same address and port, we shall assume it is a new peer and create an entry. */ - if(j.atEnd()) + if(j == m_peers.end()) { // Pass on to adding the peer } // Else: A peer was found. else { - Peer *peer = j.getNode()->getValue(); + Peer *peer = j->second; peer_id = peer->id; PrintInfo(derr_con); derr_con<<"WARNING: Assuming unknown peer to be " @@ -797,7 +794,7 @@ void Connection::receive() for(;;) { // Check if exists - if(m_peers.find(peer_id_new) == NULL) + if(m_peers.find(peer_id_new) == m_peers.end()) break; // Check for overflow if(peer_id_new == 65535){ @@ -817,7 +814,7 @@ void Connection::receive() // Create a peer Peer *peer = new Peer(peer_id_new, sender); - m_peers.insert(peer->id, peer); + m_peers[peer->id] = peer; // Create peer addition event ConnectionEvent e; @@ -837,9 +834,9 @@ void Connection::receive() // Go on and process whatever it sent } - core::map::Node *node = m_peers.find(peer_id); + std::map::iterator node = m_peers.find(peer_id); - if(node == NULL) + if(node == m_peers.end()) { // Peer not found // This means that the peer id of the sender is not PEER_ID_INEXISTENT @@ -849,7 +846,7 @@ void Connection::receive() throw InvalidIncomingDataException("Peer not found (possible timeout)"); } - Peer *peer = node->getValue(); + Peer *peer = node->second; // Validate peer address if(peer->address != sender) @@ -902,12 +899,11 @@ void Connection::runTimeouts(float dtime) float congestion_control_min_rate = g_settings->getFloat("congestion_control_min_rate"); - core::list timeouted_peers; - core::map::Iterator j; - j = m_peers.getIterator(); - for(; j.atEnd() == false; j++) + std::list timeouted_peers; + for(std::map::iterator j = m_peers.begin(); + j != m_peers.end(); ++j) { - Peer *peer = j.getNode()->getValue(); + Peer *peer = j->second; // Update congestion control values peer->congestion_control_aim_rtt = congestion_control_aim_rtt; @@ -934,8 +930,7 @@ void Connection::runTimeouts(float dtime) float resend_timeout = peer->resend_timeout; for(u16 i=0; i timed_outs; - core::list::Iterator j; + std::list timed_outs; Channel *channel = &peer->channels[i]; @@ -966,8 +961,8 @@ void Connection::runTimeouts(float dtime) channel->outgoing_reliables.resetTimedOuts(resend_timeout); - j = timed_outs.begin(); - for(; j != timed_outs.end(); j++) + for(std::list::iterator j = timed_outs.begin(); + j != timed_outs.end(); ++j) { u16 peer_id = readPeerId(*(j->data)); u8 channel = readChannel(*(j->data)); @@ -1012,8 +1007,8 @@ nextpeer: } // Remove timed out peers - core::list::Iterator i = timeouted_peers.begin(); - for(; i != timeouted_peers.end(); i++) + for(std::list::iterator i = timeouted_peers.begin(); + i != timeouted_peers.end(); ++i) { PrintInfo(derr_con); derr_con<<"RunTimeouts(): Removing peer "<<(*i)<::Node *node = m_peers.find(PEER_ID_SERVER); - if(node != NULL){ + std::map::iterator node = m_peers.find(PEER_ID_SERVER); + if(node != m_peers.end()){ throw ConnectionException("Already connected to a server"); } Peer *peer = new Peer(PEER_ID_SERVER, address); - m_peers.insert(peer->id, peer); + m_peers[peer->id] = peer; // Create event ConnectionEvent e; @@ -1072,22 +1067,20 @@ void Connection::disconnect() writeU8(&data[1], CONTROLTYPE_DISCO); // Send to all - core::map::Iterator j; - j = m_peers.getIterator(); - for(; j.atEnd() == false; j++) + for(std::map::iterator j = m_peers.begin(); + j != m_peers.end(); ++j) { - Peer *peer = j.getNode()->getValue(); + Peer *peer = j->second; rawSendAsPacket(peer->id, 0, data, false); } } void Connection::sendToAll(u8 channelnum, SharedBuffer data, bool reliable) { - core::map::Iterator j; - j = m_peers.getIterator(); - for(; j.atEnd() == false; j++) + for(std::map::iterator j = m_peers.begin(); + j != m_peers.end(); ++j) { - Peer *peer = j.getNode()->getValue(); + Peer *peer = j->second; send(peer->id, channelnum, data, reliable); } } @@ -1108,13 +1101,12 @@ void Connection::send(u16 peer_id, u8 channelnum, if(reliable) chunksize_max -= RELIABLE_HEADER_SIZE; - core::list > originals; + std::list > originals; originals = makeAutoSplitPacket(data, chunksize_max, channel->next_outgoing_split_seqnum); - core::list >::Iterator i; - i = originals.begin(); - for(; i != originals.end(); i++) + for(std::list >::iterator i = originals.begin(); + i != originals.end(); ++i) { SharedBuffer original = *i; @@ -1187,40 +1179,39 @@ void Connection::rawSend(const BufferedPacket &packet) Peer* Connection::getPeer(u16 peer_id) { - core::map::Node *node = m_peers.find(peer_id); + std::map::iterator node = m_peers.find(peer_id); - if(node == NULL){ + if(node == m_peers.end()){ throw PeerNotFoundException("GetPeer: Peer not found (possible timeout)"); } // Error checking - assert(node->getValue()->id == peer_id); + assert(node->second->id == peer_id); - return node->getValue(); + return node->second; } Peer* Connection::getPeerNoEx(u16 peer_id) { - core::map::Node *node = m_peers.find(peer_id); + std::map::iterator node = m_peers.find(peer_id); - if(node == NULL){ + if(node == m_peers.end()){ return NULL; } // Error checking - assert(node->getValue()->id == peer_id); + assert(node->second->id == peer_id); - return node->getValue(); + return node->second; } -core::list Connection::getPeers() +std::list Connection::getPeers() { - core::list list; - core::map::Iterator j; - j = m_peers.getIterator(); - for(; j.atEnd() == false; j++) + std::list list; + for(std::map::iterator j = m_peers.begin(); + j != m_peers.end(); ++j) { - Peer *peer = j.getNode()->getValue(); + Peer *peer = j->second; list.push_back(peer); } return list; @@ -1228,11 +1219,10 @@ core::list Connection::getPeers() bool Connection::getFromBuffers(u16 &peer_id, SharedBuffer &dst) { - core::map::Iterator j; - j = m_peers.getIterator(); - for(; j.atEnd() == false; j++) + for(std::map::iterator j = m_peers.begin(); + j != m_peers.end(); ++j) { - Peer *peer = j.getNode()->getValue(); + Peer *peer = j->second; for(u16 i=0; ichannels[i]; @@ -1538,7 +1528,7 @@ SharedBuffer Connection::processPacket(Channel *channel, bool Connection::deletePeer(u16 peer_id, bool timeout) { - if(m_peers.find(peer_id) == NULL) + if(m_peers.find(peer_id) == m_peers.end()) return false; Peer *peer = m_peers[peer_id]; @@ -1549,7 +1539,7 @@ bool Connection::deletePeer(u16 peer_id, bool timeout) putEvent(e); delete m_peers[peer_id]; - m_peers.remove(peer_id); + m_peers.erase(peer_id); return true; } @@ -1557,7 +1547,7 @@ bool Connection::deletePeer(u16 peer_id, bool timeout) ConnectionEvent Connection::getEvent() { - if(m_event_queue.size() == 0){ + if(m_event_queue.empty()){ ConnectionEvent e; e.type = CONNEVENT_NONE; return e; @@ -1602,8 +1592,8 @@ bool Connection::Connected() if(m_peers.size() != 1) return false; - core::map::Node *node = m_peers.find(PEER_ID_SERVER); - if(node == NULL) + std::map::iterator node = m_peers.find(PEER_ID_SERVER); + if(node == m_peers.end()) return false; if(m_peer_id == PEER_ID_INEXISTENT) diff --git a/src/connection.h b/src/connection.h index 05b1ca2e8..486cf331f 100644 --- a/src/connection.h +++ b/src/connection.h @@ -29,6 +29,8 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "util/thread.h" #include #include +#include +#include namespace con { @@ -142,14 +144,14 @@ SharedBuffer makeOriginalPacket( SharedBuffer data); // Split data in chunks and add TYPE_SPLIT headers to them -core::list > makeSplitPacket( +std::list > makeSplitPacket( SharedBuffer data, u32 chunksize_max, u16 seqnum); // Depending on size, make a TYPE_ORIGINAL or TYPE_SPLIT packet // Increments split_seqnum if a split packet is made -core::list > makeAutoSplitPacket( +std::list > makeAutoSplitPacket( SharedBuffer data, u32 chunksize_max, u16 &split_seqnum); @@ -167,7 +169,7 @@ struct IncomingSplitPacket reliable = false; } // Key is chunk number, value is data without headers - core::map > chunks; + std::map > chunks; u32 chunk_count; float time; // Seconds from adding bool reliable; // If true, isn't deleted on timeout @@ -268,12 +270,12 @@ with a buffer in the receiving and transmitting end. for fast access to the smallest one. */ -typedef core::list::Iterator RPBSearchResult; +typedef std::list::iterator RPBSearchResult; class ReliablePacketBuffer { public: - + ReliablePacketBuffer(); void print(); bool empty(); u32 size(); @@ -286,10 +288,11 @@ public: void incrementTimeouts(float dtime); void resetTimedOuts(float timeout); bool anyTotaltimeReached(float timeout); - core::list getTimedOuts(float timeout); + std::list getTimedOuts(float timeout); private: - core::list m_list; + std::list m_list; + u16 m_list_size; }; /* @@ -310,7 +313,7 @@ public: private: // Key is seqnum - core::map m_buf; + std::map m_buf; }; class Connection; @@ -589,7 +592,7 @@ private: void rawSend(const BufferedPacket &packet); Peer* getPeer(u16 peer_id); Peer* getPeerNoEx(u16 peer_id); - core::list getPeers(); + std::list getPeers(); bool getFromBuffers(u16 &peer_id, SharedBuffer &dst); // Returns next data from a buffer if possible // If found, returns true; if not, false. @@ -619,7 +622,7 @@ private: UDPSocket m_socket; u16 m_peer_id; - core::map m_peers; + std::map m_peers; JMutex m_peers_mutex; // Backwards compatibility diff --git a/src/content_abm.cpp b/src/content_abm.cpp index 03fc82ed4..a88450095 100644 --- a/src/content_abm.cpp +++ b/src/content_abm.cpp @@ -114,7 +114,7 @@ public: actionstream<<"A sapling grows into a tree at " < modified_blocks; + std::map modified_blocks; v3s16 tree_p = p; ManualMapVoxelManipulator vmanip(map); v3s16 tree_blockp = getNodeBlockPos(tree_p); @@ -124,24 +124,19 @@ public: 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); } diff --git a/src/content_cao.cpp b/src/content_cao.cpp index 5e5cb38ae..269667fe5 100644 --- a/src/content_cao.cpp +++ b/src/content_cao.cpp @@ -50,7 +50,7 @@ struct ToolCapabilities; #define PP(x) "("<<(x).X<<","<<(x).Y<<","<<(x).Z<<")" -core::map ClientActiveObject::m_types; +std::map ClientActiveObject::m_types; /* SmoothTranslator diff --git a/src/content_mapblock.cpp b/src/content_mapblock.cpp index 0d80dc173..3b001510e 100644 --- a/src/content_mapblock.cpp +++ b/src/content_mapblock.cpp @@ -230,9 +230,9 @@ void mapblock_mesh_generate_special(MeshMakeData *data, // Neighbor liquid levels (key = relative position) // Includes current node - core::map neighbor_levels; - core::map neighbor_contents; - core::map neighbor_flags; + std::map neighbor_levels; + std::map neighbor_contents; + std::map neighbor_flags; const u8 neighborflag_top_is_same_liquid = 0x01; v3s16 neighbor_dirs[9] = { v3s16(0,0,0), @@ -273,9 +273,9 @@ void mapblock_mesh_generate_special(MeshMakeData *data, flags |= neighborflag_top_is_same_liquid; } - neighbor_levels.insert(neighbor_dirs[i], level); - neighbor_contents.insert(neighbor_dirs[i], content); - neighbor_flags.insert(neighbor_dirs[i], flags); + neighbor_levels[neighbor_dirs[i]] = level; + neighbor_contents[neighbor_dirs[i]] = content; + neighbor_flags[neighbor_dirs[i]] = flags; } // Corner heights (average between four liquids) diff --git a/src/content_sao.cpp b/src/content_sao.cpp index 718a42dff..1e02ea5a5 100644 --- a/src/content_sao.cpp +++ b/src/content_sao.cpp @@ -31,7 +31,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "genericobject.h" #include "util/serialize.h" -core::map ServerActiveObject::m_types; +std::map ServerActiveObject::m_types; /* DummyLoadSAO diff --git a/src/debug.cpp b/src/debug.cpp index e32cceb86..2e4992a78 100644 --- a/src/debug.cpp +++ b/src/debug.cpp @@ -130,7 +130,7 @@ void DebugStack::print(std::ostream &os, bool everything) os<<"Probably overflown."< g_debug_stacks; +std::map g_debug_stacks; JMutex g_debug_stacks_mutex; void debug_stacks_init() @@ -144,12 +144,11 @@ void debug_stacks_print_to(std::ostream &os) os<<"Debug stacks:"<::Iterator - i = g_debug_stacks.getIterator(); - i.atEnd() == false; i++) + for(std::map::iterator + i = g_debug_stacks.begin(); + i != g_debug_stacks.end(); ++i) { - DebugStack *stack = i.getNode()->getValue(); - stack->print(os, false); + i->second->print(os, false); } } @@ -159,11 +158,11 @@ void debug_stacks_print() DEBUGPRINT("Debug stacks:\n"); - for(core::map::Iterator - i = g_debug_stacks.getIterator(); - i.atEnd() == false; i++) + for(std::map::iterator + i = g_debug_stacks.begin(); + i != g_debug_stacks.end(); ++i) { - DebugStack *stack = i.getNode()->getValue(); + DebugStack *stack = i->second; for(int i=0; i::Node *n; + std::map::iterator n; n = g_debug_stacks.find(threadid); - if(n != NULL) + if(n != g_debug_stacks.end()) { - m_stack = n->getValue(); + m_stack = n->second; } else { /*DEBUGPRINT("Creating new debug stack for thread %x\n", (unsigned int)threadid);*/ m_stack = new DebugStack(threadid); - g_debug_stacks.insert(threadid, m_stack); + g_debug_stacks[threadid] = m_stack; } if(m_stack->stack_i >= DEBUG_STACK_SIZE) @@ -224,7 +223,7 @@ DebugStacker::~DebugStacker() /*DEBUGPRINT("Deleting debug stack for thread %x\n", (unsigned int)threadid);*/ delete m_stack; - g_debug_stacks.remove(threadid); + g_debug_stacks.erase(threadid); } } diff --git a/src/debug.h b/src/debug.h index 56952427c..1b14c4e0a 100644 --- a/src/debug.h +++ b/src/debug.h @@ -29,6 +29,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "threads.h" #include "gettime.h" #include "exceptions.h" +#include #ifdef _WIN32 #define WIN32_LEAN_AND_MEAN @@ -165,7 +166,7 @@ struct DebugStack int stack_max_i; // Highest i that was seen }; -extern core::map g_debug_stacks; +extern std::map g_debug_stacks; extern JMutex g_debug_stacks_mutex; extern void debug_stacks_init(); @@ -205,42 +206,42 @@ public: void add(u16 command) { - core::map::Node *n = m_packets.find(command); - if(n == NULL) + std::map::iterator n = m_packets.find(command); + if(n == m_packets.end()) { m_packets[command] = 1; } else { - n->setValue(n->getValue()+1); + n->second++; } } void clear() { - for(core::map::Iterator - i = m_packets.getIterator(); - i.atEnd() == false; i++) + for(std::map::iterator + i = m_packets.begin(); + i != m_packets.end(); ++i) { - i.getNode()->setValue(0); + i->second = 0; } } void print(std::ostream &o) { - for(core::map::Iterator - i = m_packets.getIterator(); - i.atEnd() == false; i++) + for(std::map::iterator + i = m_packets.begin(); + i != m_packets.end(); ++i) { - o<<"cmd "<getKey() - <<" count "<getValue() + o<<"cmd "<first + <<" count "<second < m_packets; + std::map m_packets; }; /* diff --git a/src/emerge.cpp b/src/emerge.cpp index 6c6863eff..8a060d107 100644 --- a/src/emerge.cpp +++ b/src/emerge.cpp @@ -359,7 +359,7 @@ void *EmergeThread::Thread() { */ BlockMakeData data; MapBlock *block = NULL; - core::map modified_blocks; + std::map modified_blocks; if (getBlockOrStartGen(p, &block, &data, allow_generate)) { { @@ -415,13 +415,13 @@ void *EmergeThread::Thread() { JMutexAutoLock lock(m_server->m_con_mutex); // Add the originally fetched block to the modified list if (block) - modified_blocks.insert(p, block); + modified_blocks[p] = block; // Set the modified blocks unsent for all the clients - for (core::map::Iterator - i = m_server->m_clients.getIterator(); - i.atEnd() == false; i++) { - RemoteClient *client = i.getNode()->getValue(); + for (std::map::iterator + i = m_server->m_clients.begin(); + i != m_server->m_clients.end(); ++i) { + RemoteClient *client = i->second; if (modified_blocks.size() > 0) { // Remove block from sent history client->SetBlocksNotSent(modified_blocks); diff --git a/src/environment.cpp b/src/environment.cpp index e939672e7..7c93090b6 100644 --- a/src/environment.cpp +++ b/src/environment.cpp @@ -58,8 +58,8 @@ Environment::Environment(): Environment::~Environment() { // Deallocate players - for(core::list::Iterator i = m_players.begin(); - i != m_players.end(); i++) + for(std::list::iterator i = m_players.begin(); + i != m_players.end(); ++i) { delete (*i); } @@ -86,8 +86,8 @@ void Environment::removePlayer(u16 peer_id) { DSTACK(__FUNCTION_NAME); re_search: - for(core::list::Iterator i = m_players.begin(); - i != m_players.end(); i++) + for(std::list::iterator i = m_players.begin(); + i != m_players.end(); ++i) { Player *player = *i; if(player->peer_id != peer_id) @@ -103,8 +103,8 @@ re_search: Player * Environment::getPlayer(u16 peer_id) { - for(core::list::Iterator i = m_players.begin(); - i != m_players.end(); i++) + for(std::list::iterator i = m_players.begin(); + i != m_players.end(); ++i) { Player *player = *i; if(player->peer_id == peer_id) @@ -115,8 +115,8 @@ Player * Environment::getPlayer(u16 peer_id) Player * Environment::getPlayer(const char *name) { - for(core::list::Iterator i = m_players.begin(); - i != m_players.end(); i++) + for(std::list::iterator i = m_players.begin(); + i != m_players.end(); ++i) { Player *player = *i; if(strcmp(player->getName(), name) == 0) @@ -127,12 +127,12 @@ Player * Environment::getPlayer(const char *name) Player * Environment::getRandomConnectedPlayer() { - core::list connected_players = getPlayers(true); + std::list connected_players = getPlayers(true); u32 chosen_one = myrand() % connected_players.size(); u32 j = 0; - for(core::list::Iterator + for(std::list::iterator i = connected_players.begin(); - i != connected_players.end(); i++) + i != connected_players.end(); ++i) { if(j == chosen_one) { @@ -146,12 +146,12 @@ Player * Environment::getRandomConnectedPlayer() Player * Environment::getNearestConnectedPlayer(v3f pos) { - core::list connected_players = getPlayers(true); + std::list connected_players = getPlayers(true); f32 nearest_d = 0; Player *nearest_player = NULL; - for(core::list::Iterator + for(std::list::iterator i = connected_players.begin(); - i != connected_players.end(); i++) + i != connected_players.end(); ++i) { Player *player = *i; f32 d = player->getPosition().getDistanceFrom(pos); @@ -164,17 +164,17 @@ Player * Environment::getNearestConnectedPlayer(v3f pos) return nearest_player; } -core::list Environment::getPlayers() +std::list Environment::getPlayers() { return m_players; } -core::list Environment::getPlayers(bool ignore_disconnected) +std::list Environment::getPlayers(bool ignore_disconnected) { - core::list newlist; - for(core::list::Iterator + std::list newlist; + for(std::list::iterator i = m_players.begin(); - i != m_players.end(); i++) + i != m_players.end(); ++i) { Player *player = *i; @@ -193,7 +193,7 @@ core::list Environment::getPlayers(bool ignore_disconnected) void Environment::printPlayers(std::ostream &o) { o<<"Players in environment:"<::Iterator i = m_players.begin(); + for(std::list::iterator i = m_players.begin(); i != m_players.end(); i++) { Player *player = *i; @@ -251,7 +251,7 @@ ABMWithState::ABMWithState(ActiveBlockModifier *abm_): ActiveBlockList */ -void fillRadiusBlock(v3s16 p0, s16 r, core::map &list) +void fillRadiusBlock(v3s16 p0, s16 r, std::set &list) { v3s16 p; for(p.X=p0.X-r; p.X<=p0.X+r; p.X++) @@ -259,21 +259,21 @@ void fillRadiusBlock(v3s16 p0, s16 r, core::map &list) for(p.Z=p0.Z-r; p.Z<=p0.Z+r; p.Z++) { // Set in list - list[p] = true; + list.insert(p); } } -void ActiveBlockList::update(core::list &active_positions, +void ActiveBlockList::update(std::list &active_positions, s16 radius, - core::map &blocks_removed, - core::map &blocks_added) + std::set &blocks_removed, + std::set &blocks_added) { /* Create the new list */ - core::map newlist; - for(core::list::Iterator i = active_positions.begin(); - i != active_positions.end(); i++) + std::set newlist; + for(std::list::iterator i = active_positions.begin(); + i != active_positions.end(); ++i) { fillRadiusBlock(*i, radius, newlist); } @@ -282,37 +282,37 @@ void ActiveBlockList::update(core::list &active_positions, Find out which blocks on the old list are not on the new list */ // Go through old list - for(core::map::Iterator i = m_list.getIterator(); - i.atEnd()==false; i++) + for(std::set::iterator i = m_list.begin(); + i != m_list.end(); ++i) { - v3s16 p = i.getNode()->getKey(); + v3s16 p = *i; // If not on new list, it's been removed - if(newlist.find(p) == NULL) - blocks_removed.insert(p, true); + if(newlist.find(p) == newlist.end()) + blocks_removed.insert(p); } /* Find out which blocks on the new list are not on the old list */ // Go through new list - for(core::map::Iterator i = newlist.getIterator(); - i.atEnd()==false; i++) + for(std::set::iterator i = newlist.begin(); + i != newlist.end(); ++i) { - v3s16 p = i.getNode()->getKey(); + v3s16 p = *i; // If not on old list, it's been added - if(m_list.find(p) == NULL) - blocks_added.insert(p, true); + if(m_list.find(p) == m_list.end()) + blocks_added.insert(p); } /* Update m_list */ m_list.clear(); - for(core::map::Iterator i = newlist.getIterator(); - i.atEnd()==false; i++) + for(std::set::iterator i = newlist.begin(); + i != newlist.end(); ++i) { - v3s16 p = i.getNode()->getKey(); - m_list.insert(p, true); + v3s16 p = *i; + m_list.insert(p); } } @@ -348,8 +348,8 @@ ServerEnvironment::~ServerEnvironment() m_map->drop(); // Delete ActiveBlockModifiers - for(core::list::Iterator - i = m_abms.begin(); i != m_abms.end(); i++){ + for(std::list::iterator + i = m_abms.begin(); i != m_abms.end(); ++i){ delete i->abm; } } @@ -370,7 +370,7 @@ void ServerEnvironment::serializePlayers(const std::string &savedir) std::string players_path = savedir + "/players"; fs::CreateDir(players_path); - core::map saved_players; + std::set saved_players; std::vector player_files = fs::GetDirListing(players_path); for(u32 i=0; iserialize(os); - saved_players.insert(player, true); + saved_players.insert(player); } } - for(core::list::Iterator i = m_players.begin(); - i != m_players.end(); i++) + for(std::list::iterator i = m_players.begin(); + i != m_players.end(); ++i) { Player *player = *i; - if(saved_players.find(player) != NULL) + if(saved_players.find(player) != saved_players.end()) { /*infostream<<"Player "<getName() <<" was already saved."<serialize(os); - saved_players.insert(player, true); + saved_players.insert(player); } } @@ -484,8 +484,6 @@ void ServerEnvironment::deSerializePlayers(const std::string &savedir) { std::string players_path = savedir + "/players"; - core::map saved_players; - std::vector player_files = fs::GetDirListing(players_path); for(u32 i=0; i > m_aabms; public: - ABMHandler(core::list &abms, + ABMHandler(std::list &abms, float dtime_s, ServerEnvironment *env, bool use_timers): m_env(env) @@ -635,8 +633,8 @@ public: if(dtime_s < 0.001) return; INodeDefManager *ndef = env->getGameDef()->ndef(); - for(core::list::Iterator - i = abms.begin(); i != abms.end(); i++){ + for(std::list::iterator + i = abms.begin(); i != abms.end(); ++i){ ActiveBlockModifier *abm = i->abm; float trigger_interval = abm->getTriggerInterval(); if(trigger_interval < 0.001) @@ -862,12 +860,12 @@ bool ServerEnvironment::removeNode(v3s16 p) std::set ServerEnvironment::getObjectsInsideRadius(v3f pos, float radius) { std::set objects; - for(core::map::Iterator - i = m_active_objects.getIterator(); - i.atEnd()==false; i++) + for(std::map::iterator + i = m_active_objects.begin(); + i != m_active_objects.end(); ++i) { - ServerActiveObject* obj = i.getNode()->getValue(); - u16 id = i.getNode()->getKey(); + ServerActiveObject* obj = i->second; + u16 id = i->first; v3f objectpos = obj->getBasePosition(); if(objectpos.getDistanceFrom(pos) > radius) continue; @@ -880,16 +878,16 @@ void ServerEnvironment::clearAllObjects() { infostream<<"ServerEnvironment::clearAllObjects(): " <<"Removing all active objects"< objects_to_remove; - for(core::map::Iterator - i = m_active_objects.getIterator(); - i.atEnd()==false; i++) + std::list objects_to_remove; + for(std::map::iterator + i = m_active_objects.begin(); + i != m_active_objects.end(); ++i) { - ServerActiveObject* obj = i.getNode()->getValue(); + ServerActiveObject* obj = i->second; if(obj->getType() == ACTIVEOBJECT_TYPE_PLAYER) continue; - u16 id = i.getNode()->getKey(); - v3f objectpos = obj->getBasePosition(); + u16 id = i->first; + v3f objectpos = obj->getBasePosition(); // Delete static object if block is loaded if(obj->m_static_exists){ MapBlock *block = m_map->getBlockNoCreateNoEx(obj->m_static_block); @@ -919,13 +917,13 @@ void ServerEnvironment::clearAllObjects() objects_to_remove.push_back(id); } // Remove references from m_active_objects - for(core::list::Iterator i = objects_to_remove.begin(); - i != objects_to_remove.end(); i++) + for(std::list::iterator i = objects_to_remove.begin(); + i != objects_to_remove.end(); ++i) { - m_active_objects.remove(*i); + m_active_objects.erase(*i); } - core::list loadable_blocks; + std::list loadable_blocks; infostream<<"ServerEnvironment::clearAllObjects(): " <<"Listing all loadable blocks"<listAllLoadableBlocks(loadable_blocks); @@ -937,8 +935,8 @@ void ServerEnvironment::clearAllObjects() u32 num_blocks_checked = 0; u32 num_blocks_cleared = 0; u32 num_objs_cleared = 0; - for(core::list::Iterator i = loadable_blocks.begin(); - i != loadable_blocks.end(); i++) + for(std::list::iterator i = loadable_blocks.begin(); + i != loadable_blocks.end(); ++i) { v3s16 p = *i; MapBlock *block = m_map->emergeBlock(p, false); @@ -1002,8 +1000,8 @@ void ServerEnvironment::step(float dtime) */ { ScopeProfiler sp(g_profiler, "SEnv: handle players avg", SPT_AVG); - for(core::list::Iterator i = m_players.begin(); - i != m_players.end(); i++) + for(std::list::iterator i = m_players.begin(); + i != m_players.end(); ++i) { Player *player = *i; @@ -1027,10 +1025,10 @@ void ServerEnvironment::step(float dtime) /* Get player block positions */ - core::list players_blockpos; - for(core::list::Iterator + std::list players_blockpos; + for(std::list::iterator i = m_players.begin(); - i != m_players.end(); i++) + i != m_players.end(); ++i) { Player *player = *i; // Ignore disconnected players @@ -1045,8 +1043,8 @@ void ServerEnvironment::step(float dtime) Update list of active blocks, collecting changes */ const s16 active_block_range = g_settings->getS16("active_block_range"); - core::map blocks_removed; - core::map blocks_added; + std::set blocks_removed; + std::set blocks_added; m_active_blocks.update(players_blockpos, active_block_range, blocks_removed, blocks_added); @@ -1057,11 +1055,11 @@ void ServerEnvironment::step(float dtime) // Convert active objects that are no more in active blocks to static deactivateFarObjects(false); - for(core::map::Iterator - i = blocks_removed.getIterator(); - i.atEnd()==false; i++) + for(std::set::iterator + i = blocks_removed.begin(); + i != blocks_removed.end(); ++i) { - v3s16 p = i.getNode()->getKey(); + v3s16 p = *i; /*infostream<<"Server: Block ("<::Iterator - i = blocks_added.getIterator(); - i.atEnd()==false; i++) + for(std::set::iterator + i = blocks_added.begin(); + i != blocks_added.end(); ++i) { - v3s16 p = i.getNode()->getKey(); + v3s16 p = *i; /*infostream<<"Server: Block ("<queueBlockEmerge(p, false); - m_active_blocks.m_list.remove(p); + m_active_blocks.m_list.erase(p); continue; } @@ -1108,11 +1106,11 @@ void ServerEnvironment::step(float dtime) float dtime = 1.0; - for(core::map::Iterator - i = m_active_blocks.m_list.getIterator(); - i.atEnd()==false; i++) + for(std::set::iterator + i = m_active_blocks.m_list.begin(); + i != m_active_blocks.m_list.end(); ++i) { - v3s16 p = i.getNode()->getKey(); + v3s16 p = *i; /*infostream<<"Server: Block ("<::Iterator - i = m_active_blocks.m_list.getIterator(); - i.atEnd()==false; i++) + for(std::set::iterator + i = m_active_blocks.m_list.begin(); + i != m_active_blocks.m_list.end(); ++i) { - v3s16 p = i.getNode()->getKey(); + v3s16 p = *i; /*infostream<<"Server: Block ("<::Iterator - i = m_active_objects.getIterator(); - i.atEnd()==false; i++) + for(std::map::iterator + i = m_active_objects.begin(); + i != m_active_objects.end(); ++i) { - ServerActiveObject* obj = i.getNode()->getValue(); + ServerActiveObject* obj = i->second; // Remove non-peaceful mobs on peaceful mode if(g_settings->getBool("only_peaceful_mobs")){ if(!obj->isPeaceful()) @@ -1232,7 +1230,7 @@ void ServerEnvironment::step(float dtime) // Step object obj->step(dtime, send_recommended); // Read messages from object - while(obj->m_messages_out.size() > 0) + while(!obj->m_messages_out.empty()) { m_active_object_messages.push_back( obj->m_messages_out.pop_front()); @@ -1255,31 +1253,24 @@ void ServerEnvironment::step(float dtime) ServerActiveObject* ServerEnvironment::getActiveObject(u16 id) { - core::map::Node *n; + std::map::iterator n; n = m_active_objects.find(id); - if(n == NULL) + if(n == m_active_objects.end()) return NULL; - return n->getValue(); + return n->second; } bool isFreeServerActiveObjectId(u16 id, - core::map &objects) + std::map &objects) { if(id == 0) return false; - - for(core::map::Iterator - i = objects.getIterator(); - i.atEnd()==false; i++) - { - if(i.getNode()->getKey() == id) - return false; - } - return true; + + return objects.find(id) == objects.end(); } u16 getFreeServerActiveObjectId( - core::map &objects) + std::map &objects) { u16 new_id = 1; for(;;) @@ -1351,8 +1342,8 @@ bool ServerEnvironment::addActiveObjectAsStatic(ServerActiveObject *obj) inside a radius around a position */ void ServerEnvironment::getAddedActiveObjects(v3s16 pos, s16 radius, - core::map ¤t_objects, - core::map &added_objects) + std::set ¤t_objects, + std::set &added_objects) { v3f pos_f = intToFloat(pos, BS); f32 radius_f = radius * BS; @@ -1363,13 +1354,13 @@ void ServerEnvironment::getAddedActiveObjects(v3s16 pos, s16 radius, - discard objects that are found in current_objects. - add remaining objects to added_objects */ - for(core::map::Iterator - i = m_active_objects.getIterator(); - i.atEnd()==false; i++) + for(std::map::iterator + i = m_active_objects.begin(); + i != m_active_objects.end(); ++i) { - u16 id = i.getNode()->getKey(); + u16 id = i->first; // Get object - ServerActiveObject *object = i.getNode()->getValue(); + ServerActiveObject *object = i->second; if(object == NULL) continue; // Discard if removed @@ -1382,12 +1373,12 @@ void ServerEnvironment::getAddedActiveObjects(v3s16 pos, s16 radius, continue; } // Discard if already on current_objects - core::map::Node *n; + std::set::iterator n; n = current_objects.find(id); - if(n != NULL) + if(n != current_objects.end()) continue; // Add to added_objects - added_objects.insert(id, false); + added_objects.insert(id); } } @@ -1396,8 +1387,8 @@ void ServerEnvironment::getAddedActiveObjects(v3s16 pos, s16 radius, inside a radius around a position */ void ServerEnvironment::getRemovedActiveObjects(v3s16 pos, s16 radius, - core::map ¤t_objects, - core::map &removed_objects) + std::set ¤t_objects, + std::set &removed_objects) { v3f pos_f = intToFloat(pos, BS); f32 radius_f = radius * BS; @@ -1409,23 +1400,23 @@ void ServerEnvironment::getRemovedActiveObjects(v3s16 pos, s16 radius, - object has m_removed=true, or - object is too far away */ - for(core::map::Iterator - i = current_objects.getIterator(); - i.atEnd()==false; i++) + for(std::set::iterator + i = current_objects.begin(); + i != current_objects.end(); ++i) { - u16 id = i.getNode()->getKey(); + u16 id = *i; ServerActiveObject *object = getActiveObject(id); if(object == NULL){ infostream<<"ServerEnvironment::getRemovedActiveObjects():" <<" object in current_objects is NULL"<m_removed) { - removed_objects.insert(id, false); + removed_objects.insert(id); continue; } @@ -1437,7 +1428,7 @@ void ServerEnvironment::getRemovedActiveObjects(v3s16 pos, s16 radius, if(distance_f >= radius_f) { - removed_objects.insert(id, false); + removed_objects.insert(id); continue; } @@ -1447,7 +1438,7 @@ void ServerEnvironment::getRemovedActiveObjects(v3s16 pos, s16 radius, ActiveObjectMessage ServerEnvironment::getActiveObjectMessage() { - if(m_active_object_messages.size() == 0) + if(m_active_object_messages.empty()) return ActiveObjectMessage(0); return m_active_object_messages.pop_front(); @@ -1488,7 +1479,7 @@ u16 ServerEnvironment::addActiveObjectRaw(ServerActiveObject *object, /*infostream<<"ServerEnvironment::addActiveObjectRaw(): " <<"added (id="<getId()<<")"<getId(), object); + m_active_objects[object->getId()] = object; verbosestream<<"ServerEnvironment::addActiveObjectRaw(): " <<"Added id="<getId()<<"; there are now " @@ -1512,7 +1503,7 @@ u16 ServerEnvironment::addActiveObjectRaw(ServerActiveObject *object, MapBlock *block = m_map->getBlockNoCreateNoEx(blockpos); if(block) { - block->m_static_objects.m_active.insert(object->getId(), s_obj); + block->m_static_objects.m_active[object->getId()] = s_obj; object->m_static_exists = true; object->m_static_block = blockpos; @@ -1536,13 +1527,13 @@ u16 ServerEnvironment::addActiveObjectRaw(ServerActiveObject *object, */ void ServerEnvironment::removeRemovedObjects() { - core::list objects_to_remove; - for(core::map::Iterator - i = m_active_objects.getIterator(); - i.atEnd()==false; i++) + std::list objects_to_remove; + for(std::map::iterator + i = m_active_objects.begin(); + i != m_active_objects.end(); ++i) { - u16 id = i.getNode()->getKey(); - ServerActiveObject* obj = i.getNode()->getValue(); + u16 id = i->first; + ServerActiveObject* obj = i->second; // This shouldn't happen but check it if(obj == NULL) { @@ -1593,10 +1584,10 @@ void ServerEnvironment::removeRemovedObjects() objects_to_remove.push_back(id); } // Remove references from m_active_objects - for(core::list::Iterator i = objects_to_remove.begin(); - i != objects_to_remove.end(); i++) + for(std::list::iterator i = objects_to_remove.begin(); + i != objects_to_remove.end(); ++i) { - m_active_objects.remove(*i); + m_active_objects.erase(*i); } } @@ -1663,11 +1654,11 @@ void ServerEnvironment::activateObjects(MapBlock *block, u32 dtime_s) } // A list for objects that couldn't be converted to active for some // reason. They will be stored back. - core::list new_stored; + std::list new_stored; // Loop through stored static objects - for(core::list::Iterator + for(std::list::iterator i = block->m_static_objects.m_stored.begin(); - i != block->m_static_objects.m_stored.end(); i++) + i != block->m_static_objects.m_stored.end(); ++i) { /*infostream<<"Server: Creating an active object from " <<"static data"<m_static_objects.m_stored.clear(); // Add leftover failed stuff to stored list - for(core::list::Iterator + for(std::list::iterator i = new_stored.begin(); - i != new_stored.end(); i++) + i != new_stored.end(); ++i) { StaticObject &s_obj = *i; block->m_static_objects.m_stored.push_back(s_obj); @@ -1726,12 +1717,12 @@ void ServerEnvironment::activateObjects(MapBlock *block, u32 dtime_s) */ void ServerEnvironment::deactivateFarObjects(bool force_delete) { - core::list objects_to_remove; - for(core::map::Iterator - i = m_active_objects.getIterator(); - i.atEnd()==false; i++) + std::list objects_to_remove; + for(std::map::iterator + i = m_active_objects.begin(); + i != m_active_objects.end(); ++i) { - ServerActiveObject* obj = i.getNode()->getValue(); + ServerActiveObject* obj = i->second; assert(obj); // Do not deactivate if static data creation not allowed @@ -1742,7 +1733,7 @@ void ServerEnvironment::deactivateFarObjects(bool force_delete) if(!force_delete && obj->m_pending_deactivation) continue; - u16 id = i.getNode()->getKey(); + u16 id = i->first; v3f objectpos = obj->getBasePosition(); // The block in which the object resides in @@ -1778,10 +1769,10 @@ void ServerEnvironment::deactivateFarObjects(bool force_delete) MapBlock *block = m_map->emergeBlock(obj->m_static_block, false); - core::map::Node *n = + std::map::iterator n = block->m_static_objects.m_active.find(id); - if(n){ - StaticObject static_old = n->getValue(); + if(n != block->m_static_objects.m_active.end()){ + StaticObject static_old = n->second; float save_movem = obj->getMinimumSavedMovement(); @@ -1840,7 +1831,7 @@ void ServerEnvironment::deactivateFarObjects(bool force_delete) // This shouldn't happen, but happens rarely for some // unknown reason. Unsuccessful attempts have been made to // find said reason. - if(new_id && block->m_static_objects.m_active.find(new_id)){ + if(new_id && block->m_static_objects.m_active.find(new_id) != block->m_static_objects.m_active.end()){ infostream<<"ServerEnv: WARNING: Performing hack #83274" <m_static_objects.remove(new_id); @@ -1900,10 +1891,10 @@ void ServerEnvironment::deactivateFarObjects(bool force_delete) } // Remove references from m_active_objects - for(core::list::Iterator i = objects_to_remove.begin(); - i != objects_to_remove.end(); i++) + for(std::list::iterator i = objects_to_remove.begin(); + i != objects_to_remove.end(); ++i) { - m_active_objects.remove(*i); + m_active_objects.erase(*i); } } @@ -1930,15 +1921,15 @@ ClientEnvironment::ClientEnvironment(ClientMap *map, scene::ISceneManager *smgr, ClientEnvironment::~ClientEnvironment() { // delete active objects - for(core::map::Iterator - i = m_active_objects.getIterator(); - i.atEnd()==false; i++) + for(std::map::iterator + i = m_active_objects.begin(); + i != m_active_objects.end(); ++i) { - delete i.getNode()->getValue(); + delete i->second; } - for(core::list::Iterator - i = m_simple_objects.begin(); i != m_simple_objects.end(); i++) + for(std::list::iterator + i = m_simple_objects.begin(); i != m_simple_objects.end(); ++i) { delete *i; } @@ -1971,8 +1962,8 @@ void ClientEnvironment::addPlayer(Player *player) LocalPlayer * ClientEnvironment::getLocalPlayer() { - for(core::list::Iterator i = m_players.begin(); - i != m_players.end(); i++) + for(std::list::iterator i = m_players.begin(); + i != m_players.end(); ++i) { Player *player = *i; if(player->isLocal()) @@ -1996,7 +1987,7 @@ void ClientEnvironment::step(float dtime) LocalPlayer *lplayer = getLocalPlayer(); assert(lplayer); // collision info queue - core::list player_collisions; + std::list player_collisions; /* Get the speed the player is going @@ -2113,9 +2104,9 @@ void ClientEnvironment::step(float dtime) //std::cout<<"Looped "<::Iterator + for(std::list::iterator i = player_collisions.begin(); - i != player_collisions.end(); i++) + i != player_collisions.end(); ++i) { CollisionInfo &info = *i; v3f speed_diff = info.new_speed - info.old_speed;; @@ -2179,8 +2170,8 @@ void ClientEnvironment::step(float dtime) /* Stuff that can be done in an arbitarily large dtime */ - for(core::list::Iterator i = m_players.begin(); - i != m_players.end(); i++) + for(std::list::iterator i = m_players.begin(); + i != m_players.end(); ++i) { Player *player = *i; v3f playerpos = player->getPosition(); @@ -2214,11 +2205,11 @@ void ClientEnvironment::step(float dtime) */ bool update_lighting = m_active_object_light_update_interval.step(dtime, 0.21); - for(core::map::Iterator - i = m_active_objects.getIterator(); - i.atEnd()==false; i++) + for(std::map::iterator + i = m_active_objects.begin(); + i != m_active_objects.end(); ++i) { - ClientActiveObject* obj = i.getNode()->getValue(); + ClientActiveObject* obj = i->second; // Step object obj->step(dtime, this); @@ -2242,12 +2233,12 @@ void ClientEnvironment::step(float dtime) /* Step and handle simple objects */ - for(core::list::Iterator + for(std::list::iterator i = m_simple_objects.begin(); i != m_simple_objects.end();) { ClientSimpleObject *simple = *i; - core::list::Iterator cur = i; - i++; + std::list::iterator cur = i; + ++i; simple->step(dtime); if(simple->m_to_be_removed){ delete simple; @@ -2263,31 +2254,24 @@ void ClientEnvironment::addSimpleObject(ClientSimpleObject *simple) ClientActiveObject* ClientEnvironment::getActiveObject(u16 id) { - core::map::Node *n; + std::map::iterator n; n = m_active_objects.find(id); - if(n == NULL) + if(n == m_active_objects.end()) return NULL; - return n->getValue(); + return n->second; } bool isFreeClientActiveObjectId(u16 id, - core::map &objects) + std::map &objects) { if(id == 0) return false; - - for(core::map::Iterator - i = objects.getIterator(); - i.atEnd()==false; i++) - { - if(i.getNode()->getKey() == id) - return false; - } - return true; + + return objects.find(id) == objects.end(); } u16 getFreeClientActiveObjectId( - core::map &objects) + std::map &objects) { u16 new_id = 1; for(;;) @@ -2326,7 +2310,7 @@ u16 ClientEnvironment::addActiveObject(ClientActiveObject *object) } infostream<<"ClientEnvironment::addActiveObject(): " <<"added (id="<getId()<<")"<getId(), object); + m_active_objects[object->getId()] = object; object->addToScene(m_smgr, m_texturesource, m_irr); { // Update lighting immediately u8 light = 0; @@ -2389,7 +2373,7 @@ void ClientEnvironment::removeActiveObject(u16 id) } obj->removeFromScene(true); delete obj; - m_active_objects.remove(id); + m_active_objects.erase(id); } void ClientEnvironment::processActiveObjectMessage(u16 id, @@ -2445,13 +2429,13 @@ void ClientEnvironment::damageLocalPlayer(u8 damage, bool handle_hp) */ void ClientEnvironment::getActiveObjects(v3f origin, f32 max_d, - core::array &dest) + std::vector &dest) { - for(core::map::Iterator - i = m_active_objects.getIterator(); - i.atEnd()==false; i++) + for(std::map::iterator + i = m_active_objects.begin(); + i != m_active_objects.end(); ++i) { - ClientActiveObject* obj = i.getNode()->getValue(); + ClientActiveObject* obj = i->second; f32 d = (obj->getPosition() - origin).getLength(); @@ -2466,7 +2450,7 @@ void ClientEnvironment::getActiveObjects(v3f origin, f32 max_d, ClientEnvEvent ClientEnvironment::getClientEvent() { - if(m_client_event_queue.size() == 0) + if(m_client_event_queue.empty()) { ClientEnvEvent event; event.type = CEE_NONE; diff --git a/src/environment.h b/src/environment.h index 07a4d7635..02301e5d3 100644 --- a/src/environment.h +++ b/src/environment.h @@ -31,6 +31,7 @@ with this program; if not, write to the Free Software Foundation, Inc., */ #include +#include #include "irrlichttypes_extrabloated.h" #include "player.h" #include @@ -73,8 +74,8 @@ public: Player * getPlayer(const char *name); Player * getRandomConnectedPlayer(); Player * getNearestConnectedPlayer(v3f pos); - core::list getPlayers(); - core::list getPlayers(bool ignore_disconnected); + std::list getPlayers(); + std::list getPlayers(bool ignore_disconnected); void printPlayers(std::ostream &o); u32 getDayNightRatio(); @@ -102,7 +103,7 @@ public: protected: // peer_ids in here should be unique, except that there may be many 0s - core::list m_players; + std::list m_players; // Time of day in milli-hours (0-23999); determines day and night u32 m_time_of_day; // Time of day in 0...1 @@ -156,20 +157,20 @@ struct ABMWithState class ActiveBlockList { public: - void update(core::list &active_positions, + void update(std::list &active_positions, s16 radius, - core::map &blocks_removed, - core::map &blocks_added); + std::set &blocks_removed, + std::set &blocks_added); bool contains(v3s16 p){ - return (m_list.find(p) != NULL); + return (m_list.find(p) != m_list.end()); } void clear(){ m_list.clear(); } - core::map m_list; + std::set m_list; private: }; @@ -249,16 +250,16 @@ public: inside a radius around a position */ void getAddedActiveObjects(v3s16 pos, s16 radius, - core::map ¤t_objects, - core::map &added_objects); + std::set ¤t_objects, + std::set &added_objects); /* Find out what new objects have been removed from inside a radius around a position */ void getRemovedActiveObjects(v3s16 pos, s16 radius, - core::map ¤t_objects, - core::map &removed_objects); + std::set ¤t_objects, + std::set &removed_objects); /* Get the next message emitted by some active object. @@ -350,7 +351,7 @@ private: // Background block emerger (the server, in practice) IBackgroundBlockEmerger *m_emerger; // Active object list - core::map m_active_objects; + std::map m_active_objects; // Outgoing network message buffer for active objects Queue m_active_object_messages; // Some timers @@ -368,7 +369,7 @@ private: u32 m_game_time; // A helper variable for incrementing the latter float m_game_time_fraction_counter; - core::list m_abms; + std::list m_abms; // An interval for generally sending object positions and stuff float m_recommended_send_interval; }; @@ -463,7 +464,7 @@ public: // Get all nearby objects void getActiveObjects(v3f origin, f32 max_d, - core::array &dest); + std::vector &dest); // Get event from queue. CEE_NONE is returned if queue is empty. ClientEnvEvent getClientEvent(); @@ -476,8 +477,8 @@ private: ITextureSource *m_texturesource; IGameDef *m_gamedef; IrrlichtDevice *m_irr; - core::map m_active_objects; - core::list m_simple_objects; + std::map m_active_objects; + std::list m_simple_objects; Queue m_client_event_queue; IntervalLimiter m_active_object_light_update_interval; IntervalLimiter m_lava_hurt_interval; diff --git a/src/farmesh.cpp b/src/farmesh.cpp index 443e2b3bf..ecf01ee07 100644 --- a/src/farmesh.cpp +++ b/src/farmesh.cpp @@ -112,13 +112,13 @@ struct HeightPoint float have_sand; float tree_amount; }; -core::map g_heights; +std::map g_heights; HeightPoint ground_height(u64 seed, v2s16 p2d) { - core::map::Node *n = g_heights.find(p2d); - if(n) - return n->getValue(); + std::map::iterator n = g_heights.find(p2d); + if(n != g_heights.end()) + return n->second; HeightPoint hp; s16 level = Mapgen::find_ground_level_from_noise(seed, p2d, 3); hp.gh = (level-4)*BS; diff --git a/src/game.h b/src/game.h index fef777fea..a2c1fc09c 100644 --- a/src/game.h +++ b/src/game.h @@ -23,17 +23,18 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "irrlichttypes_extrabloated.h" #include #include "keycode.h" +#include -class KeyList : protected core::list +class KeyList : protected std::list { - typedef core::list super; - typedef super::Iterator Iterator; - typedef super::ConstIterator ConstIterator; + typedef std::list super; + typedef super::iterator iterator; + typedef super::const_iterator const_iterator; - virtual ConstIterator find(const KeyPress &key) const + virtual const_iterator find(const KeyPress &key) const { - ConstIterator f(begin()); - ConstIterator e(end()); + const_iterator f(begin()); + const_iterator e(end()); while (f!=e) { if (*f == key) return f; @@ -42,10 +43,10 @@ class KeyList : protected core::list return e; } - virtual Iterator find(const KeyPress &key) + virtual iterator find(const KeyPress &key) { - Iterator f(begin()); - Iterator e(end()); + iterator f(begin()); + iterator e(end()); while (f!=e) { if (*f == key) return f; @@ -65,14 +66,14 @@ public: void unset(const KeyPress &key) { - Iterator p(find(key)); + iterator p(find(key)); if (p != end()) erase(p); } void toggle(const KeyPress &key) { - Iterator p(this->find(key)); + iterator p(this->find(key)); if (p != end()) erase(p); else diff --git a/src/guiChatConsole.cpp b/src/guiChatConsole.cpp index f522af01f..5fc576cf8 100644 --- a/src/guiChatConsole.cpp +++ b/src/guiChatConsole.cpp @@ -535,7 +535,7 @@ bool GUIChatConsole::OnEvent(const SEvent& event) { // Tab or Shift-Tab pressed // Nick completion - core::list names = m_client->getConnectedPlayerNames(); + std::list names = m_client->getConnectedPlayerNames(); bool backwards = event.KeyInput.Shift; m_chat_backend->getPrompt().nickCompletion(names, backwards); return true; diff --git a/src/guiFormSpecMenu.h b/src/guiFormSpecMenu.h index aee16736e..17b202b18 100644 --- a/src/guiFormSpecMenu.h +++ b/src/guiFormSpecMenu.h @@ -209,11 +209,11 @@ protected: IFormSource *m_form_src; TextDest *m_text_dst; - core::array m_inventorylists; - core::array m_backgrounds; - core::array m_images; - core::array m_itemimages; - core::array m_fields; + std::vector m_inventorylists; + std::vector m_backgrounds; + std::vector m_images; + std::vector m_itemimages; + std::vector m_fields; ItemSpec *m_selected_item; u32 m_selected_amount; diff --git a/src/itemdef.cpp b/src/itemdef.cpp index 5fd27fca3..4bd4181f9 100644 --- a/src/itemdef.cpp +++ b/src/itemdef.cpp @@ -211,8 +211,8 @@ public: virtual ~CItemDefManager() { #ifndef SERVER - const core::list &values = m_clientcached.getValues(); - for(core::list::ConstIterator + const std::list &values = m_clientcached.getValues(); + for(std::list::const_iterator i = values.begin(); i != values.end(); ++i) { ClientCached *cc = *i; @@ -599,7 +599,7 @@ public: void processQueue(IGameDef *gamedef) { #ifndef SERVER - while(m_get_clientcached_queue.size() > 0) + while(!m_get_clientcached_queue.empty()) { GetRequest request = m_get_clientcached_queue.pop(); diff --git a/src/keycode.cpp b/src/keycode.cpp index 8aadab2f1..96631b4ea 100644 --- a/src/keycode.cpp +++ b/src/keycode.cpp @@ -345,17 +345,16 @@ const KeyPress NumberKey[] = { */ // A simple cache for quicker lookup -core::map g_key_setting_cache; +std::map g_key_setting_cache; KeyPress getKeySetting(const char *settingname) { - core::map::Node *n; + std::map::iterator n; n = g_key_setting_cache.find(settingname); - if(n) - return n->getValue(); - g_key_setting_cache.insert(settingname, - g_settings->get(settingname).c_str()); - return g_key_setting_cache.find(settingname)->getValue(); + if(n != g_key_setting_cache.end()) + return n->second; + g_key_setting_cache[settingname] = g_settings->get(settingname).c_str(); + return g_key_setting_cache.find(settingname)->second; } void clearKeyCache() diff --git a/src/localplayer.cpp b/src/localplayer.cpp index 0554302e0..9c36e75e6 100644 --- a/src/localplayer.cpp +++ b/src/localplayer.cpp @@ -58,7 +58,7 @@ LocalPlayer::~LocalPlayer() } void LocalPlayer::move(f32 dtime, Map &map, f32 pos_max_d, - core::list *collision_info) + std::list *collision_info) { INodeDefManager *nodemgr = m_gamedef->ndef(); diff --git a/src/localplayer.h b/src/localplayer.h index f372c787d..e46ca6147 100644 --- a/src/localplayer.h +++ b/src/localplayer.h @@ -21,6 +21,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #define LOCALPLAYER_HEADER #include "player.h" +#include class LocalPlayer : public Player { @@ -38,7 +39,7 @@ public: v3f overridePosition; void move(f32 dtime, Map &map, f32 pos_max_d, - core::list *collision_info); + std::list *collision_info); void move(f32 dtime, Map &map, f32 pos_max_d); void applyControl(float dtime); diff --git a/src/main.cpp b/src/main.cpp index cfd643ac7..696468049 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -700,14 +700,14 @@ void SpeedTests() } { - TimeTaker timer("Testing core::map speed"); + TimeTaker timer("Testing std::map speed"); - core::map map1; + std::map map1; tempf = -324; const s16 ii=300; for(s16 y=0; y allowed_options; - allowed_options.insert("help", ValueSpec(VALUETYPE_FLAG, - _("Show allowed options"))); - allowed_options.insert("config", ValueSpec(VALUETYPE_STRING, - _("Load configuration from specified file"))); - allowed_options.insert("port", ValueSpec(VALUETYPE_STRING, - _("Set network port (UDP)"))); - allowed_options.insert("disable-unittests", ValueSpec(VALUETYPE_FLAG, - _("Disable unit tests"))); - allowed_options.insert("enable-unittests", ValueSpec(VALUETYPE_FLAG, - _("Enable unit tests"))); - allowed_options.insert("map-dir", ValueSpec(VALUETYPE_STRING, - _("Same as --world (deprecated)"))); - allowed_options.insert("world", ValueSpec(VALUETYPE_STRING, - _("Set world path (implies local game) ('list' lists all)"))); - allowed_options.insert("worldname", ValueSpec(VALUETYPE_STRING, - _("Set world by name (implies local game)"))); - allowed_options.insert("info", ValueSpec(VALUETYPE_FLAG, - _("Print more information to console"))); - allowed_options.insert("verbose", ValueSpec(VALUETYPE_FLAG, - _("Print even more information to console"))); - allowed_options.insert("trace", ValueSpec(VALUETYPE_FLAG, - _("Print enormous amounts of information to log and console"))); - allowed_options.insert("logfile", ValueSpec(VALUETYPE_STRING, - _("Set logfile path ('' = no logging)"))); - allowed_options.insert("gameid", ValueSpec(VALUETYPE_STRING, - _("Set gameid (\"--gameid list\" prints available ones)"))); + std::map allowed_options; + allowed_options.insert(std::make_pair("help", ValueSpec(VALUETYPE_FLAG, + _("Show allowed options")))); + allowed_options.insert(std::make_pair("config", ValueSpec(VALUETYPE_STRING, + _("Load configuration from specified file")))); + allowed_options.insert(std::make_pair("port", ValueSpec(VALUETYPE_STRING, + _("Set network port (UDP)")))); + allowed_options.insert(std::make_pair("disable-unittests", ValueSpec(VALUETYPE_FLAG, + _("Disable unit tests")))); + allowed_options.insert(std::make_pair("enable-unittests", ValueSpec(VALUETYPE_FLAG, + _("Enable unit tests")))); + allowed_options.insert(std::make_pair("map-dir", ValueSpec(VALUETYPE_STRING, + _("Same as --world (deprecated)")))); + allowed_options.insert(std::make_pair("world", ValueSpec(VALUETYPE_STRING, + _("Set world path (implies local game) ('list' lists all)")))); + allowed_options.insert(std::make_pair("worldname", ValueSpec(VALUETYPE_STRING, + _("Set world by name (implies local game)")))); + allowed_options.insert(std::make_pair("info", ValueSpec(VALUETYPE_FLAG, + _("Print more information to console")))); + allowed_options.insert(std::make_pair("verbose", ValueSpec(VALUETYPE_FLAG, + _("Print even more information to console")))); + allowed_options.insert(std::make_pair("trace", ValueSpec(VALUETYPE_FLAG, + _("Print enormous amounts of information to log and console")))); + allowed_options.insert(std::make_pair("logfile", ValueSpec(VALUETYPE_STRING, + _("Set logfile path ('' = no logging)")))); + allowed_options.insert(std::make_pair("gameid", ValueSpec(VALUETYPE_STRING, + _("Set gameid (\"--gameid list\" prints available ones)")))); #ifndef SERVER - allowed_options.insert("speedtests", ValueSpec(VALUETYPE_FLAG, - _("Run speed tests"))); - allowed_options.insert("address", ValueSpec(VALUETYPE_STRING, - _("Address to connect to. ('' = local game)"))); - allowed_options.insert("random-input", ValueSpec(VALUETYPE_FLAG, - _("Enable random user input, for testing"))); - allowed_options.insert("server", ValueSpec(VALUETYPE_FLAG, - _("Run dedicated server"))); - allowed_options.insert("name", ValueSpec(VALUETYPE_STRING, - _("Set player name"))); - allowed_options.insert("password", ValueSpec(VALUETYPE_STRING, - _("Set password"))); - allowed_options.insert("go", ValueSpec(VALUETYPE_FLAG, - _("Disable main menu"))); + allowed_options.insert(std::make_pair("speedtests", ValueSpec(VALUETYPE_FLAG, + _("Run speed tests")))); + allowed_options.insert(std::make_pair("address", ValueSpec(VALUETYPE_STRING, + _("Address to connect to. ('' = local game)")))); + allowed_options.insert(std::make_pair("random-input", ValueSpec(VALUETYPE_FLAG, + _("Enable random user input, for testing")))); + allowed_options.insert(std::make_pair("server", ValueSpec(VALUETYPE_FLAG, + _("Run dedicated server")))); + allowed_options.insert(std::make_pair("name", ValueSpec(VALUETYPE_STRING, + _("Set player name")))); + allowed_options.insert(std::make_pair("password", ValueSpec(VALUETYPE_STRING, + _("Set password")))); + allowed_options.insert(std::make_pair("go", ValueSpec(VALUETYPE_FLAG, + _("Disable main menu")))); #endif Settings cmd_args; @@ -839,20 +839,20 @@ int main(int argc, char *argv[]) if(ret == false || cmd_args.getFlag("help") || cmd_args.exists("nonopt1")) { dstream<<_("Allowed options:")<::Iterator - i = allowed_options.getIterator(); - i.atEnd() == false; i++) + for(std::map::iterator + i = allowed_options.begin(); + i != allowed_options.end(); ++i) { std::ostringstream os1(std::ios::binary); - os1<<" --"<getKey(); - if(i.getNode()->getValue().type == VALUETYPE_FLAG) + os1<<" --"<first; + if(i->second.type == VALUETYPE_FLAG) {} else os1<<_(" "); dstream<getValue().help != NULL) - dstream<getValue().help; + if(i->second.help != NULL) + dstream<second.help; dstream< filenames; + std::vector filenames; filenames.push_back(porting::path_user + DIR_DELIM + "minetest.conf"); // Legacy configuration file location diff --git a/src/mainmenumanager.h b/src/mainmenumanager.h index ce7684f11..a3133686b 100644 --- a/src/mainmenumanager.h +++ b/src/mainmenumanager.h @@ -26,6 +26,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "debug.h" // assert #include "modalMenu.h" #include "guiPauseMenu.h" //For IGameCallback +#include extern gui::IGUIEnvironment* guienv; extern gui::IGUIStaticText *guiroot; @@ -37,15 +38,15 @@ class MainMenuManager : public IMenuManager public: virtual void createdMenu(GUIModalMenu *menu) { - for(core::list::Iterator + for(std::list::iterator i = m_stack.begin(); - i != m_stack.end(); i++) + i != m_stack.end(); ++i) { assert(*i != menu); } if(m_stack.size() != 0) - (*m_stack.getLast())->setVisible(false); + m_stack.back()->setVisible(false); m_stack.push_back(menu); } @@ -55,9 +56,9 @@ public: bool removed_entry; do{ removed_entry = false; - for(core::list::Iterator + for(std::list::iterator i = m_stack.begin(); - i != m_stack.end(); i++) + i != m_stack.end(); ++i) { if(*i == menu) { @@ -73,7 +74,7 @@ public: m_stack.erase(i);*/ if(m_stack.size() != 0) - (*m_stack.getLast())->setVisible(true); + m_stack.back()->setVisible(true); } u32 menuCount() @@ -81,7 +82,7 @@ public: return m_stack.size(); } - core::list m_stack; + std::list m_stack; }; extern MainMenuManager g_menumgr; diff --git a/src/map.cpp b/src/map.cpp index 4be094326..2439c7091 100644 --- a/src/map.cpp +++ b/src/map.cpp @@ -73,34 +73,30 @@ Map::~Map() /* Free all MapSectors */ - core::map::Iterator i = m_sectors.getIterator(); - for(; i.atEnd() == false; i++) + for(std::map::iterator i = m_sectors.begin(); + i != m_sectors.end(); ++i) { - MapSector *sector = i.getNode()->getValue(); - delete sector; + delete i->second; } } void Map::addEventReceiver(MapEventReceiver *event_receiver) { - m_event_receivers.insert(event_receiver, false); + m_event_receivers.insert(event_receiver); } void Map::removeEventReceiver(MapEventReceiver *event_receiver) { - if(m_event_receivers.find(event_receiver) == NULL) - return; - m_event_receivers.remove(event_receiver); + m_event_receivers.erase(event_receiver); } void Map::dispatchEvent(MapEditEvent *event) { - for(core::map::Iterator - i = m_event_receivers.getIterator(); - i.atEnd()==false; i++) + for(std::set::iterator + i = m_event_receivers.begin(); + i != m_event_receivers.end(); ++i) { - MapEventReceiver* event_receiver = i.getNode()->getKey(); - event_receiver->onMapEditEvent(event); + (*i)->onMapEditEvent(event); } } @@ -111,12 +107,12 @@ MapSector * Map::getSectorNoGenerateNoExNoLock(v2s16 p) return sector; } - core::map::Node *n = m_sectors.find(p); + std::map::iterator n = m_sectors.find(p); - if(n == NULL) + if(n == m_sectors.end()) return NULL; - MapSector *sector = n->getValue(); + MapSector *sector = n->second; // Cache the last result m_sector_cache_p = p; @@ -236,9 +232,9 @@ void Map::setNode(v3s16 p, MapNode & n) values of from_nodes are lighting values. */ void Map::unspreadLight(enum LightBank bank, - core::map & from_nodes, - core::map & light_sources, - core::map & modified_blocks) + std::map & from_nodes, + std::set & light_sources, + std::map & modified_blocks) { INodeDefManager *nodemgr = m_gamedef->ndef(); @@ -256,9 +252,7 @@ void Map::unspreadLight(enum LightBank bank, u32 blockchangecount = 0; - core::map unlighted_nodes; - core::map::Iterator j; - j = from_nodes.getIterator(); + std::map unlighted_nodes; /* Initialize block cache @@ -268,9 +262,10 @@ void Map::unspreadLight(enum LightBank bank, // Cache this a bit, too bool block_checked_in_modified = false; - for(; j.atEnd() == false; j++) + for(std::map::iterator j = from_nodes.begin(); + j != from_nodes.end(); ++j) { - v3s16 pos = j.getNode()->getKey(); + v3s16 pos = j->first; v3s16 blockpos = getNodeBlockPos(pos); // Only fetch a new block if the block position has changed @@ -297,7 +292,7 @@ void Map::unspreadLight(enum LightBank bank, // Get node straight from the block MapNode n = block->getNode(relpos); - u8 oldlight = j.getNode()->getValue(); + u8 oldlight = j->second; // Loop through 6 neighbors for(u16 i=0; i<6; i++) @@ -354,7 +349,7 @@ void Map::unspreadLight(enum LightBank bank, n2.setLight(bank, 0, nodemgr); block->setNode(relpos, n2); - unlighted_nodes.insert(n2pos, current_light); + unlighted_nodes[n2pos] = current_light; changed = true; /* @@ -373,16 +368,16 @@ void Map::unspreadLight(enum LightBank bank, light_sources.remove(n2pos);*/ } else{ - light_sources.insert(n2pos, true); + light_sources.insert(n2pos); } // Add to modified_blocks if(changed == true && block_checked_in_modified == false) { // If the block is not found in modified_blocks, add. - if(modified_blocks.find(blockpos) == NULL) + if(modified_blocks.find(blockpos) == modified_blocks.end()) { - modified_blocks.insert(blockpos, block); + modified_blocks[blockpos] = block; } block_checked_in_modified = true; } @@ -408,11 +403,11 @@ void Map::unspreadLight(enum LightBank bank, */ void Map::unLightNeighbors(enum LightBank bank, v3s16 pos, u8 lightwas, - core::map & light_sources, - core::map & modified_blocks) + std::set & light_sources, + std::map & modified_blocks) { - core::map from_nodes; - from_nodes.insert(pos, lightwas); + std::map from_nodes; + from_nodes[pos] = lightwas; unspreadLight(bank, from_nodes, light_sources, modified_blocks); } @@ -422,8 +417,8 @@ void Map::unLightNeighbors(enum LightBank bank, goes on recursively. */ void Map::spreadLight(enum LightBank bank, - core::map & from_nodes, - core::map & modified_blocks) + std::set & from_nodes, + std::map & modified_blocks) { INodeDefManager *nodemgr = m_gamedef->ndef(); @@ -441,9 +436,7 @@ void Map::spreadLight(enum LightBank bank, u32 blockchangecount = 0; - core::map lighted_nodes; - core::map::Iterator j; - j = from_nodes.getIterator(); + std::set lighted_nodes; /* Initialize block cache @@ -453,12 +446,10 @@ void Map::spreadLight(enum LightBank bank, // Cache this a bit, too bool block_checked_in_modified = false; - for(; j.atEnd() == false; j++) - //for(; j != from_nodes.end(); j++) + for(std::set::iterator j = from_nodes.begin(); + j != from_nodes.end(); ++j) { - v3s16 pos = j.getNode()->getKey(); - //v3s16 pos = *j; - //infostream<<"pos=("< undiminish_light(oldlight)) { - lighted_nodes.insert(n2pos, true); - //lighted_nodes.push_back(n2pos); + lighted_nodes.insert(n2pos); changed = true; } /* @@ -539,8 +529,7 @@ void Map::spreadLight(enum LightBank bank, { n2.setLight(bank, newlight, nodemgr); block->setNode(relpos, n2); - lighted_nodes.insert(n2pos, true); - //lighted_nodes.push_back(n2pos); + lighted_nodes.insert(n2pos); changed = true; } } @@ -549,9 +538,9 @@ void Map::spreadLight(enum LightBank bank, if(changed == true && block_checked_in_modified == false) { // If the block is not found in modified_blocks, add. - if(modified_blocks.find(blockpos) == NULL) + if(modified_blocks.find(blockpos) == modified_blocks.end()) { - modified_blocks.insert(blockpos, block); + modified_blocks[blockpos] = block; } block_checked_in_modified = true; } @@ -577,10 +566,10 @@ void Map::spreadLight(enum LightBank bank, */ void Map::lightNeighbors(enum LightBank bank, v3s16 pos, - core::map & modified_blocks) + std::map & modified_blocks) { - core::map from_nodes; - from_nodes.insert(pos, true); + std::set from_nodes; + from_nodes.insert(pos); spreadLight(bank, from_nodes, modified_blocks); } @@ -635,7 +624,7 @@ v3s16 Map::getBrightestNeighbour(enum LightBank bank, v3s16 p) Mud is turned into grass in where the sunlight stops. */ s16 Map::propagateSunlight(v3s16 start, - core::map & modified_blocks) + std::map & modified_blocks) { INodeDefManager *nodemgr = m_gamedef->ndef(); @@ -662,7 +651,7 @@ s16 Map::propagateSunlight(v3s16 start, n.setLight(LIGHTBANK_DAY, LIGHT_SUN, nodemgr); block->setNode(relpos, n); - modified_blocks.insert(blockpos, block); + modified_blocks[blockpos] = block; } else { @@ -674,8 +663,8 @@ s16 Map::propagateSunlight(v3s16 start, } void Map::updateLighting(enum LightBank bank, - core::map & a_blocks, - core::map & modified_blocks) + std::map & a_blocks, + std::map & modified_blocks) { INodeDefManager *nodemgr = m_gamedef->ndef(); @@ -688,22 +677,21 @@ void Map::updateLighting(enum LightBank bank, //bool debug=true; //u32 count_was = modified_blocks.size(); - core::map blocks_to_update; + std::map blocks_to_update; - core::map light_sources; + std::set light_sources; - core::map unlight_from; + std::map unlight_from; int num_bottom_invalid = 0; { //TimeTaker t("first stuff"); - core::map::Iterator i; - i = a_blocks.getIterator(); - for(; i.atEnd() == false; i++) + for(std::map::iterator i = a_blocks.begin(); + i != a_blocks.end(); ++i) { - MapBlock *block = i.getNode()->getValue(); + MapBlock *block = i->second; for(;;) { @@ -713,9 +701,8 @@ void Map::updateLighting(enum LightBank bank, v3s16 pos = block->getPos(); v3s16 posnodes = block->getPosRelative(); - modified_blocks.insert(pos, block); - - blocks_to_update.insert(pos, block); + modified_blocks[pos] = block; + blocks_to_update[pos] = block; /* Clear all light from block @@ -735,7 +722,7 @@ void Map::updateLighting(enum LightBank bank, // If node sources light, add to list u8 source = nodemgr->get(n).light_source; if(source != 0) - light_sources[p + posnodes] = true; + light_sources.insert(p + posnodes); // Collect borders for unlighting if((x==0 || x == MAP_BLOCKSIZE-1 @@ -744,7 +731,7 @@ void Map::updateLighting(enum LightBank bank, && oldlight != 0) { v3s16 p_map = p + posnodes; - unlight_from.insert(p_map, oldlight); + unlight_from[p_map] = oldlight; } } catch(InvalidPositionException &e) @@ -912,8 +899,8 @@ void Map::updateLighting(enum LightBank bank, //m_dout<<"Done ("< & a_blocks, - core::map & modified_blocks) +void Map::updateLighting(std::map & a_blocks, + std::map & modified_blocks) { updateLighting(LIGHTBANK_DAY, a_blocks, modified_blocks); updateLighting(LIGHTBANK_NIGHT, a_blocks, modified_blocks); @@ -921,11 +908,11 @@ void Map::updateLighting(core::map & a_blocks, /* Update information about whether day and night light differ */ - for(core::map::Iterator - i = modified_blocks.getIterator(); - i.atEnd() == false; i++) + for(std::map::iterator + i = modified_blocks.begin(); + i != modified_blocks.end(); ++i) { - MapBlock *block = i.getNode()->getValue(); + MapBlock *block = i->second; block->expireDayNightDiff(); } } @@ -933,7 +920,7 @@ void Map::updateLighting(core::map & a_blocks, /* */ void Map::addNodeAndUpdate(v3s16 p, MapNode n, - core::map &modified_blocks) + std::map &modified_blocks) { INodeDefManager *ndef = m_gamedef->ndef(); @@ -952,7 +939,7 @@ void Map::addNodeAndUpdate(v3s16 p, MapNode n, v3s16 bottompos = p + v3s16(0,-1,0); bool node_under_sunlight = true; - core::map light_sources; + std::set light_sources; /* Collect old node for rollback @@ -994,7 +981,7 @@ void Map::addNodeAndUpdate(v3s16 p, MapNode n, v3s16 blockpos = getNodeBlockPos(p); MapBlock * block = getBlockNoCreate(blockpos); assert(block != NULL); - modified_blocks.insert(blockpos, block); + modified_blocks[blockpos] = block; assert(isValidPosition(p)); @@ -1078,12 +1065,11 @@ void Map::addNodeAndUpdate(v3s16 p, MapNode n, /* Update information about whether day and night light differ */ - for(core::map::Iterator - i = modified_blocks.getIterator(); - i.atEnd() == false; i++) + for(std::map::iterator + i = modified_blocks.begin(); + i != modified_blocks.end(); ++i) { - MapBlock *block = i.getNode()->getValue(); - block->expireDayNightDiff(); + i->second->expireDayNightDiff(); } /* @@ -1132,7 +1118,7 @@ void Map::addNodeAndUpdate(v3s16 p, MapNode n, /* */ void Map::removeNodeAndUpdate(v3s16 p, - core::map &modified_blocks) + std::map &modified_blocks) { INodeDefManager *ndef = m_gamedef->ndef(); @@ -1166,7 +1152,7 @@ void Map::removeNodeAndUpdate(v3s16 p, { } - core::map light_sources; + std::set light_sources; enum LightBank banks[] = { @@ -1214,7 +1200,7 @@ void Map::removeNodeAndUpdate(v3s16 p, v3s16 blockpos = getNodeBlockPos(p); MapBlock * block = getBlockNoCreate(blockpos); assert(block != NULL); - modified_blocks.insert(blockpos, block); + modified_blocks[blockpos] = block; /* If the removed node was under sunlight, propagate the @@ -1270,12 +1256,11 @@ void Map::removeNodeAndUpdate(v3s16 p, /* Update information about whether day and night light differ */ - for(core::map::Iterator - i = modified_blocks.getIterator(); - i.atEnd() == false; i++) + for(std::map::iterator + i = modified_blocks.begin(); + i != modified_blocks.end(); ++i) { - MapBlock *block = i.getNode()->getValue(); - block->expireDayNightDiff(); + i->second->expireDayNightDiff(); } /* @@ -1330,15 +1315,15 @@ bool Map::addNodeWithEvent(v3s16 p, MapNode n) bool succeeded = true; try{ - core::map modified_blocks; + std::map modified_blocks; addNodeAndUpdate(p, n, modified_blocks); // Copy modified_blocks to event - for(core::map::Iterator - i = modified_blocks.getIterator(); - i.atEnd()==false; i++) + for(std::map::iterator + i = modified_blocks.begin(); + i != modified_blocks.end(); ++i) { - event.modified_blocks.insert(i.getNode()->getKey(), false); + event.modified_blocks.erase(i->first); } } catch(InvalidPositionException &e){ @@ -1358,15 +1343,15 @@ bool Map::removeNodeWithEvent(v3s16 p) bool succeeded = true; try{ - core::map modified_blocks; + std::map modified_blocks; removeNodeAndUpdate(p, modified_blocks); // Copy modified_blocks to event - for(core::map::Iterator - i = modified_blocks.getIterator(); - i.atEnd()==false; i++) + for(std::map::iterator + i = modified_blocks.begin(); + i != modified_blocks.end(); ++i) { - event.modified_blocks.insert(i.getNode()->getKey(), false); + event.modified_blocks.erase(i->first); } } catch(InvalidPositionException &e){ @@ -1439,33 +1424,31 @@ bool Map::getDayNightDiff(v3s16 blockpos) Updates usage timers */ void Map::timerUpdate(float dtime, float unload_timeout, - core::list *unloaded_blocks) + std::list *unloaded_blocks) { bool save_before_unloading = (mapType() == MAPTYPE_SERVER); // Profile modified reasons Profiler modprofiler; - core::list sector_deletion_queue; + std::list sector_deletion_queue; u32 deleted_blocks_count = 0; u32 saved_blocks_count = 0; u32 block_count_all = 0; - core::map::Iterator si; - beginSave(); - si = m_sectors.getIterator(); - for(; si.atEnd() == false; si++) + for(std::map::iterator si = m_sectors.begin(); + si != m_sectors.end(); ++si) { - MapSector *sector = si.getNode()->getValue(); + MapSector *sector = si->second; bool all_blocks_deleted = true; - core::list blocks; + std::list blocks; sector->getBlocks(blocks); - for(core::list::Iterator i = blocks.begin(); - i != blocks.end(); i++) + for(std::list::iterator i = blocks.begin(); + i != blocks.end(); ++i) { MapBlock *block = (*i); @@ -1501,7 +1484,7 @@ void Map::timerUpdate(float dtime, float unload_timeout, if(all_blocks_deleted) { - sector_deletion_queue.push_back(si.getNode()->getKey()); + sector_deletion_queue.push_back(si->first); } } endSave(); @@ -1526,17 +1509,17 @@ void Map::timerUpdate(float dtime, float unload_timeout, } } -void Map::deleteSectors(core::list &list) +void Map::deleteSectors(std::list &list) { - core::list::Iterator j; - for(j=list.begin(); j!=list.end(); j++) + for(std::list::iterator j = list.begin(); + j != list.end(); ++j) { MapSector *sector = m_sectors[*j]; // If sector is in sector cache, remove it from there if(m_sector_cache == sector) m_sector_cache = NULL; // Remove from map and delete - m_sectors.remove(*j); + m_sectors.erase(*j); delete sector; } } @@ -1642,7 +1625,7 @@ const v3s16 g_7dirs[7] = #define D_TOP 6 #define D_SELF 1 -void Map::transformLiquidsFinite(core::map & modified_blocks) +void Map::transformLiquidsFinite(std::map & modified_blocks) { INodeDefManager *nodemgr = m_gamedef->ndef(); @@ -1663,7 +1646,7 @@ void Map::transformLiquidsFinite(core::map & modified_blocks) UniqueQueue must_reflow, must_reflow_second; // List of MapBlocks that will require a lighting update (due to lava) - core::map lighting_modified_blocks; + std::map lighting_modified_blocks; while(m_transforming_liquid.size() > 0) { @@ -1904,7 +1887,7 @@ void Map::transformLiquidsFinite(core::map & modified_blocks) v3s16 blockpos = getNodeBlockPos(p0); MapBlock *block = getBlockNoCreateNoEx(blockpos); if(block != NULL) { - modified_blocks.insert(blockpos, block); + modified_blocks[blockpos] = block; // If node emits light, MapBlock requires lighting update if(nodemgr->get(n0).light_source != 0) lighting_modified_blocks[block->getPos()] = block; @@ -1925,11 +1908,11 @@ void Map::transformLiquidsFinite(core::map & modified_blocks) updateLighting(lighting_modified_blocks, modified_blocks); } -void Map::transformLiquids(core::map & modified_blocks) +void Map::transformLiquids(std::map & modified_blocks) { if (g_settings->getBool("liquid_finite")) return Map::transformLiquidsFinite(modified_blocks); - + INodeDefManager *nodemgr = m_gamedef->ndef(); DSTACK(__FUNCTION_NAME); @@ -1945,7 +1928,7 @@ void Map::transformLiquids(core::map & modified_blocks) UniqueQueue must_reflow; // List of MapBlocks that will require a lighting update (due to lava) - core::map lighting_modified_blocks; + std::map lighting_modified_blocks; while(m_transforming_liquid.size() != 0) { @@ -2165,7 +2148,7 @@ void Map::transformLiquids(core::map & modified_blocks) v3s16 blockpos = getNodeBlockPos(p0); MapBlock *block = getBlockNoCreateNoEx(blockpos); if(block != NULL) { - modified_blocks.insert(blockpos, block); + modified_blocks[blockpos] = block; // If node emits light, MapBlock requires lighting update if(nodemgr->get(n0).light_source != 0) lighting_modified_blocks[block->getPos()] = block; @@ -2571,7 +2554,7 @@ bool ServerMap::initBlockMake(BlockMakeData *data, v3s16 blockpos) } MapBlock* ServerMap::finishBlockMake(BlockMakeData *data, - core::map &changed_blocks) + std::map &changed_blocks) { v3s16 blockpos_min = data->blockpos_min; v3s16 blockpos_max = data->blockpos_max; @@ -2676,10 +2659,10 @@ MapBlock* ServerMap::finishBlockMake(BlockMakeData *data, /* Go through changed blocks */ - for(core::map::Iterator i = changed_blocks.getIterator(); - i.atEnd() == false; i++) + for(std::map::iterator i = changed_blocks.begin(); + i != changed_blocks.end(); ++i) { - MapBlock *block = i.getNode()->getValue(); + MapBlock *block = i->second; assert(block); /* Update day/night difference cache of the MapBlocks @@ -2797,7 +2780,7 @@ ServerMapSector * ServerMap::createSector(v2s16 p2d) /* Insert to container */ - m_sectors.insert(p2d, sector); + m_sectors[p2d] = sector; return sector; } @@ -2808,7 +2791,7 @@ ServerMapSector * ServerMap::createSector(v2s16 p2d) */ MapBlock * ServerMap::generateBlock( v3s16 p, - core::map &modified_blocks + std::map &modified_blocks ) { DSTACKF("%s: p=(%d,%d,%d)", __FUNCTION_NAME, p.X, p.Y, p.Z); @@ -3008,7 +2991,7 @@ MapBlock * ServerMap::emergeBlock(v3s16 p, bool create_blank) } /*if(allow_generate) { - core::map modified_blocks; + std::map modified_blocks; MapBlock *block = generateBlock(p, modified_blocks); if(block) { @@ -3017,11 +3000,11 @@ MapBlock * ServerMap::emergeBlock(v3s16 p, bool create_blank) event.p = p; // Copy modified_blocks to event - for(core::map::Iterator - i = modified_blocks.getIterator(); - i.atEnd()==false; i++) + for(std::map::iterator + i = modified_blocks.begin(); + i != modified_blocks.end(); ++i) { - event.modified_blocks.insert(i.getNode()->getKey(), false); + event.modified_blocks.erase(i->first); } // Queue event @@ -3262,10 +3245,10 @@ void ServerMap::save(ModifiedState save_level) // Don't do anything with sqlite unless something is really saved bool save_started = false; - core::map::Iterator i = m_sectors.getIterator(); - for(; i.atEnd() == false; i++) + for(std::map::iterator i = m_sectors.begin(); + i != m_sectors.end(); ++i) { - ServerMapSector *sector = (ServerMapSector*)i.getNode()->getValue(); + ServerMapSector *sector = (ServerMapSector*)i->second; assert(sector->getId() == MAPSECTOR_SERVER); if(sector->differs_from_disk || save_level == MOD_STATE_CLEAN) @@ -3273,11 +3256,11 @@ void ServerMap::save(ModifiedState save_level) saveSectorMeta(sector); sector_meta_count++; } - core::list blocks; + std::list blocks; sector->getBlocks(blocks); - core::list::Iterator j; - for(j=blocks.begin(); j!=blocks.end(); j++) + for(std::list::iterator j = blocks.begin(); + j != blocks.end(); ++j) { MapBlock *block = *j; @@ -3350,7 +3333,7 @@ v3s16 ServerMap::getIntegerAsBlock(sqlite3_int64 i) return v3s16(x,y,z); } -void ServerMap::listAllLoadableBlocks(core::list &dst) +void ServerMap::listAllLoadableBlocks(std::list &dst) { if(loadFromFolders()){ errorstream<<"Map::listAllLoadableBlocks(): Result will be missing " @@ -3487,7 +3470,7 @@ MapSector* ServerMap::loadSectorMeta(std::string sectordir, bool save_after_load <<" Continuing with a sector with no metadata." <::Node *n; + std::map::iterator n; n = m_loaded_blocks.find(p); - if(n != NULL) + if(n != m_loaded_blocks.end()) continue; bool block_data_inexistent = false; @@ -4017,7 +4000,7 @@ void MapVoxelManipulator::emerge(VoxelArea a, s32 caller_id) if(block_data_inexistent) { flags |= VMANIP_BLOCK_DATA_INEXIST; - + VoxelArea a(p*MAP_BLOCKSIZE, (p+1)*MAP_BLOCKSIZE-v3s16(1,1,1)); // Fill with VOXELFLAG_INEXISTENT for(s32 z=a.MinEdge.Z; z<=a.MaxEdge.Z; z++) @@ -4033,7 +4016,7 @@ void MapVoxelManipulator::emerge(VoxelArea a, s32 caller_id) flags |= VMANIP_BLOCK_CONTAINS_CIGNORE; }*/ - m_loaded_blocks.insert(p, flags); + m_loaded_blocks[p] = flags; } //infostream<<"emerge done"< & modified_blocks) + (std::map & modified_blocks) { if(m_area.getExtent() == v3s16(0,0,0)) return; @@ -4156,9 +4139,9 @@ void ManualMapVoxelManipulator::initialEmerge( u8 flags = 0; MapBlock *block; v3s16 p(x,y,z); - core::map::Node *n; + std::map::iterator n; n = m_loaded_blocks.find(p); - if(n != NULL) + if(n != m_loaded_blocks.end()) continue; bool block_data_inexistent = false; @@ -4199,12 +4182,12 @@ void ManualMapVoxelManipulator::initialEmerge( flags |= VMANIP_BLOCK_CONTAINS_CIGNORE; }*/ - m_loaded_blocks.insert(p, flags); + m_loaded_blocks[p] = flags; } } void ManualMapVoxelManipulator::blitBackAll( - core::map * modified_blocks) + std::map * modified_blocks) { if(m_area.getExtent() == v3s16(0,0,0)) return; @@ -4212,37 +4195,22 @@ void ManualMapVoxelManipulator::blitBackAll( /* Copy data of all blocks */ - for(core::map::Iterator - i = m_loaded_blocks.getIterator(); - i.atEnd() == false; i++) + for(std::map::iterator + i = m_loaded_blocks.begin(); + i != m_loaded_blocks.end(); ++i) { - v3s16 p = i.getNode()->getKey(); - u8 flags = i.getNode()->getValue(); - - bool existed = !(flags & VMANIP_BLOCK_DATA_INEXIST); - if(existed == false) - { - // The Great Bug was found using this - /*infostream<<"ManualMapVoxelManipulator::blitBackAll: " - <<"Inexistent ("<first; MapBlock *block = m_map->getBlockNoCreateNoEx(p); - if(block == NULL) + bool existed = !(i->second & VMANIP_BLOCK_DATA_INEXIST); + if(existed == false) { - infostream<<"WARNING: "<<__FUNCTION_NAME - <<": got NULL block " - <<"("<copyFrom(*this); - + if(modified_blocks) - modified_blocks->insert(p, block); + (*modified_blocks)[p] = block; } } diff --git a/src/map.h b/src/map.h index d356da2d1..3833cceb4 100644 --- a/src/map.h +++ b/src/map.h @@ -25,6 +25,9 @@ with this program; if not, write to the Free Software Foundation, Inc., #include #include #include +#include +#include +#include #include "irrlichttypes_bloated.h" #include "mapnode.h" @@ -75,7 +78,7 @@ struct MapEditEvent MapEditEventType type; v3s16 p; MapNode n; - core::map modified_blocks; + std::set modified_blocks; u16 already_known_by_peer; MapEditEvent(): @@ -90,14 +93,7 @@ struct MapEditEvent event->type = type; event->p = p; event->n = n; - for(core::map::Iterator - i = modified_blocks.getIterator(); - i.atEnd()==false; i++) - { - v3s16 p = i.getNode()->getKey(); - bool v = i.getNode()->getValue(); - event->modified_blocks.insert(p, v); - } + event->modified_blocks = modified_blocks; return event; } @@ -117,11 +113,11 @@ struct MapEditEvent case MEET_OTHER: { VoxelArea a; - for(core::map::Iterator - i = modified_blocks.getIterator(); - i.atEnd()==false; i++) + for(std::set::iterator + i = modified_blocks.begin(); + i != modified_blocks.end(); ++i) { - v3s16 p = i.getNode()->getKey(); + v3s16 p = *i; v3s16 np1 = p*MAP_BLOCKSIZE; v3s16 np2 = np1 + v3s16(1,1,1)*MAP_BLOCKSIZE - v3s16(1,1,1); a.addPoint(np1); @@ -186,7 +182,7 @@ public: */ virtual MapSector * emergeSector(v2s16 p){ return NULL; } virtual MapSector * emergeSector(v2s16 p, - core::map &changed_blocks){ return NULL; } + std::map &changed_blocks){ return NULL; } // Returns InvalidPositionException if not found MapBlock * getBlockNoCreate(v3s16 p); @@ -212,42 +208,42 @@ public: MapNode getNodeNoEx(v3s16 p); void unspreadLight(enum LightBank bank, - core::map & from_nodes, - core::map & light_sources, - core::map & modified_blocks); + std::map & from_nodes, + std::set & light_sources, + std::map & modified_blocks); void unLightNeighbors(enum LightBank bank, v3s16 pos, u8 lightwas, - core::map & light_sources, - core::map & modified_blocks); + std::set & light_sources, + std::map & modified_blocks); void spreadLight(enum LightBank bank, - core::map & from_nodes, - core::map & modified_blocks); + std::set & from_nodes, + std::map & modified_blocks); void lightNeighbors(enum LightBank bank, v3s16 pos, - core::map & modified_blocks); + std::map & modified_blocks); v3s16 getBrightestNeighbour(enum LightBank bank, v3s16 p); s16 propagateSunlight(v3s16 start, - core::map & modified_blocks); + std::map & modified_blocks); void updateLighting(enum LightBank bank, - core::map & a_blocks, - core::map & modified_blocks); + std::map & a_blocks, + std::map & modified_blocks); - void updateLighting(core::map & a_blocks, - core::map & modified_blocks); + void updateLighting(std::map & a_blocks, + std::map & modified_blocks); /* These handle lighting but not faces. */ void addNodeAndUpdate(v3s16 p, MapNode n, - core::map &modified_blocks); + std::map &modified_blocks); void removeNodeAndUpdate(v3s16 p, - core::map &modified_blocks); + std::map &modified_blocks); /* Wrappers for the latter ones. @@ -281,12 +277,12 @@ public: Saves modified blocks before unloading on MAPTYPE_SERVER. */ void timerUpdate(float dtime, float unload_timeout, - core::list *unloaded_blocks=NULL); + std::list *unloaded_blocks=NULL); // Deletes sectors and their blocks from memory // Takes cache into account // If deleted sector is in sector cache, clears cache - void deleteSectors(core::list &list); + void deleteSectors(std::list &list); #if 0 /* @@ -301,8 +297,8 @@ public: // For debug printing. Prints "Map: ", "ServerMap: " or "ClientMap: " virtual void PrintInfo(std::ostream &out); - void transformLiquids(core::map & modified_blocks); - void transformLiquidsFinite(core::map & modified_blocks); + void transformLiquids(std::map & modified_blocks); + void transformLiquidsFinite(std::map & modified_blocks); /* Node metadata @@ -325,7 +321,7 @@ public: /* Misc. */ - core::map *getSectorsPtr(){return &m_sectors;} + std::map *getSectorsPtr(){return &m_sectors;} /* Variables @@ -340,9 +336,9 @@ protected: IGameDef *m_gamedef; - core::map m_event_receivers; + std::set m_event_receivers; - core::map m_sectors; + std::map m_sectors; // Be sure to set this to NULL when the cached sector is deleted MapSector *m_sector_cache; @@ -385,13 +381,7 @@ public: */ bool initBlockMake(BlockMakeData *data, v3s16 blockpos); MapBlock *finishBlockMake(BlockMakeData *data, - core::map &changed_blocks); - - // A non-threaded wrapper to the above - DEFUNCT -/* MapBlock * generateBlock( - v3s16 p, - core::map &modified_blocks - );*/ + std::map &changed_blocks); /* Get a block from somewhere. @@ -444,9 +434,7 @@ public: void save(ModifiedState save_level); //void loadAll(); - - void listAllLoadableBlocks(core::list &dst); - + void listAllLoadableBlocks(std::list &dst); // Saves map seed and possibly other stuff void saveMapMeta(); void loadMapMeta(); @@ -538,15 +526,15 @@ public: virtual void emerge(VoxelArea a, s32 caller_id=-1); - void blitBack(core::map & modified_blocks); - + void blitBack(std::map & modified_blocks); + +protected: + Map *m_map; /* key = blockpos value = flags describing the block */ - core::map m_loaded_blocks; -protected: - Map *m_map; + std::map m_loaded_blocks; }; class ManualMapVoxelManipulator : public MapVoxelManipulator @@ -563,7 +551,7 @@ public: void initialEmerge(v3s16 blockpos_min, v3s16 blockpos_max); // This is much faster with big chunks of generated data - void blitBackAll(core::map * modified_blocks); + void blitBackAll(std::map * modified_blocks); protected: bool m_create_area; diff --git a/src/mapblock.cpp b/src/mapblock.cpp index a6e9b3951..dd95ab77f 100644 --- a/src/mapblock.cpp +++ b/src/mapblock.cpp @@ -168,7 +168,7 @@ MapNode MapBlock::getNodeParentNoEx(v3s16 p) if black_air_left!=NULL, it is set to true if non-sunlighted air is left in block. */ -bool MapBlock::propagateSunlight(core::map & light_sources, +bool MapBlock::propagateSunlight(std::set & light_sources, bool remove_light, bool *black_air_left) { INodeDefManager *nodemgr = m_gamedef->ndef(); @@ -287,7 +287,7 @@ bool MapBlock::propagateSunlight(core::map & light_sources, if(diminish_light(current_light) != 0) { - light_sources.insert(pos_relative + pos, true); + light_sources.insert(pos_relative + pos); } if(current_light == 0 && stopped_to_solid_object) diff --git a/src/mapblock.h b/src/mapblock.h index 692b54318..05bb944a6 100644 --- a/src/mapblock.h +++ b/src/mapblock.h @@ -23,6 +23,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include #include #include +#include #include "debug.h" #include "irrlichttypes.h" #include "irr_v3d.h" @@ -352,7 +353,7 @@ public: } // See comments in mapblock.cpp - bool propagateSunlight(core::map & light_sources, + bool propagateSunlight(std::set & light_sources, bool remove_light=false, bool *black_air_left=NULL); // Copies data to VoxelManipulator to getPosRelative() diff --git a/src/mapblock_mesh.cpp b/src/mapblock_mesh.cpp index f4d57922a..d098065f8 100644 --- a/src/mapblock_mesh.cpp +++ b/src/mapblock_mesh.cpp @@ -445,7 +445,7 @@ struct FastFace }; static void makeFastFace(TileSpec tile, u16 li0, u16 li1, u16 li2, u16 li3, - v3f p, v3s16 dir, v3f scale, u8 light_source, core::array &dest) + v3f p, v3s16 dir, v3f scale, u8 light_source, std::vector &dest) { FastFace face; @@ -745,7 +745,7 @@ static void updateFastFaceRow( v3f translate_dir_f, v3s16 face_dir, v3f face_dir_f, - core::array &dest) + std::vector &dest) { v3s16 p = startpos; @@ -897,7 +897,7 @@ static void updateFastFaceRow( } static void updateAllFastFaceRows(MeshMakeData *data, - core::array &dest) + std::vector &dest) { /* Go through every y,z and get top(y+) faces in rows of x+ @@ -962,7 +962,7 @@ MapBlockMesh::MapBlockMesh(MeshMakeData *data): // 24-155ms for MAP_BLOCKSIZE=32 (NOTE: probably outdated) //TimeTaker timer1("MapBlockMesh()"); - core::array fastfaces_new; + std::vector fastfaces_new; /* We are including the faces of the trailing edges of the block. @@ -1124,8 +1124,8 @@ MapBlockMesh::MapBlockMesh(MeshMakeData *data): m_mesh->addMeshBuffer(buf); // Mesh grabbed it buf->drop(); - buf->append(p.vertices.pointer(), p.vertices.size(), - p.indices.pointer(), p.indices.size()); + buf->append(&p.vertices[0], p.vertices.size(), + &p.indices[0], p.indices.size()); } /* diff --git a/src/mapblock_mesh.h b/src/mapblock_mesh.h index 5b33990c6..c75984021 100644 --- a/src/mapblock_mesh.h +++ b/src/mapblock_mesh.h @@ -143,13 +143,13 @@ private: struct PreMeshBuffer { TileSpec tile; - core::array indices; - core::array vertices; + std::vector indices; + std::vector vertices; }; struct MeshCollector { - core::array prebuffers; + std::vector prebuffers; void append(const TileSpec &material, const video::S3DVertex *vertices, u32 numVertices, diff --git a/src/mapgen.cpp b/src/mapgen.cpp index 4be47689b..1c59213ba 100644 --- a/src/mapgen.cpp +++ b/src/mapgen.cpp @@ -2275,8 +2275,8 @@ void make_block(BlockMakeData *data) { enum LightBank bank = banks[i]; - core::map light_sources; - core::map unlight_from; + std::set light_sources; + std::map unlight_from; voxalgo::clearLightAndCollectSources(vmanip, a, bank, ndef, light_sources, unlight_from); diff --git a/src/mapgen_v6.cpp b/src/mapgen_v6.cpp index bf12f3099..f4366c154 100644 --- a/src/mapgen_v6.cpp +++ b/src/mapgen_v6.cpp @@ -1422,8 +1422,8 @@ void MapgenV6::makeChunk(BlockMakeData *data) { enum LightBank bank = banks[i]; - core::map light_sources; - core::map unlight_from; + std::set light_sources; + std::map unlight_from; voxalgo::clearLightAndCollectSources(vmanip, a, bank, ndef, light_sources, unlight_from); diff --git a/src/mapsector.cpp b/src/mapsector.cpp index 108effa79..ebb050ec3 100644 --- a/src/mapsector.cpp +++ b/src/mapsector.cpp @@ -45,10 +45,10 @@ void MapSector::deleteBlocks() m_block_cache = NULL; // Delete all - core::map::Iterator i = m_blocks.getIterator(); - for(; i.atEnd() == false; i++) + for(std::map::iterator i = m_blocks.begin(); + i != m_blocks.end(); ++i) { - delete i.getNode()->getValue(); + delete i->second; } // Clear container @@ -64,14 +64,14 @@ MapBlock * MapSector::getBlockBuffered(s16 y) } // If block doesn't exist, return NULL - core::map::Node *n = m_blocks.find(y); - if(n == NULL) + std::map::iterator n = m_blocks.find(y); + if(n == m_blocks.end()) { block = NULL; } // If block exists, return it else{ - block = n->getValue(); + block = n->second; } // Cache the last result @@ -101,7 +101,7 @@ MapBlock * MapSector::createBlankBlock(s16 y) { MapBlock *block = createBlankBlockNoInsert(y); - m_blocks.insert(y, block); + m_blocks[y] = block; return block; } @@ -119,7 +119,7 @@ void MapSector::insertBlock(MapBlock *block) assert(p2d == m_pos); // Insert into container - m_blocks.insert(block_y, block); + m_blocks[block_y] = block; } void MapSector::deleteBlock(MapBlock *block) @@ -130,23 +130,18 @@ void MapSector::deleteBlock(MapBlock *block) m_block_cache = NULL; // Remove from container - m_blocks.remove(block_y); + m_blocks.erase(block_y); // Delete delete block; } -void MapSector::getBlocks(core::list &dest) +void MapSector::getBlocks(std::list &dest) { - core::list ref_list; - - core::map::Iterator bi; - - bi = m_blocks.getIterator(); - for(; bi.atEnd() == false; bi++) + for(std::map::iterator bi = m_blocks.begin(); + bi != m_blocks.end(); ++bi) { - MapBlock *b = bi.getNode()->getValue(); - dest.push_back(b); + dest.push_back(bi->second); } } @@ -189,7 +184,7 @@ ServerMapSector* ServerMapSector::deSerialize( std::istream &is, Map *parent, v2s16 p2d, - core::map & sectors, + std::map & sectors, IGameDef *gamedef ) { @@ -219,22 +214,22 @@ ServerMapSector* ServerMapSector::deSerialize( ServerMapSector *sector = NULL; - core::map::Node *n = sectors.find(p2d); + std::map::iterator n = sectors.find(p2d); - if(n != NULL) + if(n != sectors.end()) { dstream<<"WARNING: deSerializing existent sectors not supported " "at the moment, because code hasn't been tested." <getValue(); + MapSector *sector = n->second; assert(sector->getId() == MAPSECTOR_SERVER); return (ServerMapSector*)sector; } else { sector = new ServerMapSector(parent, p2d, gamedef); - sectors.insert(p2d, sector); + sectors[p2d] = sector; } /* diff --git a/src/mapsector.h b/src/mapsector.h index 88fc76b57..4f2b3f31f 100644 --- a/src/mapsector.h +++ b/src/mapsector.h @@ -24,6 +24,8 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "irrlichttypes_bloated.h" #include "exceptions.h" #include +#include +#include class MapBlock; class Map; @@ -60,7 +62,7 @@ public: void deleteBlock(MapBlock *block); - void getBlocks(core::list &dest); + void getBlocks(std::list &dest); // Always false at the moment, because sector contains no metadata. bool differs_from_disk; @@ -68,7 +70,7 @@ public: protected: // The pile of MapBlocks - core::map m_blocks; + std::map m_blocks; Map *m_parent; // Position on parent (in MapBlock widths) @@ -110,7 +112,7 @@ public: std::istream &is, Map *parent, v2s16 p2d, - core::map & sectors, + std::map & sectors, IGameDef *gamedef ); diff --git a/src/mods.h b/src/mods.h index 9761a9103..32bcfb471 100644 --- a/src/mods.h +++ b/src/mods.h @@ -28,6 +28,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include #include #include +#include class ModError : public std::exception { @@ -68,7 +69,6 @@ struct ModSpec {} }; - std::map getModsInPath(std::string path); // expands modpack contents, but does not replace them. @@ -140,6 +140,4 @@ private: }; - #endif - diff --git a/src/object_properties.h b/src/object_properties.h index bde38bd66..eeb397efa 100644 --- a/src/object_properties.h +++ b/src/object_properties.h @@ -24,6 +24,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "irrlichttypes_bloated.h" #include #include +#include struct ObjectProperties { @@ -35,8 +36,8 @@ struct ObjectProperties std::string visual; std::string mesh; v2f visual_size; - core::array textures; - core::array colors; + std::vector textures; + std::vector colors; v2s16 spritediv; v2s16 initial_sprite_basepos; bool is_visible; diff --git a/src/profiler.h b/src/profiler.h index b9fa22485..56b026880 100644 --- a/src/profiler.h +++ b/src/profiler.h @@ -45,21 +45,21 @@ public: JMutexAutoLock lock(m_mutex); { /* No average shall have been used; mark add used as -2 */ - core::map::Node *n = m_avgcounts.find(name); - if(n == NULL) + std::map::iterator n = m_avgcounts.find(name); + if(n == m_avgcounts.end()) m_avgcounts[name] = -2; else{ - if(n->getValue() == -1) - n->setValue(-2); - assert(n->getValue() == -2); + if(n->second == -1) + n->second = -2; + assert(n->second == -2); } } { - core::map::Node *n = m_data.find(name); - if(n == NULL) + std::map::iterator n = m_data.find(name); + if(n == m_data.end()) m_data[name] = value; else - n->setValue(n->getValue() + value); + n->second += value; } } @@ -67,35 +67,32 @@ public: { JMutexAutoLock lock(m_mutex); { - core::map::Node *n = m_avgcounts.find(name); - if(n == NULL) + std::map::iterator n = m_avgcounts.find(name); + if(n == m_avgcounts.end()) m_avgcounts[name] = 1; else{ /* No add shall have been used */ - assert(n->getValue() != -2); - if(n->getValue() <= 0) - n->setValue(1); - else - n->setValue(n->getValue() + 1); + assert(n->second != -2); + n->second = std::max(n->second, 0) + 1; } } { - core::map::Node *n = m_data.find(name); - if(n == NULL) + std::map::iterator n = m_data.find(name); + if(n == m_data.end()) m_data[name] = value; else - n->setValue(n->getValue() + value); + n->second += value; } } void clear() { JMutexAutoLock lock(m_mutex); - for(core::map::Iterator - i = m_data.getIterator(); - i.atEnd() == false; i++) + for(std::map::iterator + i = m_data.begin(); + i != m_data.end(); ++i) { - i.getNode()->setValue(0); + i->second = 0; } m_avgcounts.clear(); } @@ -112,9 +109,9 @@ public: u32 minindex, maxindex; paging(m_data.size(), page, pagecount, minindex, maxindex); - for(core::map::Iterator - i = m_data.getIterator(); - i.atEnd() == false; i++) + for(std::map::iterator + i = m_data.begin(); + i != m_data.end(); ++i) { if(maxindex == 0) break; @@ -126,12 +123,12 @@ public: continue; } - std::string name = i.getNode()->getKey(); + std::string name = i->first; int avgcount = 1; - core::map::Node *n = m_avgcounts.find(name); - if(n){ - if(n->getValue() >= 1) - avgcount = n->getValue(); + std::map::iterator n = m_avgcounts.find(name); + if(n != m_avgcounts.end()){ + if(n->second >= 1) + avgcount = n->second; } o<<" "<getValue() / avgcount); + o<<(i->second / avgcount); o< m_data; - core::map m_avgcounts; + std::map m_data; + std::map m_avgcounts; std::map m_graphvalues; }; diff --git a/src/scriptapi.cpp b/src/scriptapi.cpp index 074a2eb0d..04af4eb22 100644 --- a/src/scriptapi.cpp +++ b/src/scriptapi.cpp @@ -895,24 +895,24 @@ static int l_get_modpath(lua_State *L) static int l_get_modnames(lua_State *L) { // Get a list of mods - core::list mods_unsorted, mods_sorted; + std::list mods_unsorted, mods_sorted; get_server(L)->getModNames(mods_unsorted); // Take unsorted items from mods_unsorted and sort them into // mods_sorted; not great performance but the number of mods on a // server will likely be small. - for(core::list::Iterator i = mods_unsorted.begin(); - i != mods_unsorted.end(); i++) + for(std::list::iterator i = mods_unsorted.begin(); + i != mods_unsorted.end(); ++i) { bool added = false; - for(core::list::Iterator x = mods_sorted.begin(); - x != mods_unsorted.end(); x++) + for(std::list::iterator x = mods_sorted.begin(); + x != mods_unsorted.end(); ++x) { // I doubt anybody using Minetest will be using // anything not ASCII based :) if((*i).compare(*x) <= 0) { - mods_sorted.insert_before(x, *i); + mods_sorted.insert(x, *i); added = true; break; } @@ -929,7 +929,7 @@ static int l_get_modnames(lua_State *L) // Package them up for Lua lua_newtable(L); int new_table = lua_gettop(L); - core::list::Iterator i = mods_sorted.begin(); + std::list::iterator i = mods_sorted.begin(); while(i != mods_sorted.end()) { lua_pushvalue(L, insertion_func); @@ -939,7 +939,7 @@ static int l_get_modnames(lua_State *L) { script_error(L, "error: %s", lua_tostring(L, -1)); } - i++; + ++i; } return 1; } diff --git a/src/scriptapi_env.cpp b/src/scriptapi_env.cpp index d54a6ce01..4e068e377 100644 --- a/src/scriptapi_env.cpp +++ b/src/scriptapi_env.cpp @@ -532,10 +532,10 @@ int EnvRef::l_find_node_near(lua_State *L) } for(int d=1; d<=radius; d++){ - core::list list; + std::list list; getFacePositions(list, d); - for(core::list::Iterator i = list.begin(); - i != list.end(); i++){ + for(std::list::iterator i = list.begin(); + i != list.end(); ++i){ v3s16 p = pos + (*i); content_t c = env->getMap().getNodeNoEx(p).getContent(); if(filter.count(c) != 0){ diff --git a/src/server.cpp b/src/server.cpp index 41a7a4289..d699dc9d2 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -126,7 +126,7 @@ v3f ServerSoundParams::getPos(ServerEnvironment *env, bool *pos_exists) const } void RemoteClient::GetNextBlocks(Server *server, float dtime, - core::array &dest) + std::vector &dest) { DSTACK(__FUNCTION_NAME); @@ -274,11 +274,11 @@ void RemoteClient::GetNextBlocks(Server *server, float dtime, Get the border/face dot coordinates of a "d-radiused" box */ - core::list list; + std::list list; getFacePositions(list, d); - core::list::Iterator li; - for(li=list.begin(); li!=list.end(); li++) + std::list::iterator li; + for(li=list.begin(); li!=list.end(); ++li) { v3s16 p = *li + center; @@ -305,7 +305,7 @@ void RemoteClient::GetNextBlocks(Server *server, float dtime, } // Don't send blocks that are currently being transferred - if(m_blocks_sending.find(p) != NULL) + if(m_blocks_sending.find(p) != m_blocks_sending.end()) continue; /* @@ -382,7 +382,7 @@ void RemoteClient::GetNextBlocks(Server *server, float dtime, Don't send already sent blocks */ { - if(m_blocks_sent.find(p) != NULL) + if(m_blocks_sent.find(p) != m_blocks_sent.end()) { continue; } @@ -554,21 +554,21 @@ queue_full_break: void RemoteClient::GotBlock(v3s16 p) { - if(m_blocks_sending.find(p) != NULL) - m_blocks_sending.remove(p); + if(m_blocks_sending.find(p) != m_blocks_sending.end()) + m_blocks_sending.erase(p); else { /*infostream<<"RemoteClient::GotBlock(): Didn't find in" " m_blocks_sending"< &blocks) +void RemoteClient::SetBlocksNotSent(std::map &blocks) { m_nearest_unsent_d = 0; - for(core::map::Iterator - i = blocks.getIterator(); - i.atEnd()==false; i++) + for(std::map::iterator + i = blocks.begin(); + i != blocks.end(); ++i) { - v3s16 p = i.getNode()->getKey(); + v3s16 p = i->first; - if(m_blocks_sending.find(p) != NULL) - m_blocks_sending.remove(p); - if(m_blocks_sent.find(p) != NULL) - m_blocks_sent.remove(p); + if(m_blocks_sending.find(p) != m_blocks_sending.end()) + m_blocks_sending.erase(p); + if(m_blocks_sent.find(p) != m_blocks_sent.end()) + m_blocks_sent.erase(p); } } @@ -854,13 +854,13 @@ Server::~Server() /* Send the message to clients */ - for(core::map::Iterator - i = m_clients.getIterator(); - i.atEnd() == false; i++) + for(std::map::iterator + i = m_clients.begin(); + i != m_clients.end(); ++i) { // Get client and check that it is valid - RemoteClient *client = i.getNode()->getValue(); - assert(client->peer_id == i.getNode()->getKey()); + RemoteClient *client = i->second; + assert(client->peer_id == i->first); if(client->serialization_version == SER_FMT_VER_INVALID) continue; @@ -909,13 +909,13 @@ Server::~Server() { JMutexAutoLock clientslock(m_con_mutex); - for(core::map::Iterator - i = m_clients.getIterator(); - i.atEnd() == false; i++) + for(std::map::iterator + i = m_clients.begin(); + i != m_clients.end(); ++i) { // Delete client - delete i.getNode()->getValue(); + delete i->second; } } @@ -1073,11 +1073,11 @@ void Server::AsyncRunStep() //JMutexAutoLock envlock(m_env_mutex); JMutexAutoLock conlock(m_con_mutex); - for(core::map::Iterator - i = m_clients.getIterator(); - i.atEnd() == false; i++) + for(std::map::iterator + i = m_clients.begin(); + i != m_clients.end(); ++i) { - RemoteClient *client = i.getNode()->getValue(); + RemoteClient *client = i->second; SharedBuffer data = makePacket_TOCLIENT_TIME_OF_DAY( m_env->getTimeOfDay(), g_settings->getFloat("time_speed")); // Send as reliable @@ -1117,11 +1117,11 @@ void Server::AsyncRunStep() ScopeProfiler sp(g_profiler, "Server: handle players"); - for(core::map::Iterator - i = m_clients.getIterator(); - i.atEnd() == false; i++) + for(std::map::iterator + i = m_clients.begin(); + i != m_clients.end(); ++i) { - RemoteClient *client = i.getNode()->getValue(); + RemoteClient *client = i->second; PlayerSAO *playersao = getPlayerSAO(client->peer_id); if(playersao == NULL) continue; @@ -1161,7 +1161,7 @@ void Server::AsyncRunStep() ScopeProfiler sp(g_profiler, "Server: liquid transform"); - core::map modified_blocks; + std::map modified_blocks; m_env->getMap().transformLiquids(modified_blocks); #if 0 /* @@ -1186,11 +1186,11 @@ void Server::AsyncRunStep() JMutexAutoLock lock2(m_con_mutex); - for(core::map::Iterator - i = m_clients.getIterator(); - i.atEnd() == false; i++) + for(std::map::iterator + i = m_clients.begin(); + i != m_clients.end(); ++i) { - RemoteClient *client = i.getNode()->getValue(); + RemoteClient *client = i->second; if(modified_blocks.size() > 0) { @@ -1212,12 +1212,12 @@ void Server::AsyncRunStep() m_clients_number = 0; if(m_clients.size() != 0) infostream<<"Players:"<::Iterator - i = m_clients.getIterator(); - i.atEnd() == false; i++) + for(std::map::iterator + i = m_clients.begin(); + i != m_clients.end(); ++i) { //u16 peer_id = i.getNode()->getKey(); - RemoteClient *client = i.getNode()->getValue(); + RemoteClient *client = i->second; Player *player = m_env->getPlayer(client->peer_id); if(player==NULL) continue; @@ -1259,11 +1259,11 @@ void Server::AsyncRunStep() s16 radius = g_settings->getS16("active_object_send_range_blocks"); radius *= MAP_BLOCKSIZE; - for(core::map::Iterator - i = m_clients.getIterator(); - i.atEnd() == false; i++) + for(std::map::iterator + i = m_clients.begin(); + i != m_clients.end(); ++i) { - RemoteClient *client = i.getNode()->getValue(); + RemoteClient *client = i->second; // If definitions and textures have not been sent, don't // send objects either @@ -1281,8 +1281,8 @@ void Server::AsyncRunStep() } v3s16 pos = floatToInt(player->getPosition(), BS); - core::map removed_objects; - core::map added_objects; + std::set removed_objects; + std::set added_objects; m_env->getRemovedActiveObjects(pos, radius, client->m_known_objects, removed_objects); m_env->getAddedActiveObjects(pos, radius, @@ -1302,20 +1302,20 @@ void Server::AsyncRunStep() // Handle removed objects writeU16((u8*)buf, removed_objects.size()); data_buffer.append(buf, 2); - for(core::map::Iterator - i = removed_objects.getIterator(); - i.atEnd()==false; i++) + for(std::set::iterator + i = removed_objects.begin(); + i != removed_objects.end(); ++i) { // Get object - u16 id = i.getNode()->getKey(); + u16 id = *i; ServerActiveObject* obj = m_env->getActiveObject(id); // Add to data buffer for sending - writeU16((u8*)buf, i.getNode()->getKey()); + writeU16((u8*)buf, id); data_buffer.append(buf, 2); // Remove from known objects - client->m_known_objects.remove(i.getNode()->getKey()); + client->m_known_objects.erase(id); if(obj && obj->m_known_by_count > 0) obj->m_known_by_count--; @@ -1324,12 +1324,12 @@ void Server::AsyncRunStep() // Handle added objects writeU16((u8*)buf, added_objects.size()); data_buffer.append(buf, 2); - for(core::map::Iterator - i = added_objects.getIterator(); - i.atEnd()==false; i++) + for(std::set::iterator + i = added_objects.begin(); + i != added_objects.end(); ++i) { // Get object - u16 id = i.getNode()->getKey(); + u16 id = *i; ServerActiveObject* obj = m_env->getActiveObject(id); // Get object type @@ -1353,7 +1353,7 @@ void Server::AsyncRunStep() data_buffer.append(serializeLongString("")); // Add to known objects - client->m_known_objects.insert(i.getNode()->getKey(), false); + client->m_known_objects.insert(id); if(obj) obj->m_known_by_count++; @@ -1412,7 +1412,7 @@ void Server::AsyncRunStep() // Key = object id // Value = data sent by object - core::map* > buffered_messages; + std::map* > buffered_messages; // Get active object messages from environment for(;;) @@ -1421,43 +1421,43 @@ void Server::AsyncRunStep() if(aom.id == 0) break; - core::list* message_list = NULL; - core::map* >::Node *n; + std::list* message_list = NULL; + std::map* >::iterator n; n = buffered_messages.find(aom.id); - if(n == NULL) + if(n == buffered_messages.end()) { - message_list = new core::list; - buffered_messages.insert(aom.id, message_list); + message_list = new std::list; + buffered_messages[aom.id] = message_list; } else { - message_list = n->getValue(); + message_list = n->second; } message_list->push_back(aom); } // Route data to every client - for(core::map::Iterator - i = m_clients.getIterator(); - i.atEnd()==false; i++) + for(std::map::iterator + i = m_clients.begin(); + i != m_clients.end(); ++i) { - RemoteClient *client = i.getNode()->getValue(); + RemoteClient *client = i->second; std::string reliable_data; std::string unreliable_data; // Go through all objects in message buffer - for(core::map* >::Iterator - j = buffered_messages.getIterator(); - j.atEnd()==false; j++) + for(std::map* >::iterator + j = buffered_messages.begin(); + j != buffered_messages.end(); ++j) { // If object is not known by client, skip it - u16 id = j.getNode()->getKey(); - if(client->m_known_objects.find(id) == NULL) + u16 id = j->first; + if(client->m_known_objects.find(id) == client->m_known_objects.end()) continue; // Get message list of object - core::list* list = j.getNode()->getValue(); + std::list* list = j->second; // Go through every message - for(core::list::Iterator - k = list->begin(); k != list->end(); k++) + for(std::list::iterator + k = list->begin(); k != list->end(); ++k) { // Compose the full new data with header ActiveObjectMessage aom = *k; @@ -1508,11 +1508,11 @@ void Server::AsyncRunStep() } // Clear buffered_messages - for(core::map* >::Iterator - i = buffered_messages.getIterator(); - i.atEnd()==false; i++) + for(std::map* >::iterator + i = buffered_messages.begin(); + i != buffered_messages.end(); ++i) { - delete i.getNode()->getValue(); + delete i->second; } } @@ -1546,7 +1546,7 @@ void Server::AsyncRunStep() // Players far away from the change are stored here. // Instead of sending the changes, MapBlocks are set not sent // for them. - core::list far_players; + std::list far_players; if(event->type == MEET_ADDNODE) { @@ -1580,12 +1580,11 @@ void Server::AsyncRunStep() { infostream<<"Server: MEET_OTHER"<::Iterator - i = event->modified_blocks.getIterator(); - i.atEnd()==false; i++) + for(std::set::iterator + i = event->modified_blocks.begin(); + i != event->modified_blocks.end(); ++i) { - v3s16 p = i.getNode()->getKey(); - setBlockNotSent(p); + setBlockNotSent(*i); } } else @@ -1601,19 +1600,18 @@ void Server::AsyncRunStep() if(far_players.size() > 0) { // Convert list format to that wanted by SetBlocksNotSent - core::map modified_blocks2; - for(core::map::Iterator - i = event->modified_blocks.getIterator(); - i.atEnd()==false; i++) + std::map modified_blocks2; + for(std::set::iterator + i = event->modified_blocks.begin(); + i != event->modified_blocks.end(); ++i) { - v3s16 p = i.getNode()->getKey(); - modified_blocks2.insert(p, - m_env->getMap().getBlockNoCreateNoEx(p)); + modified_blocks2[*i] = + m_env->getMap().getBlockNoCreateNoEx(*i); } // Set blocks not sent - for(core::list::Iterator + for(std::list::iterator i = far_players.begin(); - i != far_players.end(); i++) + i != far_players.end(); ++i) { u16 peer_id = *i; RemoteClient *client = getClient(peer_id); @@ -1792,7 +1790,7 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id) u8 client_max = data[2]; u8 our_max = SER_FMT_VER_HIGHEST; // Use the highest version supported by both - u8 deployed = core::min_(client_max, our_max); + u8 deployed = std::min(client_max, our_max); // If it's lower than the lowest supported, give up. if(deployed < SER_FMT_VER_LOWEST) deployed = SER_FMT_VER_INVALID; @@ -2143,12 +2141,12 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id) */ { std::ostringstream os(std::ios_base::binary); - for(core::map::Iterator - i = m_clients.getIterator(); - i.atEnd() == false; i++) + for(std::map::iterator + i = m_clients.begin(); + i != m_clients.end(); ++i) { - RemoteClient *client = i.getNode()->getValue(); - assert(client->peer_id == i.getNode()->getKey()); + RemoteClient *client = i->second; + assert(client->peer_id == i->first); if(client->serialization_version == SER_FMT_VER_INVALID) continue; // Get player @@ -2520,13 +2518,13 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id) /* Send the message to clients */ - for(core::map::Iterator - i = m_clients.getIterator(); - i.atEnd() == false; i++) + for(std::map::iterator + i = m_clients.begin(); + i != m_clients.end(); ++i) { // Get client and check that it is valid - RemoteClient *client = i.getNode()->getValue(); - assert(client->peer_id == i.getNode()->getKey()); + RemoteClient *client = i->second; + assert(client->peer_id == i->first); if(client->serialization_version == SER_FMT_VER_INVALID) continue; @@ -2651,7 +2649,7 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id) std::string datastring((char*)&data[2], datasize-2); std::istringstream is(datastring, std::ios_base::binary); - core::list tosend; + std::list tosend; u16 numfiles = readU16(is); infostream<<"Sending "< Server::getPlayerInfo() +std::list Server::getPlayerInfo() { DSTACK(__FUNCTION_NAME); JMutexAutoLock envlock(m_env_mutex); JMutexAutoLock conlock(m_con_mutex); - core::list list; + std::list list; - core::list players = m_env->getPlayers(); + std::list players = m_env->getPlayers(); - core::list::Iterator i; + std::list::iterator i; for(i = players.begin(); - i != players.end(); i++) + i != players.end(); ++i) { PlayerInfo info; @@ -3470,13 +3468,13 @@ void Server::SendShowFormspecMessage(u16 peer_id, const std::string formspec, co void Server::BroadcastChatMessage(const std::wstring &message) { - for(core::map::Iterator - i = m_clients.getIterator(); - i.atEnd() == false; i++) + for(std::map::iterator + i = m_clients.begin(); + i != m_clients.end(); ++i) { // Get client and check that it is valid - RemoteClient *client = i.getNode()->getValue(); - assert(client->peer_id == i.getNode()->getKey()); + RemoteClient *client = i->second; + assert(client->peer_id == i->first); if(client->serialization_version == SER_FMT_VER_INVALID) continue; @@ -3595,10 +3593,10 @@ s32 Server::playSound(const SimpleSoundSpec &spec, } else { - for(core::map::Iterator - i = m_clients.getIterator(); i.atEnd() == false; i++) + for(std::map::iterator + i = m_clients.begin(); i != m_clients.end(); ++i) { - RemoteClient *client = i.getNode()->getValue(); + RemoteClient *client = i->second; Player *player = m_env->getPlayer(client->peer_id); if(!player) continue; @@ -3668,7 +3666,7 @@ void Server::stopSound(s32 handle) } void Server::sendRemoveNode(v3s16 p, u16 ignore_id, - core::list *far_players, float far_d_nodes) + std::list *far_players, float far_d_nodes) { float maxd = far_d_nodes*BS; v3f p_f = intToFloat(p, BS); @@ -3681,13 +3679,13 @@ void Server::sendRemoveNode(v3s16 p, u16 ignore_id, writeS16(&reply[4], p.Y); writeS16(&reply[6], p.Z); - for(core::map::Iterator - i = m_clients.getIterator(); - i.atEnd() == false; i++) + for(std::map::iterator + i = m_clients.begin(); + i != m_clients.end(); ++i) { // Get client and check that it is valid - RemoteClient *client = i.getNode()->getValue(); - assert(client->peer_id == i.getNode()->getKey()); + RemoteClient *client = i->second; + assert(client->peer_id == i->first); if(client->serialization_version == SER_FMT_VER_INVALID) continue; @@ -3717,18 +3715,18 @@ void Server::sendRemoveNode(v3s16 p, u16 ignore_id, } void Server::sendAddNode(v3s16 p, MapNode n, u16 ignore_id, - core::list *far_players, float far_d_nodes) + std::list *far_players, float far_d_nodes) { float maxd = far_d_nodes*BS; v3f p_f = intToFloat(p, BS); - for(core::map::Iterator - i = m_clients.getIterator(); - i.atEnd() == false; i++) + for(std::map::iterator + i = m_clients.begin(); + i != m_clients.end(); ++i) { // Get client and check that it is valid - RemoteClient *client = i.getNode()->getValue(); - assert(client->peer_id == i.getNode()->getKey()); + RemoteClient *client = i->second; + assert(client->peer_id == i->first); if(client->serialization_version == SER_FMT_VER_INVALID) continue; @@ -3768,11 +3766,11 @@ void Server::sendAddNode(v3s16 p, MapNode n, u16 ignore_id, void Server::setBlockNotSent(v3s16 p) { - for(core::map::Iterator - i = m_clients.getIterator(); - i.atEnd()==false; i++) + for(std::map::iterator + i = m_clients.begin(); + i != m_clients.end(); ++i) { - RemoteClient *client = i.getNode()->getValue(); + RemoteClient *client = i->second; client->SetBlockNotSent(p); } } @@ -3839,19 +3837,19 @@ void Server::SendBlocks(float dtime) ScopeProfiler sp(g_profiler, "Server: sel and send blocks to clients"); - core::array queue; + std::vector queue; s32 total_sending = 0; { ScopeProfiler sp(g_profiler, "Server: selecting blocks for sending"); - for(core::map::Iterator - i = m_clients.getIterator(); - i.atEnd() == false; i++) + for(std::map::iterator + i = m_clients.begin(); + i != m_clients.end(); ++i) { - RemoteClient *client = i.getNode()->getValue(); - assert(client->peer_id == i.getNode()->getKey()); + RemoteClient *client = i->second; + assert(client->peer_id == i->first); // If definitions and textures have not been sent, don't // send MapBlocks either @@ -3870,7 +3868,7 @@ void Server::SendBlocks(float dtime) // Sort. // Lowest priority number comes first. // Lowest is most important. - queue.sort(); + std::sort(queue.begin(), queue.end()); for(u32 i=0; i file_announcements; + std::list file_announcements; for(std::map::iterator i = m_media.begin(); i != m_media.end(); i++){ @@ -4043,9 +4041,9 @@ void Server::sendMediaAnnouncement(u16 peer_id) writeU16(os, TOCLIENT_ANNOUNCE_MEDIA); writeU16(os, file_announcements.size()); - for(core::list::Iterator + for(std::list::iterator j = file_announcements.begin(); - j != file_announcements.end(); j++){ + j != file_announcements.end(); ++j){ os<name); os<sha1_digest); } @@ -4074,7 +4072,7 @@ struct SendableMedia }; void Server::sendRequestedMedia(u16 peer_id, - const core::list &tosend) + const std::list &tosend) { DSTACK(__FUNCTION_NAME); @@ -4086,13 +4084,13 @@ void Server::sendRequestedMedia(u16 peer_id, // Put 5kB in one bunch (this is not accurate) u32 bytes_per_bunch = 5000; - core::array< core::list > file_bunches; - file_bunches.push_back(core::list()); + std::vector< std::list > file_bunches; + file_bunches.push_back(std::list()); u32 file_size_bunch_total = 0; - for(core::list::ConstIterator i = tosend.begin(); - i != tosend.end(); i++) + for(std::list::const_iterator i = tosend.begin(); + i != tosend.end(); ++i) { if(m_media.find(i->name) == m_media.end()){ errorstream<<"Server::sendRequestedMedia(): Client asked for " @@ -4138,7 +4136,7 @@ void Server::sendRequestedMedia(u16 peer_id, // Start next bunch if got enough data if(file_size_bunch_total >= bytes_per_bunch){ - file_bunches.push_back(core::list()); + file_bunches.push_back(std::list()); file_size_bunch_total = 0; } @@ -4169,9 +4167,9 @@ void Server::sendRequestedMedia(u16 peer_id, writeU16(os, i); writeU32(os, file_bunches[i].size()); - for(core::list::Iterator + for(std::list::iterator j = file_bunches[i].begin(); - j != file_bunches[i].end(); j++){ + j != file_bunches[i].end(); ++j){ os<name); os<data); } @@ -4212,10 +4210,10 @@ void Server::sendDetachedInventoryToAll(const std::string &name) { DSTACK(__FUNCTION_NAME); - for(core::map::Iterator - i = m_clients.getIterator(); - i.atEnd() == false; i++){ - RemoteClient *client = i.getNode()->getValue(); + for(std::map::iterator + i = m_clients.begin(); + i != m_clients.end(); ++i){ + RemoteClient *client = i->second; sendDetachedInventory(name, client->peer_id); } } @@ -4299,11 +4297,11 @@ RemoteClient* Server::getClient(u16 peer_id) { DSTACK(__FUNCTION_NAME); //JMutexAutoLock lock(m_con_mutex); - core::map::Node *n; + std::map::iterator n; n = m_clients.find(peer_id); // A client should exist for all peers - assert(n != NULL); - return n->getValue(); + assert(n != m_clients.end()); + return n->second; } std::wstring Server::getStatusString() @@ -4315,15 +4313,15 @@ std::wstring Server::getStatusString() // Uptime os<getValue(); - assert(client->peer_id == i.getNode()->getKey()); + RemoteClient *client = i->second; + assert(client->peer_id == i->first); if(client->serialization_version == SER_FMT_VER_INVALID) continue; // Get player @@ -4363,10 +4361,10 @@ bool Server::checkPriv(const std::string &name, const std::string &priv) void Server::reportPrivsModified(const std::string &name) { if(name == ""){ - for(core::map::Iterator - i = m_clients.getIterator(); - i.atEnd() == false; i++){ - RemoteClient *client = i.getNode()->getValue(); + for(std::map::iterator + i = m_clients.begin(); + i != m_clients.end(); ++i){ + RemoteClient *client = i->second; Player *player = m_env->getPlayer(client->peer_id); reportPrivsModified(player->getName()); } @@ -4579,11 +4577,11 @@ const ModSpec* Server::getModSpec(const std::string &modname) } return NULL; } -void Server::getModNames(core::list &modlist) +void Server::getModNames(std::list &modlist) { for(std::vector::iterator i = m_mods.begin(); i != m_mods.end(); i++) { - modlist.push_back((*i).name); + modlist.push_back(i->name); } } std::string Server::getBuiltinLuaPath() @@ -4733,15 +4731,15 @@ void Server::handlePeerChange(PeerChange &c) */ // Error check - core::map::Node *n; + std::map::iterator n; n = m_clients.find(c.peer_id); // The client shouldn't already exist - assert(n == NULL); + assert(n == m_clients.end()); // Create client RemoteClient *client = new RemoteClient(); client->peer_id = c.peer_id; - m_clients.insert(client->peer_id, client); + m_clients[client->peer_id] = client; } // PEER_ADDED else if(c.type == PEER_REMOVED) @@ -4751,22 +4749,22 @@ void Server::handlePeerChange(PeerChange &c) */ // Error check - core::map::Node *n; + std::map::iterator n; n = m_clients.find(c.peer_id); // The client should exist - assert(n != NULL); + assert(n != m_clients.end()); /* Mark objects to be not known by the client */ - RemoteClient *client = n->getValue(); + RemoteClient *client = n->second; // Handle objects - for(core::map::Iterator - i = client->m_known_objects.getIterator(); - i.atEnd()==false; i++) + for(std::set::iterator + i = client->m_known_objects.begin(); + i != client->m_known_objects.end(); ++i) { // Get object - u16 id = i.getNode()->getKey(); + u16 id = *i; ServerActiveObject* obj = m_env->getActiveObject(id); if(obj && obj->m_known_by_count > 0) @@ -4824,12 +4822,12 @@ void Server::handlePeerChange(PeerChange &c) if(player != NULL) { std::ostringstream os(std::ios_base::binary); - for(core::map::Iterator - i = m_clients.getIterator(); - i.atEnd() == false; i++) + for(std::map::iterator + i = m_clients.begin(); + i != m_clients.end(); ++i) { - RemoteClient *client = i.getNode()->getValue(); - assert(client->peer_id == i.getNode()->getKey()); + RemoteClient *client = i->second; + assert(client->peer_id == i->first); if(client->serialization_version == SER_FMT_VER_INVALID) continue; // Get player @@ -4849,7 +4847,7 @@ void Server::handlePeerChange(PeerChange &c) // Delete client delete m_clients[c.peer_id]; - m_clients.remove(c.peer_id); + m_clients.erase(c.peer_id); // Send player info to all remaining clients //SendPlayerInfos(); diff --git a/src/server.h b/src/server.h index d7700791c..63717eaec 100644 --- a/src/server.h +++ b/src/server.h @@ -38,6 +38,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "util/string.h" #include "rollback_interface.h" // Needed for rollbackRevertActions() #include // Needed for rollbackRevertActions() +#include #define PP(x) "("<<(x).X<<","<<(x).Y<<","<<(x).Z<<")" @@ -166,7 +167,7 @@ struct PrioritySortedBlockTransfer pos = a_pos; peer_id = a_peer_id; } - bool operator < (PrioritySortedBlockTransfer &other) + bool operator < (const PrioritySortedBlockTransfer &other) const { return priority < other.priority; } @@ -271,14 +272,14 @@ public: dtime is used for resetting send radius at slow interval */ void GetNextBlocks(Server *server, float dtime, - core::array &dest); + std::vector &dest); void GotBlock(v3s16 p); void SentBlock(v3s16 p); void SetBlockNotSent(v3s16 p); - void SetBlocksNotSent(core::map &blocks); + void SetBlocksNotSent(std::map &blocks); s32 SendingCount() { @@ -314,7 +315,7 @@ public: List of active objects that the client knows of. Value is dummy. */ - core::map m_known_objects; + std::set m_known_objects; private: /* @@ -326,7 +327,7 @@ private: Key is position, value is dummy. No MapBlock* is stored here because the blocks can get deleted. */ - core::map m_blocks_sent; + std::set m_blocks_sent; s16 m_nearest_unsent_d; v3s16 m_last_center; float m_nearest_unsent_reset_timer; @@ -339,7 +340,7 @@ private: Block is removed when GOTBLOCKS is received. Value is time from sending. (not used at the moment) */ - core::map m_blocks_sending; + std::map m_blocks_sending; /* Count of excess GotBlocks(). @@ -381,7 +382,7 @@ public: void Receive(); void ProcessData(u8 *data, u32 datasize, u16 peer_id); - core::list getPlayerInfo(); + std::list getPlayerInfo(); // Environment must be locked when called void setTimeOfDay(u32 time) @@ -494,7 +495,7 @@ public: IWritableCraftDefManager* getWritableCraftDefManager(); const ModSpec* getModSpec(const std::string &modname); - void getModNames(core::list &modlist); + void getModNames(std::list &modlist); std::string getBuiltinLuaPath(); std::string getWorldPath(){ return m_path_world; } @@ -553,9 +554,9 @@ private: */ // Envlock and conlock should be locked when calling these void sendRemoveNode(v3s16 p, u16 ignore_id=0, - core::list *far_players=NULL, float far_d_nodes=100); + std::list *far_players=NULL, float far_d_nodes=100); void sendAddNode(v3s16 p, MapNode n, u16 ignore_id=0, - core::list *far_players=NULL, float far_d_nodes=100); + std::list *far_players=NULL, float far_d_nodes=100); void setBlockNotSent(v3s16 p); // Environment and Connection must be locked when called @@ -567,7 +568,7 @@ private: void fillMediaCache(); void sendMediaAnnouncement(u16 peer_id); void sendRequestedMedia(u16 peer_id, - const core::list &tosend); + const std::list &tosend); void sendDetachedInventory(const std::string &name, u16 peer_id); void sendDetachedInventoryToAll(const std::string &name); @@ -655,7 +656,7 @@ private: con::Connection m_con; JMutex m_con_mutex; // Connected clients (behind the con mutex) - core::map m_clients; + std::map m_clients; u16 m_clients_number; //for announcing masterserver // Bann checking @@ -735,7 +736,7 @@ private: */ // Mod parent directory paths - core::list m_modspaths; + std::list m_modspaths; bool m_shutdown_requested; diff --git a/src/serverobject.cpp b/src/serverobject.cpp index beb17d31f..95735de17 100644 --- a/src/serverobject.cpp +++ b/src/serverobject.cpp @@ -43,9 +43,9 @@ ServerActiveObject* ServerActiveObject::create(u8 type, const std::string &data) { // Find factory function - core::map::Node *n; + std::map::iterator n; n = m_types.find(type); - if(n == NULL) + if(n == m_types.end()) { // If factory is not found, just return. dstream<<"WARNING: ServerActiveObject: No factory for type=" @@ -53,18 +53,18 @@ ServerActiveObject* ServerActiveObject::create(u8 type, return NULL; } - Factory f = n->getValue(); + Factory f = n->second; ServerActiveObject *object = (*f)(env, pos, data); return object; } void ServerActiveObject::registerType(u16 type, Factory f) { - core::map::Node *n; + std::map::iterator n; n = m_types.find(type); - if(n) + if(n != m_types.end()) return; - m_types.insert(type, f); + m_types[type] = f; } float ServerActiveObject::getMinimumSavedMovement() diff --git a/src/serverobject.h b/src/serverobject.h index 6525270f6..7a5b47bd1 100644 --- a/src/serverobject.h +++ b/src/serverobject.h @@ -235,7 +235,7 @@ protected: private: // Used for creating objects based on type - static core::map m_types; + static std::map m_types; }; #endif diff --git a/src/settings.h b/src/settings.h index 7ac308cc0..0696b8190 100644 --- a/src/settings.h +++ b/src/settings.h @@ -33,6 +33,9 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "log.h" #include "util/string.h" #include "porting.h" +#include +#include +#include enum ValueType { @@ -63,12 +66,12 @@ public: { JMutexAutoLock lock(m_mutex); - for(core::map::Iterator - i = m_settings.getIterator(); - i.atEnd() == false; i++) + for(std::map::iterator + i = m_settings.begin(); + i != m_settings.end(); ++i) { - std::string name = i.getNode()->getKey(); - std::string value = i.getNode()->getValue(); + std::string name = i->first; + std::string value = i->second; os< getNames(){ std::vector names; - for(core::map::Iterator - i = m_settings.getIterator(); - i.atEnd() == false; i++) + for(std::map::iterator + i = m_settings.begin(); + i != m_settings.end(); ++i) { - std::string name = i.getNode()->getKey(); - names.push_back(name); + names.push_back(i->first); } return names; } @@ -89,7 +91,7 @@ public: // remove a setting bool remove(const std::string& name) { - return m_settings.remove(name); + return m_settings.erase(name); } @@ -188,8 +190,8 @@ public: Returns false on EOF */ bool getUpdatedConfigObject(std::istream &is, - core::list &dst, - core::map &updated, + std::list &dst, + std::set &updated, bool &value_changed) { JMutexAutoLock lock(m_mutex); @@ -228,7 +230,7 @@ public: std::string value = sf.next("\n"); value = trim(value); - if(m_settings.find(name)) + if(m_settings.find(name) != m_settings.end()) { std::string newvalue = m_settings[name]; @@ -242,7 +244,7 @@ public: dst.push_back(name + " = " + newvalue + line_end); - updated[name] = true; + updated.insert(name); } else //file contains a setting which is not in m_settings value_changed=true; @@ -260,8 +262,8 @@ public: infostream<<"Updating configuration file: \"" < objects; - core::map updated; + std::list objects; + std::set updated; bool something_actually_changed = false; // Read and modify stuff @@ -286,11 +288,11 @@ public: // If something not yet determined to have been changed, check if // any new stuff was added if(!something_actually_changed){ - for(core::map::Iterator - i = m_settings.getIterator(); - i.atEnd() == false; i++) + for(std::map::iterator + i = m_settings.begin(); + i != m_settings.end(); ++i) { - if(updated.find(i.getNode()->getKey())) + if(updated.find(i->first) != updated.end()) continue; something_actually_changed = true; break; @@ -318,9 +320,9 @@ public: /* Write updated stuff */ - for(core::list::Iterator + for(std::list::iterator i = objects.begin(); - i != objects.end(); i++) + i != objects.end(); ++i) { os<<(*i); } @@ -328,14 +330,14 @@ public: /* Write stuff that was not already in the file */ - for(core::map::Iterator - i = m_settings.getIterator(); - i.atEnd() == false; i++) + for(std::map::iterator + i = m_settings.begin(); + i != m_settings.end(); ++i) { - if(updated.find(i.getNode()->getKey())) + if(updated.find(i->first) != updated.end()) continue; - std::string name = i.getNode()->getKey(); - std::string value = i.getNode()->getValue(); + std::string name = i->first; + std::string value = i->second; infostream<<"Adding \""< &allowed_options) + std::map &allowed_options) { int nonopt_index = 0; int i=1; @@ -379,16 +381,16 @@ public: std::string name = argname.substr(2); - core::map::Node *n; + std::map::iterator n; n = allowed_options.find(name); - if(n == NULL) + if(n == allowed_options.end()) { errorstream<<"Unknown command-line parameter \"" <getValue().type; + ValueType type = n->second.type; std::string value = ""; @@ -444,25 +446,25 @@ public: { JMutexAutoLock lock(m_mutex); - return (m_settings.find(name) || m_defaults.find(name)); + return (m_settings.find(name) != m_settings.end() || m_defaults.find(name) != m_defaults.end()); } std::string get(std::string name) { JMutexAutoLock lock(m_mutex); - core::map::Node *n; + std::map::iterator n; n = m_settings.find(name); - if(n == NULL) + if(n == m_settings.end()) { n = m_defaults.find(name); - if(n == NULL) + if(n == m_defaults.end()) { throw SettingNotFoundException("Setting not found"); } } - return n->getValue(); + return n->second; } bool getBool(std::string name) @@ -919,19 +921,8 @@ fail: if(&other == this) return; - for(core::map::Iterator - i = other.m_settings.getIterator(); - i.atEnd() == false; i++) - { - m_settings[i.getNode()->getKey()] = i.getNode()->getValue(); - } - - for(core::map::Iterator - i = other.m_defaults.getIterator(); - i.atEnd() == false; i++) - { - m_defaults[i.getNode()->getKey()] = i.getNode()->getValue(); - } + m_settings.insert(other.m_settings.begin(), other.m_settings.end()); + m_defaults.insert(other.m_defaults.begin(), other.m_defaults.end()); return; } @@ -944,21 +935,7 @@ fail: if(&other == this) return *this; - for(core::map::Iterator - i = other.m_settings.getIterator(); - i.atEnd() == false; i++) - { - m_settings.insert(i.getNode()->getKey(), - i.getNode()->getValue()); - } - - for(core::map::Iterator - i = other.m_defaults.getIterator(); - i.atEnd() == false; i++) - { - m_defaults.insert(i.getNode()->getKey(), - i.getNode()->getValue()); - } + update(other); return *this; @@ -979,8 +956,8 @@ fail: } private: - core::map m_settings; - core::map m_defaults; + std::map m_settings; + std::map m_defaults; // All methods that access m_settings/m_defaults directly should lock this. JMutex m_mutex; }; diff --git a/src/shader.cpp b/src/shader.cpp index 7e3d16e8b..a224c82bb 100644 --- a/src/shader.cpp +++ b/src/shader.cpp @@ -125,10 +125,10 @@ public: const std::string &filename) { std::string combined = name_of_shader + DIR_DELIM + filename; - core::map::Node *n; + std::map::iterator n; n = m_programs.find(combined); - if(n) - return n->getValue(); + if(n != m_programs.end()) + return n->second; return ""; } // Primarily fetches from cache, secondarily tries to read from filesystem @@ -136,10 +136,10 @@ public: const std::string &filename) { std::string combined = name_of_shader + DIR_DELIM + filename; - core::map::Node *n; + std::map::iterator n; n = m_programs.find(combined); - if(n) - return n->getValue(); + if(n != m_programs.end()) + return n->second; std::string path = getShaderPath(name_of_shader, filename); if(path == ""){ infostream<<"SourceShaderCache::getOrLoad(): No path found for \"" @@ -156,7 +156,7 @@ public: return ""; } private: - core::map m_programs; + std::map m_programs; std::string readFile(const std::string &path) { std::ifstream is(path.c_str(), std::ios::binary); @@ -332,9 +332,9 @@ private: // A shader id is index in this array. // The first position contains a dummy shader. - core::array m_shaderinfo_cache; + std::vector m_shaderinfo_cache; // Maps a shader name to an index in the former. - core::map m_name_to_id; + std::map m_name_to_id; // The two former containers are behind this mutex JMutex m_shaderinfo_cache_mutex; @@ -343,7 +343,7 @@ private: // Global constant setters // TODO: Delete these in the destructor - core::array m_global_setters; + std::vector m_global_setters; }; IWritableShaderSource* createShaderSource(IrrlichtDevice *device) @@ -399,10 +399,10 @@ u32 ShaderSource::getShaderId(const std::string &name) See if shader already exists */ JMutexAutoLock lock(m_shaderinfo_cache_mutex); - core::map::Node *n; + std::map::iterator n; n = m_name_to_id.find(name); - if(n != NULL) - return n->getValue(); + if(n != m_name_to_id.end()) + return n->second; } /* @@ -471,12 +471,12 @@ u32 ShaderSource::getShaderIdDirect(const std::string &name) { JMutexAutoLock lock(m_shaderinfo_cache_mutex); - core::map::Node *n; + std::map::iterator n; n = m_name_to_id.find(name); - if(n != NULL){ + if(n != m_name_to_id.end()){ /*infostream<<"getShaderIdDirect(): \""<getValue(); + return n->second; } } @@ -494,7 +494,7 @@ u32 ShaderSource::getShaderIdDirect(const std::string &name) u32 id = m_shaderinfo_cache.size(); m_shaderinfo_cache.push_back(info); - m_name_to_id.insert(name, id); + m_name_to_id[name] = id; /*infostream<<"getShaderIdDirect(): " <<"Returning id="< 0){ + if(!m_get_shader_queue.empty()){ GetRequest request = m_get_shader_queue.pop(); diff --git a/src/staticobject.cpp b/src/staticobject.cpp index 48fadaf06..973257fcf 100644 --- a/src/staticobject.cpp +++ b/src/staticobject.cpp @@ -58,18 +58,18 @@ void StaticObjectList::serialize(std::ostream &os) u16 count = m_stored.size() + m_active.size(); writeU16((u8*)buf, count); os.write(buf, 2); - for(core::list::Iterator + for(std::list::iterator i = m_stored.begin(); - i != m_stored.end(); i++) + i != m_stored.end(); ++i) { StaticObject &s_obj = *i; s_obj.serialize(os); } - for(core::map::Iterator - i = m_active.getIterator(); - i.atEnd()==false; i++) + for(std::map::iterator + i = m_active.begin(); + i != m_active.end(); ++i) { - StaticObject s_obj = i.getNode()->getValue(); + StaticObject s_obj = i->second; s_obj.serialize(os); } } diff --git a/src/staticobject.h b/src/staticobject.h index c8427fe47..640747e96 100644 --- a/src/staticobject.h +++ b/src/staticobject.h @@ -23,6 +23,8 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "irrlichttypes_bloated.h" #include #include +#include +#include #include "debug.h" struct StaticObject @@ -62,27 +64,27 @@ public: } else { - if(m_active.find(id) != NULL) + if(m_active.find(id) != m_active.end()) { dstream<<"ERROR: StaticObjectList::insert(): " <<"id already exists"< m_stored; - core::map m_active; + std::list m_stored; + std::map m_active; private: }; diff --git a/src/test.cpp b/src/test.cpp index d86868118..d18bd8b93 100644 --- a/src/test.cpp +++ b/src/test.cpp @@ -42,6 +42,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "util/serialize.h" #include "noise.h" // PseudoRandom used for random data for compression #include "clientserver.h" // LATEST_PROTOCOL_VERSION +#include /* Asserts that the exception occurs @@ -508,26 +509,26 @@ struct TestVoxelManipulator: public TestBase // An area that is 1 bigger in x+ and z- VoxelArea d(v3s16(-2,-2,-3), v3s16(3,2,2)); - core::list aa; + std::list aa; d.diff(c, aa); // Correct results - core::array results; + std::vector results; results.push_back(VoxelArea(v3s16(-2,-2,-3),v3s16(3,2,-3))); results.push_back(VoxelArea(v3s16(3,-2,-2),v3s16(3,2,2))); UASSERT(aa.size() == results.size()); infostream<<"Result of diff:"<::Iterator - i = aa.begin(); i != aa.end(); i++) + for(std::list::const_iterator + i = aa.begin(); i != aa.end(); ++i) { i->print(infostream); infostream<::iterator j = std::find(results.begin(), results.end(), *i); + UASSERT(j != results.end()); + results.erase(j); } @@ -582,7 +583,7 @@ struct TestVoxelAlgorithms: public TestBase } VoxelArea a(v3s16(0,0,0), v3s16(2,2,2)); { - core::map light_sources; + std::set light_sources; voxalgo::setLight(v, a, 0, ndef); voxalgo::SunlightPropagateResult res = voxalgo::propagateSunlight( v, a, true, light_sources, ndef); @@ -593,7 +594,7 @@ struct TestVoxelAlgorithms: public TestBase } v.setNodeNoRef(v3s16(0,0,0), MapNode(CONTENT_STONE)); { - core::map light_sources; + std::set light_sources; voxalgo::setLight(v, a, 0, ndef); voxalgo::SunlightPropagateResult res = voxalgo::propagateSunlight( v, a, true, light_sources, ndef); @@ -602,7 +603,7 @@ struct TestVoxelAlgorithms: public TestBase == LIGHT_SUN); } { - core::map light_sources; + std::set light_sources; voxalgo::setLight(v, a, 0, ndef); voxalgo::SunlightPropagateResult res = voxalgo::propagateSunlight( v, a, false, light_sources, ndef); @@ -612,7 +613,7 @@ struct TestVoxelAlgorithms: public TestBase } v.setNodeNoRef(v3s16(1,3,2), MapNode(CONTENT_STONE)); { - core::map light_sources; + std::set light_sources; voxalgo::setLight(v, a, 0, ndef); voxalgo::SunlightPropagateResult res = voxalgo::propagateSunlight( v, a, true, light_sources, ndef); @@ -621,7 +622,7 @@ struct TestVoxelAlgorithms: public TestBase == 0); } { - core::map light_sources; + std::set light_sources; voxalgo::setLight(v, a, 0, ndef); voxalgo::SunlightPropagateResult res = voxalgo::propagateSunlight( v, a, false, light_sources, ndef); @@ -635,14 +636,14 @@ struct TestVoxelAlgorithms: public TestBase v.setNodeNoRef(v3s16(1,-1,2), n); } { - core::map light_sources; + std::set light_sources; voxalgo::setLight(v, a, 0, ndef); voxalgo::SunlightPropagateResult res = voxalgo::propagateSunlight( v, a, true, light_sources, ndef); UASSERT(res.bottom_sunlight_valid == true); } { - core::map light_sources; + std::set light_sources; voxalgo::setLight(v, a, 0, ndef); voxalgo::SunlightPropagateResult res = voxalgo::propagateSunlight( v, a, false, light_sources, ndef); @@ -654,14 +655,14 @@ struct TestVoxelAlgorithms: public TestBase v.setNodeNoRef(v3s16(1,-1,2), n); } { - core::map light_sources; + std::set light_sources; voxalgo::setLight(v, a, 0, ndef); voxalgo::SunlightPropagateResult res = voxalgo::propagateSunlight( v, a, true, light_sources, ndef); UASSERT(res.bottom_sunlight_valid == false); } { - core::map light_sources; + std::set light_sources; voxalgo::setLight(v, a, 0, ndef); voxalgo::SunlightPropagateResult res = voxalgo::propagateSunlight( v, a, false, light_sources, ndef); @@ -669,7 +670,7 @@ struct TestVoxelAlgorithms: public TestBase } v.setNodeNoRef(v3s16(1,3,2), MapNode(CONTENT_IGNORE)); { - core::map light_sources; + std::set light_sources; voxalgo::setLight(v, a, 0, ndef); voxalgo::SunlightPropagateResult res = voxalgo::propagateSunlight( v, a, true, light_sources, ndef); @@ -697,16 +698,16 @@ struct TestVoxelAlgorithms: public TestBase v.setNode(v3s16(1,1,2), n); } { - core::map light_sources; - core::map unlight_from; + std::set light_sources; + std::map unlight_from; voxalgo::clearLightAndCollectSources(v, a, LIGHTBANK_DAY, ndef, light_sources, unlight_from); //v.print(dstream, ndef, VOXELPRINT_LIGHT_DAY); UASSERT(v.getNode(v3s16(0,1,1)).getLight(LIGHTBANK_DAY, ndef) == 0); - UASSERT(light_sources.find(v3s16(1,1,1)) != NULL); + UASSERT(light_sources.find(v3s16(1,1,1)) != light_sources.end()); UASSERT(light_sources.size() == 1); - UASSERT(unlight_from.find(v3s16(1,1,2)) != NULL); + UASSERT(unlight_from.find(v3s16(1,1,2)) != unlight_from.end()); UASSERT(unlight_from.size() == 1); } } diff --git a/src/tile.cpp b/src/tile.cpp index 7286293d8..aea9665f5 100644 --- a/src/tile.cpp +++ b/src/tile.cpp @@ -206,10 +206,10 @@ public: { assert(img); // Remove old image - core::map::Node *n; + std::map::iterator n; n = m_images.find(name); - if(n){ - video::IImage *oldimg = n->getValue(); + if(n != m_images.end()){ + video::IImage *oldimg = n->second; if(oldimg) oldimg->drop(); } @@ -229,20 +229,20 @@ public: } video::IImage* get(const std::string &name) { - core::map::Node *n; + std::map::iterator n; n = m_images.find(name); - if(n) - return n->getValue(); + if(n != m_images.end()) + return n->second; return NULL; } // Primarily fetches from cache, secondarily tries to read from filesystem video::IImage* getOrLoad(const std::string &name, IrrlichtDevice *device) { - core::map::Node *n; + std::map::iterator n; n = m_images.find(name); - if(n){ - n->getValue()->grab(); // Grab for caller - return n->getValue(); + if(n != m_images.end()){ + n->second->grab(); // Grab for caller + return n->second; } video::IVideoDriver* driver = device->getVideoDriver(); std::string path = getTexturePath(name.c_str()); @@ -263,7 +263,7 @@ public: return img; } private: - core::map m_images; + std::map m_images; }; /* @@ -417,9 +417,9 @@ private: // A texture id is index in this array. // The first position contains a NULL texture. - core::array m_atlaspointer_cache; + std::vector m_atlaspointer_cache; // Maps a texture name to an index in the former. - core::map m_name_to_id; + std::map m_name_to_id; // The two former containers are behind this mutex JMutex m_atlaspointer_cache_mutex; @@ -465,11 +465,11 @@ u32 TextureSource::getTextureId(const std::string &name) See if texture already exists */ JMutexAutoLock lock(m_atlaspointer_cache_mutex); - core::map::Node *n; + std::map::iterator n; n = m_name_to_id.find(name); - if(n != NULL) + if(n != m_name_to_id.end()) { - return n->getValue(); + return n->second; } } @@ -579,13 +579,13 @@ u32 TextureSource::getTextureIdDirect(const std::string &name) { JMutexAutoLock lock(m_atlaspointer_cache_mutex); - core::map::Node *n; + std::map::iterator n; n = m_name_to_id.find(name); - if(n != NULL) + if(n != m_name_to_id.end()) { /*infostream<<"getTextureIdDirect(): \""<getValue(); + return n->second; } } @@ -724,7 +724,7 @@ u32 TextureSource::getTextureIdDirect(const std::string &name) baseimg_dim = baseimg->getDimension(); SourceAtlasPointer nap(name, ap, baseimg, v2s32(0,0), baseimg_dim); m_atlaspointer_cache.push_back(nap); - m_name_to_id.insert(name, id); + m_name_to_id[name] = id; /*infostream<<"getTextureIdDirect(): " <<"Returning id="< 0) + if(!m_get_texture_queue.empty()) { GetRequest request = m_get_texture_queue.pop(); @@ -872,7 +872,7 @@ void TextureSource::buildMainAtlas(class IGameDef *gamedef) main content features */ - core::map sourcelist; + std::set sourcelist; for(u16 j=0; j::Iterator - i = sourcelist.getIterator(); - i.atEnd() == false; i++) + for(std::set::iterator + i = sourcelist.begin(); + i != sourcelist.end(); ++i) { - std::string name = i.getNode()->getKey(); + std::string name = *i; infostream<<"\""<::Iterator - i = sourcelist.getIterator(); - i.atEnd() == false; i++) + for(std::set::iterator + i = sourcelist.begin(); + i != sourcelist.end(); ++i) { - std::string name = i.getNode()->getKey(); + std::string name = *i; // Generate image by name video::IImage *img2 = generate_image_from_scratch(name, m_device, @@ -1026,11 +1026,11 @@ void TextureSource::buildMainAtlas(class IGameDef *gamedef) bool reuse_old_id = false; u32 id = m_atlaspointer_cache.size(); // Check old id without fetching a texture - core::map::Node *n; + std::map::iterator n; n = m_name_to_id.find(name); // If it exists, we will replace the old definition - if(n){ - id = n->getValue(); + if(n != m_name_to_id.end()){ + id = n->second; reuse_old_id = true; /*infostream<<"TextureSource::buildMainAtlas(): " <<"Replacing old AtlasPointer"<::Iterator - i = sourcelist.getIterator(); - i.atEnd() == false; i++) + for(std::set::iterator + i = sourcelist.begin(); + i != sourcelist.end(); ++i) { - std::string name = i.getNode()->getKey(); - if(m_name_to_id.find(name) == NULL) + std::string name = *i; + if(m_name_to_id.find(name) == m_name_to_id.end()) continue; u32 id = m_name_to_id[name]; //infostream<<"id of name "<getServerMap(); - core::map modified_blocks; + std::map modified_blocks; ManualMapVoxelManipulator vmanip(map); v3s16 tree_blockp = getNodeBlockPos(p0); vmanip.initialEmerge(tree_blockp - v3s16(1,1,1), tree_blockp + v3s16(1,3,1)); @@ -122,23 +122,17 @@ void spawn_ltree (ServerEnvironment *env, v3s16 p0, INodeDefManager *ndef, TreeD 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++) + 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); } diff --git a/src/util/container.h b/src/util/container.h index 775372649..9bb388f0e 100644 --- a/src/util/container.h +++ b/src/util/container.h @@ -24,6 +24,8 @@ with this program; if not, write to the Free Software Foundation, Inc., #include #include #include "../porting.h" // For sleep_ms +#include +#include /* Queue with unique values with fast checking of value existence @@ -43,11 +45,11 @@ public: bool push_back(Value value) { // Check if already exists - if(m_map.find(value) != NULL) + if(m_map.find(value) != m_map.end()) return false; // Add - m_map.insert(value, 0); + m_map[value] = 0; m_list.push_back(value); return true; @@ -55,22 +57,21 @@ public: Value pop_front() { - typename core::list::Iterator i = m_list.begin(); + typename std::list::iterator i = m_list.begin(); Value value = *i; - m_map.remove(value); + m_map.erase(value); m_list.erase(i); return value; } u32 size() { - assert(m_list.size() == m_map.size()); - return m_list.size(); + return m_map.size(); } private: - core::map m_map; - core::list m_list; + std::map m_map; + std::list m_list; }; #if 1 @@ -95,31 +96,31 @@ public: { JMutexAutoLock lock(m_mutex); - typename core::map::Node *n; + typename std::map::iterator n; n = m_values.find(name); - if(n == NULL) + if(n == m_values.end()) return false; if(result != NULL) - *result = n->getValue(); + *result = n->second; return true; } - core::list getValues() + std::list getValues() { - core::list result; - for(typename core::map::Iterator - i = m_values.getIterator(); - i.atEnd() == false; i++){ - result.push_back(i.getNode()->getValue()); + std::list result; + for(typename std::map::iterator + i = m_values.begin(); + i != m_values.end(); ++i){ + result.push_back(i->second); } return result; } private: - core::map m_values; + std::map m_values; JMutex m_mutex; }; #endif @@ -163,10 +164,10 @@ public: u32 getId(const T &value) { JMutexAutoLock lock(m_mutex); - typename core::map::Node *n; + typename std::map::iterator n; n = m_value_to_id.find(value); - if(n != NULL) - return n->getValue(); + if(n != m_value_to_id.end()) + return n->second; m_id_to_value.push_back(value); u32 new_id = m_id_to_value.size(); m_value_to_id.insert(value, new_id); @@ -176,8 +177,8 @@ public: private: JMutex m_mutex; // Values are stored here at id-1 position (id 1 = [0]) - core::array m_id_to_value; - core::map m_value_to_id; + std::vector m_id_to_value; + std::map m_value_to_id; }; /* @@ -187,39 +188,52 @@ template class Queue { public: + Queue(): + m_list_size(0) + {} + void push_back(T t) { m_list.push_back(t); + ++m_list_size; } T pop_front() { - if(m_list.size() == 0) + if(m_list.empty()) throw ItemNotFoundException("Queue: queue is empty"); - typename core::list::Iterator begin = m_list.begin(); + typename std::list::iterator begin = m_list.begin(); T t = *begin; m_list.erase(begin); + --m_list_size; return t; } T pop_back() { - if(m_list.size() == 0) + if(m_list.empty()) throw ItemNotFoundException("Queue: queue is empty"); - typename core::list::Iterator last = m_list.getLast(); + typename std::list::iterator last = m_list.back(); T t = *last; m_list.erase(last); + --m_list_size; return t; } u32 size() { - return m_list.size(); + return m_list_size; + } + + bool empty() + { + return m_list.empty(); } protected: - core::list m_list; + std::list m_list; + u32 m_list_size; }; /* @@ -234,10 +248,10 @@ public: { m_mutex.Init(); } - u32 size() + bool empty() { JMutexAutoLock lock(m_mutex); - return m_list.size(); + return m_list.empty(); } void push_back(T t) { @@ -253,9 +267,9 @@ public: { JMutexAutoLock lock(m_mutex); - if(m_list.size() > 0) + if(!m_list.empty()) { - typename core::list::Iterator begin = m_list.begin(); + typename std::list::iterator begin = m_list.begin(); T t = *begin; m_list.erase(begin); return t; @@ -279,9 +293,9 @@ public: { JMutexAutoLock lock(m_mutex); - if(m_list.size() > 0) + if(!m_list.empty()) { - typename core::list::Iterator last = m_list.getLast(); + typename std::list::iterator last = m_list.back(); T t = *last; m_list.erase(last); return t; @@ -302,14 +316,14 @@ public: return m_mutex; } - core::list & getList() + std::list & getList() { return m_list; } protected: JMutex m_mutex; - core::list m_list; + std::list m_list; }; #endif diff --git a/src/util/numeric.cpp b/src/util/numeric.cpp index a79454628..ed83df7d7 100644 --- a/src/util/numeric.cpp +++ b/src/util/numeric.cpp @@ -24,7 +24,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include // Calculate the borders of a "d-radius" cube -void getFacePositions(core::list &list, u16 d) +void getFacePositions(std::list &list, u16 d) { if(d == 0) { diff --git a/src/util/numeric.h b/src/util/numeric.h index 450a98e40..e66af2376 100644 --- a/src/util/numeric.h +++ b/src/util/numeric.h @@ -25,9 +25,10 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "../irr_v3d.h" #include "../irr_aabb3d.h" #include +#include // Calculate the borders of a "d-radius" cube -void getFacePositions(core::list &list, u16 d); +void getFacePositions(std::list &list, u16 d); class IndentationRaiser { diff --git a/src/util/thread.h b/src/util/thread.h index 949bb4204..6b2cf5b6c 100644 --- a/src/util/thread.h +++ b/src/util/thread.h @@ -120,7 +120,7 @@ class GetResult public: Key key; T item; - core::list > callers; + std::list > callers; }; template @@ -152,16 +152,16 @@ public: Key key; ResultQueue *dest; - core::list > callers; + std::list > callers; }; template class RequestQueue { public: - u32 size() + bool empty() { - return m_queue.size(); + return m_queue.empty(); } void add(Key key, Caller caller, CallerData callerdata, @@ -172,17 +172,17 @@ public: /* If the caller is already on the list, only update CallerData */ - for(typename core::list< GetRequest >::Iterator + for(typename std::list< GetRequest >::iterator i = m_queue.getList().begin(); - i != m_queue.getList().end(); i++) + i != m_queue.getList().end(); ++i) { GetRequest &request = *i; if(request.key == key) { - for(typename core::list< CallerInfo >::Iterator + for(typename std::list< CallerInfo >::iterator i = request.callers.begin(); - i != request.callers.end(); i++) + i != request.callers.end(); ++i) { CallerInfo &ca = *i; if(ca.caller == caller) diff --git a/src/voxel.cpp b/src/voxel.cpp index c55f3f539..f859a1f03 100644 --- a/src/voxel.cpp +++ b/src/voxel.cpp @@ -302,7 +302,7 @@ void VoxelManipulator::clearFlag(u8 flags) } void VoxelManipulator::unspreadLight(enum LightBank bank, v3s16 p, u8 oldlight, - core::map & light_sources, INodeDefManager *nodemgr) + std::set & light_sources, INodeDefManager *nodemgr) { v3s16 dirs[6] = { v3s16(0,0,1), // back @@ -360,7 +360,7 @@ void VoxelManipulator::unspreadLight(enum LightBank bank, v3s16 p, u8 oldlight, } } else{ - light_sources.insert(n2pos, true); + light_sources.insert(n2pos); } } } @@ -384,24 +384,16 @@ void VoxelManipulator::unspreadLight(enum LightBank bank, v3s16 p, u8 oldlight, values of from_nodes are lighting values. */ void VoxelManipulator::unspreadLight(enum LightBank bank, - core::map & from_nodes, - core::map & light_sources, INodeDefManager *nodemgr) + std::map & from_nodes, + std::set & light_sources, INodeDefManager *nodemgr) { if(from_nodes.size() == 0) return; - core::map::Iterator j; - j = from_nodes.getIterator(); - - for(; j.atEnd() == false; j++) + for(std::map::iterator j = from_nodes.begin(); + j != from_nodes.end(); ++j) { - v3s16 pos = j.getNode()->getKey(); - - //MapNode &n = m_data[m_area.index(pos)]; - - u8 oldlight = j.getNode()->getValue(); - - unspreadLight(bank, pos, oldlight, light_sources, nodemgr); + unspreadLight(bank, j->first, j->second, light_sources, nodemgr); } } #endif @@ -609,7 +601,7 @@ void VoxelManipulator::spreadLight(enum LightBank bank, goes on recursively. */ void VoxelManipulator::spreadLight(enum LightBank bank, - core::map & from_nodes, INodeDefManager *nodemgr) + std::set & from_nodes, INodeDefManager *nodemgr) { const v3s16 dirs[6] = { v3s16(0,0,1), // back @@ -623,13 +615,12 @@ void VoxelManipulator::spreadLight(enum LightBank bank, if(from_nodes.size() == 0) return; - core::map lighted_nodes; - core::map::Iterator j; - j = from_nodes.getIterator(); + std::set lighted_nodes; - for(; j.atEnd() == false; j++) + for(std::set::iterator j = from_nodes.begin(); + j != from_nodes.end(); ++j) { - v3s16 pos = j.getNode()->getKey(); + v3s16 pos = *j; emerge(VoxelArea(pos - v3s16(1,1,1), pos + v3s16(1,1,1))); @@ -666,7 +657,7 @@ void VoxelManipulator::spreadLight(enum LightBank bank, */ if(light2 > undiminish_light(oldlight)) { - lighted_nodes.insert(n2pos, true); + lighted_nodes.insert(n2pos); } /* If the neighbor is dimmer than how much light this node @@ -677,7 +668,7 @@ void VoxelManipulator::spreadLight(enum LightBank bank, if(nodemgr->get(n2).light_propagates) { n2.setLight(bank, newlight, nodemgr); - lighted_nodes.insert(n2pos, true); + lighted_nodes.insert(n2pos); } } } diff --git a/src/voxel.h b/src/voxel.h index b48943624..bed35b57e 100644 --- a/src/voxel.h +++ b/src/voxel.h @@ -26,6 +26,8 @@ with this program; if not, write to the Free Software Foundation, Inc., #include #include "debug.h" #include "mapnode.h" +#include +#include class INodeDefManager; @@ -186,7 +188,7 @@ public: a: area inside *this */ - void diff(const VoxelArea &a, core::list &result) + void diff(const VoxelArea &a, std::list &result) { /* This can result in a maximum of 6 areas @@ -519,14 +521,14 @@ public: // TODO: Move to voxelalgorithms.h void unspreadLight(enum LightBank bank, v3s16 p, u8 oldlight, - core::map & light_sources, INodeDefManager *nodemgr); + std::set & light_sources, INodeDefManager *nodemgr); void unspreadLight(enum LightBank bank, - core::map & from_nodes, - core::map & light_sources, INodeDefManager *nodemgr); + std::map & from_nodes, + std::set & light_sources, INodeDefManager *nodemgr); void spreadLight(enum LightBank bank, v3s16 p, INodeDefManager *nodemgr); void spreadLight(enum LightBank bank, - core::map & from_nodes, INodeDefManager *nodemgr); + std::set & from_nodes, INodeDefManager *nodemgr); /* Virtual functions diff --git a/src/voxelalgorithms.cpp b/src/voxelalgorithms.cpp index bd8f816b8..14638a827 100644 --- a/src/voxelalgorithms.cpp +++ b/src/voxelalgorithms.cpp @@ -39,8 +39,8 @@ void setLight(VoxelManipulator &v, VoxelArea a, u8 light, void clearLightAndCollectSources(VoxelManipulator &v, VoxelArea a, enum LightBank bank, INodeDefManager *ndef, - core::map & light_sources, - core::map & unlight_from) + std::set & light_sources, + std::map & unlight_from) { // The full area we shall touch VoxelArea required_a = a; @@ -60,7 +60,7 @@ void clearLightAndCollectSources(VoxelManipulator &v, VoxelArea a, // If node sources light, add to list u8 source = ndef->get(n).light_source; if(source != 0) - light_sources[p] = true; + light_sources.insert(p); // Collect borders for unlighting if((x==a.MinEdge.X || x == a.MaxEdge.X @@ -68,14 +68,14 @@ void clearLightAndCollectSources(VoxelManipulator &v, VoxelArea a, || z==a.MinEdge.Z || z == a.MaxEdge.Z) && oldlight != 0) { - unlight_from.insert(p, oldlight); + unlight_from[p] = oldlight; } } } SunlightPropagateResult propagateSunlight(VoxelManipulator &v, VoxelArea a, bool inexistent_top_provides_sunlight, - core::map & light_sources, + std::set & light_sources, INodeDefManager *ndef) { // Return values @@ -127,7 +127,7 @@ SunlightPropagateResult propagateSunlight(VoxelManipulator &v, VoxelArea a, n.setLight(LIGHTBANK_DAY, incoming_light, ndef); if(diminish_light(incoming_light) != 0) - light_sources.insert(p, true); + light_sources.insert(p); } // Check validity of sunlight at top of block below if it diff --git a/src/voxelalgorithms.h b/src/voxelalgorithms.h index 2a5fc394e..2eba6a176 100644 --- a/src/voxelalgorithms.h +++ b/src/voxelalgorithms.h @@ -22,6 +22,8 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "voxel.h" #include "mapnode.h" +#include +#include namespace voxalgo { @@ -33,8 +35,8 @@ void setLight(VoxelManipulator &v, VoxelArea a, u8 light, void clearLightAndCollectSources(VoxelManipulator &v, VoxelArea a, enum LightBank bank, INodeDefManager *ndef, - core::map & light_sources, - core::map & unlight_from); + std::set & light_sources, + std::map & unlight_from); struct SunlightPropagateResult { @@ -47,7 +49,7 @@ struct SunlightPropagateResult SunlightPropagateResult propagateSunlight(VoxelManipulator &v, VoxelArea a, bool inexistent_top_provides_sunlight, - core::map & light_sources, + std::set & light_sources, INodeDefManager *ndef); } // namespace voxalgo -- cgit v1.2.3 From d10223254ab9363eb1b6f8cc7aa6b99965940cee Mon Sep 17 00:00:00 2001 From: kwolekr Date: Mon, 11 Mar 2013 21:32:52 -0400 Subject: Clean up Mapgen --- src/mapgen.cpp | 2233 ++--------------------------------------------------- src/mapgen.h | 5 + src/mapgen_v6.cpp | 1608 +++++++++++++++----------------------- src/mapgen_v6.h | 73 +- src/treegen.cpp | 34 +- src/treegen.h | 51 +- 6 files changed, 784 insertions(+), 3220 deletions(-) (limited to 'src/mapgen_v6.cpp') diff --git a/src/mapgen.cpp b/src/mapgen.cpp index 1c59213ba..156863170 100644 --- a/src/mapgen.cpp +++ b/src/mapgen.cpp @@ -45,9 +45,60 @@ FlagDesc flagdesc_mapgen[] = { {NULL, 0} }; + /////////////////////////////////////////////////////////////////////////////// -///////////////////// + +void Mapgen::updateLiquid(UniqueQueue *trans_liquid, v3s16 nmin, v3s16 nmax) { + bool isliquid, wasliquid; + u32 i; + + for (s16 z = nmin.Z; z <= nmax.Z; z++) { + for (s16 x = nmin.X; x <= nmax.X; x++) { + v2s16 p2d(x, z); + wasliquid = true; + v3s16 em = vm->m_area.getExtent(); + i = vm->m_area.index(v3s16(p2d.X, nmax.Y, p2d.Y)); + + for (s16 y = nmax.Y; y >= nmin.Y; y--) { + isliquid = ndef->get(vm->m_data[i]).isLiquid(); + + // there was a change between liquid and nonliquid, add to queue + if (isliquid != wasliquid) + trans_liquid->push_back(v3s16(p2d.X, y, p2d.Y)); + + wasliquid = isliquid; + vm->m_area.add_y(em, i, -1); + } + } + } +} + + +void Mapgen::updateLighting(v3s16 nmin, v3s16 nmax) { + enum LightBank banks[2] = {LIGHTBANK_DAY, LIGHTBANK_NIGHT}; + + VoxelArea a(nmin - v3s16(1,0,1) * MAP_BLOCKSIZE, + nmax + v3s16(1,0,1) * MAP_BLOCKSIZE); + bool block_is_underground = (water_level > nmax.Y); + bool sunlight = !block_is_underground; + + ScopeProfiler sp(g_profiler, "EmergeThread: mapgen lighting update", SPT_AVG); + for (int i = 0; i < 2; i++) { + enum LightBank bank = banks[i]; + std::set light_sources; + std::map unlight_from; + + voxalgo::clearLightAndCollectSources(*vm, a, bank, ndef, + light_sources, unlight_from); + voxalgo::propagateSunlight(*vm, a, sunlight, light_sources, ndef); + vm->unspreadLight(bank, unlight_from, light_sources, ndef); + vm->spreadLight(bank, light_sources, ndef); + } +} + + +//////////////////////// Mapgen V6 parameter read/write bool MapgenV6Params::readParams(Settings *settings) { freq_desert = settings->getFloat("mgv6_freq_desert"); @@ -116,2183 +167,3 @@ double Mapgen::tree_amount_2d(u64 seed, v2s16 p) { else return 0.04 * (noise-zeroval) / (1.0-zeroval); } - - -#if 0 /// BIG COMMENT -namespace mapgen -{ - -/* - Some helper functions for the map generator -*/ - -#if 1 -// Returns Y one under area minimum if not found -static s16 find_ground_level(VoxelManipulator &vmanip, v2s16 p2d, - INodeDefManager *ndef) -{ - v3s16 em = vmanip.m_area.getExtent(); - s16 y_nodes_max = vmanip.m_area.MaxEdge.Y; - s16 y_nodes_min = vmanip.m_area.MinEdge.Y; - u32 i = vmanip.m_area.index(v3s16(p2d.X, y_nodes_max, p2d.Y)); - s16 y; - for(y=y_nodes_max; y>=y_nodes_min; y--) - { - MapNode &n = vmanip.m_data[i]; - if(ndef->get(n).walkable) - break; - - vmanip.m_area.add_y(em, i, -1); - } - if(y >= y_nodes_min) - return y; - else - return y_nodes_min - 1; -} - -#if 0 -// Returns Y one under area minimum if not found -static s16 find_ground_level_clever(VoxelManipulator &vmanip, v2s16 p2d, - INodeDefManager *ndef) -{ - if(!vmanip.m_area.contains(v3s16(p2d.X, vmanip.m_area.MaxEdge.Y, p2d.Y))) - return vmanip.m_area.MinEdge.Y-1; - v3s16 em = vmanip.m_area.getExtent(); - s16 y_nodes_max = vmanip.m_area.MaxEdge.Y; - s16 y_nodes_min = vmanip.m_area.MinEdge.Y; - u32 i = vmanip.m_area.index(v3s16(p2d.X, y_nodes_max, p2d.Y)); - s16 y; - content_t c_tree = ndef->getId("mapgen_tree"); - content_t c_leaves = ndef->getId("mapgen_leaves"); - for(y=y_nodes_max; y>=y_nodes_min; y--) - { - MapNode &n = vmanip.m_data[i]; - if(ndef->get(n).walkable - && n.getContent() != c_tree - && n.getContent() != c_leaves) - break; - - vmanip.m_area.add_y(em, i, -1); - } - if(y >= y_nodes_min) - return y; - else - return y_nodes_min - 1; -} -#endif - -// Returns Y one under area minimum if not found -static s16 find_stone_level(VoxelManipulator &vmanip, v2s16 p2d, - INodeDefManager *ndef) -{ - v3s16 em = vmanip.m_area.getExtent(); - s16 y_nodes_max = vmanip.m_area.MaxEdge.Y; - s16 y_nodes_min = vmanip.m_area.MinEdge.Y; - u32 i = vmanip.m_area.index(v3s16(p2d.X, y_nodes_max, p2d.Y)); - s16 y; - content_t c_stone = ndef->getId("mapgen_stone"); - content_t c_desert_stone = ndef->getId("mapgen_desert_stone"); - for(y=y_nodes_max; y>=y_nodes_min; y--) - { - MapNode &n = vmanip.m_data[i]; - content_t c = n.getContent(); - if(c != CONTENT_IGNORE && ( - c == c_stone || c == c_desert_stone)) - break; - - vmanip.m_area.add_y(em, i, -1); - } - if(y >= y_nodes_min) - return y; - else - return y_nodes_min - 1; -} -#endif - - -#if 0 - -static void make_papyrus(VoxelManipulator &vmanip, v3s16 p0, - INodeDefManager *ndef) -{ - MapNode papyrusnode(ndef->getId("mapgen_papyrus")); - - s16 trunk_h = myrand_range(2, 3); - v3s16 p1 = p0; - for(s16 ii=0; iigetId("mapgen_cactus")); - - s16 trunk_h = 3; - v3s16 p1 = p0; - for(s16 ii=0; iigetId("mapgen_nyancat"), facedir_i); - u32 length = random.range(3,15); - for(u32 j=0; jgetId("mapgen_nyancat_rainbow")); - } -} -#endif - -/* - Noise functions. Make sure seed is mangled differently in each one. -*/ - -#if 0 -/* - Scaling the output of the noise function affects the overdrive of the - contour function, which affects the shape of the output considerably. -*/ -#define CAVE_NOISE_SCALE 12.0 -//#define CAVE_NOISE_SCALE 10.0 -//#define CAVE_NOISE_SCALE 7.5 -//#define CAVE_NOISE_SCALE 5.0 -//#define CAVE_NOISE_SCALE 1.0 - -//#define CAVE_NOISE_THRESHOLD (2.5/CAVE_NOISE_SCALE) -#define CAVE_NOISE_THRESHOLD (1.5/CAVE_NOISE_SCALE) - -NoiseParams get_cave_noise1_params(u64 seed) -{ - /*return NoiseParams(NOISE_PERLIN_CONTOUR, seed+52534, 5, 0.7, - 200, CAVE_NOISE_SCALE);*/ - /*return NoiseParams(NOISE_PERLIN_CONTOUR, seed+52534, 4, 0.7, - 100, CAVE_NOISE_SCALE);*/ - /*return NoiseParams(NOISE_PERLIN_CONTOUR, seed+52534, 5, 0.6, - 100, CAVE_NOISE_SCALE);*/ - /*return NoiseParams(NOISE_PERLIN_CONTOUR, seed+52534, 5, 0.3, - 100, CAVE_NOISE_SCALE);*/ - return NoiseParams(NOISE_PERLIN_CONTOUR, seed+52534, 4, 0.5, - 50, CAVE_NOISE_SCALE); - //return NoiseParams(NOISE_CONSTANT_ONE); -} - -NoiseParams get_cave_noise2_params(u64 seed) -{ - /*return NoiseParams(NOISE_PERLIN_CONTOUR_FLIP_YZ, seed+10325, 5, 0.7, - 200, CAVE_NOISE_SCALE);*/ - /*return NoiseParams(NOISE_PERLIN_CONTOUR_FLIP_YZ, seed+10325, 4, 0.7, - 100, CAVE_NOISE_SCALE);*/ - /*return NoiseParams(NOISE_PERLIN_CONTOUR_FLIP_YZ, seed+10325, 5, 0.3, - 100, CAVE_NOISE_SCALE);*/ - return NoiseParams(NOISE_PERLIN_CONTOUR_FLIP_YZ, seed+10325, 4, 0.5, - 50, CAVE_NOISE_SCALE); - //return NoiseParams(NOISE_CONSTANT_ONE); -} - -NoiseParams get_ground_noise1_params(u64 seed) -{ - return NoiseParams(NOISE_PERLIN, seed+983240, 4, - 0.55, 80.0, 40.0); -} - -NoiseParams get_ground_crumbleness_params(u64 seed) -{ - return NoiseParams(NOISE_PERLIN, seed+34413, 3, - 1.3, 20.0, 1.0); -} - -NoiseParams get_ground_wetness_params(u64 seed) -{ - return NoiseParams(NOISE_PERLIN, seed+32474, 4, - 1.1, 40.0, 1.0); -} - -bool is_cave(u64 seed, v3s16 p) -{ - double d1 = noise3d_param(get_cave_noise1_params(seed), p.X,p.Y,p.Z); - double d2 = noise3d_param(get_cave_noise2_params(seed), p.X,p.Y,p.Z); - return d1*d2 > CAVE_NOISE_THRESHOLD; -} - -/* - Ground density noise shall be interpreted by using this. - - TODO: No perlin noises here, they should be outsourced - and buffered - NOTE: The speed of these actually isn't terrible -*/ -bool val_is_ground(double ground_noise1_val, v3s16 p, u64 seed) -{ - //return ((double)p.Y < ground_noise1_val); - - double f = 0.55 + noise2d_perlin( - 0.5+(float)p.X/250, 0.5+(float)p.Z/250, - seed+920381, 3, 0.45); - if(f < 0.01) - f = 0.01; - else if(f >= 1.0) - f *= 1.6; - double h = WATER_LEVEL + 10 * noise2d_perlin( - 0.5+(float)p.X/250, 0.5+(float)p.Z/250, - seed+84174, 4, 0.5); - /*double f = 1; - double h = 0;*/ - return ((double)p.Y - h < ground_noise1_val * f); -} - -/* - Queries whether a position is ground or not. -*/ -bool is_ground(u64 seed, v3s16 p) -{ - double val1 = noise3d_param(get_ground_noise1_params(seed), p.X,p.Y,p.Z); - return val_is_ground(val1, p, seed); -} -#endif - -// Amount of trees per area in nodes -double tree_amount_2d(u64 seed, v2s16 p) -{ - /*double noise = noise2d_perlin( - 0.5+(float)p.X/250, 0.5+(float)p.Y/250, - seed+2, 5, 0.66);*/ - double noise = noise2d_perlin( - 0.5+(float)p.X/125, 0.5+(float)p.Y/125, - seed+2, 4, 0.66); - double zeroval = -0.39; - if(noise < zeroval) - return 0; - else - return 0.04 * (noise-zeroval) / (1.0-zeroval); -} - -#if 0 -double surface_humidity_2d(u64 seed, v2s16 p) -{ - double noise = noise2d_perlin( - 0.5+(float)p.X/500, 0.5+(float)p.Y/500, - seed+72384, 4, 0.66); - noise = (noise + 1.0)/2.0; - if(noise < 0.0) - noise = 0.0; - if(noise > 1.0) - noise = 1.0; - return noise; -} - -/* - Incrementally find ground level from 3d noise -*/ -s16 find_ground_level_from_noise(u64 seed, v2s16 p2d, s16 precision) -{ - // Start a bit fuzzy to make averaging lower precision values - // more useful - s16 level = myrand_range(-precision/2, precision/2); - s16 dec[] = {31000, 100, 20, 4, 1, 0}; - s16 i; - for(i = 1; dec[i] != 0 && precision <= dec[i]; i++) - { - // First find non-ground by going upwards - // Don't stop in caves. - { - s16 max = level+dec[i-1]*2; - v3s16 p(p2d.X, level, p2d.Y); - for(; p.Y < max; p.Y += dec[i]) - { - if(!is_ground(seed, p)) - { - level = p.Y; - break; - } - } - } - // Then find ground by going downwards from there. - // Go in caves, too, when precision is 1. - { - s16 min = level-dec[i-1]*2; - v3s16 p(p2d.X, level, p2d.Y); - for(; p.Y>min; p.Y-=dec[i]) - { - bool ground = is_ground(seed, p); - /*if(dec[i] == 1 && is_cave(seed, p)) - ground = false;*/ - if(ground) - { - level = p.Y; - break; - } - } - } - } - - // This is more like the actual ground level - level += dec[i-1]/2; - - return level; -} - -double get_sector_average_ground_level(u64 seed, v2s16 sectorpos, double p=4); - -double get_sector_average_ground_level(u64 seed, v2s16 sectorpos, double p) -{ - v2s16 node_min = sectorpos*MAP_BLOCKSIZE; - v2s16 node_max = (sectorpos+v2s16(1,1))*MAP_BLOCKSIZE-v2s16(1,1); - double a = 0; - a += find_ground_level_from_noise(seed, - v2s16(node_min.X, node_min.Y), p); - a += find_ground_level_from_noise(seed, - v2s16(node_min.X, node_max.Y), p); - a += find_ground_level_from_noise(seed, - v2s16(node_max.X, node_max.Y), p); - a += find_ground_level_from_noise(seed, - v2s16(node_max.X, node_min.Y), p); - a += find_ground_level_from_noise(seed, - v2s16(node_min.X+MAP_BLOCKSIZE/2, node_min.Y+MAP_BLOCKSIZE/2), p); - a /= 5; - return a; -} - -double get_sector_maximum_ground_level(u64 seed, v2s16 sectorpos, double p=4); - -double get_sector_maximum_ground_level(u64 seed, v2s16 sectorpos, double p) -{ - v2s16 node_min = sectorpos*MAP_BLOCKSIZE; - v2s16 node_max = (sectorpos+v2s16(1,1))*MAP_BLOCKSIZE-v2s16(1,1); - double a = -31000; - // Corners - a = MYMAX(a, find_ground_level_from_noise(seed, - v2s16(node_min.X, node_min.Y), p)); - a = MYMAX(a, find_ground_level_from_noise(seed, - v2s16(node_min.X, node_max.Y), p)); - a = MYMAX(a, find_ground_level_from_noise(seed, - v2s16(node_max.X, node_max.Y), p)); - a = MYMAX(a, find_ground_level_from_noise(seed, - v2s16(node_min.X, node_min.Y), p)); - // Center - a = MYMAX(a, find_ground_level_from_noise(seed, - v2s16(node_min.X+MAP_BLOCKSIZE/2, node_min.Y+MAP_BLOCKSIZE/2), p)); - // Side middle points - a = MYMAX(a, find_ground_level_from_noise(seed, - v2s16(node_min.X+MAP_BLOCKSIZE/2, node_min.Y), p)); - a = MYMAX(a, find_ground_level_from_noise(seed, - v2s16(node_min.X+MAP_BLOCKSIZE/2, node_max.Y), p)); - a = MYMAX(a, find_ground_level_from_noise(seed, - v2s16(node_min.X, node_min.Y+MAP_BLOCKSIZE/2), p)); - a = MYMAX(a, find_ground_level_from_noise(seed, - v2s16(node_max.X, node_min.Y+MAP_BLOCKSIZE/2), p)); - return a; -} - -double get_sector_minimum_ground_level(u64 seed, v2s16 sectorpos, double p=4); - -double get_sector_minimum_ground_level(u64 seed, v2s16 sectorpos, double p) -{ - v2s16 node_min = sectorpos*MAP_BLOCKSIZE; - v2s16 node_max = (sectorpos+v2s16(1,1))*MAP_BLOCKSIZE-v2s16(1,1); - double a = 31000; - // Corners - a = MYMIN(a, find_ground_level_from_noise(seed, - v2s16(node_min.X, node_min.Y), p)); - a = MYMIN(a, find_ground_level_from_noise(seed, - v2s16(node_min.X, node_max.Y), p)); - a = MYMIN(a, find_ground_level_from_noise(seed, - v2s16(node_max.X, node_max.Y), p)); - a = MYMIN(a, find_ground_level_from_noise(seed, - v2s16(node_min.X, node_min.Y), p)); - // Center - a = MYMIN(a, find_ground_level_from_noise(seed, - v2s16(node_min.X+MAP_BLOCKSIZE/2, node_min.Y+MAP_BLOCKSIZE/2), p)); - // Side middle points - a = MYMIN(a, find_ground_level_from_noise(seed, - v2s16(node_min.X+MAP_BLOCKSIZE/2, node_min.Y), p)); - a = MYMIN(a, find_ground_level_from_noise(seed, - v2s16(node_min.X+MAP_BLOCKSIZE/2, node_max.Y), p)); - a = MYMIN(a, find_ground_level_from_noise(seed, - v2s16(node_min.X, node_min.Y+MAP_BLOCKSIZE/2), p)); - a = MYMIN(a, find_ground_level_from_noise(seed, - v2s16(node_max.X, node_min.Y+MAP_BLOCKSIZE/2), p)); - return a; -} -#endif - -// Required by mapgen.h -bool block_is_underground(u64 seed, v3s16 blockpos) -{ - /*s16 minimum_groundlevel = (s16)get_sector_minimum_ground_level( - seed, v2s16(blockpos.X, blockpos.Z));*/ - // Nah, this is just a heuristic, just return something - s16 minimum_groundlevel = WATER_LEVEL; - - if(blockpos.Y*MAP_BLOCKSIZE + MAP_BLOCKSIZE <= minimum_groundlevel) - return true; - else - return false; -} - -#define AVERAGE_MUD_AMOUNT 4 - -double base_rock_level_2d(u64 seed, v2s16 p) -{ - // The base ground level - double base = (double)WATER_LEVEL - (double)AVERAGE_MUD_AMOUNT - + 20. * noise2d_perlin( - 0.5+(float)p.X/250., 0.5+(float)p.Y/250., - seed+82341, 5, 0.6); - - /*// A bit hillier one - double base2 = WATER_LEVEL - 4.0 + 40. * noise2d_perlin( - 0.5+(float)p.X/250., 0.5+(float)p.Y/250., - seed+93413, 6, 0.69); - if(base2 > base) - base = base2;*/ -#if 1 - // Higher ground level - double higher = (double)WATER_LEVEL + 20. + 16. * noise2d_perlin( - 0.5+(float)p.X/500., 0.5+(float)p.Y/500., - seed+85039, 5, 0.6); - //higher = 30; // For debugging - - // Limit higher to at least base - if(higher < base) - higher = base; - - // Steepness factor of cliffs - double b = 0.85 + 0.5 * noise2d_perlin( - 0.5+(float)p.X/125., 0.5+(float)p.Y/125., - seed-932, 5, 0.7); - b = rangelim(b, 0.0, 1000.0); - b = b*b*b*b*b*b*b; - b *= 5; - b = rangelim(b, 0.5, 1000.0); - // Values 1.5...100 give quite horrible looking slopes - if(b > 1.5 && b < 100.0){ - if(b < 10.0) - b = 1.5; - else - b = 100.0; - } - //dstream<<"b="<vmanip); - assert(data->nodedef); - assert(data->blockpos_requested.X >= data->blockpos_min.X && - data->blockpos_requested.Y >= data->blockpos_min.Y && - data->blockpos_requested.Z >= data->blockpos_min.Z); - assert(data->blockpos_requested.X <= data->blockpos_max.X && - data->blockpos_requested.Y <= data->blockpos_max.Y && - data->blockpos_requested.Z <= data->blockpos_max.Z); - - INodeDefManager *ndef = data->nodedef; - - // Hack: use minimum block coordinates for old code that assumes - // a single block - v3s16 blockpos = data->blockpos_requested; - - /*dstream<<"makeBlock(): ("<blockpos_min; - v3s16 blockpos_max = data->blockpos_max; - v3s16 blockpos_full_min = blockpos_min - v3s16(1,1,1); - v3s16 blockpos_full_max = blockpos_max + v3s16(1,1,1); - - ManualMapVoxelManipulator &vmanip = *(data->vmanip); - // Area of central chunk - v3s16 node_min = blockpos_min*MAP_BLOCKSIZE; - v3s16 node_max = (blockpos_max+v3s16(1,1,1))*MAP_BLOCKSIZE-v3s16(1,1,1); - // Full allocated area - v3s16 full_node_min = (blockpos_min-1)*MAP_BLOCKSIZE; - v3s16 full_node_max = (blockpos_max+2)*MAP_BLOCKSIZE-v3s16(1,1,1); - - v3s16 central_area_size = node_max - node_min + v3s16(1,1,1); - - const s16 max_spread_amount = MAP_BLOCKSIZE; - - int volume_blocks = (blockpos_max.X - blockpos_min.X + 1) - * (blockpos_max.Y - blockpos_min.Y + 1) - * (blockpos_max.Z - blockpos_max.Z + 1); - - int volume_nodes = volume_blocks * - MAP_BLOCKSIZE*MAP_BLOCKSIZE*MAP_BLOCKSIZE; - - // Generated surface area - //double gen_area_nodes = MAP_BLOCKSIZE*MAP_BLOCKSIZE * rel_volume; - - // Horribly wrong heuristic, but better than nothing - bool block_is_underground = (WATER_LEVEL > node_max.Y); - - /* - Create a block-specific seed - */ - u32 blockseed = get_blockseed(data->seed, full_node_min); - - /* - Cache some ground type values for speed - */ - -// Creates variables c_name=id and n_name=node -#define CONTENT_VARIABLE(ndef, name)\ - content_t c_##name = ndef->getId("mapgen_" #name);\ - MapNode n_##name(c_##name); -// Default to something else if was CONTENT_IGNORE -#define CONTENT_VARIABLE_FALLBACK(name, dname)\ - if(c_##name == CONTENT_IGNORE){\ - c_##name = c_##dname;\ - n_##name = n_##dname;\ - } - - CONTENT_VARIABLE(ndef, stone); - CONTENT_VARIABLE(ndef, air); - CONTENT_VARIABLE(ndef, water_source); - CONTENT_VARIABLE(ndef, dirt); - CONTENT_VARIABLE(ndef, sand); - CONTENT_VARIABLE(ndef, gravel); - CONTENT_VARIABLE(ndef, clay); - CONTENT_VARIABLE(ndef, lava_source); - CONTENT_VARIABLE(ndef, cobble); - CONTENT_VARIABLE(ndef, mossycobble); - CONTENT_VARIABLE(ndef, dirt_with_grass); - CONTENT_VARIABLE(ndef, junglegrass); - CONTENT_VARIABLE(ndef, stone_with_coal); - CONTENT_VARIABLE(ndef, stone_with_iron); - CONTENT_VARIABLE(ndef, mese); - CONTENT_VARIABLE(ndef, desert_sand); - CONTENT_VARIABLE_FALLBACK(desert_sand, sand); - CONTENT_VARIABLE(ndef, desert_stone); - CONTENT_VARIABLE_FALLBACK(desert_stone, stone); - - // Maximum height of the stone surface and obstacles. - // This is used to guide the cave generation - s16 stone_surface_max_y = 0; - - /* - Generate general ground level to full area - */ - { -#if 1 - TimeTaker timer1("Generating ground level"); - - for(s16 x=node_min.X; x<=node_max.X; x++) - for(s16 z=node_min.Z; z<=node_max.Z; z++) - { - // Node position - v2s16 p2d = v2s16(x,z); - - /* - Skip of already generated - */ - /*{ - v3s16 p(p2d.X, node_min.Y, p2d.Y); - if(vmanip.m_data[vmanip.m_area.index(p)].d != CONTENT_AIR) - continue; - }*/ - - // Ground height at this point - float surface_y_f = 0.0; - - // Use perlin noise for ground height - surface_y_f = base_rock_level_2d(data->seed, p2d); - - /*// Experimental stuff - { - float a = highlands_level_2d(data->seed, p2d); - if(a > surface_y_f) - surface_y_f = a; - }*/ - - // Convert to integer - s16 surface_y = (s16)surface_y_f; - - // Log it - if(surface_y > stone_surface_max_y) - stone_surface_max_y = surface_y; - - BiomeType bt = get_biome(data->seed, p2d); - /* - Fill ground with stone - */ - { - // Use fast index incrementing - v3s16 em = vmanip.m_area.getExtent(); - u32 i = vmanip.m_area.index(v3s16(p2d.X, node_min.Y, p2d.Y)); - for(s16 y=node_min.Y; y<=node_max.Y; y++) - { - if(vmanip.m_data[i].getContent() == CONTENT_IGNORE){ - if(y <= surface_y){ - if(y > WATER_LEVEL && bt == BT_DESERT) - vmanip.m_data[i] = n_desert_stone; - else - vmanip.m_data[i] = n_stone; - } else if(y <= WATER_LEVEL){ - vmanip.m_data[i] = MapNode(c_water_source); - } else { - vmanip.m_data[i] = MapNode(c_air); - } - } - vmanip.m_area.add_y(em, i, 1); - } - } - } -#endif - - }//timer1 - - // Limit dirt flow area by 1 because mud is flown into neighbors. - assert(central_area_size.X == central_area_size.Z); - s16 mudflow_minpos = 0-max_spread_amount+1; - s16 mudflow_maxpos = central_area_size.X+max_spread_amount-2; - - /* - Loop this part, it will make stuff look older and newer nicely - */ - - const u32 age_loops = 2; - for(u32 i_age=0; i_ageseed+34329, 3, 0.50); - cave_amount = MYMAX(0.0, cave_amount); - u32 caves_count = cave_amount * volume_nodes / 50000; - u32 bruises_count = 1; - PseudoRandom ps(blockseed+21343); - PseudoRandom ps2(blockseed+1032); - if(ps.range(1, 6) == 1) - bruises_count = ps.range(0, ps.range(0, 2)); - if(get_biome(data->seed, v2s16(node_min.X, node_min.Y)) == BT_DESERT){ - caves_count /= 3; - bruises_count /= 3; - } - for(u32 jj=0; jj= caves_count); - s16 min_tunnel_diameter = 2; - s16 max_tunnel_diameter = ps.range(2,6); - int dswitchint = ps.range(1,14); - u16 tunnel_routepoints = 0; - int part_max_length_rs = 0; - if(large_cave){ - part_max_length_rs = ps.range(2,4); - tunnel_routepoints = ps.range(5, ps.range(15,30)); - min_tunnel_diameter = 5; - max_tunnel_diameter = ps.range(7, ps.range(8,24)); - } else { - part_max_length_rs = ps.range(2,9); - tunnel_routepoints = ps.range(10, ps.range(15,30)); - } - bool large_cave_is_flat = (ps.range(0,1) == 0); - - v3f main_direction(0,0,0); - - // Allowed route area size in nodes - v3s16 ar = central_area_size; - - // Area starting point in nodes - v3s16 of = node_min; - - // Allow a bit more - //(this should be more than the maximum radius of the tunnel) - //s16 insure = 5; // Didn't work with max_d = 20 - s16 insure = 10; - s16 more = max_spread_amount - max_tunnel_diameter/2 - insure; - ar += v3s16(1,0,1) * more * 2; - of -= v3s16(1,0,1) * more; - - s16 route_y_min = 0; - // Allow half a diameter + 7 over stone surface - s16 route_y_max = -of.Y + stone_surface_max_y + max_tunnel_diameter/2 + 7; - - /*// If caves, don't go through surface too often - if(large_cave == false) - route_y_max -= ps.range(0, max_tunnel_diameter*2);*/ - - // Limit maximum to area - route_y_max = rangelim(route_y_max, 0, ar.Y-1); - - if(large_cave) - { - /*// Minimum is at y=0 - route_y_min = -of.Y - 0;*/ - // Minimum is at y=max_tunnel_diameter/4 - //route_y_min = -of.Y + max_tunnel_diameter/4; - //s16 min = -of.Y + max_tunnel_diameter/4; - //s16 min = -of.Y + 0; - s16 min = 0; - if(node_min.Y < WATER_LEVEL && node_max.Y > WATER_LEVEL) - { - min = WATER_LEVEL - max_tunnel_diameter/3 - of.Y; - route_y_max = WATER_LEVEL + max_tunnel_diameter/3 - of.Y; - } - route_y_min = ps.range(min, min + max_tunnel_diameter); - route_y_min = rangelim(route_y_min, 0, route_y_max); - } - - /*dstream<<"route_y_min = "<seed, p2d) / 2.0 + 0.5; - - // Find ground level - s16 surface_y = find_stone_level(vmanip, p2d, ndef); - // Handle area not found - if(surface_y == vmanip.m_area.MinEdge.Y - 1) - continue; - - MapNode addnode(c_dirt); - BiomeType bt = get_biome(data->seed, p2d); - - if(bt == BT_DESERT) - addnode = MapNode(c_desert_sand); - - if(bt == BT_DESERT && surface_y + mud_add_amount <= WATER_LEVEL+1){ - addnode = MapNode(c_sand); - } else if(mud_add_amount <= 0){ - mud_add_amount = 1 - mud_add_amount; - addnode = MapNode(c_gravel); - } else if(bt == BT_NORMAL && get_have_beach(data->seed, p2d) && - surface_y + mud_add_amount <= WATER_LEVEL+2){ - addnode = MapNode(c_sand); - } - - if(bt == BT_DESERT){ - if(surface_y > 20){ - mud_add_amount = MYMAX(0, mud_add_amount - (surface_y - 20)/5); - } - } - - /* - If topmost node is grass, change it to mud. - It might be if it was flown to there from a neighboring - chunk and then converted. - */ - { - u32 i = vmanip.m_area.index(v3s16(p2d.X, surface_y, p2d.Y)); - MapNode *n = &vmanip.m_data[i]; - if(n->getContent() == c_dirt_with_grass) - *n = MapNode(c_dirt); - } - - /* - Add mud on ground - */ - { - s16 mudcount = 0; - v3s16 em = vmanip.m_area.getExtent(); - s16 y_start = surface_y+1; - u32 i = vmanip.m_area.index(v3s16(p2d.X, y_start, p2d.Y)); - for(s16 y=y_start; y<=node_max.Y; y++) - { - if(mudcount >= mud_add_amount) - break; - - MapNode &n = vmanip.m_data[i]; - n = addnode; - mudcount++; - - vmanip.m_area.add_y(em, i, 1); - } - } - - } - - }//timer1 -#endif - - /* - Add blobs of dirt and gravel underground - */ - if(get_biome(data->seed, v2s16(node_min.X, node_min.Y)) == BT_NORMAL) - { - PseudoRandom pr(blockseed+983); - for(int i=0; i -32 && pr.range(0,1) == 0) - n1 = MapNode(c_dirt); - else - n1 = MapNode(c_gravel); - for(int x1=0; x1= node_min.Y) - { - - for(;; y--) - { - MapNode *n = NULL; - // Find mud - for(; y>=node_min.Y; y--) - { - n = &vmanip.m_data[i]; - //if(content_walkable(n->d)) - // break; - if(n->getContent() == c_dirt || - n->getContent() == c_dirt_with_grass || - n->getContent() == c_gravel) - break; - - vmanip.m_area.add_y(em, i, -1); - } - - // Stop if out of area - //if(vmanip.m_area.contains(i) == false) - if(y < node_min.Y) - break; - - /*// If not mud, do nothing to it - MapNode *n = &vmanip.m_data[i]; - if(n->d != CONTENT_MUD && n->d != CONTENT_GRASS) - continue;*/ - - if(n->getContent() == c_dirt || - n->getContent() == c_dirt_with_grass) - { - // Make it exactly mud - n->setContent(c_dirt); - - /* - Don't flow it if the stuff under it is not mud - */ - { - u32 i2 = i; - vmanip.m_area.add_y(em, i2, -1); - // Cancel if out of area - if(vmanip.m_area.contains(i2) == false) - continue; - MapNode *n2 = &vmanip.m_data[i2]; - if(n2->getContent() != c_dirt && - n2->getContent() != c_dirt_with_grass) - continue; - } - } - - /*s16 recurse_count = 0; - mudflow_recurse:*/ - - v3s16 dirs4[4] = { - v3s16(0,0,1), // back - v3s16(1,0,0), // right - v3s16(0,0,-1), // front - v3s16(-1,0,0), // left - }; - - // Theck that upper is air or doesn't exist. - // Cancel dropping if upper keeps it in place - u32 i3 = i; - vmanip.m_area.add_y(em, i3, 1); - if(vmanip.m_area.contains(i3) == true - && ndef->get(vmanip.m_data[i3]).walkable) - { - continue; - } - - // Drop mud on side - - for(u32 di=0; di<4; di++) - { - v3s16 dirp = dirs4[di]; - u32 i2 = i; - // Move to side - vmanip.m_area.add_p(em, i2, dirp); - // Fail if out of area - if(vmanip.m_area.contains(i2) == false) - continue; - // Check that side is air - MapNode *n2 = &vmanip.m_data[i2]; - if(ndef->get(*n2).walkable) - continue; - // Check that under side is air - vmanip.m_area.add_y(em, i2, -1); - if(vmanip.m_area.contains(i2) == false) - continue; - n2 = &vmanip.m_data[i2]; - if(ndef->get(*n2).walkable) - continue; - /*// Check that under that is air (need a drop of 2) - vmanip.m_area.add_y(em, i2, -1); - if(vmanip.m_area.contains(i2) == false) - continue; - n2 = &vmanip.m_data[i2]; - if(content_walkable(n2->d)) - continue;*/ - // Loop further down until not air - bool dropped_to_unknown = false; - do{ - vmanip.m_area.add_y(em, i2, -1); - n2 = &vmanip.m_data[i2]; - // if out of known area - if(vmanip.m_area.contains(i2) == false - || n2->getContent() == CONTENT_IGNORE){ - dropped_to_unknown = true; - break; - } - }while(ndef->get(*n2).walkable == false); - // Loop one up so that we're in air - vmanip.m_area.add_y(em, i2, 1); - n2 = &vmanip.m_data[i2]; - - bool old_is_water = (n->getContent() == c_water_source); - // Move mud to new place - if(!dropped_to_unknown) { - *n2 = *n; - // Set old place to be air (or water) - if(old_is_water) - *n = MapNode(c_water_source); - else - *n = MapNode(CONTENT_AIR); - } - - // Done - break; - } - } - } - } - - } - - }//timer1 -#endif - - } // Aging loop - /*********************** - END OF AGING LOOP - ************************/ - - /* - Add top and bottom side of water to transforming_liquid queue - */ - - for(s16 x=full_node_min.X; x<=full_node_max.X; x++) - for(s16 z=full_node_min.Z; z<=full_node_max.Z; z++) - { - // Node position - v2s16 p2d(x,z); - { - bool water_found = false; - // Use fast index incrementing - v3s16 em = vmanip.m_area.getExtent(); - u32 i = vmanip.m_area.index(v3s16(p2d.X, full_node_max.Y, p2d.Y)); - for(s16 y=full_node_max.Y; y>=full_node_min.Y; y--) - { - if(y == full_node_max.Y){ - water_found = - (vmanip.m_data[i].getContent() == c_water_source || - vmanip.m_data[i].getContent() == c_lava_source); - } - else if(water_found == false) - { - if(vmanip.m_data[i].getContent() == c_water_source || - vmanip.m_data[i].getContent() == c_lava_source) - { - v3s16 p = v3s16(p2d.X, y, p2d.Y); - data->transforming_liquid.push_back(p); - water_found = true; - } - } - else - { - // This can be done because water_found can only - // turn to true and end up here after going through - // a single block. - if(vmanip.m_data[i+1].getContent() != c_water_source || - vmanip.m_data[i+1].getContent() != c_lava_source) - { - v3s16 p = v3s16(p2d.X, y+1, p2d.Y); - data->transforming_liquid.push_back(p); - water_found = false; - } - } - - vmanip.m_area.add_y(em, i, -1); - } - } - } - - /* - Grow grass - */ - - for(s16 x=full_node_min.X; x<=full_node_max.X; x++) - for(s16 z=full_node_min.Z; z<=full_node_max.Z; z++) - { - // Node position in 2d - v2s16 p2d = v2s16(x,z); - - /* - Find the lowest surface to which enough light ends up - to make grass grow. - - Basically just wait until not air and not leaves. - */ - s16 surface_y = 0; - { - v3s16 em = vmanip.m_area.getExtent(); - u32 i = vmanip.m_area.index(v3s16(p2d.X, node_max.Y, p2d.Y)); - s16 y; - // Go to ground level - for(y=node_max.Y; y>=full_node_min.Y; y--) - { - MapNode &n = vmanip.m_data[i]; - if(ndef->get(n).param_type != CPT_LIGHT - || ndef->get(n).liquid_type != LIQUID_NONE) - break; - vmanip.m_area.add_y(em, i, -1); - } - if(y >= full_node_min.Y) - surface_y = y; - else - surface_y = full_node_min.Y; - } - - u32 i = vmanip.m_area.index(p2d.X, surface_y, p2d.Y); - MapNode *n = &vmanip.m_data[i]; - if(n->getContent() == c_dirt){ - // Well yeah, this can't be overground... - if(surface_y < WATER_LEVEL - 20) - continue; - n->setContent(c_dirt_with_grass); - } - } - - /* - Generate some trees - */ - assert(central_area_size.X == central_area_size.Z); - { - PseudoRandom ps (blockseed); - // Divide area into parts - s16 div = 8; - s16 sidelen = central_area_size.X / div; - double area = sidelen * sidelen; - for(s16 x0=0; x0seed, p2d_center); - // Put trees in random places on part of division - for(u32 i=0; i node_max.Y - 6) - continue; - v3s16 p(x,y,z); - /* - Trees grow only on mud and grass - */ - { - u32 i = vmanip.m_area.index(v3s16(p)); - MapNode *n = &vmanip.m_data[i]; - if(n->getContent() != c_dirt - && n->getContent() != c_dirt_with_grass) - continue; - } - p.Y++; - // Make a tree - treegen::make_tree(vmanip, p, false, ndef, ps.next()); - } - } - } - -#if 0 - /* - Make base ground level - */ - - for(s16 x=node_min.X; x<=node_max.X; x++) - for(s16 z=node_min.Z; z<=node_max.Z; z++) - { - // Node position - v2s16 p2d(x,z); - { - // Use fast index incrementing - v3s16 em = vmanip.m_area.getExtent(); - u32 i = vmanip.m_area.index(v3s16(p2d.X, node_min.Y, p2d.Y)); - for(s16 y=node_min.Y; y<=node_max.Y; y++) - { - // Only modify places that have no content - if(vmanip.m_data[i].getContent() == CONTENT_IGNORE) - { - // First priority: make air and water. - // This avoids caves inside water. - if(all_is_ground_except_caves == false - && val_is_ground(noisebuf_ground.get(x,y,z), - v3s16(x,y,z), data->seed) == false) - { - if(y <= WATER_LEVEL) - vmanip.m_data[i] = n_water_source; - else - vmanip.m_data[i] = n_air; - } - else if(noisebuf_cave.get(x,y,z) > CAVE_NOISE_THRESHOLD) - vmanip.m_data[i] = n_air; - else - vmanip.m_data[i] = n_stone; - } - - vmanip->m_area.add_y(em, i, 1); - } - } - } - - /* - Add mud and sand and others underground (in place of stone) - */ - - for(s16 x=node_min.X; x<=node_max.X; x++) - for(s16 z=node_min.Z; z<=node_max.Z; z++) - { - // Node position - v2s16 p2d(x,z); - { - // Use fast index incrementing - v3s16 em = vmanip.m_area.getExtent(); - u32 i = vmanip.m_area.index(v3s16(p2d.X, node_max.Y, p2d.Y)); - for(s16 y=node_max.Y; y>=node_min.Y; y--) - { - if(vmanip.m_data[i].getContent() == c_stone) - { - if(noisebuf_ground_crumbleness.get(x,y,z) > 1.3) - { - if(noisebuf_ground_wetness.get(x,y,z) > 0.0) - vmanip.m_data[i] = n_dirt; - else - vmanip.m_data[i] = n_sand; - } - else if(noisebuf_ground_crumbleness.get(x,y,z) > 0.7) - { - if(noisebuf_ground_wetness.get(x,y,z) < -0.6) - vmanip.m_data[i] = n_gravel; - } - else if(noisebuf_ground_crumbleness.get(x,y,z) < - -3.0 + MYMIN(0.1 * sqrt((float)MYMAX(0, -y)), 1.5)) - { - vmanip.m_data[i] = n_lava_source; - for(s16 x1=-1; x1<=1; x1++) - for(s16 y1=-1; y1<=1; y1++) - for(s16 z1=-1; z1<=1; z1++) - data->transforming_liquid.push_back( - v3s16(p2d.X+x1, y+y1, p2d.Y+z1)); - } - } - - vmanip->m_area.add_y(em, i, -1); - } - } - } - - /* - Add dungeons - */ - - //if(node_min.Y < approx_groundlevel) - //if(myrand() % 3 == 0) - //if(myrand() % 3 == 0 && node_min.Y < approx_groundlevel) - //if(myrand() % 100 == 0 && node_min.Y < approx_groundlevel) - //float dungeon_rarity = g_settings.getFloat("dungeon_rarity"); - float dungeon_rarity = 0.02; - if(((noise3d(blockpos.X,blockpos.Y,blockpos.Z,data->seed)+1.0)/2.0) - < dungeon_rarity - && node_min.Y < approx_groundlevel) - { - // Dungeon generator doesn't modify places which have this set - vmanip->clearFlag(VMANIP_FLAG_DUNGEON_INSIDE - | VMANIP_FLAG_DUNGEON_PRESERVE); - - // Set all air and water to be untouchable to make dungeons open - // to caves and open air - for(s16 x=full_node_min.X; x<=full_node_max.X; x++) - for(s16 z=full_node_min.Z; z<=full_node_max.Z; z++) - { - // Node position - v2s16 p2d(x,z); - { - // Use fast index incrementing - v3s16 em = vmanip.m_area.getExtent(); - u32 i = vmanip.m_area.index(v3s16(p2d.X, full_node_max.Y, p2d.Y)); - for(s16 y=full_node_max.Y; y>=full_node_min.Y; y--) - { - if(vmanip.m_data[i].getContent() == CONTENT_AIR) - vmanip.m_flags[i] |= VMANIP_FLAG_DUNGEON_PRESERVE; - else if(vmanip.m_data[i].getContent() == c_water_source) - vmanip.m_flags[i] |= VMANIP_FLAG_DUNGEON_PRESERVE; - vmanip->m_area.add_y(em, i, -1); - } - } - } - - PseudoRandom random(blockseed+2); - - // Add it - make_dungeon1(vmanip, random, ndef); - - // Convert some cobble to mossy cobble - for(s16 x=full_node_min.X; x<=full_node_max.X; x++) - for(s16 z=full_node_min.Z; z<=full_node_max.Z; z++) - { - // Node position - v2s16 p2d(x,z); - { - // Use fast index incrementing - v3s16 em = vmanip.m_area.getExtent(); - u32 i = vmanip.m_area.index(v3s16(p2d.X, full_node_max.Y, p2d.Y)); - for(s16 y=full_node_max.Y; y>=full_node_min.Y; y--) - { - // (noisebuf not used because it doesn't contain the - // full area) - double wetness = noise3d_param( - get_ground_wetness_params(data->seed), x,y,z); - double d = noise3d_perlin((float)x/2.5, - (float)y/2.5,(float)z/2.5, - blockseed, 2, 1.4); - if(vmanip.m_data[i].getContent() == c_cobble) - { - if(d < wetness/3.0) - { - vmanip.m_data[i].setContent(c_mossycobble); - } - } - /*else if(vmanip.m_flags[i] & VMANIP_FLAG_DUNGEON_INSIDE) - { - if(wetness > 1.2) - vmanip.m_data[i].setContent(c_dirt); - }*/ - vmanip->m_area.add_y(em, i, -1); - } - } - } - } - - /* - Add NC - */ - { - PseudoRandom ncrandom(blockseed+9324342); - if(ncrandom.range(0, 1000) == 0 && blockpos.Y <= -3) - { - make_nc(vmanip, ncrandom, ndef); - } - } - - /* - Add top and bottom side of water to transforming_liquid queue - */ - - for(s16 x=node_min.X; x<=node_max.X; x++) - for(s16 z=node_min.Z; z<=node_max.Z; z++) - { - // Node position - v2s16 p2d(x,z); - { - bool water_found = false; - // Use fast index incrementing - v3s16 em = vmanip.m_area.getExtent(); - u32 i = vmanip.m_area.index(v3s16(p2d.X, node_max.Y, p2d.Y)); - for(s16 y=node_max.Y; y>=node_min.Y; y--) - { - if(water_found == false) - { - if(vmanip.m_data[i].getContent() == c_water_source) - { - v3s16 p = v3s16(p2d.X, y, p2d.Y); - data->transforming_liquid.push_back(p); - water_found = true; - } - } - else - { - // This can be done because water_found can only - // turn to true and end up here after going through - // a single block. - if(vmanip.m_data[i+1].getContent() != c_water_source) - { - v3s16 p = v3s16(p2d.X, y+1, p2d.Y); - data->transforming_liquid.push_back(p); - water_found = false; - } - } - - vmanip->m_area.add_y(em, i, -1); - } - } - } - - /* - If close to ground level - */ - - //if(abs(approx_ground_depth) < 30) - if(minimum_ground_depth < 5 && maximum_ground_depth > -5) - { - /* - Add grass and mud - */ - - for(s16 x=node_min.X; x<=node_max.X; x++) - for(s16 z=node_min.Z; z<=node_max.Z; z++) - { - // Node position - v2s16 p2d(x,z); - { - bool possibly_have_sand = get_have_beach(data->seed, p2d); - bool have_sand = false; - u32 current_depth = 0; - bool air_detected = false; - bool water_detected = false; - bool have_clay = false; - - // Use fast index incrementing - s16 start_y = node_max.Y+2; - v3s16 em = vmanip.m_area.getExtent(); - u32 i = vmanip.m_area.index(v3s16(p2d.X, start_y, p2d.Y)); - for(s16 y=start_y; y>=node_min.Y-3; y--) - { - if(vmanip.m_data[i].getContent() == c_water_source) - water_detected = true; - if(vmanip.m_data[i].getContent() == CONTENT_AIR) - air_detected = true; - - if((vmanip.m_data[i].getContent() == c_stone - || vmanip.m_data[i].getContent() == c_dirt_with_grass - || vmanip.m_data[i].getContent() == c_dirt - || vmanip.m_data[i].getContent() == c_sand - || vmanip.m_data[i].getContent() == c_gravel - ) && (air_detected || water_detected)) - { - if(current_depth == 0 && y <= WATER_LEVEL+2 - && possibly_have_sand) - have_sand = true; - - if(current_depth < 4) - { - if(have_sand) - { - vmanip.m_data[i] = MapNode(c_sand); - } - #if 1 - else if(current_depth==0 && !water_detected - && y >= WATER_LEVEL && air_detected) - vmanip.m_data[i] = MapNode(c_dirt_with_grass); - #endif - else - vmanip.m_data[i] = MapNode(c_dirt); - } - else - { - if(vmanip.m_data[i].getContent() == c_dirt - || vmanip.m_data[i].getContent() == c_dirt_with_grass) - vmanip.m_data[i] = MapNode(c_stone); - } - - current_depth++; - - if(current_depth >= 8) - break; - } - else if(current_depth != 0) - break; - - vmanip->m_area.add_y(em, i, -1); - } - } - } - - /* - Calculate some stuff - */ - - float surface_humidity = surface_humidity_2d(data->seed, p2d_center); - bool is_jungle = surface_humidity > 0.75; - // Amount of trees - u32 tree_count = gen_area_nodes * tree_amount_2d(data->seed, p2d_center); - if(is_jungle) - tree_count *= 5; - - /* - Add trees - */ - PseudoRandom treerandom(blockseed); - // Put trees in random places on part of division - for(u32 i=0; iseed, v2s16(x,z), 4); - // Don't make a tree under water level - if(y < WATER_LEVEL) - continue; - // Make sure tree fits (only trees whose starting point is - // at this block are added) - if(y < node_min.Y || y > node_max.Y) - continue; - /* - Find exact ground level - */ - v3s16 p(x,y+6,z); - bool found = false; - for(; p.Y >= y-6; p.Y--) - { - u32 i = vmanip->m_area.index(p); - MapNode *n = &vmanip->m_data[i]; - if(n->getContent() != CONTENT_AIR && n->getContent() != c_water_source && n->getContent() != CONTENT_IGNORE) - { - found = true; - break; - } - } - // If not found, handle next one - if(found == false) - continue; - - { - u32 i = vmanip->m_area.index(p); - MapNode *n = &vmanip->m_data[i]; - - if(n->getContent() != c_dirt && n->getContent() != c_dirt_with_grass && n->getContent() != c_sand) - continue; - - // Papyrus grows only on mud and in water - if(n->getContent() == c_dirt && y <= WATER_LEVEL) - { - p.Y++; - make_papyrus(vmanip, p, ndef); - } - // Trees grow only on mud and grass, on land - else if((n->getContent() == c_dirt || n->getContent() == c_dirt_with_grass) && y > WATER_LEVEL + 2) - { - p.Y++; - //if(surface_humidity_2d(data->seed, v2s16(x, y)) < 0.5) - if(is_jungle == false) - { - bool is_apple_tree; - if(myrand_range(0,4) != 0) - is_apple_tree = false; - else - is_apple_tree = noise2d_perlin( - 0.5+(float)p.X/100, 0.5+(float)p.Z/100, - data->seed+342902, 3, 0.45) > 0.2; - make_tree(vmanip, p, is_apple_tree, ndef); - } - else - make_jungletree(vmanip, p, ndef); - } - // Cactii grow only on sand, on land - else if(n->getContent() == c_sand && y > WATER_LEVEL + 2) - { - p.Y++; - make_cactus(vmanip, p, ndef); - } - } - } - - /* - Add jungle grass - */ - if(is_jungle) - { - PseudoRandom grassrandom(blockseed); - for(u32 i=0; iseed, v2s16(x,z), 4); - if(y < WATER_LEVEL) - continue; - if(y < node_min.Y || y > node_max.Y) - continue; - /* - Find exact ground level - */ - v3s16 p(x,y+6,z); - bool found = false; - for(; p.Y >= y-6; p.Y--) - { - u32 i = vmanip->m_area.index(p); - MapNode *n = &vmanip->m_data[i]; - if(data->nodedef->get(*n).is_ground_content) - { - found = true; - break; - } - } - // If not found, handle next one - if(found == false) - continue; - p.Y++; - if(vmanip.m_area.contains(p) == false) - continue; - if(vmanip.m_data[vmanip.m_area.index(p)].getContent() != CONTENT_AIR) - continue; - /*p.Y--; - if(vmanip.m_area.contains(p)) - vmanip.m_data[vmanip.m_area.index(p)] = c_dirt; - p.Y++;*/ - if(vmanip.m_area.contains(p)) - vmanip.m_data[vmanip.m_area.index(p)] = c_junglegrass; - } - } - -#if 0 - /* - Add some kind of random stones - */ - - u32 random_stone_count = gen_area_nodes * - randomstone_amount_2d(data->seed, p2d_center); - // Put in random places on part of division - for(u32 i=0; iseed, v2s16(x,z), 1); - // Don't add under water level - /*if(y < WATER_LEVEL) - continue;*/ - // Don't add if doesn't belong to this block - if(y < node_min.Y || y > node_max.Y) - continue; - v3s16 p(x,y,z); - // Filter placement - /*{ - u32 i = vmanip->m_area.index(v3s16(p)); - MapNode *n = &vmanip->m_data[i]; - if(n->getContent() != c_dirt && n->getContent() != c_dirt_with_grass) - continue; - }*/ - // Will be placed one higher - p.Y++; - // Add it - make_randomstone(vmanip, p); - } -#endif - -#if 0 - /* - Add larger stones - */ - - u32 large_stone_count = gen_area_nodes * - largestone_amount_2d(data->seed, p2d_center); - //u32 large_stone_count = 1; - // Put in random places on part of division - for(u32 i=0; iseed, v2s16(x,z), 1); - // Don't add under water level - /*if(y < WATER_LEVEL) - continue;*/ - // Don't add if doesn't belong to this block - if(y < node_min.Y || y > node_max.Y) - continue; - v3s16 p(x,y,z); - // Filter placement - /*{ - u32 i = vmanip->m_area.index(v3s16(p)); - MapNode *n = &vmanip->m_data[i]; - if(n->getContent() != c_dirt && n->getContent() != c_dirt_with_grass) - continue; - }*/ - // Will be placed one lower - p.Y--; - // Add it - make_largestone(vmanip, p); - } -#endif - } - - /* - Add minerals - */ - - { - PseudoRandom mineralrandom(blockseed); - - /* - Add meseblocks - */ - for(s16 i=0; i 0.0) - new_content = MapNode(c_stone_with_iron); - /*if(noisebuf_ground_wetness.get(x,y,z) > 0.0) - vmanip.m_data[i] = MapNode(c_dirt); - else - vmanip.m_data[i] = MapNode(c_sand);*/ - } - /*else if(noisebuf_ground_crumbleness.get(x,y,z) > 0.1) - { - }*/ - - if(new_content.getContent() != CONTENT_IGNORE) - { - for(u16 i=0; i<27; i++) - { - v3s16 p = v3s16(x,y,z) + g_27dirs[i]; - u32 vi = vmanip.m_area.index(p); - if(vmanip.m_data[vi].getContent() == base_content) - { - if(mineralrandom.next()%sparseness == 0) - vmanip.m_data[vi] = new_content; - } - } - } - } - } - /* - Add coal - */ - //for(s16 i=0; i < MYMAX(0, 50 - abs(node_min.Y+8 - (-30))); i++) - //for(s16 i=0; i<50; i++) - u16 coal_amount = 30; - u16 coal_rareness = 60 / coal_amount; - if(coal_rareness == 0) - coal_rareness = 1; - if(mineralrandom.next()%coal_rareness == 0) - { - u16 a = mineralrandom.next() % 16; - u16 amount = coal_amount * a*a*a / 1000; - for(s16 i=0; i light_sources; - std::map unlight_from; - - voxalgo::clearLightAndCollectSources(vmanip, a, bank, ndef, - light_sources, unlight_from); - - bool inexistent_top_provides_sunlight = !block_is_underground; - voxalgo::SunlightPropagateResult res = voxalgo::propagateSunlight( - vmanip, a, inexistent_top_provides_sunlight, - light_sources, ndef); - // TODO: Do stuff according to bottom_sunlight_valid - - vmanip.unspreadLight(bank, unlight_from, light_sources, ndef); - - vmanip.spreadLight(bank, light_sources, ndef); - } - } -} - -#endif ///BIG COMMENT - diff --git a/src/mapgen.h b/src/mapgen.h index 911e87537..67ea9fbd4 100644 --- a/src/mapgen.h +++ b/src/mapgen.h @@ -72,6 +72,11 @@ public: int water_level; bool generating; int id; + ManualMapVoxelManipulator *vm; + INodeDefManager *ndef; + + void updateLiquid(UniqueQueue *trans_liquid, v3s16 nmin, v3s16 nmax); + void updateLighting(v3s16 nmin, v3s16 nmax); virtual void makeChunk(BlockMakeData *data) {}; virtual int getGroundLevelAtPoint(v2s16 p) = 0; diff --git a/src/mapgen_v6.cpp b/src/mapgen_v6.cpp index f4366c154..b60758310 100644 --- a/src/mapgen_v6.cpp +++ b/src/mapgen_v6.cpp @@ -33,6 +33,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "main.h" // For g_profiler #include "emerge.h" #include "dungeongen.h" +#include "treegen.h" #include "mapgen_v6.h" /////////////////// Mapgen V6 perlin noise default values @@ -83,15 +84,6 @@ MapgenV6::MapgenV6(int mapgenid, MapgenV6Params *params) { noise_mud = new Noise(params->np_mud, seed, csize.X, csize.Y); noise_beach = new Noise(params->np_beach, seed, csize.X, csize.Y); noise_biome = new Noise(params->np_biome, seed, csize.X, csize.Y); - - map_terrain_base = noise_terrain_base->result; - map_terrain_higher = noise_terrain_higher->result; - map_steepness = noise_steepness->result; - map_height_select = noise_height_select->result; - map_trees = noise_trees->result; - map_mud = noise_mud->result; - map_beach = noise_beach->result; - map_biome = noise_biome->result; } @@ -107,162 +99,47 @@ MapgenV6::~MapgenV6() { } -/* - Some helper functions for the map generator -*/ +//////////////////////// Some helper functions for the map generator -#if 1 // Returns Y one under area minimum if not found -s16 MapgenV6::find_ground_level(VoxelManipulator &vmanip, v2s16 p2d, - INodeDefManager *ndef) -{ - v3s16 em = vmanip.m_area.getExtent(); - s16 y_nodes_max = vmanip.m_area.MaxEdge.Y; - s16 y_nodes_min = vmanip.m_area.MinEdge.Y; - u32 i = vmanip.m_area.index(v3s16(p2d.X, y_nodes_max, p2d.Y)); +s16 MapgenV6::find_ground_level(v2s16 p2d) { + v3s16 em = vm->m_area.getExtent(); + s16 y_nodes_max = vm->m_area.MaxEdge.Y; + s16 y_nodes_min = vm->m_area.MinEdge.Y; + u32 i = vm->m_area.index(p2d.X, y_nodes_max, p2d.Y); s16 y; - for(y=y_nodes_max; y>=y_nodes_min; y--) - { - MapNode &n = vmanip.m_data[i]; + + for (y = y_nodes_max; y >= y_nodes_min; y--) { + MapNode &n = vm->m_data[i]; if(ndef->get(n).walkable) break; - vmanip.m_area.add_y(em, i, -1); + vm->m_area.add_y(em, i, -1); } - if(y >= y_nodes_min) - return y; - else - return y_nodes_min - 1; + return (y >= y_nodes_min) ? y : y_nodes_min - 1; } // Returns Y one under area minimum if not found -s16 MapgenV6::find_stone_level(VoxelManipulator &vmanip, v2s16 p2d, - INodeDefManager *ndef) -{ - v3s16 em = vmanip.m_area.getExtent(); - s16 y_nodes_max = vmanip.m_area.MaxEdge.Y; - s16 y_nodes_min = vmanip.m_area.MinEdge.Y; - u32 i = vmanip.m_area.index(v3s16(p2d.X, y_nodes_max, p2d.Y)); +s16 MapgenV6::find_stone_level(v2s16 p2d) { + v3s16 em = vm->m_area.getExtent(); + s16 y_nodes_max = vm->m_area.MaxEdge.Y; + s16 y_nodes_min = vm->m_area.MinEdge.Y; + u32 i = vm->m_area.index(p2d.X, y_nodes_max, p2d.Y); s16 y; - content_t c_stone = ndef->getId("mapgen_stone"); - content_t c_desert_stone = ndef->getId("mapgen_desert_stone"); - for(y=y_nodes_max; y>=y_nodes_min; y--) - { - MapNode &n = vmanip.m_data[i]; + + for (y = y_nodes_max; y >= y_nodes_min; y--) { + MapNode &n = vm->m_data[i]; content_t c = n.getContent(); - if(c != CONTENT_IGNORE && ( - c == c_stone || c == c_desert_stone)) + if (c != CONTENT_IGNORE && ( + c == c_stone || c == c_desert_stone)) break; - vmanip.m_area.add_y(em, i, -1); - } - if(y >= y_nodes_min) - return y; - else - return y_nodes_min - 1; -} -#endif - -void MapgenV6::make_tree(ManualMapVoxelManipulator &vmanip, v3s16 p0, - bool is_apple_tree, INodeDefManager *ndef) -{ - MapNode treenode(ndef->getId("mapgen_tree")); - MapNode leavesnode(ndef->getId("mapgen_leaves")); - MapNode applenode(ndef->getId("mapgen_apple")); - - s16 trunk_h = myrand_range(4, 5); - v3s16 p1 = p0; - for(s16 ii=0; ii leaves_d(new u8[leaves_a.getVolume()]); - Buffer leaves_d(leaves_a.getVolume()); - for(s32 i=0; im_area.add_y(em, i, -1); } + return (y >= y_nodes_min) ? y : y_nodes_min - 1; } -/* - Noise functions. Make sure seed is mangled differently in each one. -*/ - - -// Amount of trees per area in nodes -double MapgenV6::tree_amount_2d(u64 seed, v2s16 p) -{ - /*double noise = noise2d_perlin( - 0.5+(float)p.X/125, 0.5+(float)p.Y/125, - seed+2, 4, 0.66);*/ - double noise = map_trees[(p.Y - node_min.Z) * ystride + (p.X - node_min.X)]; - double zeroval = -0.39; - if(noise < zeroval) - return 0; - else - return 0.04 * (noise-zeroval) / (1.0-zeroval); -} - // Required by mapgen.h bool MapgenV6::block_is_underground(u64 seed, v3s16 blockpos) { @@ -278,105 +155,125 @@ bool MapgenV6::block_is_underground(u64 seed, v3s16 blockpos) } -double MapgenV6::base_rock_level_2d(u64 seed, v2s16 p) -{ - if (flags & MG_FLAT) - return water_level; - - int index = (p.Y - node_min.Z) * ystride + (p.X - node_min.X); +//////////////////////// Base terrain height functions - // The base ground level - /*double base = (double)WATER_LEVEL - (double)AVERAGE_MUD_AMOUNT - + 20. * noise2d_perlin( - 0.5+(float)p.X/250., 0.5+(float)p.Y/250., - seed+82341, 5, 0.6);*/ - double base = water_level + map_terrain_base[index]; +float MapgenV6::baseTerrainLevel(float terrain_base, float terrain_higher, + float steepness, float height_select) { + float base = water_level + terrain_base; + float higher = water_level + terrain_higher; - // Higher ground level - /*double higher = (double)WATER_LEVEL + 20. + 16. * noise2d_perlin( - 0.5+(float)p.X/500., 0.5+(float)p.Y/500., - seed+85039, 5, 0.6);*/ - double higher = water_level + map_terrain_higher[index]; - - // Limit higher to at least base + // Limit higher ground level to at least base if(higher < base) higher = base; // Steepness factor of cliffs - /*double b = 0.85 + 0.5 * noise2d_perlin( - 0.5+(float)p.X/125., 0.5+(float)p.Y/125., - seed-932, 5, 0.7);*/ - double b = map_steepness[index]; + float b = steepness; b = rangelim(b, 0.0, 1000.0); - b = pow(b, 7); - b *= 5; + b = 5 * b * b * b * b * b * b * b; b = rangelim(b, 0.5, 1000.0); // Values 1.5...100 give quite horrible looking slopes - if(b > 1.5 && b < 100.0){ - if(b < 10.0) - b = 1.5; - else - b = 100.0; - } + if (b > 1.5 && b < 100.0) + b = (b < 10.0) ? 1.5 : 100.0; - // Offset to more low - double a_off = -0.20; + float a_off = -0.20; // Offset to more low + float a = 0.5 + b * (a_off + height_select); + a = rangelim(a, 0.0, 1.0); // Limit + + return base * (1.0 - a) + higher * a; +} - // High/low selector - /*double a = (double)0.5 + b * (a_off + noise2d_perlin( - 0.5+(float)p.X/250., 0.5+(float)p.Y/250., - seed+4213, 5, 0.69));*/ - double a = 0.5 + b * (a_off + map_height_select[index]); - // Limit - a = rangelim(a, 0.0, 1.0); +float MapgenV6::baseTerrainLevelFromNoise(v2s16 p) { + if (flags & MG_FLAT) + return water_level; + + float terrain_base = NoisePerlin2DPosOffset(noise_terrain_base->np, + p.X, 0.5, p.Y, 0.5, seed); + float terrain_higher = NoisePerlin2DPosOffset(noise_terrain_higher->np, + p.X, 0.5, p.Y, 0.5, seed); + float steepness = NoisePerlin2DPosOffset(noise_steepness->np, + p.X, 0.5, p.Y, 0.5, seed); + float height_select = NoisePerlin2DNoTxfmPosOffset(noise_height_select->np, + p.X, 0.5, p.Y, 0.5, seed); + + return baseTerrainLevel(terrain_base, terrain_higher, + steepness, height_select); +} - double h = base*(1.0-a) + higher*a; - return h; +float MapgenV6::baseTerrainLevelFromMap(v2s16 p) { + int index = (p.Y - node_min.Z) * ystride + (p.X - node_min.X); + return baseTerrainLevelFromMap(index); } -double MapgenV6::baseRockLevelFromNoise(v2s16 p) { + +float MapgenV6::baseTerrainLevelFromMap(int index) { if (flags & MG_FLAT) return water_level; - double base = water_level + - NoisePerlin2DPosOffset(noise_terrain_base->np, p.X, 0.5, p.Y, 0.5, seed); - double higher = water_level + - NoisePerlin2DPosOffset(noise_terrain_higher->np, p.X, 0.5, p.Y, 0.5, seed); + float terrain_base = noise_terrain_base->result[index]; + float terrain_higher = noise_terrain_higher->result[index]; + float steepness = noise_steepness->result[index]; + float height_select = noise_height_select->result[index]; + + return baseTerrainLevel(terrain_base, terrain_higher, + steepness, height_select); +} - if (higher < base) - higher = base; - double b = NoisePerlin2DPosOffset(noise_steepness->np, p.X, 0.5, p.Y, 0.5, seed); - b = rangelim(b, 0.0, 1000.0); - b = b*b*b*b*b*b*b; - b *= 5; - b = rangelim(b, 0.5, 1000.0); +s16 MapgenV6::find_ground_level_from_noise(u64 seed, v2s16 p2d, s16 precision) { + return baseTerrainLevelFromNoise(p2d) + AVERAGE_MUD_AMOUNT; +} - if(b > 1.5 && b < 100.0){ - if(b < 10.0) - b = 1.5; - else - b = 100.0; - } - - double a_off = -0.20; - double a = 0.5 + b * (a_off + NoisePerlin2DNoTxfmPosOffset( - noise_height_select->np, p.X, 0.5, p.Y, 0.5, seed)); - a = rangelim(a, 0.0, 1.0); - return base * (1.0 - a) + higher * a; +int MapgenV6::getGroundLevelAtPoint(v2s16 p) { + return baseTerrainLevelFromNoise(p) + AVERAGE_MUD_AMOUNT; } -s16 MapgenV6::find_ground_level_from_noise(u64 seed, v2s16 p2d, s16 precision) +//////////////////////// Noise functions + +float MapgenV6::getTreeAmount(v2s16 p) { + int index = (p.Y - node_min.Z) * ystride + (p.X - node_min.X); + return getTreeAmount(index); +} + + +float MapgenV6::getMudAmount(v2s16 p) { + int index = (p.Y - node_min.Z) * ystride + (p.X - node_min.X); + return getMudAmount(index); +} + + +bool MapgenV6::getHaveBeach(v2s16 p) { + int index = (p.Y - node_min.Z) * ystride + (p.X - node_min.X); + return getHaveBeach(index); +} + + +BiomeType MapgenV6::getBiome(v2s16 p) { + int index = (p.Y - node_min.Z) * ystride + (p.X - node_min.X); + return getBiome(index, p); +} + + +float MapgenV6::getTreeAmount(int index) { - return baseRockLevelFromNoise(p2d) + AVERAGE_MUD_AMOUNT; + /*double noise = noise2d_perlin( + 0.5+(float)p.X/125, 0.5+(float)p.Y/125, + seed+2, 4, 0.66);*/ + + float noise = noise_trees->result[index]; + float zeroval = -0.39; + if (noise < zeroval) + return 0; + else + return 0.04 * (noise-zeroval) / (1.0-zeroval); } -double MapgenV6::get_mud_add_amount(u64 seed, v2s16 p) + +float MapgenV6::getMudAmount(int index) { if (flags & MG_FLAT) return AVERAGE_MUD_AMOUNT; @@ -384,39 +281,42 @@ double MapgenV6::get_mud_add_amount(u64 seed, v2s16 p) /*return ((float)AVERAGE_MUD_AMOUNT + 2.0 * noise2d_perlin( 0.5+(float)p.X/200, 0.5+(float)p.Y/200, seed+91013, 3, 0.55));*/ - int index = (p.Y - node_min.Z) * ystride + (p.X - node_min.X); - return map_mud[index]; + + return noise_mud->result[index]; } -bool MapgenV6::get_have_beach(u64 seed, v2s16 p2d) + +bool MapgenV6::getHaveBeach(int index) { // Determine whether to have sand here /*double sandnoise = noise2d_perlin( 0.2+(float)p2d.X/250, 0.7+(float)p2d.Y/250, seed+59420, 3, 0.50);*/ - int index = (p2d.Y - node_min.Z) * ystride + (p2d.X - node_min.X); - double sandnoise = map_beach[index]; - + + float sandnoise = noise_beach->result[index]; return (sandnoise > freq_beach); } -BiomeType MapgenV6::get_biome(u64 seed, v2s16 p2d) + +BiomeType MapgenV6::getBiome(int index, v2s16 p) { // Just do something very simple as for now /*double d = noise2d_perlin( 0.6+(float)p2d.X/250, 0.2+(float)p2d.Y/250, seed+9130, 3, 0.50);*/ - int index = (p2d.Y - node_min.Z) * ystride + (p2d.X - node_min.X); - double d = map_biome[index]; - if(d > freq_desert) + + float d = noise_biome->result[index]; + if (d > freq_desert) return BT_DESERT; - if (flags & MGV6_BIOME_BLEND) { - if(d > freq_desert - 0.10 && - (noise2d(p2d.X, p2d.Y, seed) + 1.0) > (freq_desert - d) * 20.0) - return BT_DESERT; - } + + if ((flags & MGV6_BIOME_BLEND) && + (d > freq_desert - 0.10) && + ((noise2d(p.X, p.Y, seed) + 1.0) > (freq_desert - d) * 20.0)) + return BT_DESERT; + return BT_NORMAL; -}; +} + u32 MapgenV6::get_blockseed(u64 seed, v3s16 p) { @@ -425,275 +325,548 @@ u32 MapgenV6::get_blockseed(u64 seed, v3s16 p) } -int MapgenV6::getGroundLevelAtPoint(v2s16 p) { - return baseRockLevelFromNoise(p) + AVERAGE_MUD_AMOUNT; -} - -#define VMANIP_FLAG_CAVE VOXELFLAG_CHECKED1 - -void MapgenV6::makeChunk(BlockMakeData *data) -{ - this->generating = true; +//////////////////////// Map generator +void MapgenV6::makeChunk(BlockMakeData *data) { assert(data->vmanip); assert(data->nodedef); assert(data->blockpos_requested.X >= data->blockpos_min.X && - data->blockpos_requested.Y >= data->blockpos_min.Y && - data->blockpos_requested.Z >= data->blockpos_min.Z); + data->blockpos_requested.Y >= data->blockpos_min.Y && + data->blockpos_requested.Z >= data->blockpos_min.Z); assert(data->blockpos_requested.X <= data->blockpos_max.X && - data->blockpos_requested.Y <= data->blockpos_max.Y && - data->blockpos_requested.Z <= data->blockpos_max.Z); - - INodeDefManager *ndef = data->nodedef; - - // Hack: use minimum block coordinates for old code that assumes - // a single block + data->blockpos_requested.Y <= data->blockpos_max.Y && + data->blockpos_requested.Z <= data->blockpos_max.Z); + + this->generating = true; + this->vm = data->vmanip; + this->ndef = data->nodedef; + + // Hack: use minimum block coords for old code that assumes a single block v3s16 blockpos = data->blockpos_requested; - - /*dstream<<"makeBlock(): ("<blockpos_min; v3s16 blockpos_max = data->blockpos_max; v3s16 blockpos_full_min = blockpos_min - v3s16(1,1,1); v3s16 blockpos_full_max = blockpos_max + v3s16(1,1,1); - ManualMapVoxelManipulator &vmanip = *(data->vmanip); // Area of central chunk node_min = blockpos_min*MAP_BLOCKSIZE; node_max = (blockpos_max+v3s16(1,1,1))*MAP_BLOCKSIZE-v3s16(1,1,1); + // Full allocated area - v3s16 full_node_min = (blockpos_min-1)*MAP_BLOCKSIZE; - v3s16 full_node_max = (blockpos_max+2)*MAP_BLOCKSIZE-v3s16(1,1,1); + full_node_min = (blockpos_min-1)*MAP_BLOCKSIZE; + full_node_max = (blockpos_max+2)*MAP_BLOCKSIZE-v3s16(1,1,1); + + central_area_size = node_max - node_min + v3s16(1,1,1); + assert(central_area_size.X == central_area_size.Z); - v3s16 central_area_size = node_max - node_min + v3s16(1,1,1); + int volume_blocks = (blockpos_max.X - blockpos_min.X + 1) + * (blockpos_max.Y - blockpos_min.Y + 1) + * (blockpos_max.Z - blockpos_max.Z + 1); + + volume_nodes = volume_blocks * + MAP_BLOCKSIZE * MAP_BLOCKSIZE * MAP_BLOCKSIZE; + + // Create a block-specific seed + blockseed = get_blockseed(data->seed, full_node_min); + + // Make some noise + calculateNoise(); + + c_stone = ndef->getId("mapgen_stone"); + c_dirt = ndef->getId("mapgen_dirt"); + c_dirt_with_grass = ndef->getId("mapgen_dirt_with_grass"); + c_sand = ndef->getId("mapgen_sand"); + c_water_source = ndef->getId("mapgen_water_source"); + c_lava_source = ndef->getId("mapgen_lava_source"); + c_gravel = ndef->getId("mapgen_gravel"); + c_cobble = ndef->getId("mapgen_cobble"); + c_desert_sand = ndef->getId("mapgen_desert_sand"); + c_desert_stone = ndef->getId("mapgen_desert_stone"); + if (c_desert_sand == CONTENT_IGNORE) + c_desert_sand = c_sand; + if (c_desert_stone == CONTENT_IGNORE) + c_desert_stone = c_stone; + + // Maximum height of the stone surface and obstacles. + // This is used to guide the cave generation + s16 stone_surface_max_y; + + // Generate general ground level to full area + stone_surface_max_y = generateGround(); const s16 max_spread_amount = MAP_BLOCKSIZE; + // Limit dirt flow area by 1 because mud is flown into neighbors. + s16 mudflow_minpos = -max_spread_amount + 1; + s16 mudflow_maxpos = central_area_size.X + max_spread_amount - 2; - int volume_blocks = (blockpos_max.X - blockpos_min.X + 1) - * (blockpos_max.Y - blockpos_min.Y + 1) - * (blockpos_max.Z - blockpos_max.Z + 1); - - int volume_nodes = volume_blocks * - MAP_BLOCKSIZE*MAP_BLOCKSIZE*MAP_BLOCKSIZE; - - // Generated surface area - //double gen_area_nodes = MAP_BLOCKSIZE*MAP_BLOCKSIZE * rel_volume; - - // Horribly wrong heuristic, but better than nothing - bool block_is_underground = (water_level > node_max.Y); - - /* - Create a block-specific seed - */ - u32 blockseed = get_blockseed(data->seed, full_node_min); - - /* - Make some noise - */ - { - int x = node_min.X; - int z = node_min.Z; - - // Need to adjust for the original implementation's +.5 offset... - if (!(flags & MG_FLAT)) { - noise_terrain_base->perlinMap2D( - x + 0.5 * noise_terrain_base->np->spread.X, - z + 0.5 * noise_terrain_base->np->spread.Z); - noise_terrain_base->transformNoiseMap(); - - noise_terrain_higher->perlinMap2D( - x + 0.5 * noise_terrain_higher->np->spread.X, - z + 0.5 * noise_terrain_higher->np->spread.Z); - noise_terrain_higher->transformNoiseMap(); - - noise_steepness->perlinMap2D( - x + 0.5 * noise_steepness->np->spread.X, - z + 0.5 * noise_steepness->np->spread.Z); - noise_steepness->transformNoiseMap(); - - noise_height_select->perlinMap2D( - x + 0.5 * noise_height_select->np->spread.X, - z + 0.5 * noise_height_select->np->spread.Z); - } - + // Loop this part, it will make stuff look older and newer nicely + const u32 age_loops = 2; + for (u32 i_age = 0; i_age < age_loops; i_age++) { // Aging loop + // Make caves (this code is relatively horrible) + if (flags & MG_CAVES) + generateCaves(stone_surface_max_y); + + // Add mud to the central chunk + addMud(); + + // Add blobs of dirt and gravel underground + addDirtGravelBlobs(); + + // Flow mud away from steep edges + flowMud(mudflow_minpos, mudflow_maxpos); + + } + + // Add dungeons + if (flags & MG_DUNGEONS) { + DungeonGen dgen(ndef, data->seed, water_level); + dgen.generate(vm, blockseed, full_node_min, full_node_max); + } + + // Add top and bottom side of water to transforming_liquid queue + updateLiquid(&data->transforming_liquid, full_node_min, full_node_max); + + // Grow grass + growGrass(); + + // Generate some trees + if (flags & MG_TREES) + placeTrees(); + + // Calculate lighting + updateLighting(node_min, node_max); + + this->generating = false; +} + + +void MapgenV6::calculateNoise() { + int x = node_min.X; + int z = node_min.Z; + + // Need to adjust for the original implementation's +.5 offset... + if (!(flags & MG_FLAT)) { + noise_terrain_base->perlinMap2D( + x + 0.5 * noise_terrain_base->np->spread.X, + z + 0.5 * noise_terrain_base->np->spread.Z); + noise_terrain_base->transformNoiseMap(); + + noise_terrain_higher->perlinMap2D( + x + 0.5 * noise_terrain_higher->np->spread.X, + z + 0.5 * noise_terrain_higher->np->spread.Z); + noise_terrain_higher->transformNoiseMap(); + + noise_steepness->perlinMap2D( + x + 0.5 * noise_steepness->np->spread.X, + z + 0.5 * noise_steepness->np->spread.Z); + noise_steepness->transformNoiseMap(); + + noise_height_select->perlinMap2D( + x + 0.5 * noise_height_select->np->spread.X, + z + 0.5 * noise_height_select->np->spread.Z); + } + + if (flags & MG_TREES) { noise_trees->perlinMap2D( x + 0.5 * noise_trees->np->spread.X, z + 0.5 * noise_trees->np->spread.Z); - - if (!(flags & MG_FLAT)) { - noise_mud->perlinMap2D( - x + 0.5 * noise_mud->np->spread.X, - z + 0.5 * noise_mud->np->spread.Z); - noise_mud->transformNoiseMap(); - } - noise_beach->perlinMap2D( - x + 0.2 * noise_beach->np->spread.X, - z + 0.7 * noise_beach->np->spread.Z); - - noise_biome->perlinMap2D( - x + 0.6 * noise_biome->np->spread.X, - z + 0.2 * noise_biome->np->spread.Z); } + + if (!(flags & MG_FLAT)) { + noise_mud->perlinMap2D( + x + 0.5 * noise_mud->np->spread.X, + z + 0.5 * noise_mud->np->spread.Z); + noise_mud->transformNoiseMap(); + } + noise_beach->perlinMap2D( + x + 0.2 * noise_beach->np->spread.X, + z + 0.7 * noise_beach->np->spread.Z); + noise_biome->perlinMap2D( + x + 0.6 * noise_biome->np->spread.X, + z + 0.2 * noise_biome->np->spread.Z); +} - /* - Cache some ground type values for speed - */ -// Creates variables c_name=id and n_name=node -#define CONTENT_VARIABLE(ndef, name)\ - content_t c_##name = ndef->getId("mapgen_" #name);\ - MapNode n_##name(c_##name); -// Default to something else if was CONTENT_IGNORE -#define CONTENT_VARIABLE_FALLBACK(name, dname)\ - if(c_##name == CONTENT_IGNORE){\ - c_##name = c_##dname;\ - n_##name = n_##dname;\ +int MapgenV6::generateGround() { + //TimeTaker timer1("Generating ground level"); + MapNode n_air(CONTENT_AIR), n_water_source(c_water_source); + MapNode n_stone(c_stone), n_desert_stone(c_desert_stone); + int stone_surface_max_y = -MAP_GENERATION_LIMIT; + u32 index = 0; + + for (s16 z = node_min.Z; z <= node_max.Z; z++) + for (s16 x = node_min.X; x <= node_max.X; x++, index++) { + // Surface height + s16 surface_y = (s16)baseTerrainLevelFromMap(index); + + // Log it + if (surface_y > stone_surface_max_y) + stone_surface_max_y = surface_y; + + BiomeType bt = getBiome(index, v2s16(x, z)); + + // Fill ground with stone + v3s16 em = vm->m_area.getExtent(); + u32 i = vm->m_area.index(x, node_min.Y, z); + for (s16 y = node_min.Y; y <= node_max.Y; y++) { + if (vm->m_data[i].getContent() == CONTENT_IGNORE) { + if (y <= surface_y) { + vm->m_data[i] = (y > water_level && bt == BT_DESERT) ? + n_desert_stone : n_stone; + } else if (y <= water_level) { + vm->m_data[i] = n_water_source; + } else { + vm->m_data[i] = n_air; + } + } + vm->m_area.add_y(em, i, 1); + } } + + return stone_surface_max_y; +} - CONTENT_VARIABLE(ndef, stone); - CONTENT_VARIABLE(ndef, air); - CONTENT_VARIABLE(ndef, water_source); - CONTENT_VARIABLE(ndef, dirt); - CONTENT_VARIABLE(ndef, sand); - CONTENT_VARIABLE(ndef, gravel); - CONTENT_VARIABLE(ndef, clay); - CONTENT_VARIABLE(ndef, lava_source); - CONTENT_VARIABLE(ndef, cobble); - CONTENT_VARIABLE(ndef, mossycobble); - CONTENT_VARIABLE(ndef, dirt_with_grass); - CONTENT_VARIABLE(ndef, junglegrass); - CONTENT_VARIABLE(ndef, stone_with_coal); - CONTENT_VARIABLE(ndef, stone_with_iron); - CONTENT_VARIABLE(ndef, mese); - CONTENT_VARIABLE(ndef, desert_sand); - CONTENT_VARIABLE_FALLBACK(desert_sand, sand); - CONTENT_VARIABLE(ndef, desert_stone); - CONTENT_VARIABLE_FALLBACK(desert_stone, stone); - // Maximum height of the stone surface and obstacles. - // This is used to guide the cave generation - s16 stone_surface_max_y = 0; +void MapgenV6::addMud() { + // 15ms @cs=8 + //TimeTaker timer1("add mud"); + MapNode n_dirt(c_dirt), n_gravel(c_gravel); + MapNode n_sand(c_sand), n_desert_sand(c_desert_sand); + MapNode addnode; + + u32 index = 0; + for (s16 z = node_min.Z; z <= node_max.Z; z++) + for (s16 x = node_min.X; x <= node_max.X; x++, index++) { + // Randomize mud amount + s16 mud_add_amount = getMudAmount(index) / 2.0 + 0.5; - /* - Generate general ground level to full area - */ - { -#if 1 - TimeTaker timer1("Generating ground level"); + // Find ground level + s16 surface_y = find_stone_level(v2s16(x, z)); /////////////////optimize this! + + // Handle area not found + if (surface_y == vm->m_area.MinEdge.Y - 1) + continue; + + BiomeType bt = getBiome(index, v2s16(x, z)); + addnode = (bt == BT_DESERT) ? n_desert_sand : n_dirt; - for(s16 x=node_min.X; x<=node_max.X; x++) - for(s16 z=node_min.Z; z<=node_max.Z; z++) - { - // Node position - v2s16 p2d = v2s16(x,z); + if (bt == BT_DESERT && surface_y + mud_add_amount <= water_level + 1) { + addnode = n_sand; + } else if (mud_add_amount <= 0) { + mud_add_amount = 1 - mud_add_amount; + addnode = n_gravel; + } else if (bt == BT_NORMAL && getHaveBeach(index) && + surface_y + mud_add_amount <= water_level + 2) { + addnode = n_sand; + } - /* - Skip of already generated - */ - /*{ - v3s16 p(p2d.X, node_min.Y, p2d.Y); - if(vmanip.m_data[vmanip.m_area.index(p)].d != CONTENT_AIR) - continue; - }*/ + if (bt == BT_DESERT && surface_y > 20) + mud_add_amount = MYMAX(0, mud_add_amount - (surface_y - 20) / 5); + + // If topmost node is grass, change it to mud. It might be if it was + // flown to there from a neighboring chunk and then converted. + u32 i = vm->m_area.index(x, surface_y, z); + if (vm->m_data[i].getContent() == c_dirt_with_grass) + vm->m_data[i] = n_dirt; + + // Add mud on ground + s16 mudcount = 0; + v3s16 em = vm->m_area.getExtent(); + s16 y_start = surface_y + 1; + i = vm->m_area.index(x, y_start, z); + for (s16 y = y_start; y <= node_max.Y; y++) { + if (mudcount >= mud_add_amount) + break; - // Ground height at this point - float surface_y_f = 0.0; + vm->m_data[i] = addnode; + mudcount++; - // Use perlin noise for ground height - surface_y_f = base_rock_level_2d(data->seed, p2d); + vm->m_area.add_y(em, i, 1); + } + } +} - /*// Experimental stuff - { - float a = highlands_level_2d(data->seed, p2d); - if(a > surface_y_f) - surface_y_f = a; - }*/ - // Convert to integer - s16 surface_y = (s16)surface_y_f; +void MapgenV6::flowMud(s16 &mudflow_minpos, s16 &mudflow_maxpos) { + // 340ms @cs=8 + TimeTaker timer1("flow mud"); - // Log it - if(surface_y > stone_surface_max_y) - stone_surface_max_y = surface_y; + // Iterate a few times + for(s16 k = 0; k < 3; k++) { + for (s16 z = mudflow_minpos; z <= mudflow_maxpos; z++) + for (s16 x = mudflow_minpos; x <= mudflow_maxpos; x++) { + // Invert coordinates every 2nd iteration + if (k % 2 == 0) { + x = mudflow_maxpos - (x - mudflow_minpos); + z = mudflow_maxpos - (z - mudflow_minpos); + } - BiomeType bt = get_biome(data->seed, p2d); - /* - Fill ground with stone - */ - { - // Use fast index incrementing - v3s16 em = vmanip.m_area.getExtent(); - u32 i = vmanip.m_area.index(v3s16(p2d.X, node_min.Y, p2d.Y)); - for(s16 y=node_min.Y; y<=node_max.Y; y++) + // Node position in 2d + v2s16 p2d = v2s16(node_min.X, node_min.Z) + v2s16(x, z); + + v3s16 em = vm->m_area.getExtent(); + u32 i = vm->m_area.index(p2d.X, node_max.Y, p2d.Y); + s16 y = node_max.Y; + + while(y >= node_min.Y) + { + + for(;; y--) { - if(vmanip.m_data[i].getContent() == CONTENT_IGNORE){ - if(y <= surface_y){ - if(y > water_level && bt == BT_DESERT) - vmanip.m_data[i] = n_desert_stone; + MapNode *n = NULL; + // Find mud + for(; y >= node_min.Y; y--) { + n = &vm->m_data[i]; + if (n->getContent() == c_dirt || + n->getContent() == c_dirt_with_grass || + n->getContent() == c_gravel) + break; + + vm->m_area.add_y(em, i, -1); + } + + // Stop if out of area + //if(vmanip.m_area.contains(i) == false) + if (y < node_min.Y) + break; + + if (n->getContent() == c_dirt || + n->getContent() == c_dirt_with_grass) + { + // Make it exactly mud + n->setContent(c_dirt); + + // Don't flow it if the stuff under it is not mud + { + u32 i2 = i; + vm->m_area.add_y(em, i2, -1); + // Cancel if out of area + if(vm->m_area.contains(i2) == false) + continue; + MapNode *n2 = &vm->m_data[i2]; + if (n2->getContent() != c_dirt && + n2->getContent() != c_dirt_with_grass) + continue; + } + } + + v3s16 dirs4[4] = { + v3s16(0,0,1), // back + v3s16(1,0,0), // right + v3s16(0,0,-1), // front + v3s16(-1,0,0), // left + }; + + // Check that upper is air or doesn't exist. + // Cancel dropping if upper keeps it in place + u32 i3 = i; + vm->m_area.add_y(em, i3, 1); + if (vm->m_area.contains(i3) == true && + ndef->get(vm->m_data[i3]).walkable) + continue; + + // Drop mud on side + for(u32 di=0; di<4; di++) { + v3s16 dirp = dirs4[di]; + u32 i2 = i; + // Move to side + vm->m_area.add_p(em, i2, dirp); + // Fail if out of area + if (vm->m_area.contains(i2) == false) + continue; + // Check that side is air + MapNode *n2 = &vm->m_data[i2]; + if (ndef->get(*n2).walkable) + continue; + // Check that under side is air + vm->m_area.add_y(em, i2, -1); + if (vm->m_area.contains(i2) == false) + continue; + n2 = &vm->m_data[i2]; + if (ndef->get(*n2).walkable) + continue; + // Loop further down until not air + bool dropped_to_unknown = false; + do { + vm->m_area.add_y(em, i2, -1); + n2 = &vm->m_data[i2]; + // if out of known area + if(vm->m_area.contains(i2) == false || + n2->getContent() == CONTENT_IGNORE) { + dropped_to_unknown = true; + break; + } + } while (ndef->get(*n2).walkable == false); + // Loop one up so that we're in air + vm->m_area.add_y(em, i2, 1); + n2 = &vm->m_data[i2]; + + bool old_is_water = (n->getContent() == c_water_source); + // Move mud to new place + if (!dropped_to_unknown) { + *n2 = *n; + // Set old place to be air (or water) + if(old_is_water) + *n = MapNode(c_water_source); else - vmanip.m_data[i] = n_stone; - } else if(y <= water_level){ - vmanip.m_data[i] = MapNode(c_water_source); - } else { - vmanip.m_data[i] = MapNode(c_air); + *n = MapNode(CONTENT_AIR); } + + // Done + break; } - vmanip.m_area.add_y(em, i, 1); + } } } } -#endif +} - }//timer1 - // Limit dirt flow area by 1 because mud is flown into neighbors. - assert(central_area_size.X == central_area_size.Z); - s16 mudflow_minpos = 0-max_spread_amount+1; - s16 mudflow_maxpos = central_area_size.X+max_spread_amount-2; +void MapgenV6::addDirtGravelBlobs() { + if (getBiome(v2s16(node_min.X, node_min.Z)) != BT_NORMAL) + return; + + PseudoRandom pr(blockseed + 983); + for (int i = 0; i < volume_nodes/10/10/10; i++) { + bool only_fill_cave = (myrand_range(0,1) != 0); + v3s16 size( + pr.range(1, 8), + pr.range(1, 8), + pr.range(1, 8) + ); + v3s16 p0( + pr.range(node_min.X, node_max.X) - size.X / 2, + pr.range(node_min.Y, node_max.Y) - size.Y / 2, + pr.range(node_min.Z, node_max.Z) - size.Z / 2 + ); + + MapNode n1((p0.Y > -32 && !pr.range(0, 1)) ? c_dirt : c_gravel); + for (int z1 = 0; z1 < size.Z; z1++) + for (int y1 = 0; y1 < size.Y; y1++) + for (int x1 = 0; x1 < size.X; x1++) { + v3s16 p = p0 + v3s16(x1, y1, z1); + u32 i = vm->m_area.index(p); + if (!vm->m_area.contains(i)) + continue; + // Cancel if not stone and not cave air + if (vm->m_data[i].getContent() != c_stone && + !(vm->m_flags[i] & VMANIP_FLAG_CAVE)) + continue; + if (only_fill_cave && !(vm->m_flags[i] & VMANIP_FLAG_CAVE)) + continue; + vm->m_data[i] = n1; + } + } +} - /* - Loop this part, it will make stuff look older and newer nicely - */ - /*double cave_amount = 6.0 + 6.0 * noise2d_perlin( - 0.5+(double)node_min.X/250, 0.5+(double)node_min.Y/250, - data->seed+34329, 3, 0.50);*/ +void MapgenV6::placeTrees() { + // Divide area into parts + s16 div = 8; + s16 sidelen = central_area_size.X / div; + double area = sidelen * sidelen; + + for (s16 z0 = 0; z0 < div; z0++) + for (s16 x0 = 0; x0 < div; x0++) { + // Center position of part of division + v2s16 p2d_center( + node_min.X + sidelen / 2 + sidelen * x0, + node_min.Z + sidelen / 2 + sidelen * z0 + ); + // Minimum edge of part of division + v2s16 p2d_min( + node_min.X + sidelen * x0, + node_min.Z + sidelen * z0 + ); + // Maximum edge of part of division + v2s16 p2d_max( + node_min.X + sidelen + sidelen * x0 - 1, + node_min.Z + sidelen + sidelen * z0 - 1 + ); + // Amount of trees + u32 tree_count = area * getTreeAmount(p2d_center); /////////////optimize this! + // Put trees in random places on part of division + for (u32 i = 0; i < tree_count; i++) { + s16 x = myrand_range(p2d_min.X, p2d_max.X); + s16 z = myrand_range(p2d_min.Y, p2d_max.Y); + s16 y = find_ground_level(v2s16(x, z)); ////////////////////optimize this! + // Don't make a tree under water level + // Don't make a tree so high that it doesn't fit + if(y < water_level || y > node_max.Y - 6) + continue; + + v3s16 p(x,y,z); + // Trees grow only on mud and grass + { + u32 i = vm->m_area.index(p); + MapNode *n = &vm->m_data[i]; + if (n->getContent() != c_dirt && + n->getContent() != c_dirt_with_grass) + continue; + } + p.Y++; + // Make a tree + treegen::make_tree(*vm, p, false, ndef, myrand()); + } + } +} - double cave_amount = NoisePerlin2D(np_cave, node_min.X, node_min.Y, data->seed); - const u32 age_loops = 2; - for(u32 i_age=0; i_agem_area.getExtent(); + u32 i = vm->m_area.index(x, node_max.Y, z); + s16 y; + // Go to ground level + for (y = node_max.Y; y >= full_node_min.Y; y--) { + MapNode &n = vm->m_data[i]; + if (ndef->get(n).param_type != CPT_LIGHT || + ndef->get(n).liquid_type != LIQUID_NONE) + break; + vm->m_area.add_y(em, i, -1); + } + surface_y = (y >= full_node_min.Y) ? y : full_node_min.Y; + } + + u32 i = vm->m_area.index(x, surface_y, z); + MapNode *n = &vm->m_data[i]; + if (n->getContent() == c_dirt && surface_y >= water_level - 20) + n->setContent(c_dirt_with_grass); + } +} + + +void MapgenV6::generateCaves(int max_stone_y) { // 24ms @cs=8 //TimeTaker timer1("caves"); + + /*double cave_amount = 6.0 + 6.0 * noise2d_perlin( + 0.5+(double)node_min.X/250, 0.5+(double)node_min.Y/250, + data->seed+34329, 3, 0.50);*/ + const s16 max_spread_amount = MAP_BLOCKSIZE; + float cave_amount = NoisePerlin2D(np_cave, node_min.X, node_min.Y, seed); - /* - Make caves (this code is relatively horrible) - */ cave_amount = MYMAX(0.0, cave_amount); u32 caves_count = cave_amount * volume_nodes / 50000; u32 bruises_count = 1; - PseudoRandom ps(blockseed+21343); - PseudoRandom ps2(blockseed+1032); - if(ps.range(1, 6) == 1) + PseudoRandom ps(blockseed + 21343); + PseudoRandom ps2(blockseed + 1032); + + if (ps.range(1, 6) == 1) bruises_count = ps.range(0, ps.range(0, 2)); - if(get_biome(data->seed, v2s16(node_min.X, node_min.Z)) == BT_DESERT){ - caves_count /= 3; + + if (getBiome(v2s16(node_min.X, node_min.Z)) == BT_DESERT) { + caves_count /= 3; bruises_count /= 3; } - for(u32 jj=0; jjseed, v2s16(node_min.X, node_min.Z)) + base_rock_level_2d(data->seed, v2s16(node_max.X, node_max.Z))) / 2); @@ -728,13 +901,13 @@ void MapgenV6::makeChunk(BlockMakeData *data) // Allow a bit more //(this should be more than the maximum radius of the tunnel) s16 insure = 10; - s16 more = max_spread_amount - max_tunnel_diameter/2 - insure; + s16 more = max_spread_amount - max_tunnel_diameter / 2 - insure; ar += v3s16(1,0,1) * more * 2; of -= v3s16(1,0,1) * more; s16 route_y_min = 0; // Allow half a diameter + 7 over stone surface - s16 route_y_max = -of.Y + stone_surface_max_y + max_tunnel_diameter/2 + 7; + s16 route_y_max = -of.Y + max_stone_y + max_tunnel_diameter/2 + 7; // Limit maximum to area route_y_max = rangelim(route_y_max, 0, ar.Y-1); @@ -881,9 +1054,9 @@ void MapgenV6::makeChunk(BlockMakeData *data) /*// Make better floors in small caves if(y0 <= -rs/2 && rs<=7) continue;*/ - if(large_cave_is_flat){ + if (large_cave_is_flat) { // Make large caves not so tall - if(rs > 7 && abs(y0) >= rs/3) + if (rs > 7 && abs(y0) >= rs/3) continue; } @@ -893,551 +1066,44 @@ void MapgenV6::makeChunk(BlockMakeData *data) v3s16 p(x,y,z); p += of; - if(vmanip.m_area.contains(p) == false) + if(vm->m_area.contains(p) == false) continue; - u32 i = vmanip.m_area.index(p); + u32 i = vm->m_area.index(p); - if(large_cave) - { - if(full_node_min.Y < water_level && - full_node_max.Y > water_level){ - if(p.Y <= water_level) - vmanip.m_data[i] = waternode; + if(large_cave) { + if (full_node_min.Y < water_level && + full_node_max.Y > water_level) { + if (p.Y <= water_level) + vm->m_data[i] = waternode; else - vmanip.m_data[i] = airnode; - } else if(full_node_max.Y < water_level){ - if(p.Y < startp.Y - 2) - vmanip.m_data[i] = lavanode; + vm->m_data[i] = airnode; + } else if (full_node_max.Y < water_level) { + if (p.Y < startp.Y - 2) + vm->m_data[i] = lavanode; else - vmanip.m_data[i] = airnode; + vm->m_data[i] = airnode; } else { - vmanip.m_data[i] = airnode; + vm->m_data[i] = airnode; } } else { // Don't replace air or water or lava or ignore - if(vmanip.m_data[i].getContent() == CONTENT_IGNORE || - vmanip.m_data[i].getContent() == CONTENT_AIR || - vmanip.m_data[i].getContent() == c_water_source || - vmanip.m_data[i].getContent() == c_lava_source) + if (vm->m_data[i].getContent() == CONTENT_IGNORE || + vm->m_data[i].getContent() == CONTENT_AIR || + vm->m_data[i].getContent() == c_water_source || + vm->m_data[i].getContent() == c_lava_source) continue; - vmanip.m_data[i] = airnode; + vm->m_data[i] = airnode; // Set tunnel flag - vmanip.m_flags[i] |= VMANIP_FLAG_CAVE; + vm->m_flags[i] |= VMANIP_FLAG_CAVE; } } } } } - orp = rp; } - - } - - }//timer1 -#endif - -#if 1 - { - // 15ms @cs=8 - TimeTaker timer1("add mud"); - - /* - Add mud to the central chunk - */ - - for(s16 x=node_min.X; x<=node_max.X; x++) - for(s16 z=node_min.Z; z<=node_max.Z; z++) - { - // Node position in 2d - v2s16 p2d = v2s16(x,z); - - // Randomize mud amount - s16 mud_add_amount = get_mud_add_amount(data->seed, p2d) / 2.0 + 0.5; - - // Find ground level - s16 surface_y = find_stone_level(vmanip, p2d, ndef); - // Handle area not found - if(surface_y == vmanip.m_area.MinEdge.Y - 1) - continue; - - MapNode addnode(c_dirt); - BiomeType bt = get_biome(data->seed, p2d); - - if(bt == BT_DESERT) - addnode = MapNode(c_desert_sand); - - if(bt == BT_DESERT && surface_y + mud_add_amount <= water_level+1){ - addnode = MapNode(c_sand); - } else if(mud_add_amount <= 0){ - mud_add_amount = 1 - mud_add_amount; - addnode = MapNode(c_gravel); - } else if(bt == BT_NORMAL && get_have_beach(data->seed, p2d) && - surface_y + mud_add_amount <= water_level+2){ - addnode = MapNode(c_sand); - } - - if(bt == BT_DESERT){ - if(surface_y > 20){ - mud_add_amount = MYMAX(0, mud_add_amount - (surface_y - 20)/5); - } - } - - /* - If topmost node is grass, change it to mud. - It might be if it was flown to there from a neighboring - chunk and then converted. - */ - { - u32 i = vmanip.m_area.index(v3s16(p2d.X, surface_y, p2d.Y)); - MapNode *n = &vmanip.m_data[i]; - if(n->getContent() == c_dirt_with_grass) - *n = MapNode(c_dirt); - } - - /* - Add mud on ground - */ - { - s16 mudcount = 0; - v3s16 em = vmanip.m_area.getExtent(); - s16 y_start = surface_y+1; - u32 i = vmanip.m_area.index(v3s16(p2d.X, y_start, p2d.Y)); - for(s16 y=y_start; y<=node_max.Y; y++) - { - if(mudcount >= mud_add_amount) - break; - - MapNode &n = vmanip.m_data[i]; - n = addnode; - mudcount++; - - vmanip.m_area.add_y(em, i, 1); - } - } - - } - - }//timer1 -#endif - - /* - Add blobs of dirt and gravel underground - */ - if(get_biome(data->seed, v2s16(node_min.X, node_min.Z)) == BT_NORMAL) - { - PseudoRandom pr(blockseed+983); - for(int i=0; i -32 && pr.range(0,1) == 0) - n1 = MapNode(c_dirt); - else - n1 = MapNode(c_gravel); - for(int x1=0; x1= node_min.Y) - { - - for(;; y--) - { - MapNode *n = NULL; - // Find mud - for(; y>=node_min.Y; y--) - { - n = &vmanip.m_data[i]; - //if(content_walkable(n->d)) - // break; - if(n->getContent() == c_dirt || - n->getContent() == c_dirt_with_grass || - n->getContent() == c_gravel) - break; - - vmanip.m_area.add_y(em, i, -1); - } - - // Stop if out of area - //if(vmanip.m_area.contains(i) == false) - if(y < node_min.Y) - break; - - /*// If not mud, do nothing to it - MapNode *n = &vmanip.m_data[i]; - if(n->d != CONTENT_MUD && n->d != CONTENT_GRASS) - continue;*/ - - if(n->getContent() == c_dirt || - n->getContent() == c_dirt_with_grass) - { - // Make it exactly mud - n->setContent(c_dirt); - - /* - Don't flow it if the stuff under it is not mud - */ - { - u32 i2 = i; - vmanip.m_area.add_y(em, i2, -1); - // Cancel if out of area - if(vmanip.m_area.contains(i2) == false) - continue; - MapNode *n2 = &vmanip.m_data[i2]; - if(n2->getContent() != c_dirt && - n2->getContent() != c_dirt_with_grass) - continue; - } - } - - /*s16 recurse_count = 0; - mudflow_recurse:*/ - - v3s16 dirs4[4] = { - v3s16(0,0,1), // back - v3s16(1,0,0), // right - v3s16(0,0,-1), // front - v3s16(-1,0,0), // left - }; - - // Theck that upper is air or doesn't exist. - // Cancel dropping if upper keeps it in place - u32 i3 = i; - vmanip.m_area.add_y(em, i3, 1); - if(vmanip.m_area.contains(i3) == true - && ndef->get(vmanip.m_data[i3]).walkable) - { - continue; - } - - // Drop mud on side - - for(u32 di=0; di<4; di++) - { - v3s16 dirp = dirs4[di]; - u32 i2 = i; - // Move to side - vmanip.m_area.add_p(em, i2, dirp); - // Fail if out of area - if(vmanip.m_area.contains(i2) == false) - continue; - // Check that side is air - MapNode *n2 = &vmanip.m_data[i2]; - if(ndef->get(*n2).walkable) - continue; - // Check that under side is air - vmanip.m_area.add_y(em, i2, -1); - if(vmanip.m_area.contains(i2) == false) - continue; - n2 = &vmanip.m_data[i2]; - if(ndef->get(*n2).walkable) - continue; - /*// Check that under that is air (need a drop of 2) - vmanip.m_area.add_y(em, i2, -1); - if(vmanip.m_area.contains(i2) == false) - continue; - n2 = &vmanip.m_data[i2]; - if(content_walkable(n2->d)) - continue;*/ - // Loop further down until not air - bool dropped_to_unknown = false; - do{ - vmanip.m_area.add_y(em, i2, -1); - n2 = &vmanip.m_data[i2]; - // if out of known area - if(vmanip.m_area.contains(i2) == false - || n2->getContent() == CONTENT_IGNORE){ - dropped_to_unknown = true; - break; - } - }while(ndef->get(*n2).walkable == false); - // Loop one up so that we're in air - vmanip.m_area.add_y(em, i2, 1); - n2 = &vmanip.m_data[i2]; - - bool old_is_water = (n->getContent() == c_water_source); - // Move mud to new place - if(!dropped_to_unknown) { - *n2 = *n; - // Set old place to be air (or water) - if(old_is_water) - *n = MapNode(c_water_source); - else - *n = MapNode(CONTENT_AIR); - } - - // Done - break; - } - } - } - } - - } - - }//timer1 -#endif - - } // Aging loop - /*********************** - END OF AGING LOOP - ************************/ - - /* - Add dungeons - */ - if (flags & MG_DUNGEONS) { - DungeonGen dgen(ndef, data->seed, water_level); - dgen.generate(&vmanip, blockseed, full_node_min, full_node_max); - } - - /* - Add top and bottom side of water to transforming_liquid queue - */ - - for(s16 x=full_node_min.X; x<=full_node_max.X; x++) - for(s16 z=full_node_min.Z; z<=full_node_max.Z; z++) - { - // Node position - v2s16 p2d(x,z); - { - bool water_found = false; - // Use fast index incrementing - v3s16 em = vmanip.m_area.getExtent(); - u32 i = vmanip.m_area.index(v3s16(p2d.X, full_node_max.Y, p2d.Y)); - for(s16 y=full_node_max.Y; y>=full_node_min.Y; y--) - { - if(y == full_node_max.Y){ - water_found = - (vmanip.m_data[i].getContent() == c_water_source || - vmanip.m_data[i].getContent() == c_lava_source); - } - else if(water_found == false) - { - if(vmanip.m_data[i].getContent() == c_water_source || - vmanip.m_data[i].getContent() == c_lava_source) - { - v3s16 p = v3s16(p2d.X, y, p2d.Y); - data->transforming_liquid.push_back(p); - water_found = true; - } - } - else - { - // This can be done because water_found can only - // turn to true and end up here after going through - // a single block. - if(vmanip.m_data[i+1].getContent() != c_water_source || - vmanip.m_data[i+1].getContent() != c_lava_source) - { - v3s16 p = v3s16(p2d.X, y+1, p2d.Y); - data->transforming_liquid.push_back(p); - water_found = false; - } - } - - vmanip.m_area.add_y(em, i, -1); - } - } - } - - /* - Grow grass - */ - - for(s16 x=full_node_min.X; x<=full_node_max.X; x++) - for(s16 z=full_node_min.Z; z<=full_node_max.Z; z++) - { - // Node position in 2d - v2s16 p2d = v2s16(x,z); - - /* - Find the lowest surface to which enough light ends up - to make grass grow. - - Basically just wait until not air and not leaves. - */ - s16 surface_y = 0; - { - v3s16 em = vmanip.m_area.getExtent(); - u32 i = vmanip.m_area.index(v3s16(p2d.X, node_max.Y, p2d.Y)); - s16 y; - // Go to ground level - for(y=node_max.Y; y>=full_node_min.Y; y--) - { - MapNode &n = vmanip.m_data[i]; - if(ndef->get(n).param_type != CPT_LIGHT - || ndef->get(n).liquid_type != LIQUID_NONE) - break; - vmanip.m_area.add_y(em, i, -1); - } - if(y >= full_node_min.Y) - surface_y = y; - else - surface_y = full_node_min.Y; - } - - u32 i = vmanip.m_area.index(p2d.X, surface_y, p2d.Y); - MapNode *n = &vmanip.m_data[i]; - if(n->getContent() == c_dirt){ - // Well yeah, this can't be overground... - if(surface_y < water_level - 20) - continue; - n->setContent(c_dirt_with_grass); - } } - - /* - Generate some trees - */ - assert(central_area_size.X == central_area_size.Z); - if (flags & MG_TREES) { - // Divide area into parts - s16 div = 8; - s16 sidelen = central_area_size.X / div; - double area = sidelen * sidelen; - for(s16 x0=0; x0seed, p2d_center); - // Put trees in random places on part of division - for(u32 i=0; i node_max.Y - 6) - continue; - v3s16 p(x,y,z); - /* - Trees grow only on mud and grass - */ - { - u32 i = vmanip.m_area.index(v3s16(p)); - MapNode *n = &vmanip.m_data[i]; - if(n->getContent() != c_dirt - && n->getContent() != c_dirt_with_grass) - continue; - } - p.Y++; - // Make a tree - make_tree(vmanip, p, false, ndef); - } - } - } - - - /* - Calculate lighting - */ - { - ScopeProfiler sp(g_profiler, "EmergeThread: mapgen lighting update", - SPT_AVG); - //VoxelArea a(node_min, node_max); - VoxelArea a(node_min-v3s16(1,0,1)*MAP_BLOCKSIZE, - node_max+v3s16(1,0,1)*MAP_BLOCKSIZE); - /*VoxelArea a(node_min-v3s16(1,0,1)*MAP_BLOCKSIZE/2, - node_max+v3s16(1,0,1)*MAP_BLOCKSIZE/2);*/ - enum LightBank banks[2] = {LIGHTBANK_DAY, LIGHTBANK_NIGHT}; - for(int i=0; i<2; i++) - { - enum LightBank bank = banks[i]; - - std::set light_sources; - std::map unlight_from; - - voxalgo::clearLightAndCollectSources(vmanip, a, bank, ndef, - light_sources, unlight_from); - - bool inexistent_top_provides_sunlight = !block_is_underground; - voxalgo::SunlightPropagateResult res = voxalgo::propagateSunlight( - vmanip, a, inexistent_top_provides_sunlight, - light_sources, ndef); - // TODO: Do stuff according to bottom_sunlight_valid - - vmanip.unspreadLight(bank, unlight_from, light_sources, ndef); - - vmanip.spreadLight(bank, light_sources, ndef); - } - } - this->generating = false; } diff --git a/src/mapgen_v6.h b/src/mapgen_v6.h index eb21794c3..7b1e31020 100644 --- a/src/mapgen_v6.h +++ b/src/mapgen_v6.h @@ -20,10 +20,10 @@ with this program; if not, write to the Free Software Foundation, Inc., #ifndef MAPGENV6_HEADER #define MAPGENV6_HEADER -#include "dungeongen.h" #include "mapgen.h" #define AVERAGE_MUD_AMOUNT 4 +#define VMANIP_FLAG_CAVE VOXELFLAG_CHECKED1 enum BiomeType { @@ -74,13 +74,17 @@ struct MapgenV6Params : public MapgenParams { class MapgenV6 : public Mapgen { public: - //ManualMapVoxelManipulator &vmanip; - int ystride; v3s16 csize; + u32 flags; + u32 blockseed; v3s16 node_min; v3s16 node_max; + v3s16 full_node_min; + v3s16 full_node_max; + v3s16 central_area_size; + int volume_nodes; Noise *noise_terrain_base; Noise *noise_terrain_higher; @@ -90,21 +94,20 @@ public: Noise *noise_mud; Noise *noise_beach; Noise *noise_biome; - - float *map_terrain_base; - float *map_terrain_higher; - float *map_steepness; - float *map_height_select; - float *map_trees; - float *map_mud; - float *map_beach; - float *map_biome; - NoiseParams *np_cave; - - u32 flags; float freq_desert; float freq_beach; + + content_t c_stone; + content_t c_dirt; + content_t c_dirt_with_grass; + content_t c_sand; + content_t c_water_source; + content_t c_lava_source; + content_t c_gravel; + content_t c_cobble; + content_t c_desert_sand; + content_t c_desert_stone; MapgenV6(int mapgenid, MapgenV6Params *params); ~MapgenV6(); @@ -112,21 +115,37 @@ public: void makeChunk(BlockMakeData *data); int getGroundLevelAtPoint(v2s16 p); - double baseRockLevelFromNoise(v2s16 p); - static s16 find_ground_level(VoxelManipulator &vmanip, - v2s16 p2d, INodeDefManager *ndef); - static s16 find_stone_level(VoxelManipulator &vmanip, - v2s16 p2d, INodeDefManager *ndef); - void make_tree(ManualMapVoxelManipulator &vmanip, v3s16 p0, - bool is_apple_tree, INodeDefManager *ndef); - double tree_amount_2d(u64 seed, v2s16 p); + float baseTerrainLevel(float terrain_base, float terrain_higher, + float steepness, float height_select); + float baseTerrainLevelFromNoise(v2s16 p); + float baseTerrainLevelFromMap(v2s16 p); + float baseTerrainLevelFromMap(int index); + + s16 find_ground_level(v2s16 p2d); + s16 find_stone_level(v2s16 p2d); bool block_is_underground(u64 seed, v3s16 blockpos); - double base_rock_level_2d(u64 seed, v2s16 p); s16 find_ground_level_from_noise(u64 seed, v2s16 p2d, s16 precision); - double get_mud_add_amount(u64 seed, v2s16 p); - bool get_have_beach(u64 seed, v2s16 p2d); - BiomeType get_biome(u64 seed, v2s16 p2d); + + float getTreeAmount(v2s16 p); + float getTreeAmount(int index); + float getMudAmount(v2s16 p); + float getMudAmount(int index); + bool getHaveBeach(v2s16 p); + bool getHaveBeach(int index); + BiomeType getBiome(v2s16 p); + BiomeType getBiome(int index, v2s16 p); + u32 get_blockseed(u64 seed, v3s16 p); + + + void calculateNoise(); + int generateGround(); + void addMud(); + void flowMud(s16 &mudflow_minpos, s16 &mudflow_maxpos); + void addDirtGravelBlobs(); + void growGrass(); + void placeTrees(); + void generateCaves(int max_stone_y); }; struct MapgenFactoryV6 : public MapgenFactory { diff --git a/src/treegen.cpp b/src/treegen.cpp index a8500026b..5ddf1132d 100644 --- a/src/treegen.cpp +++ b/src/treegen.cpp @@ -28,15 +28,16 @@ with this program; if not, write to the Free Software Foundation, Inc., namespace treegen { + void make_tree(ManualMapVoxelManipulator &vmanip, v3s16 p0, - bool is_apple_tree, INodeDefManager *ndef,int seed) + bool is_apple_tree, INodeDefManager *ndef, int seed) { MapNode treenode(ndef->getId("mapgen_tree")); MapNode leavesnode(ndef->getId("mapgen_leaves")); MapNode applenode(ndef->getId("mapgen_apple")); - PseudoRandom ps(seed); - s16 trunk_h = ps.range(4, 5); + PseudoRandom pr(seed); + s16 trunk_h = pr.range(4, 5); v3s16 p1 = p0; for(s16 ii=0; iigetServerMap(); std::map modified_blocks; @@ -506,17 +507,17 @@ v3f transposeMatrix(irr::core::matrix4 M, v3f v) return translated; } -#if 0 -static void make_jungletree(VoxelManipulator &vmanip, v3s16 p0, - INodeDefManager *ndef) +void make_jungletree(VoxelManipulator &vmanip, v3s16 p0, + INodeDefManager *ndef, int seed) { MapNode treenode(ndef->getId("mapgen_jungletree")); MapNode leavesnode(ndef->getId("mapgen_leaves")); + PseudoRandom pr(seed); for(s16 x=-1; x<=1; x++) for(s16 z=-1; z<=1; z++) { - if(myrand_range(0, 2) == 0) + if(pr.range(0, 2) == 0) continue; v3s16 p1 = p0 + v3s16(x,0,z); v3s16 p2 = p0 + v3s16(x,-1,z); @@ -527,7 +528,7 @@ static void make_jungletree(VoxelManipulator &vmanip, v3s16 p0, vmanip.m_data[vmanip.m_area.index(p1)] = treenode; } - s16 trunk_h = myrand_range(8, 12); + s16 trunk_h = pr.range(8, 12); v3s16 p1 = p0; for(s16 ii=0; ii Date: Sat, 16 Mar 2013 17:06:11 -0400 Subject: Re-add jungles, apple trees --- minetest.conf.example | 9 ++++-- src/content_abm.cpp | 18 ++++++++--- src/defaultsettings.cpp | 6 ++-- src/mapgen.cpp | 13 +++++--- src/mapgen.h | 2 +- src/mapgen_v6.cpp | 81 +++++++++++++++++++++++++++++++++++-------------- src/mapgen_v6.h | 22 ++++++++++---- src/treegen.cpp | 11 +++++-- 8 files changed, 118 insertions(+), 44 deletions(-) (limited to 'src/mapgen_v6.cpp') diff --git a/minetest.conf.example b/minetest.conf.example index 41a691b1a..649717ee8 100644 --- a/minetest.conf.example +++ b/minetest.conf.example @@ -314,22 +314,25 @@ #water_level = 1 # Size of chunks to be generated. #chunksize = 5 -# Map generation attributes. Currently supported: trees, caves, flat, v6_biome_blend +# Map generation attributes. Currently supported: trees, caves, flat, v6_biome_blend, v6_jungles #mg_flags = trees, caves, v6_biome_blend # How large deserts and beaches are #mgv6_freq_desert = 0.45 #mgv6_freq_beach = 0.15 # Perlin noise attributes for different map generation parameters # Offset, scale, spread factor, seed offset, number of octaves, persistence -#mgv6_np_terrain_base = -4, 20, (250.0, 250, 250), 82341, 5, 0.6 +#mgv6_np_terrain_base = -4, 20, (250, 250, 250), 82341, 5, 0.6 #mgv6_np_terrain_higher = 20, 16, (500, 500, 500), 85039, 5, 0.6 #mgv6_np_steepness = 0.85, 0.5, (125, 125, 125), -932, 5, 0.7 #mgv6_np_height_select = 0.5, 1, (250, 250, 250), 4213, 5, 0.69 -#mgv6_np_trees = 0, 1, (125, 125, 125), 2, 4, 0.66 #mgv6_np_mud = 4, 2, (200, 200, 200), 91013, 3, 0.55 #mgv6_np_beach = 0, 1, (250, 250, 250), 59420, 3, 0.50 #mgv6_np_biome = 0, 1, (250, 250, 250), 9130, 3, 0.50 #mgv6_np_cave = 6, 6, (250, 250, 250), 34329, 3, 0.50 +#mgv6_np_humidity = 0.5, 0.5, (500, 500, 500), 72384, 4, 0.66 +#mgv6_np_trees = 0, 1, (125, 125, 125), 2, 4, 0.66 +#mgv6_np_apple_trees = 0, 1, (100, 100, 100), 342902, 3, 0.45 + #mgv7_np_terrain = 10, 12, (350, 350, 350), 82341, 5, 0.6 #mgv7_np_bgroup = 0.5, 0.3125, (350, 350, 350), 5923, 2, 0.6 #mgv7_np_heat = 25, 50, (500, 500, 500), 35293, 1, 0 diff --git a/src/content_abm.cpp b/src/content_abm.cpp index a88450095..e50edddd7 100644 --- a/src/content_abm.cpp +++ b/src/content_abm.cpp @@ -99,6 +99,7 @@ public: { std::set s; s.insert("sapling"); + s.insert("junglesapling"); return s; } virtual float getTriggerInterval() @@ -111,16 +112,25 @@ public: INodeDefManager *ndef = env->getGameDef()->ndef(); ServerMap *map = &env->getServerMap(); - actionstream<<"A sapling grows into a tree at " - <getId("junglesapling"); + + actionstream <<"A " << (is_jungle_tree ? "jungle " : "") + << "sapling grows into a tree at " + << PP(p) << std::endl; 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; - treegen::make_tree(vmanip, tree_p, is_apple_tree, ndef, myrand()); + + 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 diff --git a/src/defaultsettings.cpp b/src/defaultsettings.cpp index 8f878648a..f7724fa11 100644 --- a/src/defaultsettings.cpp +++ b/src/defaultsettings.cpp @@ -219,15 +219,17 @@ void set_default_settings(Settings *settings) settings->setDefault("mgv6_freq_desert", "0.45"); settings->setDefault("mgv6_freq_beach", "0.15"); - settings->setDefault("mgv6_np_terrain_base", "-4, 20, (250.0, 250, 250), 82341, 5, 0.6"); + settings->setDefault("mgv6_np_terrain_base", "-4, 20, (250, 250, 250), 82341, 5, 0.6"); settings->setDefault("mgv6_np_terrain_higher", "20, 16, (500, 500, 500), 85039, 5, 0.6"); settings->setDefault("mgv6_np_steepness", "0.85, 0.5, (125, 125, 125), -932, 5, 0.7"); settings->setDefault("mgv6_np_height_select", "0.5, 1, (250, 250, 250), 4213, 5, 0.69"); - settings->setDefault("mgv6_np_trees", "0, 1, (125, 125, 125), 2, 4, 0.66"); settings->setDefault("mgv6_np_mud", "4, 2, (200, 200, 200), 91013, 3, 0.55"); settings->setDefault("mgv6_np_beach", "0, 1, (250, 250, 250), 59420, 3, 0.50"); settings->setDefault("mgv6_np_biome", "0, 1, (250, 250, 250), 9130, 3, 0.50"); settings->setDefault("mgv6_np_cave", "6, 6, (250, 250, 250), 34329, 3, 0.50"); + settings->setDefault("mgv6_np_humidity", "0.5, 0.5, (500, 500, 500), 72384, 4, 0.66"); + settings->setDefault("mgv6_np_trees", "0, 1, (125, 125, 125), 2, 4, 0.66"); + settings->setDefault("mgv6_np_apple_trees", "0, 1, (100, 100, 100), 342902, 3, 0.45"); settings->setDefault("mgv7_np_terrain", "10, 12, (350, 350, 350), 82341, 5, 0.6"); settings->setDefault("mgv7_np_bgroup", "0.5, 0.3125, (350, 350, 350), 5923, 2, 0.6"); diff --git a/src/mapgen.cpp b/src/mapgen.cpp index 699b51789..4316be6fe 100644 --- a/src/mapgen.cpp +++ b/src/mapgen.cpp @@ -39,7 +39,7 @@ FlagDesc flagdesc_mapgen[] = { {"trees", MG_TREES}, {"caves", MG_CAVES}, {"dungeons", MG_DUNGEONS}, - {"v6_forests", MGV6_FORESTS}, + {"v6_jungles", MGV6_JUNGLES}, {"v6_biome_blend", MGV6_BIOME_BLEND}, {"flat", MG_FLAT}, {NULL, 0} @@ -209,16 +209,19 @@ bool MapgenV6Params::readParams(Settings *settings) { np_terrain_higher = settings->getNoiseParams("mgv6_np_terrain_higher"); np_steepness = settings->getNoiseParams("mgv6_np_steepness"); np_height_select = settings->getNoiseParams("mgv6_np_height_select"); - np_trees = settings->getNoiseParams("mgv6_np_trees"); np_mud = settings->getNoiseParams("mgv6_np_mud"); np_beach = settings->getNoiseParams("mgv6_np_beach"); np_biome = settings->getNoiseParams("mgv6_np_biome"); np_cave = settings->getNoiseParams("mgv6_np_cave"); + np_humidity = settings->getNoiseParams("mgv6_np_humidity"); + np_trees = settings->getNoiseParams("mgv6_np_trees"); + np_apple_trees = settings->getNoiseParams("mgv6_np_apple_trees"); bool success = np_terrain_base && np_terrain_higher && np_steepness && np_height_select && np_trees && np_mud && - np_beach && np_biome && np_cave; + np_beach && np_biome && np_cave && + np_humidity && np_apple_trees; return success; } @@ -231,11 +234,13 @@ void MapgenV6Params::writeParams(Settings *settings) { settings->setNoiseParams("mgv6_np_terrain_higher", np_terrain_higher); settings->setNoiseParams("mgv6_np_steepness", np_steepness); settings->setNoiseParams("mgv6_np_height_select", np_height_select); - settings->setNoiseParams("mgv6_np_trees", np_trees); settings->setNoiseParams("mgv6_np_mud", np_mud); settings->setNoiseParams("mgv6_np_beach", np_beach); settings->setNoiseParams("mgv6_np_biome", np_biome); settings->setNoiseParams("mgv6_np_cave", np_cave); + settings->setNoiseParams("mgv6_np_humidity", np_humidity); + settings->setNoiseParams("mgv6_np_trees", np_trees); + settings->setNoiseParams("mgv6_np_apple_trees", np_apple_trees); } diff --git a/src/mapgen.h b/src/mapgen.h index e5b0b6399..3f3cd424d 100644 --- a/src/mapgen.h +++ b/src/mapgen.h @@ -32,7 +32,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #define MG_TREES 0x01 #define MG_CAVES 0x02 #define MG_DUNGEONS 0x04 -#define MGV6_FORESTS 0x08 +#define MGV6_JUNGLES 0x08 #define MGV6_BIOME_BLEND 0x10 #define MG_FLAT 0x20 diff --git a/src/mapgen_v6.cpp b/src/mapgen_v6.cpp index b60758310..dca4e5353 100644 --- a/src/mapgen_v6.cpp +++ b/src/mapgen_v6.cpp @@ -45,8 +45,6 @@ NoiseParams nparams_v6_def_steepness = {0.85, 0.5, v3f(125.0, 125.0, 125.0), -932, 5, 0.7}; NoiseParams nparams_v6_def_height_select = {0.5, 1.0, v3f(250.0, 250.0, 250.0), 4213, 5, 0.69}; -NoiseParams nparams_v6_def_trees = - {0.0, 1.0, v3f(125.0, 125.0, 125.0), 2, 4, 0.66}; NoiseParams nparams_v6_def_mud = {AVERAGE_MUD_AMOUNT, 2.0, v3f(200.0, 200.0, 200.0), 91013, 3, 0.55}; NoiseParams nparams_v6_def_beach = @@ -55,6 +53,12 @@ NoiseParams nparams_v6_def_biome = {0.0, 1.0, v3f(250.0, 250.0, 250.0), 9130, 3, 0.50}; NoiseParams nparams_v6_def_cave = {6.0, 6.0, v3f(250.0, 250.0, 250.0), 34329, 3, 0.50}; +NoiseParams nparams_v6_def_humidity = + {0.5, 0.5, v3f(500.0, 500.0, 500.0), 72384, 4, 0.66}; +NoiseParams nparams_v6_def_trees = + {0.0, 1.0, v3f(125.0, 125.0, 125.0), 2, 4, 0.66}; +NoiseParams nparams_v6_def_apple_trees = + {0.0, 1.0, v3f(100.0, 100.0, 100.0), 342902, 3, 0.45}; /////////////////////////////////////////////////////////////////////////////// @@ -74,13 +78,15 @@ MapgenV6::MapgenV6(int mapgenid, MapgenV6Params *params) { this->ystride = csize.X; //////fix this - np_cave = params->np_cave; + np_cave = params->np_cave; + np_humidity = params->np_humidity; + np_trees = params->np_trees; + np_apple_trees = params->np_apple_trees; noise_terrain_base = new Noise(params->np_terrain_base, seed, csize.X, csize.Y); noise_terrain_higher = new Noise(params->np_terrain_higher, seed, csize.X, csize.Y); noise_steepness = new Noise(params->np_steepness, seed, csize.X, csize.Y); noise_height_select = new Noise(params->np_height_select, seed, csize.X, csize.Y); - noise_trees = new Noise(params->np_trees, seed, csize.X, csize.Y); noise_mud = new Noise(params->np_mud, seed, csize.X, csize.Y); noise_beach = new Noise(params->np_beach, seed, csize.X, csize.Y); noise_biome = new Noise(params->np_biome, seed, csize.X, csize.Y); @@ -92,7 +98,6 @@ MapgenV6::~MapgenV6() { delete noise_terrain_higher; delete noise_steepness; delete noise_height_select; - delete noise_trees; delete noise_mud; delete noise_beach; delete noise_biome; @@ -234,12 +239,6 @@ int MapgenV6::getGroundLevelAtPoint(v2s16 p) { //////////////////////// Noise functions -float MapgenV6::getTreeAmount(v2s16 p) { - int index = (p.Y - node_min.Z) * ystride + (p.X - node_min.X); - return getTreeAmount(index); -} - - float MapgenV6::getMudAmount(v2s16 p) { int index = (p.Y - node_min.Z) * ystride + (p.X - node_min.X); return getMudAmount(index); @@ -258,13 +257,30 @@ BiomeType MapgenV6::getBiome(v2s16 p) { } -float MapgenV6::getTreeAmount(int index) +float MapgenV6::getHumidity(v2s16 p) +{ + /*double noise = noise2d_perlin( + 0.5+(float)p.X/500, 0.5+(float)p.Y/500, + seed+72384, 4, 0.66); + noise = (noise + 1.0)/2.0;*/ + + float noise = NoisePerlin2D(np_humidity, p.X, p.Y, seed); + + if (noise < 0.0) + noise = 0.0; + if (noise > 1.0) + noise = 1.0; + return noise; +} + + +float MapgenV6::getTreeAmount(v2s16 p) { /*double noise = noise2d_perlin( 0.5+(float)p.X/125, 0.5+(float)p.Y/125, seed+2, 4, 0.66);*/ - float noise = noise_trees->result[index]; + float noise = NoisePerlin2D(np_trees, p.X, p.Y, seed); float zeroval = -0.39; if (noise < zeroval) return 0; @@ -273,6 +289,18 @@ float MapgenV6::getTreeAmount(int index) } +bool MapgenV6::getHaveAppleTree(v2s16 p) +{ + /*is_apple_tree = noise2d_perlin( + 0.5+(float)p.X/100, 0.5+(float)p.Z/100, + data->seed+342902, 3, 0.45) > 0.2;*/ + + float noise = NoisePerlin2D(np_apple_trees, p.X, p.Y, seed); + + return noise > 0.2; +} + + float MapgenV6::getMudAmount(int index) { if (flags & MG_FLAT) @@ -465,12 +493,6 @@ void MapgenV6::calculateNoise() { x + 0.5 * noise_height_select->np->spread.X, z + 0.5 * noise_height_select->np->spread.Z); } - - if (flags & MG_TREES) { - noise_trees->perlinMap2D( - x + 0.5 * noise_trees->np->spread.X, - z + 0.5 * noise_trees->np->spread.Z); - } if (!(flags & MG_FLAT)) { noise_mud->perlinMap2D( @@ -762,6 +784,8 @@ void MapgenV6::addDirtGravelBlobs() { void MapgenV6::placeTrees() { + //TimeTaker t("placeTrees"); + // Divide area into parts s16 div = 8; s16 sidelen = central_area_size.X / div; @@ -784,8 +808,13 @@ void MapgenV6::placeTrees() { node_min.X + sidelen + sidelen * x0 - 1, node_min.Z + sidelen + sidelen * z0 - 1 ); - // Amount of trees - u32 tree_count = area * getTreeAmount(p2d_center); /////////////optimize this! + + // Amount of trees, jungle area + u32 tree_count = area * getTreeAmount(p2d_center); + bool is_jungle = (flags & MGV6_JUNGLES) && (getHumidity(p2d_center) > 0.75); + if (is_jungle) + tree_count *= 4; + // Put trees in random places on part of division for (u32 i = 0; i < tree_count; i++) { s16 x = myrand_range(p2d_min.X, p2d_max.X); @@ -806,10 +835,18 @@ void MapgenV6::placeTrees() { continue; } p.Y++; + // Make a tree - treegen::make_tree(*vm, p, false, ndef, myrand()); + if (is_jungle) { + treegen::make_jungletree(*vm, p, ndef, myrand()); + } else { + bool is_apple_tree = (myrand_range(0, 3) == 0) && + getHaveAppleTree(v2s16(x, z)); + treegen::make_tree(*vm, p, is_apple_tree, ndef, myrand()); + } } } + //printf("placeTrees: %dms\n", t.stop()); } diff --git a/src/mapgen_v6.h b/src/mapgen_v6.h index 7b1e31020..89d72300a 100644 --- a/src/mapgen_v6.h +++ b/src/mapgen_v6.h @@ -35,11 +35,13 @@ extern NoiseParams nparams_v6_def_terrain_base; extern NoiseParams nparams_v6_def_terrain_higher; extern NoiseParams nparams_v6_def_steepness; extern NoiseParams nparams_v6_def_height_select; -extern NoiseParams nparams_v6_def_trees; extern NoiseParams nparams_v6_def_mud; extern NoiseParams nparams_v6_def_beach; extern NoiseParams nparams_v6_def_biome; extern NoiseParams nparams_v6_def_cave; +extern NoiseParams nparams_v6_def_humidity; +extern NoiseParams nparams_v6_def_trees; +extern NoiseParams nparams_v6_def_apple_trees; struct MapgenV6Params : public MapgenParams { float freq_desert; @@ -48,12 +50,14 @@ struct MapgenV6Params : public MapgenParams { NoiseParams *np_terrain_higher; NoiseParams *np_steepness; NoiseParams *np_height_select; - NoiseParams *np_trees; NoiseParams *np_mud; NoiseParams *np_beach; NoiseParams *np_biome; NoiseParams *np_cave; - + NoiseParams *np_humidity; + NoiseParams *np_trees; + NoiseParams *np_apple_trees; + MapgenV6Params() { freq_desert = 0.45; freq_beach = 0.15; @@ -61,11 +65,14 @@ struct MapgenV6Params : public MapgenParams { np_terrain_higher = &nparams_v6_def_terrain_higher; np_steepness = &nparams_v6_def_steepness; np_height_select = &nparams_v6_def_height_select; - np_trees = &nparams_v6_def_trees; np_mud = &nparams_v6_def_mud; np_beach = &nparams_v6_def_beach; np_biome = &nparams_v6_def_biome; np_cave = &nparams_v6_def_cave; + np_humidity = &nparams_v6_def_humidity; + np_trees = &nparams_v6_def_trees; + np_apple_trees = &nparams_v6_def_apple_trees; + } bool readParams(Settings *settings); @@ -90,11 +97,13 @@ public: Noise *noise_terrain_higher; Noise *noise_steepness; Noise *noise_height_select; - Noise *noise_trees; Noise *noise_mud; Noise *noise_beach; Noise *noise_biome; NoiseParams *np_cave; + NoiseParams *np_humidity; + NoiseParams *np_trees; + NoiseParams *np_apple_trees; float freq_desert; float freq_beach; @@ -126,8 +135,9 @@ public: bool block_is_underground(u64 seed, v3s16 blockpos); s16 find_ground_level_from_noise(u64 seed, v2s16 p2d, s16 precision); + float getHumidity(v2s16 p); float getTreeAmount(v2s16 p); - float getTreeAmount(int index); + bool getHaveAppleTree(v2s16 p); float getMudAmount(v2s16 p); float getMudAmount(int index); bool getHaveBeach(v2s16 p); diff --git a/src/treegen.cpp b/src/treegen.cpp index 5ddf1132d..9df528a21 100644 --- a/src/treegen.cpp +++ b/src/treegen.cpp @@ -510,8 +510,15 @@ v3f transposeMatrix(irr::core::matrix4 M, v3f v) void make_jungletree(VoxelManipulator &vmanip, v3s16 p0, INodeDefManager *ndef, int seed) { - MapNode treenode(ndef->getId("mapgen_jungletree")); - MapNode leavesnode(ndef->getId("mapgen_leaves")); + content_t c_tree = ndef->getId("mapgen_jungletree"); + content_t c_leaves = ndef->getId("mapgen_jungleleaves"); + if (c_tree == CONTENT_IGNORE) + c_tree = ndef->getId("mapgen_tree"); + if (c_leaves == CONTENT_IGNORE) + c_leaves = ndef->getId("mapgen_leaves"); + + MapNode treenode(c_tree); + MapNode leavesnode(c_leaves); PseudoRandom pr(seed); for(s16 x=-1; x<=1; x++) -- cgit v1.2.3 From 165498cecfc11f3471d84855f4d019be9b353621 Mon Sep 17 00:00:00 2001 From: proller Date: Wed, 13 Mar 2013 00:41:14 +0400 Subject: initial mapgen indev version with farscale feature and huge caves --- minetest.conf.example | 8 +- src/CMakeLists.txt | 1 + src/defaultsettings.cpp | 6 ++ src/emerge.cpp | 2 + src/map.cpp | 1 + src/mapgen_indev.cpp | 246 ++++++++++++++++++++++++++++++++++++++++++++++++ src/mapgen_indev.h | 135 ++++++++++++++++++++++++++ src/mapgen_v6.cpp | 72 +++++++------- src/mapgen_v6.h | 21 ++++- src/noise.cpp | 1 + src/noise.h | 2 +- src/settings.h | 2 +- 12 files changed, 456 insertions(+), 41 deletions(-) create mode 100644 src/mapgen_indev.cpp create mode 100644 src/mapgen_indev.h (limited to 'src/mapgen_v6.cpp') diff --git a/minetest.conf.example b/minetest.conf.example index 649717ee8..6a227487a 100644 --- a/minetest.conf.example +++ b/minetest.conf.example @@ -308,7 +308,7 @@ # Mapgen stuff # -# Name of map generator to be used. Currently only v6 is supported. +# Name of map generator to be used. Currently v6 and indev are supported. #mg_name = v6 # Water level of map. #water_level = 1 @@ -337,3 +337,9 @@ #mgv7_np_bgroup = 0.5, 0.3125, (350, 350, 350), 5923, 2, 0.6 #mgv7_np_heat = 25, 50, (500, 500, 500), 35293, 1, 0 #mgv7_np_humidity = 50, 31.25, (750, 750, 750), 12094, 2, 0.6 + +# Offset, scale, spread factor, seed offset, number of octaves, persistence, farscale +#mgindev_np_terrain_base = -4, 20, (250.0, 250, 250), 82341, 5, 0.6, 10 +#mgindev_np_terrain_higher = 20, 16, (500, 500, 500), 85039, 5, 0.6, 10 +#mgindev_np_steepness = 0.85, 0.5, (125, 125, 125), -932, 5, 0.7, 10 +#mgindev_np_mud = 4, 2, (200, 200, 200), 91013, 3, 0.55, 1 diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 60e2b1d88..0f8396c02 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -225,6 +225,7 @@ set(common_SRCS emerge.cpp mapgen.cpp mapgen_v6.cpp + mapgen_indev.cpp treegen.cpp dungeongen.cpp content_nodemeta.cpp diff --git a/src/defaultsettings.cpp b/src/defaultsettings.cpp index f7724fa11..b0ae271ce 100644 --- a/src/defaultsettings.cpp +++ b/src/defaultsettings.cpp @@ -235,5 +235,11 @@ void set_default_settings(Settings *settings) settings->setDefault("mgv7_np_bgroup", "0.5, 0.3125, (350, 350, 350), 5923, 2, 0.6"); settings->setDefault("mgv7_np_heat", "25, 50, (500, 500, 500), 35293, 1, 0"); settings->setDefault("mgv7_np_humidity", "50, 31.25, (750, 750, 750), 12094, 2, 0.6"); + + settings->setDefault("mgindev_np_terrain_base", "-4, 20, (250.0, 250, 250), 82341, 5, 0.6, 10"); + settings->setDefault("mgindev_np_terrain_higher", "20, 16, (500, 500, 500), 85039, 5, 0.6, 10"); + settings->setDefault("mgindev_np_steepness", "0.85, 0.5, (125, 125, 125), -932, 5, 0.7, 10"); + settings->setDefault("mgindev_np_mud", "4, 2, (200, 200, 200), 91013, 3, 0.55, 1"); + } diff --git a/src/emerge.cpp b/src/emerge.cpp index 8a060d107..5311c1210 100644 --- a/src/emerge.cpp +++ b/src/emerge.cpp @@ -39,6 +39,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "biome.h" #include "emerge.h" #include "mapgen_v6.h" +#include "mapgen_indev.h" /////////////////////////////// Emerge Manager //////////////////////////////// @@ -46,6 +47,7 @@ with this program; if not, write to the Free Software Foundation, Inc., EmergeManager::EmergeManager(IGameDef *gamedef, BiomeDefManager *bdef) { //register built-in mapgens registerMapgen("v6", new MapgenFactoryV6()); + registerMapgen("indev", new MapgenFactoryIndev()); this->biomedef = bdef ? bdef : new BiomeDefManager(gamedef); this->params = NULL; diff --git a/src/map.cpp b/src/map.cpp index 6103b9017..3d36675a8 100644 --- a/src/map.cpp +++ b/src/map.cpp @@ -35,6 +35,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "rollback_interface.h" #include "emerge.h" #include "mapgen_v6.h" +#include "mapgen_indev.h" #define PP(x) "("<<(x).X<<","<<(x).Y<<","<<(x).Z<<")" diff --git a/src/mapgen_indev.cpp b/src/mapgen_indev.cpp new file mode 100644 index 000000000..e9ab36ae9 --- /dev/null +++ b/src/mapgen_indev.cpp @@ -0,0 +1,246 @@ +/* +Minetest +Copyright (C) 2010-2013 celeron55, Perttu Ahola + +This program is free software; you can redistribute it and/or modify +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 Lesser General Public License for more details. + +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. +*/ + +#include "mapgen_indev.h" +#include "constants.h" +#include "log.h" + +/////////////////// Mapgen Indev perlin noise default values + +NoiseIndevParams nparams_indev_def_terrain_base + (-AVERAGE_MUD_AMOUNT, 20.0, v3f(250.0, 250.0, 250.0), 82341, 5, 0.6, 1); +NoiseIndevParams nparams_indev_def_terrain_higher + (20.0, 16.0, v3f(500.0, 500.0, 500.0), 85039, 5, 0.6, 1); +NoiseIndevParams nparams_indev_def_steepness + (0.85, 0.5, v3f(125.0, 125.0, 125.0), -932, 5, 0.7, 1); +NoiseIndevParams nparams_indev_def_mud + (AVERAGE_MUD_AMOUNT, 2.0, v3f(200.0, 200.0, 200.0), 91013, 3, 0.55, 1); + +/////////////////////////////////////////////////////////////////////////////// + +void NoiseIndev::init(NoiseIndevParams *np, int seed, int sx, int sy, int sz) { + Noise::init((NoiseParams*)np, seed, sx, sy, sz); + this->npindev = np; +} + + +NoiseIndev::NoiseIndev(NoiseIndevParams *np, int seed, int sx, int sy) : Noise(np, seed, sx, sy) { + init(np, seed, sx, sy, 1); +} + + +NoiseIndev::NoiseIndev(NoiseIndevParams *np, int seed, int sx, int sy, int sz) : Noise(np, seed, sx, sy, sz) { + init(np, seed, sx, sy, sz); +} + + +float farscale(float scale, float x, float y, float z) { + return ( 1 + ( 1 - (MAP_GENERATION_LIMIT * 3 - (fabs(x) + fabs(y) + fabs(z)) ) / (MAP_GENERATION_LIMIT * 3) ) * (scale - 1) ); +} + +void NoiseIndev::transformNoiseMapFarScale(float xx, float yy, float zz) { + // more correct use distantion from 0,0,0 via pow, but + is faster + //float farscale = ( 1 + ( 1 - (MAP_GENERATION_LIMIT * 3 - (fabs(xx) + fabs(yy) + fabs(zz)) ) / (MAP_GENERATION_LIMIT * 3) ) * ((npindev)->farscale - 1) ); + // dstream << "TNM rs=" << farscale << " from=" << (npindev)->farscale << " x=" << xx << " y=" << yy <<" z=" << zz << std::endl; + int i = 0; + for (int z = 0; z != sz; z++) { + for (int y = 0; y != sy; y++) { + for (int x = 0; x != sx; x++) { + //result[i] = result[i] * npindev->scale * farscale + npindev->offset; + result[i] = result[i] * npindev->scale * farscale(npindev->farscale,xx,yy,zz) + npindev->offset; + i++; + } + } + } +} + +MapgenIndev::MapgenIndev(int mapgenid, MapgenIndevParams *params) : MapgenV6(mapgenid, params) { + noiseindev_terrain_base = new NoiseIndev(params->npindev_terrain_base, seed, csize.X, csize.Y); + noiseindev_terrain_higher = new NoiseIndev(params->npindev_terrain_higher, seed, csize.X, csize.Y); + noiseindev_steepness = new NoiseIndev(params->npindev_steepness, seed, csize.X, csize.Y); +// noise_height_select = new Noise(params->np_height_select, seed, csize.X, csize.Y); +// noise_trees = new Noise(params->np_trees, seed, csize.X, csize.Y); + noiseindev_mud = new NoiseIndev(params->npindev_mud, seed, csize.X, csize.Y); +// noise_beach = new Noise(params->np_beach, seed, csize.X, csize.Y); +// noise_biome = new Noise(params->np_biome, seed, csize.X, csize.Y); +} + +MapgenIndev::~MapgenIndev() { + delete noiseindev_terrain_base; + delete noiseindev_terrain_higher; + delete noiseindev_steepness; + //delete noise_height_select; + //delete noise_trees; + delete noiseindev_mud; + //delete noise_beach; + //delete noise_biome; +} + + +void MapgenIndev::calculateNoise() { + int x = node_min.X; + int y = node_min.Y; + int z = node_min.Z; + // Need to adjust for the original implementation's +.5 offset... + if (!(flags & MG_FLAT)) { + noiseindev_terrain_base->perlinMap2D( + x + 0.5 * noiseindev_terrain_base->npindev->spread.X, + z + 0.5 * noiseindev_terrain_base->npindev->spread.Z); + noiseindev_terrain_base->transformNoiseMapFarScale(x, y, z); + //noise_terrain_base->transformNoiseMap(); + + noiseindev_terrain_higher->perlinMap2D( + x + 0.5 * noiseindev_terrain_higher->npindev->spread.X, + z + 0.5 * noiseindev_terrain_higher->npindev->spread.Z); + noiseindev_terrain_higher->transformNoiseMapFarScale(x, y, z); + //noise_terrain_higher->transformNoiseMap(); + + noiseindev_steepness->perlinMap2D( + x + 0.5 * noiseindev_steepness->npindev->spread.X, + z + 0.5 * noiseindev_steepness->npindev->spread.Z); + noiseindev_steepness->transformNoiseMapFarScale(x, y, z); + + noise_height_select->perlinMap2D( + x + 0.5 * noise_height_select->np->spread.X, + z + 0.5 * noise_height_select->np->spread.Z); + } + + if (!(flags & MG_FLAT)) { + noiseindev_mud->perlinMap2D( + x + 0.5 * noiseindev_mud->npindev->spread.X, + z + 0.5 * noiseindev_mud->npindev->spread.Z); + noiseindev_mud->transformNoiseMapFarScale(x, y, z); + } + noise_beach->perlinMap2D( + x + 0.2 * noise_beach->np->spread.X, + z + 0.7 * noise_beach->np->spread.Z); + + noise_biome->perlinMap2D( + x + 0.6 * noise_biome->np->spread.X, + z + 0.2 * noise_biome->np->spread.Z); +} + +bool MapgenIndevParams::readParams(Settings *settings) { + freq_desert = settings->getFloat("mgv6_freq_desert"); + freq_beach = settings->getFloat("mgv6_freq_beach"); + + npindev_terrain_base = settings->getNoiseIndevParams("mgindev_np_terrain_base"); + npindev_terrain_higher = settings->getNoiseIndevParams("mgindev_np_terrain_higher"); + npindev_steepness = settings->getNoiseIndevParams("mgindev_np_steepness"); + np_height_select = settings->getNoiseParams("mgv6_np_height_select"); + np_trees = settings->getNoiseParams("mgv6_np_trees"); + npindev_mud = settings->getNoiseIndevParams("mgindev_np_mud"); + np_beach = settings->getNoiseParams("mgv6_np_beach"); + np_biome = settings->getNoiseParams("mgv6_np_biome"); + np_cave = settings->getNoiseParams("mgv6_np_cave"); + + bool success = + npindev_terrain_base && npindev_terrain_higher && npindev_steepness && + np_height_select && np_trees && npindev_mud && + np_beach && np_biome && np_cave; + return success; +} + + +void MapgenIndevParams::writeParams(Settings *settings) { + settings->setFloat("mgv6_freq_desert", freq_desert); + settings->setFloat("mgv6_freq_beach", freq_beach); + + settings->setNoiseIndevParams("mgindev_np_terrain_base", npindev_terrain_base); + settings->setNoiseIndevParams("mgindev_np_terrain_higher", npindev_terrain_higher); + settings->setNoiseIndevParams("mgindev_np_steepness", npindev_steepness); + settings->setNoiseParams("mgv6_np_height_select", np_height_select); + settings->setNoiseParams("mgv6_np_trees", np_trees); + settings->setNoiseIndevParams("mgindev_np_mud", npindev_mud); + settings->setNoiseParams("mgv6_np_beach", np_beach); + settings->setNoiseParams("mgv6_np_biome", np_biome); + settings->setNoiseParams("mgv6_np_cave", np_cave); +} + + +float MapgenIndev::baseTerrainLevelFromNoise(v2s16 p) { + if (flags & MG_FLAT) + return water_level; + + float terrain_base = NoisePerlin2DPosOffset(noiseindev_terrain_base->npindev, + p.X, 0.5, p.Y, 0.5, seed); + float terrain_higher = NoisePerlin2DPosOffset(noiseindev_terrain_higher->npindev, + p.X, 0.5, p.Y, 0.5, seed); + float steepness = NoisePerlin2DPosOffset(noiseindev_steepness->npindev, + p.X, 0.5, p.Y, 0.5, seed); + float height_select = NoisePerlin2DNoTxfmPosOffset(noise_height_select->np, + p.X, 0.5, p.Y, 0.5, seed); + + return baseTerrainLevel(terrain_base, terrain_higher, + steepness, height_select); +} + +float MapgenIndev::baseTerrainLevelFromMap(int index) { + if (flags & MG_FLAT) + return water_level; + + float terrain_base = noiseindev_terrain_base->result[index]; + float terrain_higher = noiseindev_terrain_higher->result[index]; + float steepness = noiseindev_steepness->result[index]; + float height_select = noise_height_select->result[index]; + + return baseTerrainLevel(terrain_base, terrain_higher, + steepness, height_select); +} + +float MapgenIndev::getMudAmount(int index) +{ + if (flags & MG_FLAT) + return AVERAGE_MUD_AMOUNT; + + /*return ((float)AVERAGE_MUD_AMOUNT + 2.0 * noise2d_perlin( + 0.5+(float)p.X/200, 0.5+(float)p.Y/200, + seed+91013, 3, 0.55));*/ + + return noiseindev_mud->result[index]; +} + +void MapgenIndev::defineCave(Cave & cave, PseudoRandom ps, v3s16 node_min, bool large_cave) { + cave.min_tunnel_diameter = 2; + cave.max_tunnel_diameter = ps.range(2,6); + cave.dswitchint = ps.range(1,14); + //cave.tunnel_routepoints = 0; + //cave.part_max_length_rs = 0; + cave.flooded = large_cave && ps.range(0,4); + if(large_cave){ + cave.part_max_length_rs = ps.range(2,4); +//dstream<<"try:"< + +This program is free software; you can redistribute it and/or modify +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 Lesser General Public License for more details. + +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. +*/ + +#ifndef MAPGENINDEV_HEADER +#define MAPGENINDEV_HEADER + +#include "mapgen.h" +#include "mapgen_v6.h" + +float farscale(float scale, float x, float y, float z); + +struct NoiseIndevParams : public NoiseParams { + float farscale; + + NoiseIndevParams(){} + NoiseIndevParams(float offset_, float scale_, v3f spread_, int seed_, int octaves_, float persist_, float farscale_) + //:NoiseParams(offset_, scale_, spread_, seed_, octaves_, persist_) + { + //NoiseParams(float offset_, float scale_, v3f spread_, int seed_, int octaves_, float persist_) { + offset = offset_; + scale = scale_; + spread = spread_; + seed = seed_; + octaves = octaves_; + persist = persist_; + //} + farscale = farscale_; + } + +}; + +#define getNoiseIndevParams(x) getStruct((x), "f,f,v3,s32,s32,f,f") +#define setNoiseIndevParams(x, y) setStruct((x), "f,f,v3,s32,s32,f,f", (y)) + +class NoiseIndev : public Noise { + public: + NoiseIndevParams *npindev; + + //NoiseIndev() {}; + NoiseIndev(NoiseIndevParams *np, int seed, int sx, int sy); + NoiseIndev(NoiseIndevParams *np, int seed, int sx, int sy, int sz); + void init(NoiseIndevParams *np, int seed, int sx, int sy, int sz); + void transformNoiseMapFarScale(float xx = 0, float yy = 0, float zz = 0); +}; + +extern NoiseIndevParams nparams_indev_def_terrain_base; +extern NoiseIndevParams nparams_indev_def_terrain_higher; +extern NoiseIndevParams nparams_indev_def_steepness; +//extern NoiseIndevParams nparams_indev_def_height_select; +//extern NoiseIndevParams nparams_indev_def_trees; +extern NoiseIndevParams nparams_indev_def_mud; +//extern NoiseIndevParams nparams_indev_def_beach; +//extern NoiseIndevParams nparams_indev_def_biome; +//extern NoiseIndevParams nparams_indev_def_cave; + + +struct MapgenIndevParams : public MapgenV6Params { + NoiseIndevParams *npindev_terrain_base; + NoiseIndevParams *npindev_terrain_higher; + NoiseIndevParams *npindev_steepness; + //NoiseParams *np_height_select; + //NoiseParams *np_trees; + NoiseIndevParams *npindev_mud; + //NoiseParams *np_beach; + //NoiseParams *np_biome; + //NoiseParams *np_cave; + + MapgenIndevParams() { + //freq_desert = 0.45; + //freq_beach = 0.15; + npindev_terrain_base = &nparams_indev_def_terrain_base; + npindev_terrain_higher = &nparams_indev_def_terrain_higher; + npindev_steepness = &nparams_indev_def_steepness; + //np_height_select = &nparams_v6_def_height_select; + //np_trees = &nparams_v6_def_trees; + npindev_mud = &nparams_indev_def_mud; + //np_beach = &nparams_v6_def_beach; + //np_biome = &nparams_v6_def_biome; + //np_cave = &nparams_v6_def_cave; + } + + bool readParams(Settings *settings); + void writeParams(Settings *settings); +}; + +class MapgenIndev : public MapgenV6 { + public: + NoiseIndev *noiseindev_terrain_base; + NoiseIndev *noiseindev_terrain_higher; + NoiseIndev *noiseindev_steepness; + //NoiseIndev *noise_height_select; + //NoiseIndev *noise_trees; + NoiseIndev *noiseindev_mud; + //NoiseIndev *noise_beach; + //NoiseIndev *noise_biome; + //NoiseIndevParams *np_cave; + + MapgenIndev(int mapgenid, MapgenIndevParams *params); + ~MapgenIndev(); + void calculateNoise(); + + float baseTerrainLevelFromNoise(v2s16 p); + float baseTerrainLevelFromMap(int index); + float getMudAmount(int index); + void defineCave(Cave & cave, PseudoRandom ps, v3s16 node_min, bool large_cave); +}; + +struct MapgenFactoryIndev : public MapgenFactoryV6 { + Mapgen *createMapgen(int mgid, MapgenParams *params, EmergeManager *emerge) { + return new MapgenIndev(mgid, (MapgenIndevParams *)params); + }; + + MapgenParams *createMapgenParams() { + return new MapgenIndevParams(); + }; +}; + + +#endif diff --git a/src/mapgen_v6.cpp b/src/mapgen_v6.cpp index dca4e5353..91947df84 100644 --- a/src/mapgen_v6.cpp +++ b/src/mapgen_v6.cpp @@ -878,6 +878,24 @@ void MapgenV6::growGrass() { } } +void MapgenV6::defineCave(Cave & cave, PseudoRandom ps, v3s16 node_min, bool large_cave) { + cave.min_tunnel_diameter = 2; + cave.max_tunnel_diameter = ps.range(2,6); + cave.dswitchint = ps.range(1,14); + //cave.tunnel_routepoints = 0; + //cave.part_max_length_rs = 0; + cave.flooded = large_cave && ps.range(0,4); + if(large_cave){ + cave.part_max_length_rs = ps.range(2,4); + cave.tunnel_routepoints = ps.range(5, ps.range(15,30)); + cave.min_tunnel_diameter = 5; + cave.max_tunnel_diameter = ps.range(7, ps.range(8,24)); + } else { + cave.part_max_length_rs = ps.range(2,9); + cave.tunnel_routepoints = ps.range(10, ps.range(15,30)); + } + cave.large_cave_is_flat = (ps.range(0,1) == 0); +}; void MapgenV6::generateCaves(int max_stone_y) { // 24ms @cs=8 @@ -911,21 +929,9 @@ void MapgenV6::generateCaves(int max_stone_y) { break;*/ bool large_cave = (jj >= caves_count); - s16 min_tunnel_diameter = 2; - s16 max_tunnel_diameter = ps.range(2,6); - int dswitchint = ps.range(1,14); - u16 tunnel_routepoints = 0; - int part_max_length_rs = 0; - if(large_cave){ - part_max_length_rs = ps.range(2,4); - tunnel_routepoints = ps.range(5, ps.range(15,30)); - min_tunnel_diameter = 5; - max_tunnel_diameter = ps.range(7, ps.range(8,24)); - } else { - part_max_length_rs = ps.range(2,9); - tunnel_routepoints = ps.range(10, ps.range(15,30)); - } - bool large_cave_is_flat = (ps.range(0,1) == 0); + + Cave cave; + defineCave(cave, ps, node_min, large_cave); v3f main_direction(0,0,0); @@ -938,13 +944,13 @@ void MapgenV6::generateCaves(int max_stone_y) { // Allow a bit more //(this should be more than the maximum radius of the tunnel) s16 insure = 10; - s16 more = max_spread_amount - max_tunnel_diameter / 2 - insure; + s16 more = max_spread_amount - cave.max_tunnel_diameter / 2 - insure; ar += v3s16(1,0,1) * more * 2; of -= v3s16(1,0,1) * more; s16 route_y_min = 0; // Allow half a diameter + 7 over stone surface - s16 route_y_max = -of.Y + max_stone_y + max_tunnel_diameter/2 + 7; + s16 route_y_max = -of.Y + max_stone_y + cave.max_tunnel_diameter/2 + 7; // Limit maximum to area route_y_max = rangelim(route_y_max, 0, ar.Y-1); @@ -954,10 +960,10 @@ void MapgenV6::generateCaves(int max_stone_y) { s16 min = 0; if(node_min.Y < water_level && node_max.Y > water_level) { - min = water_level - max_tunnel_diameter/3 - of.Y; - route_y_max = water_level + max_tunnel_diameter/3 - of.Y; + min = water_level - cave.max_tunnel_diameter/3 - of.Y; + route_y_max = water_level + cave.max_tunnel_diameter/3 - of.Y; } - route_y_min = ps.range(min, min + max_tunnel_diameter); + route_y_min = ps.range(min, min + cave.max_tunnel_diameter); route_y_min = rangelim(route_y_min, 0, route_y_max); } @@ -985,9 +991,9 @@ void MapgenV6::generateCaves(int max_stone_y) { Generate some tunnel starting from orp */ - for(u16 j=0; j 7 && abs(y0) >= rs/3) continue; @@ -1109,13 +1115,13 @@ void MapgenV6::generateCaves(int max_stone_y) { u32 i = vm->m_area.index(p); if(large_cave) { - if (full_node_min.Y < water_level && + if (cave.flooded && full_node_min.Y < water_level && full_node_max.Y > water_level) { if (p.Y <= water_level) vm->m_data[i] = waternode; else vm->m_data[i] = airnode; - } else if (full_node_max.Y < water_level) { + } else if (cave.flooded && full_node_max.Y < water_level) { if (p.Y < startp.Y - 2) vm->m_data[i] = lavanode; else diff --git a/src/mapgen_v6.h b/src/mapgen_v6.h index 89d72300a..34de7c0ed 100644 --- a/src/mapgen_v6.h +++ b/src/mapgen_v6.h @@ -43,6 +43,16 @@ extern NoiseParams nparams_v6_def_humidity; extern NoiseParams nparams_v6_def_trees; extern NoiseParams nparams_v6_def_apple_trees; +struct Cave { + s16 min_tunnel_diameter; + s16 max_tunnel_diameter; + int dswitchint; + u16 tunnel_routepoints; + int part_max_length_rs; + bool large_cave_is_flat; + bool flooded; +}; + struct MapgenV6Params : public MapgenParams { float freq_desert; float freq_beach; @@ -126,9 +136,9 @@ public: float baseTerrainLevel(float terrain_base, float terrain_higher, float steepness, float height_select); - float baseTerrainLevelFromNoise(v2s16 p); - float baseTerrainLevelFromMap(v2s16 p); - float baseTerrainLevelFromMap(int index); + virtual float baseTerrainLevelFromNoise(v2s16 p); + virtual float baseTerrainLevelFromMap(v2s16 p); + virtual float baseTerrainLevelFromMap(int index); s16 find_ground_level(v2s16 p2d); s16 find_stone_level(v2s16 p2d); @@ -139,7 +149,7 @@ public: float getTreeAmount(v2s16 p); bool getHaveAppleTree(v2s16 p); float getMudAmount(v2s16 p); - float getMudAmount(int index); + virtual float getMudAmount(int index); bool getHaveBeach(v2s16 p); bool getHaveBeach(int index); BiomeType getBiome(v2s16 p); @@ -148,13 +158,14 @@ public: u32 get_blockseed(u64 seed, v3s16 p); - void calculateNoise(); + virtual void calculateNoise(); int generateGround(); void addMud(); void flowMud(s16 &mudflow_minpos, s16 &mudflow_maxpos); void addDirtGravelBlobs(); void growGrass(); void placeTrees(); + virtual void defineCave(Cave & cave, PseudoRandom ps, v3s16 node_min, bool large_cave); void generateCaves(int max_stone_y); }; diff --git a/src/noise.cpp b/src/noise.cpp index 49b5f7e58..ba7c30574 100644 --- a/src/noise.cpp +++ b/src/noise.cpp @@ -524,6 +524,7 @@ float *Noise::perlinMap2D(float x, float y) { for (j = 0; j != sy; j++) { for (i = 0; i != sx; i++) { result[index] += g * buf[index]; +//dstream << "pm2d i="< Date: Sat, 16 Mar 2013 22:34:12 -0400 Subject: Some minor cleanups from the last commit --- src/mapgen_indev.cpp | 5 ++++- src/mapgen_v6.cpp | 10 +++++----- src/mapgen_v6.h | 4 ++-- src/noise.cpp | 1 - 4 files changed, 11 insertions(+), 9 deletions(-) (limited to 'src/mapgen_v6.cpp') diff --git a/src/mapgen_indev.cpp b/src/mapgen_indev.cpp index e9ab36ae9..4de4fd55f 100644 --- a/src/mapgen_indev.cpp +++ b/src/mapgen_indev.cpp @@ -191,6 +191,7 @@ float MapgenIndev::baseTerrainLevelFromNoise(v2s16 p) { steepness, height_select); } + float MapgenIndev::baseTerrainLevelFromMap(int index) { if (flags & MG_FLAT) return water_level; @@ -204,6 +205,7 @@ float MapgenIndev::baseTerrainLevelFromMap(int index) { steepness, height_select); } + float MapgenIndev::getMudAmount(int index) { if (flags & MG_FLAT) @@ -216,6 +218,7 @@ float MapgenIndev::getMudAmount(int index) return noiseindev_mud->result[index]; } + void MapgenIndev::defineCave(Cave & cave, PseudoRandom ps, v3s16 node_min, bool large_cave) { cave.min_tunnel_diameter = 2; cave.max_tunnel_diameter = ps.range(2,6); @@ -243,4 +246,4 @@ void MapgenIndev::defineCave(Cave & cave, PseudoRandom ps, v3s16 node_min, bool cave.tunnel_routepoints = ps.range(10, ps.range(15,30)); } cave.large_cave_is_flat = (ps.range(0,1) == 0); -}; +} diff --git a/src/mapgen_v6.cpp b/src/mapgen_v6.cpp index 91947df84..5f428bb8f 100644 --- a/src/mapgen_v6.cpp +++ b/src/mapgen_v6.cpp @@ -878,13 +878,12 @@ void MapgenV6::growGrass() { } } -void MapgenV6::defineCave(Cave & cave, PseudoRandom ps, v3s16 node_min, bool large_cave) { +void MapgenV6::defineCave(Cave &cave, PseudoRandom ps, + v3s16 node_min, bool large_cave) { cave.min_tunnel_diameter = 2; cave.max_tunnel_diameter = ps.range(2,6); cave.dswitchint = ps.range(1,14); - //cave.tunnel_routepoints = 0; - //cave.part_max_length_rs = 0; - cave.flooded = large_cave && ps.range(0,4); + cave.flooded = true; //large_cave && ps.range(0,4); if(large_cave){ cave.part_max_length_rs = ps.range(2,4); cave.tunnel_routepoints = ps.range(5, ps.range(15,30)); @@ -895,7 +894,8 @@ void MapgenV6::defineCave(Cave & cave, PseudoRandom ps, v3s16 node_min, bool lar cave.tunnel_routepoints = ps.range(10, ps.range(15,30)); } cave.large_cave_is_flat = (ps.range(0,1) == 0); -}; +} + void MapgenV6::generateCaves(int max_stone_y) { // 24ms @cs=8 diff --git a/src/mapgen_v6.h b/src/mapgen_v6.h index 34de7c0ed..662aed2ce 100644 --- a/src/mapgen_v6.h +++ b/src/mapgen_v6.h @@ -157,7 +157,6 @@ public: u32 get_blockseed(u64 seed, v3s16 p); - virtual void calculateNoise(); int generateGround(); void addMud(); @@ -165,7 +164,8 @@ public: void addDirtGravelBlobs(); void growGrass(); void placeTrees(); - virtual void defineCave(Cave & cave, PseudoRandom ps, v3s16 node_min, bool large_cave); + virtual void defineCave(Cave &cave, PseudoRandom ps, + v3s16 node_min, bool large_cave); void generateCaves(int max_stone_y); }; diff --git a/src/noise.cpp b/src/noise.cpp index ba7c30574..49b5f7e58 100644 --- a/src/noise.cpp +++ b/src/noise.cpp @@ -524,7 +524,6 @@ float *Noise::perlinMap2D(float x, float y) { for (j = 0; j != sy; j++) { for (i = 0; i != sx; i++) { result[index] += g * buf[index]; -//dstream << "pm2d i="<getId("mapgen_junglegrass"); + // if we don't have junglegrass, don't place cignore... that's bad + if (c_junglegrass == CONTENT_IGNORE) + c_junglegrass = CONTENT_AIR; + MapNode n_junglegrass(c_junglegrass); + v3s16 em = vm->m_area.getExtent(); // Divide area into parts s16 div = 8; s16 sidelen = central_area_size.X / div; double area = sidelen * sidelen; + // N.B. We must add jungle grass first, since tree leaves will + // obstruct the ground, giving us a false ground level for (s16 z0 = 0; z0 < div; z0++) for (s16 x0 = 0; x0 < div; x0++) { // Center position of part of division @@ -811,9 +823,36 @@ void MapgenV6::placeTrees() { // Amount of trees, jungle area u32 tree_count = area * getTreeAmount(p2d_center); - bool is_jungle = (flags & MGV6_JUNGLES) && (getHumidity(p2d_center) > 0.75); - if (is_jungle) - tree_count *= 4; + + float humidity; + bool is_jungle = false; + if (flags & MGV6_JUNGLES) { + humidity = getHumidity(p2d_center); + if (humidity > 0.75) { + is_jungle = true; + tree_count *= 4; + } + } + + // Add jungle grass + if (is_jungle) { + u32 grass_count = 5 * humidity * tree_count; + for (u32 i = 0; i < grass_count; i++) { + s16 x = grassrandom.range(p2d_min.X, p2d_max.X); + s16 z = grassrandom.range(p2d_min.Y, p2d_max.Y); + + s16 y = find_ground_level(v2s16(x, z)); ////////////////optimize this! + if (y < water_level || y < node_min.Y || y > node_max.Y) + continue; + + u32 vi = vm->m_area.index(x, y, z); + // place on dirt_with_grass, since we know it is exposed to sunlight + if (vm->m_data[vi].getContent() == c_dirt_with_grass) { + vm->m_area.add_y(em, vi, 1); + vm->m_data[vi] = n_junglegrass; + } + } + } // Put trees in random places on part of division for (u32 i = 0; i < tree_count; i++) { @@ -846,7 +885,7 @@ void MapgenV6::placeTrees() { } } } - //printf("placeTrees: %dms\n", t.stop()); + //printf("placeTreesAndJungleGrass: %dms\n", t.stop()); } @@ -878,6 +917,7 @@ void MapgenV6::growGrass() { } } + void MapgenV6::defineCave(Cave &cave, PseudoRandom ps, v3s16 node_min, bool large_cave) { cave.min_tunnel_diameter = 2; diff --git a/src/mapgen_v6.h b/src/mapgen_v6.h index 662aed2ce..5b3ea9d27 100644 --- a/src/mapgen_v6.h +++ b/src/mapgen_v6.h @@ -163,7 +163,7 @@ public: void flowMud(s16 &mudflow_minpos, s16 &mudflow_maxpos); void addDirtGravelBlobs(); void growGrass(); - void placeTrees(); + void placeTreesAndJungleGrass(); virtual void defineCave(Cave &cave, PseudoRandom ps, v3s16 node_min, bool large_cave); void generateCaves(int max_stone_y); -- cgit v1.2.3 From f70378f7f57f293a2a0afcf35aec8ee67180a6c0 Mon Sep 17 00:00:00 2001 From: proller Date: Sun, 24 Mar 2013 03:40:15 +0400 Subject: Mapgen indev: float islands, larger far biomes --- games/minimal/mods/default/mapgen.lua | 3 + minetest.conf.example | 17 ++- src/defaultsettings.cpp | 13 +- src/mapgen_indev.cpp | 226 ++++++++++++++++++++++++++-------- src/mapgen_indev.h | 49 +++++--- src/mapgen_v6.cpp | 2 + src/mapgen_v6.h | 1 + 7 files changed, 233 insertions(+), 78 deletions(-) (limited to 'src/mapgen_v6.cpp') diff --git a/games/minimal/mods/default/mapgen.lua b/games/minimal/mods/default/mapgen.lua index 74fc398b2..de6632d13 100644 --- a/games/minimal/mods/default/mapgen.lua +++ b/games/minimal/mods/default/mapgen.lua @@ -74,6 +74,9 @@ minetest.register_on_generated(function(minp, maxp, seed) generate_ore("default:stone_with_iron", "default:stone", minp, maxp, seed+2, 1/12/12/12, 5, -16, -5 ) generate_ore("default:stone_with_iron", "default:stone", minp, maxp, seed+3, 1/9/9/9, 5, -31000, -17 ) + generate_ore("default:stone_with_coal", "default:stone", minp, maxp, seed+4, 1/8/8/8, 5, 200, 31000 ) -- for float islands and far scaled mountains + generate_ore("default:stone_with_iron", "default:stone", minp, maxp, seed+5, 1/9/9/9, 5, 200, 31000 ) + if minetest.setting_getbool("underground_springs") then generate_ore("default:water_source", "default:stone", minp, maxp, seed+4, 1/24/24/24, 12, -100, -11, 128) generate_ore("default:water_source", "default:stone", minp, maxp, seed+5, 1/28/28/28, 8, -10000, -101, 128) diff --git a/minetest.conf.example b/minetest.conf.example index 5401f6aad..838987c33 100644 --- a/minetest.conf.example +++ b/minetest.conf.example @@ -341,8 +341,15 @@ #mgv7_np_heat = 25, 50, (500, 500, 500), 35293, 1, 0 #mgv7_np_humidity = 50, 31.25, (750, 750, 750), 12094, 2, 0.6 -# Offset, scale, spread factor, seed offset, number of octaves, persistence, farscale -#mgindev_np_terrain_base = -4, 20, (250.0, 250, 250), 82341, 5, 0.6, 10 -#mgindev_np_terrain_higher = 20, 16, (500, 500, 500), 85039, 5, 0.6, 10 -#mgindev_np_steepness = 0.85, 0.5, (125, 125, 125), -932, 5, 0.7, 10 -#mgindev_np_mud = 4, 2, (200, 200, 200), 91013, 3, 0.55, 1 +# Offset, scale, spread factor, seed offset, number of octaves, persistence, farscale, farspread +#mgindev_np_terrain_base = -4, 20, (250, 250, 250), 82341, 5, 0.6, 10, 10 +#mgindev_np_terrain_higher = 20, 16, (500, 500, 500), 85039, 5, 0.6, 10, 10 +#mgindev_np_steepness = 0.85, 0.5, (125, 125, 125), -932, 5, 0.7, 2, 10 +#mgindev_np_mud = 4, 2, (200, 200, 200), 91013, 3, 0.55, 1, 1 +#mgindev_np_float_islands1 = 0, 1, (64, 64, 64 ), 3683, 5, 0.5, 1, 1.5 +#mgindev_np_float_islands2 = 0, 1, (8, 8, 8 ), 9292, 2, 0.5, 1, 1.5 +#mgindev_np_float_islands3 = 0, 1, (256, 256, 256), 6412, 2, 0.5, 1, 0.5 +#mgindev_np_biome = 0, 1, (250, 250, 250), 9130, 3, 0.50, 1, 10 + +# Float islands starts from height, 0 to disable +#mgindev_float_islands = 500 diff --git a/src/defaultsettings.cpp b/src/defaultsettings.cpp index 25edffe32..592c6bcca 100644 --- a/src/defaultsettings.cpp +++ b/src/defaultsettings.cpp @@ -236,10 +236,15 @@ void set_default_settings(Settings *settings) settings->setDefault("mgv7_np_heat", "25, 50, (500, 500, 500), 35293, 1, 0"); settings->setDefault("mgv7_np_humidity", "50, 31.25, (750, 750, 750), 12094, 2, 0.6"); - settings->setDefault("mgindev_np_terrain_base", "-4, 20, (250.0, 250, 250), 82341, 5, 0.6, 10"); - settings->setDefault("mgindev_np_terrain_higher", "20, 16, (500, 500, 500), 85039, 5, 0.6, 10"); - settings->setDefault("mgindev_np_steepness", "0.85, 0.5, (125, 125, 125), -932, 5, 0.7, 10"); - settings->setDefault("mgindev_np_mud", "4, 2, (200, 200, 200), 91013, 3, 0.55, 1"); + settings->setDefault("mgindev_np_terrain_base", "-4, 20, (250, 250, 250), 82341, 5, 0.6, 10, 10"); + settings->setDefault("mgindev_np_terrain_higher", "20, 16, (500, 500, 500), 85039, 5, 0.6, 10, 10"); + settings->setDefault("mgindev_np_steepness", "0.85, 0.5, (125, 125, 125), -932, 5, 0.7, 2, 10"); + settings->setDefault("mgindev_np_mud", "4, 2, (200, 200, 200), 91013, 3, 0.55, 1, 1"); + settings->setDefault("mgindev_np_float_islands1", "0, 1, (64, 64, 64 ), 3683, 5, 0.5, 1, 1.5"); + settings->setDefault("mgindev_np_float_islands2", "0, 1, (8, 8, 8 ), 9292, 2, 0.5, 1, 1.5"); + settings->setDefault("mgindev_np_float_islands3", "0, 1, (256, 256, 256), 6412, 2, 0.5, 1, 0.5"); + settings->setDefault("mgindev_np_biome", "0, 1, (250, 250, 250), 9130, 3, 0.50, 1, 10"); + settings->setDefault("mgindev_float_islands", "500"); } diff --git a/src/mapgen_indev.cpp b/src/mapgen_indev.cpp index 4de4fd55f..6956fc63f 100644 --- a/src/mapgen_indev.cpp +++ b/src/mapgen_indev.cpp @@ -19,18 +19,27 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "mapgen_indev.h" #include "constants.h" +#include "map.h" +#include "main.h" #include "log.h" -/////////////////// Mapgen Indev perlin noise default values +/////////////////// Mapgen Indev perlin noise (default values - not used, from config or defaultsettings) -NoiseIndevParams nparams_indev_def_terrain_base - (-AVERAGE_MUD_AMOUNT, 20.0, v3f(250.0, 250.0, 250.0), 82341, 5, 0.6, 1); -NoiseIndevParams nparams_indev_def_terrain_higher - (20.0, 16.0, v3f(500.0, 500.0, 500.0), 85039, 5, 0.6, 1); -NoiseIndevParams nparams_indev_def_steepness - (0.85, 0.5, v3f(125.0, 125.0, 125.0), -932, 5, 0.7, 1); -NoiseIndevParams nparams_indev_def_mud - (AVERAGE_MUD_AMOUNT, 2.0, v3f(200.0, 200.0, 200.0), 91013, 3, 0.55, 1); +NoiseIndevParams nparams_indev_def; + +/* +NoiseIndevParams nparams_indev_def_terrain_base; +// (-AVERAGE_MUD_AMOUNT, 20.0, v3f(250.0, 250.0, 250.0), 82341, 5, 0.6, 1); +NoiseIndevParams nparams_indev_def_terrain_higher; +// (20.0, 16.0, v3f(500.0, 500.0, 500.0), 85039, 5, 0.6, 1); +NoiseIndevParams nparams_indev_def_steepness; +// (0.85, 0.5, v3f(125.0, 125.0, 125.0), -932, 5, 0.7, 1); +NoiseIndevParams nparams_indev_def_mud; +// (AVERAGE_MUD_AMOUNT, 2.0, v3f(200.0, 200.0, 200.0), 91013, 3, 0.55, 1); +NoiseIndevParams nparams_indev_def_float_islands; +// (1, 10.0, v3f(500.0, 500.0, 500.0), 32451, 5, 0.6, 1); +NoiseIndevParams nparams_indev_def_biome; +*/ /////////////////////////////////////////////////////////////////////////////// @@ -39,31 +48,32 @@ void NoiseIndev::init(NoiseIndevParams *np, int seed, int sx, int sy, int sz) { this->npindev = np; } - NoiseIndev::NoiseIndev(NoiseIndevParams *np, int seed, int sx, int sy) : Noise(np, seed, sx, sy) { init(np, seed, sx, sy, 1); } - NoiseIndev::NoiseIndev(NoiseIndevParams *np, int seed, int sx, int sy, int sz) : Noise(np, seed, sx, sy, sz) { init(np, seed, sx, sy, sz); } +float farscale(float scale, float z) { + return ( 1 + ( 1 - (MAP_GENERATION_LIMIT * 1 - (fabs(z)) ) / (MAP_GENERATION_LIMIT * 1) ) * (scale - 1) ); +} + +float farscale(float scale, float x, float z) { + return ( 1 + ( 1 - (MAP_GENERATION_LIMIT * 2 - (fabs(x) + fabs(z)) ) / (MAP_GENERATION_LIMIT * 2) ) * (scale - 1) ); +} float farscale(float scale, float x, float y, float z) { return ( 1 + ( 1 - (MAP_GENERATION_LIMIT * 3 - (fabs(x) + fabs(y) + fabs(z)) ) / (MAP_GENERATION_LIMIT * 3) ) * (scale - 1) ); } void NoiseIndev::transformNoiseMapFarScale(float xx, float yy, float zz) { - // more correct use distantion from 0,0,0 via pow, but + is faster - //float farscale = ( 1 + ( 1 - (MAP_GENERATION_LIMIT * 3 - (fabs(xx) + fabs(yy) + fabs(zz)) ) / (MAP_GENERATION_LIMIT * 3) ) * ((npindev)->farscale - 1) ); - // dstream << "TNM rs=" << farscale << " from=" << (npindev)->farscale << " x=" << xx << " y=" << yy <<" z=" << zz << std::endl; int i = 0; for (int z = 0; z != sz; z++) { for (int y = 0; y != sy; y++) { for (int x = 0; x != sx; x++) { - //result[i] = result[i] * npindev->scale * farscale + npindev->offset; - result[i] = result[i] * npindev->scale * farscale(npindev->farscale,xx,yy,zz) + npindev->offset; + result[i] = result[i] * npindev->scale * farscale(npindev->farscale, xx, yy, zz) + npindev->offset; i++; } } @@ -71,14 +81,17 @@ void NoiseIndev::transformNoiseMapFarScale(float xx, float yy, float zz) { } MapgenIndev::MapgenIndev(int mapgenid, MapgenIndevParams *params) : MapgenV6(mapgenid, params) { - noiseindev_terrain_base = new NoiseIndev(params->npindev_terrain_base, seed, csize.X, csize.Y); - noiseindev_terrain_higher = new NoiseIndev(params->npindev_terrain_higher, seed, csize.X, csize.Y); - noiseindev_steepness = new NoiseIndev(params->npindev_steepness, seed, csize.X, csize.Y); + noiseindev_terrain_base = new NoiseIndev(params->npindev_terrain_base, seed, csize.X, csize.Z); + noiseindev_terrain_higher = new NoiseIndev(params->npindev_terrain_higher, seed, csize.X, csize.Z); + noiseindev_steepness = new NoiseIndev(params->npindev_steepness, seed, csize.X, csize.Z); // noise_height_select = new Noise(params->np_height_select, seed, csize.X, csize.Y); // noise_trees = new Noise(params->np_trees, seed, csize.X, csize.Y); - noiseindev_mud = new NoiseIndev(params->npindev_mud, seed, csize.X, csize.Y); + noiseindev_mud = new NoiseIndev(params->npindev_mud, seed, csize.X, csize.Z); // noise_beach = new Noise(params->np_beach, seed, csize.X, csize.Y); -// noise_biome = new Noise(params->np_biome, seed, csize.X, csize.Y); + noiseindev_float_islands1 = new NoiseIndev(params->npindev_float_islands1, seed, csize.X, csize.Y, csize.Z); + noiseindev_float_islands2 = new NoiseIndev(params->npindev_float_islands2, seed, csize.X, csize.Y, csize.Z); + noiseindev_float_islands3 = new NoiseIndev(params->npindev_float_islands3, seed, csize.X, csize.Z); + noiseindev_biome = new NoiseIndev(params->npindev_biome, seed, csize.X, csize.Z); } MapgenIndev::~MapgenIndev() { @@ -89,10 +102,12 @@ MapgenIndev::~MapgenIndev() { //delete noise_trees; delete noiseindev_mud; //delete noise_beach; - //delete noise_biome; + delete noiseindev_float_islands1; + delete noiseindev_float_islands2; + delete noiseindev_float_islands3; + delete noiseindev_biome; } - void MapgenIndev::calculateNoise() { int x = node_min.X; int y = node_min.Y; @@ -100,31 +115,49 @@ void MapgenIndev::calculateNoise() { // Need to adjust for the original implementation's +.5 offset... if (!(flags & MG_FLAT)) { noiseindev_terrain_base->perlinMap2D( - x + 0.5 * noiseindev_terrain_base->npindev->spread.X, - z + 0.5 * noiseindev_terrain_base->npindev->spread.Z); + x + 0.5 * noiseindev_terrain_base->npindev->spread.X * farscale(noiseindev_terrain_base->npindev->farspread, x, z), + z + 0.5 * noiseindev_terrain_base->npindev->spread.Z * farscale(noiseindev_terrain_base->npindev->farspread, x, z)); noiseindev_terrain_base->transformNoiseMapFarScale(x, y, z); - //noise_terrain_base->transformNoiseMap(); noiseindev_terrain_higher->perlinMap2D( - x + 0.5 * noiseindev_terrain_higher->npindev->spread.X, - z + 0.5 * noiseindev_terrain_higher->npindev->spread.Z); + x + 0.5 * noiseindev_terrain_higher->npindev->spread.X * farscale(noiseindev_terrain_higher->npindev->farspread, x, z), + z + 0.5 * noiseindev_terrain_higher->npindev->spread.Z * farscale(noiseindev_terrain_higher->npindev->farspread, x, z)); noiseindev_terrain_higher->transformNoiseMapFarScale(x, y, z); - //noise_terrain_higher->transformNoiseMap(); noiseindev_steepness->perlinMap2D( - x + 0.5 * noiseindev_steepness->npindev->spread.X, - z + 0.5 * noiseindev_steepness->npindev->spread.Z); + x + 0.5 * noiseindev_steepness->npindev->spread.X * farscale(noiseindev_steepness->npindev->farspread, x, z), + z + 0.5 * noiseindev_steepness->npindev->spread.Z * farscale(noiseindev_steepness->npindev->farspread, x, z)); noiseindev_steepness->transformNoiseMapFarScale(x, y, z); noise_height_select->perlinMap2D( x + 0.5 * noise_height_select->np->spread.X, z + 0.5 * noise_height_select->np->spread.Z); + + noiseindev_float_islands1->perlinMap3D( + x + 0.33 * noiseindev_float_islands1->npindev->spread.X * farscale(noiseindev_float_islands1->npindev->farspread, x, y, z), + y + 0.33 * noiseindev_float_islands1->npindev->spread.Y * farscale(noiseindev_float_islands1->npindev->farspread, x, y, z), + z + 0.33 * noiseindev_float_islands1->npindev->spread.Z * farscale(noiseindev_float_islands1->npindev->farspread, x, y, z) + ); + noiseindev_float_islands1->transformNoiseMapFarScale(x, y, z); + + noiseindev_float_islands2->perlinMap3D( + x + 0.33 * noiseindev_float_islands2->npindev->spread.X * farscale(noiseindev_float_islands2->npindev->farspread, x, y, z), + y + 0.33 * noiseindev_float_islands2->npindev->spread.Y * farscale(noiseindev_float_islands2->npindev->farspread, x, y, z), + z + 0.33 * noiseindev_float_islands2->npindev->spread.Z * farscale(noiseindev_float_islands2->npindev->farspread, x, y, z) + ); + noiseindev_float_islands2->transformNoiseMapFarScale(x, y, z); + + noiseindev_float_islands3->perlinMap2D( + x + 0.5 * noiseindev_float_islands3->npindev->spread.X * farscale(noiseindev_float_islands3->npindev->farspread, x, z), + z + 0.5 * noiseindev_float_islands3->npindev->spread.Z * farscale(noiseindev_float_islands3->npindev->farspread, x, z)); + noiseindev_float_islands3->transformNoiseMapFarScale(x, y, z); + } if (!(flags & MG_FLAT)) { noiseindev_mud->perlinMap2D( - x + 0.5 * noiseindev_mud->npindev->spread.X, - z + 0.5 * noiseindev_mud->npindev->spread.Z); + x + 0.5 * noiseindev_mud->npindev->spread.X * farscale(noiseindev_mud->npindev->farspread, x, y, z), + z + 0.5 * noiseindev_mud->npindev->spread.Z * farscale(noiseindev_mud->npindev->farspread, x, y, z)); noiseindev_mud->transformNoiseMapFarScale(x, y, z); } noise_beach->perlinMap2D( @@ -132,8 +165,8 @@ void MapgenIndev::calculateNoise() { z + 0.7 * noise_beach->np->spread.Z); noise_biome->perlinMap2D( - x + 0.6 * noise_biome->np->spread.X, - z + 0.2 * noise_biome->np->spread.Z); + x + 0.6 * noiseindev_biome->npindev->spread.X * farscale(noiseindev_biome->npindev->farspread, x, z), + z + 0.2 * noiseindev_biome->npindev->spread.Z * farscale(noiseindev_biome->npindev->farspread, x, z)); } bool MapgenIndevParams::readParams(Settings *settings) { @@ -147,17 +180,20 @@ bool MapgenIndevParams::readParams(Settings *settings) { np_trees = settings->getNoiseParams("mgv6_np_trees"); npindev_mud = settings->getNoiseIndevParams("mgindev_np_mud"); np_beach = settings->getNoiseParams("mgv6_np_beach"); - np_biome = settings->getNoiseParams("mgv6_np_biome"); + npindev_biome = settings->getNoiseIndevParams("mgindev_np_biome"); np_cave = settings->getNoiseParams("mgv6_np_cave"); + npindev_float_islands1 = settings->getNoiseIndevParams("mgindev_np_float_islands1"); + npindev_float_islands2 = settings->getNoiseIndevParams("mgindev_np_float_islands2"); + npindev_float_islands3 = settings->getNoiseIndevParams("mgindev_np_float_islands3"); bool success = npindev_terrain_base && npindev_terrain_higher && npindev_steepness && np_height_select && np_trees && npindev_mud && - np_beach && np_biome && np_cave; + np_beach && np_biome && np_cave && + npindev_float_islands1 && npindev_float_islands2 && npindev_float_islands3; return success; } - void MapgenIndevParams::writeParams(Settings *settings) { settings->setFloat("mgv6_freq_desert", freq_desert); settings->setFloat("mgv6_freq_beach", freq_beach); @@ -169,8 +205,11 @@ void MapgenIndevParams::writeParams(Settings *settings) { settings->setNoiseParams("mgv6_np_trees", np_trees); settings->setNoiseIndevParams("mgindev_np_mud", npindev_mud); settings->setNoiseParams("mgv6_np_beach", np_beach); - settings->setNoiseParams("mgv6_np_biome", np_biome); + settings->setNoiseIndevParams("mgindev_np_biome", npindev_biome); settings->setNoiseParams("mgv6_np_cave", np_cave); + settings->setNoiseIndevParams("mgindev_np_float_islands1", npindev_float_islands1); + settings->setNoiseIndevParams("mgindev_np_float_islands2", npindev_float_islands2); + settings->setNoiseIndevParams("mgindev_np_float_islands3", npindev_float_islands3); } @@ -191,7 +230,6 @@ float MapgenIndev::baseTerrainLevelFromNoise(v2s16 p) { steepness, height_select); } - float MapgenIndev::baseTerrainLevelFromMap(int index) { if (flags & MG_FLAT) return water_level; @@ -205,9 +243,7 @@ float MapgenIndev::baseTerrainLevelFromMap(int index) { steepness, height_select); } - -float MapgenIndev::getMudAmount(int index) -{ +float MapgenIndev::getMudAmount(int index) { if (flags & MG_FLAT) return AVERAGE_MUD_AMOUNT; @@ -218,25 +254,19 @@ float MapgenIndev::getMudAmount(int index) return noiseindev_mud->result[index]; } - void MapgenIndev::defineCave(Cave & cave, PseudoRandom ps, v3s16 node_min, bool large_cave) { cave.min_tunnel_diameter = 2; cave.max_tunnel_diameter = ps.range(2,6); cave.dswitchint = ps.range(1,14); - //cave.tunnel_routepoints = 0; - //cave.part_max_length_rs = 0; cave.flooded = large_cave && ps.range(0,4); if(large_cave){ cave.part_max_length_rs = ps.range(2,4); -//dstream<<"try:"<setDefault("mgindev_np_float_islands1", "-9.5, 10, (20, 50, 50 ), 45123, 5, 0.6, 1.5, 5"); +void MapgenIndev::generateFloatIslands(int min_y) { + if (node_min.Y < min_y) return; + v3s16 p0(node_min.X, node_min.Y, node_min.Z); + MapNode n1(c_stone), n2(c_desert_stone); + int xl = node_max.X - node_min.X; + int yl = node_max.Y - node_min.Y; + int zl = node_max.Z - node_min.Z; + u32 index = 0; + for (int x1 = 0; x1 <= xl; x1++) + { + //int x = x1 + node_min.Y; + for (int z1 = 0; z1 <= zl; z1++) + { + //int z = z1 + node_min.Z; + for (int y1 = 0; y1 <= yl; y1++, index++) + { + //int y = y1 + node_min.Y; + float noise = noiseindev_float_islands1->result[index]; + //dstream << " y1="<((x), "f,f,v3,s32,s32,f,f") -#define setNoiseIndevParams(x, y) setStruct((x), "f,f,v3,s32,s32,f,f", (y)) +#define getNoiseIndevParams(x) getStruct((x), "f,f,v3,s32,s32,f,f,f") +#define setNoiseIndevParams(x, y) setStruct((x), "f,f,v3,s32,s32,f,f,f", (y)) class NoiseIndev : public Noise { public: @@ -59,6 +61,8 @@ class NoiseIndev : public Noise { void transformNoiseMapFarScale(float xx = 0, float yy = 0, float zz = 0); }; +extern NoiseIndevParams nparams_indev_def; +/* extern NoiseIndevParams nparams_indev_def_terrain_base; extern NoiseIndevParams nparams_indev_def_terrain_higher; extern NoiseIndevParams nparams_indev_def_steepness; @@ -66,9 +70,10 @@ extern NoiseIndevParams nparams_indev_def_steepness; //extern NoiseIndevParams nparams_indev_def_trees; extern NoiseIndevParams nparams_indev_def_mud; //extern NoiseIndevParams nparams_indev_def_beach; -//extern NoiseIndevParams nparams_indev_def_biome; +extern NoiseIndevParams nparams_indev_def_biome; //extern NoiseIndevParams nparams_indev_def_cave; - +extern NoiseIndevParams nparams_indev_def_float_islands; +*/ struct MapgenIndevParams : public MapgenV6Params { NoiseIndevParams *npindev_terrain_base; @@ -78,21 +83,28 @@ struct MapgenIndevParams : public MapgenV6Params { //NoiseParams *np_trees; NoiseIndevParams *npindev_mud; //NoiseParams *np_beach; - //NoiseParams *np_biome; + NoiseIndevParams *npindev_biome; //NoiseParams *np_cave; + NoiseIndevParams *npindev_float_islands1; + NoiseIndevParams *npindev_float_islands2; + NoiseIndevParams *npindev_float_islands3; MapgenIndevParams() { //freq_desert = 0.45; //freq_beach = 0.15; - npindev_terrain_base = &nparams_indev_def_terrain_base; - npindev_terrain_higher = &nparams_indev_def_terrain_higher; - npindev_steepness = &nparams_indev_def_steepness; + npindev_terrain_base = &nparams_indev_def; //&nparams_indev_def_terrain_base; + npindev_terrain_higher = &nparams_indev_def; //&nparams_indev_def_terrain_higher; + npindev_steepness = &nparams_indev_def; //&nparams_indev_def_steepness; //np_height_select = &nparams_v6_def_height_select; //np_trees = &nparams_v6_def_trees; - npindev_mud = &nparams_indev_def_mud; + npindev_mud = &nparams_indev_def; //&nparams_indev_def_mud; //np_beach = &nparams_v6_def_beach; - //np_biome = &nparams_v6_def_biome; + npindev_biome = &nparams_indev_def; //&nparams_indev_def_biome; //np_cave = &nparams_v6_def_cave; + npindev_float_islands1 = &nparams_indev_def; //&nparams_indev_def_float_islands; + npindev_float_islands2 = &nparams_indev_def; //&nparams_indev_def_float_islands; + npindev_float_islands3 = &nparams_indev_def; //&nparams_indev_def_float_islands; + } bool readParams(Settings *settings); @@ -108,8 +120,11 @@ class MapgenIndev : public MapgenV6 { //NoiseIndev *noise_trees; NoiseIndev *noiseindev_mud; //NoiseIndev *noise_beach; - //NoiseIndev *noise_biome; + NoiseIndev *noiseindev_biome; //NoiseIndevParams *np_cave; + NoiseIndev *noiseindev_float_islands1; + NoiseIndev *noiseindev_float_islands2; + NoiseIndev *noiseindev_float_islands3; MapgenIndev(int mapgenid, MapgenIndevParams *params); ~MapgenIndev(); @@ -119,6 +134,9 @@ class MapgenIndev : public MapgenV6 { float baseTerrainLevelFromMap(int index); float getMudAmount(int index); void defineCave(Cave & cave, PseudoRandom ps, v3s16 node_min, bool large_cave); + void generateSomething(); + + void generateFloatIslands(int min_y); }; struct MapgenFactoryIndev : public MapgenFactoryV6 { @@ -131,5 +149,4 @@ struct MapgenFactoryIndev : public MapgenFactoryV6 { }; }; - #endif diff --git a/src/mapgen_v6.cpp b/src/mapgen_v6.cpp index 59a4d49fc..1efa3ad74 100644 --- a/src/mapgen_v6.cpp +++ b/src/mapgen_v6.cpp @@ -422,6 +422,8 @@ void MapgenV6::makeChunk(BlockMakeData *data) { // Generate general ground level to full area stone_surface_max_y = generateGround(); + generateSomething(); + const s16 max_spread_amount = MAP_BLOCKSIZE; // Limit dirt flow area by 1 because mud is flown into neighbors. s16 mudflow_minpos = -max_spread_amount + 1; diff --git a/src/mapgen_v6.h b/src/mapgen_v6.h index 5b3ea9d27..89a3324cd 100644 --- a/src/mapgen_v6.h +++ b/src/mapgen_v6.h @@ -167,6 +167,7 @@ public: virtual void defineCave(Cave &cave, PseudoRandom ps, v3s16 node_min, bool large_cave); void generateCaves(int max_stone_y); + virtual void generateSomething() {}; //for next mapgen }; struct MapgenFactoryV6 : public MapgenFactory { -- cgit v1.2.3 From 57cbb8bfd8daaa1b8b1aa876723ff6355d21f7fc Mon Sep 17 00:00:00 2001 From: kwolekr Date: Sun, 24 Mar 2013 01:43:38 -0400 Subject: Add Ore infrastructure and l_register_ore() --- src/emerge.h | 3 +- src/mapgen.cpp | 134 ++++++++++++++++++++++++++++++++++++++++++++++++ src/mapgen.h | 43 ++++++++++++++++ src/mapgen_indev.cpp | 4 +- src/mapgen_indev.h | 4 +- src/mapgen_v6.cpp | 14 +++-- src/mapgen_v6.h | 6 ++- src/scriptapi.cpp | 46 ++++++++++++++++- src/scriptapi_noise.cpp | 2 + src/server.cpp | 9 ++-- 10 files changed, 248 insertions(+), 17 deletions(-) (limited to 'src/mapgen_v6.cpp') diff --git a/src/emerge.h b/src/emerge.h index 70b67e731..3d717bce3 100644 --- a/src/emerge.h +++ b/src/emerge.h @@ -63,8 +63,9 @@ public: std::map blocks_enqueued; std::map peer_queue_count; - //biome manager + //Mapgen-related structures BiomeDefManager *biomedef; + std::vector ores; EmergeManager(IGameDef *gamedef, BiomeDefManager *bdef); ~EmergeManager(); diff --git a/src/mapgen.cpp b/src/mapgen.cpp index dc6dab6bb..53b5d6867 100644 --- a/src/mapgen.cpp +++ b/src/mapgen.cpp @@ -49,6 +49,140 @@ FlagDesc flagdesc_mapgen[] = { /////////////////////////////////////////////////////////////////////////////// +Ore *createOre(OreType type) { + switch (type) { + case ORE_SCATTER: + return new OreScatter; + case ORE_SHEET: + return new OreSheet; + //case ORE_CLAYLIKE: //TODO: implement this! + // return new OreClaylike; + default: + return NULL; + } +} + + +void Ore::resolveNodeNames(INodeDefManager *ndef) { + if (ore == CONTENT_IGNORE) { + ore = ndef->getId(ore_name); + if (ore == CONTENT_IGNORE) { + errorstream << "Ore::resolveNodeNames: ore node '" + << ore_name << "' not defined"; + ore = CONTENT_AIR; + wherein = CONTENT_AIR; + } + } + + if (wherein == CONTENT_IGNORE) { + wherein = ndef->getId(wherein_name); + if (wherein == CONTENT_IGNORE) { + errorstream << "Ore::resolveNodeNames: wherein node '" + << wherein_name << "' not defined"; + ore = CONTENT_AIR; + wherein = CONTENT_AIR; + } + } +} + + +void OreScatter::generate(Mapgen *mg, u32 blockseed, v3s16 nmin, v3s16 nmax) { + if (nmin.Y > height_max || nmax.Y < height_min) + return; + + resolveNodeNames(mg->ndef); + + MapNode n_ore(ore); + ManualMapVoxelManipulator *vm = mg->vm; + PseudoRandom pr(blockseed); + + int ymin = MYMAX(nmin.Y, height_min); + int ymax = MYMIN(nmax.Y, height_max); + if (clust_size >= ymax - ymin + 1) + return; + + int volume = (nmax.X - nmin.X + 1) * + (nmax.Y - nmin.Y + 1) * + (nmax.Z - nmin.Z + 1); + int csize = clust_size; + int orechance = (csize * csize * csize) / clust_num_ores; + int nclusters = volume / clust_scarcity; + + for (int i = 0; i != nclusters; i++) { + int x0 = pr.range(nmin.X, nmax.X - csize + 1); + int y0 = pr.range(ymin, ymax - csize + 1); + int z0 = pr.range(nmin.Z, nmax.Z - csize + 1); + + if (np && (NoisePerlin3D(np, x0, y0, z0, mg->seed) < nthresh)) + continue; + + for (int z1 = 0; z1 != csize; z1++) + for (int y1 = 0; y1 != csize; y1++) + for (int x1 = 0; x1 != csize; x1++) { + if (pr.range(1, orechance) != 1) + continue; + + u32 i = vm->m_area.index(x0 + x1, y0 + y1, z0 + z1); + if (vm->m_data[i].getContent() == wherein) + vm->m_data[i] = n_ore; + } + } +} + + +void OreSheet::generate(Mapgen *mg, u32 blockseed, v3s16 nmin, v3s16 nmax) { + if (nmin.Y > height_max || nmax.Y < height_min) + return; + + resolveNodeNames(mg->ndef); + + MapNode n_ore(ore); + ManualMapVoxelManipulator *vm = mg->vm; + PseudoRandom pr(blockseed + 4234); + + int ymin = MYMAX(nmin.Y, height_min); + int ymax = MYMIN(nmax.Y, height_max); + + int x0 = nmin.X; + int z0 = nmin.Z; + + int x1 = nmax.X; + int z1 = nmax.Z; + + int max_height = clust_size; + + int y_start = pr.range(ymin, ymax - max_height); + + if (!noise) { + int sx = nmax.X - nmin.X + 1; + int sz = nmax.Z - nmin.Z + 1; + noise = new Noise(np, 0, sx, sz); + } + noise->seed = mg->seed + y_start; + noise->perlinMap2D(x0, z0); + + int index = 0; + for (int z = z0; z != z1; z++) + for (int x = x0; x != x1; x++) { + + if (noise->result[index++] < nthresh) + continue; + + int height = max_height * (1. / pr.range(1, 3)); + int y0 = y_start + pr.range(1, 3) - 1; + int y1 = y0 + height; + for (int y = y0; y != y1; y++) { + u32 i = vm->m_area.index(x, y, z); + if (!vm->m_area.contains(i)) + continue; + + if (vm->m_data[i].getContent() == wherein) + vm->m_data[i] = n_ore; + } + } +} + + void Mapgen::updateLiquid(UniqueQueue *trans_liquid, v3s16 nmin, v3s16 nmax) { bool isliquid, wasliquid; v3s16 em = vm->m_area.getExtent(); diff --git a/src/mapgen.h b/src/mapgen.h index 2e917a3aa..a900985da 100644 --- a/src/mapgen.h +++ b/src/mapgen.h @@ -97,5 +97,48 @@ struct MapgenFactory { virtual MapgenParams *createMapgenParams() = 0; }; +enum OreType { + ORE_SCATTER, + ORE_SHEET, + ORE_CLAYLIKE +}; + +class Ore { +public: + std::string ore_name; + std::string wherein_name; + + content_t ore; + content_t wherein; // the node to be replaced + s16 clust_scarcity; // + s16 clust_num_ores; // how many ore nodes are in a chunk + s16 clust_size; // how large (in nodes) a chunk of ore is + s16 height_min; + s16 height_max; + float nthresh; // threshhold for noise at which an ore is placed + NoiseParams *np; // noise for distribution of clusters (NULL for uniform scattering) + Noise *noise; + + Ore() { + ore = CONTENT_IGNORE; + wherein = CONTENT_IGNORE; + np = NULL; + noise = NULL; + } + + void resolveNodeNames(INodeDefManager *ndef); + virtual void generate(Mapgen *mg, u32 blockseed, v3s16 nmin, v3s16 nmax) = 0; +}; + +class OreScatter : public Ore { + void generate(Mapgen *mg, u32 blockseed, v3s16 nmin, v3s16 nmax); +}; + +class OreSheet : public Ore { + void generate(Mapgen *mg, u32 blockseed, v3s16 nmin, v3s16 nmax); +}; + +Ore *createOre(OreType type); + #endif diff --git a/src/mapgen_indev.cpp b/src/mapgen_indev.cpp index 6956fc63f..5d455827a 100644 --- a/src/mapgen_indev.cpp +++ b/src/mapgen_indev.cpp @@ -80,7 +80,9 @@ void NoiseIndev::transformNoiseMapFarScale(float xx, float yy, float zz) { } } -MapgenIndev::MapgenIndev(int mapgenid, MapgenIndevParams *params) : MapgenV6(mapgenid, params) { +MapgenIndev::MapgenIndev(int mapgenid, MapgenIndevParams *params, EmergeManager *emerge) + : MapgenV6(mapgenid, params, emerge) +{ noiseindev_terrain_base = new NoiseIndev(params->npindev_terrain_base, seed, csize.X, csize.Z); noiseindev_terrain_higher = new NoiseIndev(params->npindev_terrain_higher, seed, csize.X, csize.Z); noiseindev_steepness = new NoiseIndev(params->npindev_steepness, seed, csize.X, csize.Z); diff --git a/src/mapgen_indev.h b/src/mapgen_indev.h index 7ce65dfe3..fdac1ba20 100644 --- a/src/mapgen_indev.h +++ b/src/mapgen_indev.h @@ -126,7 +126,7 @@ class MapgenIndev : public MapgenV6 { NoiseIndev *noiseindev_float_islands2; NoiseIndev *noiseindev_float_islands3; - MapgenIndev(int mapgenid, MapgenIndevParams *params); + MapgenIndev(int mapgenid, MapgenIndevParams *params, EmergeManager *emerge); ~MapgenIndev(); void calculateNoise(); @@ -141,7 +141,7 @@ class MapgenIndev : public MapgenV6 { struct MapgenFactoryIndev : public MapgenFactoryV6 { Mapgen *createMapgen(int mgid, MapgenParams *params, EmergeManager *emerge) { - return new MapgenIndev(mgid, (MapgenIndevParams *)params); + return new MapgenIndev(mgid, (MapgenIndevParams *)params, emerge); }; MapgenParams *createMapgenParams() { diff --git a/src/mapgen_v6.cpp b/src/mapgen_v6.cpp index 1efa3ad74..0b419617d 100644 --- a/src/mapgen_v6.cpp +++ b/src/mapgen_v6.cpp @@ -64,9 +64,10 @@ NoiseParams nparams_v6_def_apple_trees = /////////////////////////////////////////////////////////////////////////////// -MapgenV6::MapgenV6(int mapgenid, MapgenV6Params *params) { +MapgenV6::MapgenV6(int mapgenid, MapgenV6Params *params, EmergeManager *emerge) { this->generating = false; this->id = mapgenid; + this->emerge = emerge; this->seed = (int)params->seed; this->water_level = params->water_level; @@ -463,6 +464,12 @@ void MapgenV6::makeChunk(BlockMakeData *data) { if (flags & MG_TREES) placeTreesAndJungleGrass(); + // Generate the registered ores + for (unsigned int i = 0; i != emerge->ores.size(); i++) { + Ore *ore = emerge->ores[i]; + ore->generate(this, blockseed + i, node_min, node_max); + } + // Calculate lighting calcLighting(node_min, node_max); @@ -494,14 +501,13 @@ void MapgenV6::calculateNoise() { noise_height_select->perlinMap2D( x + 0.5 * noise_height_select->np->spread.X, z + 0.5 * noise_height_select->np->spread.Z); - } - - if (!(flags & MG_FLAT)) { + noise_mud->perlinMap2D( x + 0.5 * noise_mud->np->spread.X, z + 0.5 * noise_mud->np->spread.Z); noise_mud->transformNoiseMap(); } + noise_beach->perlinMap2D( x + 0.2 * noise_beach->np->spread.X, z + 0.7 * noise_beach->np->spread.Z); diff --git a/src/mapgen_v6.h b/src/mapgen_v6.h index 89a3324cd..d37e406cb 100644 --- a/src/mapgen_v6.h +++ b/src/mapgen_v6.h @@ -91,6 +91,8 @@ struct MapgenV6Params : public MapgenParams { class MapgenV6 : public Mapgen { public: + EmergeManager *emerge; + int ystride; v3s16 csize; u32 flags; @@ -128,7 +130,7 @@ public: content_t c_desert_sand; content_t c_desert_stone; - MapgenV6(int mapgenid, MapgenV6Params *params); + MapgenV6(int mapgenid, MapgenV6Params *params, EmergeManager *emerge); ~MapgenV6(); void makeChunk(BlockMakeData *data); @@ -172,7 +174,7 @@ public: struct MapgenFactoryV6 : public MapgenFactory { Mapgen *createMapgen(int mgid, MapgenParams *params, EmergeManager *emerge) { - return new MapgenV6(mgid, (MapgenV6Params *)params); + return new MapgenV6(mgid, (MapgenV6Params *)params, emerge); }; MapgenParams *createMapgenParams() { diff --git a/src/scriptapi.cpp b/src/scriptapi.cpp index 29494ff69..ddffbb0b7 100644 --- a/src/scriptapi.cpp +++ b/src/scriptapi.cpp @@ -30,6 +30,7 @@ extern "C" { #include "settings.h" // For accessing g_settings #include "main.h" // For g_settings #include "biome.h" +#include "emerge.h" #include "script.h" #include "rollback.h" @@ -242,6 +243,14 @@ struct EnumString es_BiomeTerrainType[] = {0, NULL}, }; +struct EnumString es_OreType[] = +{ + {ORE_SCATTER, "scatter"}, + {ORE_SHEET, "sheet"}, + {ORE_CLAYLIKE, "claylike"}, + {0, NULL}, +}; + /*****************************************************************************/ /* Parameters */ /*****************************************************************************/ @@ -612,8 +621,6 @@ static int l_register_biome_groups(lua_State *L) { luaL_checktype(L, 1, LUA_TTABLE); int index = 1; - if (!lua_istable(L, index)) - throw LuaError(L, "register_biome_groups: parameter is not a table"); BiomeDefManager *bmgr = get_server(L)->getBiomeDef(); if (!bmgr) { @@ -686,6 +693,40 @@ static int l_register_biome(lua_State *L) } +static int l_register_ore(lua_State *L) +{ + int index = 1; + luaL_checktype(L, index, LUA_TTABLE); + + IWritableNodeDefManager *ndef = get_server(L)->getWritableNodeDefManager(); + EmergeManager *emerge = get_server(L)->getEmergeManager(); + + enum OreType oretype = (OreType)getenumfield(L, index, + "ore_type", es_OreType, ORE_SCATTER); + Ore *ore = createOre(oretype); + + ore->ore_name = getstringfield_default(L, index, "ore", ""); + ore->wherein_name = getstringfield_default(L, index, "wherein", ""); + ore->clust_scarcity = getintfield_default(L, index, "clust_scarcity", 0); + ore->clust_num_ores = getintfield_default(L, index, "clust_num_ores", 0); + ore->clust_size = getintfield_default(L, index, "clust_size", 0); + ore->height_min = getintfield_default(L, index, "height_min", 0); + ore->height_max = getintfield_default(L, index, "height_max", 0); + ore->nthresh = getfloatfield_default(L, index, "noise_threshhold", 0.); + + lua_getfield(L, index, "noise_params"); + ore->np = read_noiseparams(L, -1); + lua_pop(L, 1); + + ore->noise = NULL; + + emerge->ores.push_back(ore); + + verbosestream << "register_ore: ore '" << ore->ore_name + << "' registered" << std::endl; + return 0; +} + // setting_set(name, value) static int l_setting_set(lua_State *L) @@ -1060,6 +1101,7 @@ static const struct luaL_Reg minetest_f [] = { {"register_craft", l_register_craft}, {"register_biome", l_register_biome}, {"register_biome_groups", l_register_biome_groups}, + {"register_ore", l_register_ore}, {"setting_set", l_setting_set}, {"setting_get", l_setting_get}, {"setting_getbool", l_setting_getbool}, diff --git a/src/scriptapi_noise.cpp b/src/scriptapi_noise.cpp index 1dd6ef8e0..2c1a83c4c 100644 --- a/src/scriptapi_noise.cpp +++ b/src/scriptapi_noise.cpp @@ -269,6 +269,7 @@ NoiseParams *read_noiseparams(lua_State *L, int index) np->scale = getfloatfield_default(L, index, "scale", 0.0); lua_getfield(L, index, "spread"); np->spread = read_v3f(L, -1); + lua_pop(L, 1); np->seed = getintfield_default(L, index, "seed", 0); np->octaves = getintfield_default(L, index, "octaves", 0); np->persist = getfloatfield_default(L, index, "persist", 0.0); @@ -276,6 +277,7 @@ NoiseParams *read_noiseparams(lua_State *L, int index) return np; } + /* LuaPseudoRandom */ diff --git a/src/server.cpp b/src/server.cpp index 644f89349..db05b95cc 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -653,7 +653,6 @@ Server::Server( m_craftdef(createCraftDefManager()), m_event(new EventManager()), m_thread(this), - //m_emergethread(this), m_time_of_day_send_timer(0), m_uptime(0), m_shutdown_requested(false), @@ -698,7 +697,10 @@ Server::Server( // Create biome definition manager m_biomedef = new BiomeDefManager(this); - + + // Create emerge manager + m_emerge = new EmergeManager(this, m_biomedef); + // Create rollback manager std::string rollback_path = m_path_world+DIR_DELIM+"rollback.txt"; m_rollback = createRollbackManager(rollback_path, this); @@ -814,9 +816,6 @@ Server::Server( // Add default biomes after nodedef had its aliases added m_biomedef->addDefaultBiomes(); - // Create emerge manager - m_emerge = new EmergeManager(this, m_biomedef); - // Initialize Environment ServerMap *servermap = new ServerMap(path_world, this, m_emerge); m_env = new ServerEnvironment(servermap, m_lua, this, this); -- cgit v1.2.3