X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Fserver.cpp;h=9e1db6c61f16fbf8ee1edd8ffad24bf24a717e48;hb=c7c03ad7a60b77040d0dfc360a79f065e0c2c971;hp=653441b54213b0233938bd544e79f3b7b4e6b9a8;hpb=05d93c7fa1be9245dd5211b7dc1bdf0961b39eea;p=dragonfireclient.git diff --git a/src/server.cpp b/src/server.cpp index 653441b54..9e1db6c61 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -253,7 +253,10 @@ Server::Server( m_nodedef->updateAliases(m_itemdef); // Apply texture overrides from texturepack/override.txt - for (const auto &path : fs::GetRecursiveDirs(g_settings->get("texture_path"))) + std::vector paths; + fs::GetRecursiveDirs(paths, g_settings->get("texture_path")); + fs::GetRecursiveDirs(paths, m_gamespec.path + DIR_DELIM + "textures"); + for (const std::string &path : paths) m_nodedef->applyTextureOverrides(path + DIR_DELIM + "override.txt"); m_nodedef->setNodeRegistrationStatus(true); @@ -306,7 +309,7 @@ Server::Server( Server::~Server() { - infostream<<"Server destructing"<on_shutdown(); - infostream << "Server: Saving players" << std::endl; m_env->saveLoadedPlayers(); @@ -333,6 +333,20 @@ Server::~Server() } m_env->kickAllPlayers(SERVER_ACCESSDENIED_SHUTDOWN, kick_msg, reconnect); + } + + // Do this before stopping the server in case mapgen callbacks need to access + // server-controlled resources (like ModStorages). Also do them before + // shutdown callbacks since they may modify state that is finalized in a + // callback. + m_emerge->stopThreads(); + + { + MutexAutoLock envlock(m_env_mutex); + + // Execute script shutdown hooks + infostream << "Executing shutdown hooks" << std::endl; + m_script->on_shutdown(); infostream << "Server: Saving environment metadata" << std::endl; m_env->saveMeta(); @@ -342,10 +356,6 @@ Server::~Server() stop(); delete m_thread; - // stop all emerge threads before deleting players that may have - // requested blocks to be emerged - m_emerge->stopThreads(); - // Delete things in the reverse order of creation delete m_emerge; delete m_env; @@ -357,7 +367,7 @@ Server::~Server() delete m_craftdef; // Deinitialize scripting - infostream<<"Server: Deinitializing scripting"< dirlist = fs::GetDirListing(mediapath); @@ -2649,6 +2656,9 @@ void Server::DeleteClient(session_t peer_id, ClientDeletionReason reason) ++i; } + // clear formspec info so the next client can't abuse the current state + m_formspec_state_data.erase(peer_id); + RemotePlayer *player = m_env->getPlayer(peer_id); /* Run scripts and remove from environment */ @@ -3074,11 +3084,6 @@ bool Server::hudSetHotbarItemcount(RemotePlayer *player, s32 hotbar_itemcount) return true; } -s32 Server::hudGetHotbarItemcount(RemotePlayer *player) const -{ - return player->getHotbarItemcount(); -} - void Server::hudSetHotbarImage(RemotePlayer *player, std::string name) { if (!player) @@ -3088,13 +3093,6 @@ void Server::hudSetHotbarImage(RemotePlayer *player, std::string name) SendHUDSetParam(player->getPeerId(), HUD_PARAM_HOTBAR_IMAGE, name); } -std::string Server::hudGetHotbarImage(RemotePlayer *player) -{ - if (!player) - return ""; - return player->getHotbarImage(); -} - void Server::hudSetHotbarSelectedImage(RemotePlayer *player, std::string name) { if (!player) @@ -3104,64 +3102,41 @@ void Server::hudSetHotbarSelectedImage(RemotePlayer *player, std::string name) SendHUDSetParam(player->getPeerId(), HUD_PARAM_HOTBAR_SELECTED_IMAGE, name); } -const std::string& Server::hudGetHotbarSelectedImage(RemotePlayer *player) const -{ - return player->getHotbarSelectedImage(); -} - Address Server::getPeerAddress(session_t peer_id) { return m_con->GetPeerAddress(peer_id); } -bool Server::setLocalPlayerAnimations(RemotePlayer *player, +void Server::setLocalPlayerAnimations(RemotePlayer *player, v2s32 animation_frames[4], f32 frame_speed) { - if (!player) - return false; - + sanity_check(player); player->setLocalAnimations(animation_frames, frame_speed); SendLocalPlayerAnimations(player->getPeerId(), animation_frames, frame_speed); - return true; } -bool Server::setPlayerEyeOffset(RemotePlayer *player, v3f first, v3f third) +void Server::setPlayerEyeOffset(RemotePlayer *player, const v3f &first, const v3f &third) { - if (!player) - return false; - + sanity_check(player); player->eye_offset_first = first; player->eye_offset_third = third; SendEyeOffset(player->getPeerId(), first, third); - return true; } -bool Server::setSky(RemotePlayer *player, const video::SColor &bgcolor, +void Server::setSky(RemotePlayer *player, const video::SColor &bgcolor, const std::string &type, const std::vector ¶ms, bool &clouds) { - if (!player) - return false; - + sanity_check(player); player->setSky(bgcolor, type, params, clouds); SendSetSky(player->getPeerId(), bgcolor, type, params, clouds); - return true; } -bool Server::setClouds(RemotePlayer *player, float density, - const video::SColor &color_bright, - const video::SColor &color_ambient, - float height, - float thickness, - const v2f &speed) +void Server::setClouds(RemotePlayer *player, const CloudParams ¶ms) { - if (!player) - return false; - - SendCloudParams(player->getPeerId(), density, - color_bright, color_ambient, height, - thickness, speed); - return true; + sanity_check(player); + player->setCloudParams(params); + SendCloudParams(player->getPeerId(), params); } bool Server::overrideDayNightRatio(RemotePlayer *player, bool do_override, @@ -3330,7 +3305,7 @@ IItemDefManager *Server::getItemDefManager() return m_itemdef; } -INodeDefManager *Server::getNodeDefManager() +const NodeDefManager *Server::getNodeDefManager() { return m_nodedef; } @@ -3355,7 +3330,7 @@ IWritableItemDefManager *Server::getWritableItemDefManager() return m_itemdef; } -IWritableNodeDefManager *Server::getWritableNodeDefManager() +NodeDefManager *Server::getWritableNodeDefManager() { return m_nodedef; }