diff options
author | Tiger Wang <ziwei.tiger@hotmail.co.uk> | 2014-08-01 23:15:14 +0200 |
---|---|---|
committer | Tiger Wang <ziwei.tiger@hotmail.co.uk> | 2014-08-01 23:15:34 +0200 |
commit | b5c0a4aa3ac904a7db1ee23e92a73dad6e1d4ade (patch) | |
tree | a84a4290d55961e83cf6f557d6a99c645e27f924 | |
parent | Improved endermen code a little (diff) | |
download | cuberite-b5c0a4aa3ac904a7db1ee23e92a73dad6e1d4ade.tar cuberite-b5c0a4aa3ac904a7db1ee23e92a73dad6e1d4ade.tar.gz cuberite-b5c0a4aa3ac904a7db1ee23e92a73dad6e1d4ade.tar.bz2 cuberite-b5c0a4aa3ac904a7db1ee23e92a73dad6e1d4ade.tar.lz cuberite-b5c0a4aa3ac904a7db1ee23e92a73dad6e1d4ade.tar.xz cuberite-b5c0a4aa3ac904a7db1ee23e92a73dad6e1d4ade.tar.zst cuberite-b5c0a4aa3ac904a7db1ee23e92a73dad6e1d4ade.zip |
-rw-r--r-- | src/World.cpp | 40 |
1 files changed, 33 insertions, 7 deletions
diff --git a/src/World.cpp b/src/World.cpp index 865ddfcc6..d2213d1e5 100644 --- a/src/World.cpp +++ b/src/World.cpp @@ -578,8 +578,7 @@ void cWorld::Start(void) m_VillagersShouldHarvestCrops = IniFile.GetValueSetB("Monsters", "VillagersShouldHarvestCrops", true); int GameMode = IniFile.GetValueSetI("General", "Gamemode", (int)m_GameMode); int Weather = IniFile.GetValueSetI("General", "Weather", (int)m_Weather); - m_TimeOfDay = IniFile.GetValueSetI("General", "TimeInTicks", m_TimeOfDay); - + if (GetDimension() == dimOverworld) { m_NetherWorldName = IniFile.GetValueSet("LinkedWorlds", "NetherWorldName", GetName() + "_nether"); @@ -597,6 +596,7 @@ void cWorld::Start(void) InitialiseGeneratorDefaults(IniFile); InitialiseAndLoadMobSpawningValues(IniFile); + SetTimeOfDay(IniFile.GetValueSetI("General", "TimeInTicks", m_TimeOfDay)); m_ChunkMap = new cChunkMap(this); @@ -3153,21 +3153,47 @@ int cWorld::CreateProjectile(double a_PosX, double a_PosY, double a_PosZ, cProje void cWorld::TabCompleteUserName(const AString & a_Text, AStringVector & a_Results) { + typedef std::pair<AString::size_type, AString> pair_t; + size_t LastSpace = a_Text.find_last_of(" "); // Find the position of the last space + AString LastWord = a_Text.substr(LastSpace + 1, a_Text.length()); // Find the last word + + if (LastWord.empty()) + { + return; + } + + std::vector<pair_t> UsernamesByWeight; + cCSLock Lock(m_CSPlayers); for (cPlayerList::iterator itr = m_Players.begin(), end = m_Players.end(); itr != end; ++itr) { - size_t LastSpace = a_Text.find_last_of(" "); // Find the position of the last space - - AString LastWord = a_Text.substr(LastSpace + 1, a_Text.length()); // Find the last word AString PlayerName ((*itr)->GetName()); - size_t Found = PlayerName.find(LastWord); // Try to find last word in playername + AString::size_type Found = PlayerName.find(LastWord); // Try to find last word in playername if (Found == AString::npos) { continue; // No match } - a_Results.push_back(PlayerName); // Match! + UsernamesByWeight.push_back(std::make_pair(Found, PlayerName)); // Match! Store it with the position of the match as a weight + } + Lock.Unlock(); + + std::sort(UsernamesByWeight.begin(), UsernamesByWeight.end()); // Sort lexicographically (by the first value, then second), so higher weights (usernames with match closer to start) come first (#1274) + + /* TODO: Uncomment once migrated to C++11 + std::transform( + UsernamesByWeight.begin(), + UsernamesByWeight.end(), + std::back_inserter(a_Results), + [](const pair_t & p) { return p.first; } + ); + */ + + a_Results.reserve(UsernamesByWeight.size()); + for (std::vector<pair_t>::const_iterator itr = UsernamesByWeight.begin(); itr != UsernamesByWeight.end(); ++itr) + { + a_Results.push_back(itr->second); } } |