bool IOMapSerialize::loadMapRelational(Map* map) { Database* db = Database::getInstance(); DBQuery query; //lock mutex! House* house = NULL; for(HouseMap::iterator it = Houses::getInstance()->getHouseBegin(); it != Houses::getInstance()->getHouseEnd(); ++it) { if(!(house = it->second)) continue; query.str(""); query << "SELECT * FROM `tiles` WHERE `house_id` = " << house->getId() << " AND `world_id` = " << g_config.getNumber(ConfigManager::WORLD_ID); if(DBResult* result = db->storeQuery(query.str())) { do { query.str(""); query << "SELECT * FROM `tile_items` WHERE `tile_id` = " << result->getDataInt("id") << " AND `world_id` = " << g_config.getNumber(ConfigManager::WORLD_ID) << " ORDER BY `sid` DESC"; if(DBResult* itemsResult = db->storeQuery(query.str())) { if(house->hasPendingTransfer()) { if(Player* player = g_game.getPlayerByGuidEx(house->getOwner())) { loadItems(itemsResult, player->getInbox(), true); if(player->isVirtual()) { IOLoginData::getInstance()->savePlayer(player); delete player; } } } else { Position pos(result->getDataInt("x"), result->getDataInt("y"), result->getDataInt("z")); if(Tile* tile = map->getTile(pos)) loadItems(itemsResult, tile, false); else std::clog << "[Error - IOMapSerialize::loadMapRelational] Unserialization" << " of invalid tile at position "<< pos << std::endl; } itemsResult->free(); } } while(result->next()); result->free(); } else //backward compatibility { for(HouseTileList::iterator it = house->getHouseTileBegin(); it != house->getHouseTileEnd(); ++it) { query.str(""); query << "SELECT `id` FROM `tiles` WHERE `x` = " << (*it)->getPosition().x << " AND `y` = " << (*it)->getPosition().y << " AND `z` = " << (*it)->getPosition().z << " AND `world_id` = " << g_config.getNumber(ConfigManager::WORLD_ID) << " LIMIT 1"; if(DBResult* result = db->storeQuery(query.str())) { query.str(""); query << "SELECT * FROM `tile_items` WHERE `tile_id` = " << result->getDataInt("id") << " AND `world_id` = " << g_config.getNumber(ConfigManager::WORLD_ID) << " ORDER BY `sid` DESC"; if(DBResult* itemsResult = db->storeQuery(query.str())) { if(house->hasPendingTransfer()) { if(Player* player = g_game.getPlayerByGuidEx(house->getOwner())) { loadItems(itemsResult, player->getInbox(), true); if(player->isVirtual()) { IOLoginData::getInstance()->savePlayer(player); delete player; } } } else loadItems(itemsResult, (*it), false); itemsResult->free(); } result->free(); } } } } return true; }
bool Houses::payHouses() { if(rentPeriod == RENTPERIOD_NEVER) return true; uint32_t currentTime = time(NULL); for(HouseMap::iterator it = houseMap.begin(); it != houseMap.end(); ++it) { House* house = it->second; if(house->getHouseOwner() != 0) { uint32_t ownerid = house->getHouseOwner(); Town* town = Towns::getInstance().getTown(house->getTownId()); if(!town) { #ifdef __DEBUG_HOUSES__ std::cout << "Warning: [Houses::payHouses] town = NULL, townid = " << house->getTownId() << ", houseid = " << house->getHouseId() << std::endl; #endif continue; } std::string name; if(!IOLoginData::getInstance()->getNameByGuid(ownerid, name)) { //player doesnt exist, remove it as house owner? house->setHouseOwner(0); continue; } Player* player = g_game.getPlayerByName(name); if(!player) { player = new Player(name, NULL); if(!IOLoginData::getInstance()->loadPlayer(player, name)) { #ifdef __DEBUG__ std::cout << "Failure: [Houses::payHouses], can not load player: " << name << std::endl; #endif delete player; continue; } } int32_t housePrice = 0; for(HouseTileList::iterator it = house->getHouseTileBegin(), end = house->getHouseTileEnd(); it != end; ++it) housePrice += g_config.getNumber(ConfigManager::HOUSE_PRICE); bool paid = false; if(player->getBankBalance() >= house->getRent()) { player->setBankBalance(player->getBankBalance() - house->getRent()); paid = true; } if(paid) { time_t paidUntil = currentTime; switch(rentPeriod) { case RENTPERIOD_DAILY: paidUntil += 24 * 60 * 60; break; case RENTPERIOD_WEEKLY: paidUntil += 24 * 60 * 60 * 7; break; case RENTPERIOD_MONTHLY: paidUntil += 24 * 60 * 60 * 30; break; case RENTPERIOD_YEARLY: paidUntil += 24 * 60 * 60 * 365; break; default: break; } house->setPaidUntil(paidUntil); } else { if(house->getPayRentWarnings() < 7) { int32_t daysLeft = 7 - house->getPayRentWarnings(); Item* letter = Item::CreateItem(ITEM_LETTER_STAMPED); std::string period = ""; switch(rentPeriod) { case RENTPERIOD_DAILY: period = "daily"; break; case RENTPERIOD_WEEKLY: period = "weekly"; break; case RENTPERIOD_MONTHLY: period = "monthly"; break; case RENTPERIOD_YEARLY: period = "annual"; break; default: break; } std::ostringstream ss; ss << "Warning! \nThe " << period << " rent of " << house->getRent() << " gold for your house \"" << house->getName() << "\" is payable. Have it within " << daysLeft << " days or you will lose this house."; letter->setText(ss.str()); g_game.internalAddItem(player->getInbox(), letter, INDEX_WHEREEVER, FLAG_NOLIMIT); house->setPayRentWarnings(house->getPayRentWarnings() + 1); } else house->setHouseOwner(0); } if(player->isOffline()) { IOLoginData::getInstance()->savePlayer(player); delete player; } } } return true; }