Já disse que não é possível.
int32_t LuaInterface::luaDoSaveServer(lua_State* L)
{
//doSaveServer([shallow = false])
bool shallow = false;
if(lua_gettop(L) > 0)
shallow = popBoolean(L);
Dispatcher::getInstance().addTask(createTask(boost::bind(&Game::saveGameState, &g_game, shallow)));
lua_pushnil(L);
return 1;
}
Agora uma olha no Game:saveGameState
void Game::saveGameState(bool shallow)
{
std::clog << "> Saving server..." << std::endl;
uint64_t start = OTSYS_TIME();
if(gameState == GAMESTATE_NORMAL)
setGameState(GAMESTATE_MAINTAIN);
IOLoginData* io = IOLoginData::getInstance();
for(AutoList<Player>::iterator it = Player::autoList.begin(); it != Player::autoList.end(); ++it)
{
it->second->loginPosition = it->second->getPosition();
io->savePlayer(it->second, false, shallow);
}
map->saveMap();
ScriptEnviroment::saveGameState();
if(gameState == GAMESTATE_MAINTAIN)
setGameState(GAMESTATE_NORMAL);
std::clog << "> SAVE: Complete in " << (OTSYS_TIME() - start) / (1000.) << " seconds using "
<< asLowerCaseString(g_config.getString(ConfigManager::HOUSE_STORAGE))
<< " house storage." << std::endl;
}
Mas se você acredita em milagres, só dividir esse for em vários.
for(AutoList<Player>::iterator it = Player::autoList.begin(); it != Player::autoList.end(); ++it)
{
it->second->loginPosition = it->second->getPosition();
io->savePlayer(it->second, false, shallow);
}
Mas dando uma olhada melhor, dá para separar em save de jogadores e save de mapa, que acho que já ajuda um pouco.
Abraços.