• There is NO official Otland's Discord server and NO official Otland's server list. The Otland's Staff does not manage any Discord server or server list. Moderators or administrator of any Discord server or server lists have NO connection to the Otland's Staff. Do not get scammed!
  • 2026 staff recruitment is open! Check it out and consider applying!

Unable to save house items.

Nothxbye

Banned User
Joined
Jan 22, 2012
Messages
1,124
Reaction score
174
Wywala mi błąd w funkcji doSaveHouse(houseId) >> "LuaScriptInterface::luaDoSaveHouse(). Unable to save house items, ID: 606"
Wiecie może o co chodzi? Oto skrypty:

luascript.cpp
Code:
int32_t LuaScriptInterface::luaDoSaveHouse(lua_State* L)
{
	//doSaveHouse(houseID)
	
	House* house = Houses::getInstance().getHouse(popNumber(L));
	if(!house)
	{
        reportErrorFunc(getErrorDesc(LUA_ERROR_HOUSE_NOT_FOUND));
		lua_pushboolean(L, false);
		return 1;
	}

	Database* db = Database::instance();
	DBTransaction trans(db);
	
	if(!trans.begin())
    	{
    		lua_pushboolean(L, false);
    		return 1;
    	}

    if(!IOMapSerialize::getInstance()->saveHouse(db, house))
		{
			std::stringstream s;
			s << "Unable to save house information, ID: " << house->getHouseId();
			reportErrorFunc(s.str());
		}

	if(!IOMapSerialize::getInstance()->saveHouseItems(db, house))
		{
			std::stringstream s;
			s << "Unable to save house items, ID: " << house->getHouseId();
			reportErrorFunc(s.str());
		}

	lua_pushboolean(L, trans.commit());
	return 1;
}

iomapserialize.cpp/saveHouseItems
Code:
bool IOMapSerialize::saveHouseItems(Database* db, House* house)
{
         std::string config = asLowerCaseString(g_config.getString(ConfigManager::HOUSE_STORAGE));
         if(config == "binary-tilebased")
         {
                 DBQuery query;
                 query << "DELETE FROM `map_store` WHERE `house_id` = " << house->getHouseId()
                         << " AND `world_id` = " << g_config.getNumber(ConfigManager::WORLD_ID);
                 if(!db->executeQuery(query.str()))
                         return false;

                 DBInsert stmt(db);
                 stmt.setQuery("INSERT INTO `map_store` (`house_id`, `world_id`, `data`) VALUES ");
                 return saveHouseBinaryTileBased(db, stmt, house) && stmt.execute();
         }
         else if(config == "binary")
         {
                 DBQuery query;
                 query << "DELETE FROM `map_store` WHERE `house_id` = "<< house->getHouseId()
                         << " AND `world_id` = " << g_config.getNumber(ConfigManager::WORLD_ID);
                 if(!db->executeQuery(query.str()))
                         return false;

                 DBInsert stmt(db);
                 stmt.setQuery("INSERT INTO `map_store` (`house_id`, `world_id`, `data`) VALUES ");
                 return saveHouseBinary(db, stmt, house) && stmt.execute();
         }

         DBQuery query;
         query << "DELETE FROM `tile_items` WHERE `tile_id` IN (SELECT `id` FROM `houses` WHERE `id` = "
                 << house->getHouseId() << " AND `world_id` = " << g_config.getNumber(ConfigManager::WORLD_ID)
                 << ") AND `world_id` = " << g_config.getNumber(ConfigManager::WORLD_ID);
         if(!db->executeQuery(query.str()))
                 return false;

         query.str("");
         query << "DELETE FROM `tiles` WHERE `house_id` = " << house->getHouseId()
                 << " AND `world_id` = " << g_config.getNumber(ConfigManager::WORLD_ID);
         if(!db->executeQuery(query.str()))
                 return false;

         query.str("");
         query << "SELECT `id` FROM `tiles` WHERE `world_id` = " << g_config.getNumber(ConfigManager::WORLD_ID) << " ORDER BY `id` DESC LIMIT 1;";

         DBResult* result;
         if(!(result = db->storeQuery(query.str())))
                 return false;

         uint32_t tileId = result->getDataInt("id") + 1;
         db->freeResult(result);
         return saveHouseRelational(db, house, tileId);
}

iomapserialize.cpp/saveHouseBinary

Code:
bool IOMapSerialize::saveHouseBinary(Database* db, DBInsert& stmt, House* house)
{
         PropWriteStream stream;
         for(HouseTileList::iterator tit = house->getHouseTileBegin(); tit != house->getHouseTileEnd(); ++tit)
         {
                 if(!saveTile(stream, *tit))
                         continue;
         }

         uint32_t attributesSize = 0;
         const char* attributes = stream.getStream(attributesSize);
         if(!attributesSize)
                 return true;

         DBQuery query;
         query << house->getHouseId() << ", " << g_config.getNumber(ConfigManager::WORLD_ID)
                 << ", " << db->escapeBlob(attributes, attributesSize);
         return stmt.addRow(query);
}

iomapserialize.cpp/saveHouseBinaryTileBased

Code:
bool IOMapSerialize::saveHouseBinaryTileBased(Database* db, DBInsert& stmt, House* house)
{
         for(HouseTileList::iterator tit = house->getHouseTileBegin(); tit != house->getHouseTileEnd(); ++tit)
         {
                 PropWriteStream stream;
                 if(!saveTile(stream, *tit))
                         continue;

                 uint32_t attributesSize = 0;
                 const char* attributes = stream.getStream(attributesSize);
                 if(!attributesSize)
                         continue;

                 DBQuery query;
                 query << house->getHouseId() << ", " << g_config.getNumber(ConfigManager::WORLD_ID)
                         << ", " << db->escapeBlob(attributes, attributesSize);
                 if(!stmt.addRow(query))
                         return false;
         }

         return true;
}

iomapserialize.cpp/saveHouseRelational
Code:
bool IOMapSerialize::saveHouseRelational(Database* db, House* house, uint32_t& tileId)
{
         for(HouseTileList::iterator tit = house->getHouseTileBegin(); tit != house->getHouseTileEnd(); ++tit)
                 saveItems(db, tileId, house->getHouseId(), (*tit));

         return true;
}
 
Jakim sposobem zapisuje ci przedmioty z domku? Jaki tryb masz ustawiony w pliku kofiguracyjnym?
 
Jakim sposobem zapisuje ci przedmioty z domku? Jaki tryb masz ustawiony w pliku kofiguracyjnym?

houseDataStorage = "binary" wywaliłem bo nie mogłem tego utawić ciągle wywalalo mi "useHouseDataStorage must be = no/false";"
worldId mam ustawione na 0

Dodam, że powyzsze funkcje wkompilowalem w otserv z tfsa
 
Back
Top