bool Houses::payHouse(House* house, time_t _time, uint32_t bid) { if(rentPeriod == RENTPERIOD_NEVER || !house->getOwner() || house->getPaidUntil() > _time || !house->getRent()) return true; Town* town = Towns::getInstance()->getTown(house->getTownId()); if(!town) return false; uint32_t owner = house->getOwner(); if(house->isGuild() && !IOGuild::getInstance()->swapGuildIdToOwner(owner)) { house->setOwnerEx(0, true); return false; } std::string name; if(!IOLoginData::getInstance()->getNameByGuid(owner, name)) { house->setOwnerEx(0, true); return false; } Player* player = g_game.getPlayerByNameEx(name); if(!player) return false; if(!player->isPremium() && g_config.getBool(ConfigManager::HOUSE_NEED_PREMIUM)) { house->setOwnerEx(0, true); if(player->isVirtual()) delete player; return false; } int32_t loginClean = g_config.getNumber(ConfigManager::HOUSE_CLEAN_OLD); if(loginClean && _time >= (player->getLastLogin() + loginClean)) { house->setOwnerEx(0, true); if(player->isVirtual()) delete player; return false; } if(payRent(player, house, bid, _time) || _time < (house->getLastWarning() + 86400)) { if(player->isVirtual()) { IOLoginData::getInstance()->savePlayer(player); delete player; } return true; } uint32_t warningsLimit = 7; switch(rentPeriod) { case RENTPERIOD_DAILY: warningsLimit = 1; break; case RENTPERIOD_WEEKLY: warningsLimit = 3; break; case RENTPERIOD_YEARLY: warningsLimit = 14; break; default: break; } uint32_t warnings = house->getRentWarnings(); if(warnings >= warningsLimit) { house->setOwnerEx(0, true); if(player->isVirtual()) delete player; return false; } if(Item* letter = Item::CreateItem(ITEM_LETTER_STAMPED)) { if(g_game.internalAddItem(NULL, player->getInbox(), letter, INDEX_WHEREEVER, FLAG_NOLIMIT) == RET_NOERROR) { letter->setWriter(g_config.getString(ConfigManager::SERVER_NAME)); letter->setDate(std::time(NULL)); std::stringstream s; s << "Warning!\nThe "; switch(rentPeriod) { case RENTPERIOD_DAILY: s << "daily"; break; case RENTPERIOD_WEEKLY: s << "weekly"; break; case RENTPERIOD_MONTHLY: s << "monthly"; break; case RENTPERIOD_YEARLY: s << "annual"; break; default: break; } s << " rent of " << house->getRent() << " gold for your " << (house->isGuild() ? "guild hall" : "house") << " \"" << house->getName() << "\" has to be paid. Have it within " << (warningsLimit - warnings) << " days or you will lose your " << (house->isGuild() ? "guild hall" : "house") << "."; letter->setText(s.str().c_str()); if(player->isVirtual()) IOLoginData::getInstance()->savePlayer(player); } else g_game.freeThing(letter); } house->setLastWarning(_time); house->setRentWarnings(++warnings); if(player->isVirtual()) delete player; return false; }
bool Houses::payHouse(House* house, time_t time) { if(rentPeriod == RENTPERIOD_NEVER){ return true; } if(house->getRent() == 0 || house->getPaidUntil() > time || house->getHouseOwner() == 0){ return true; } 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 return false; } std::string name; if(!IOPlayer::instance()->getNameByGuid(ownerid, name)){ //player doesnt exist, remove it as house owner? //house->setHouseOwner(0); return false; } Player* player = g_game.getPlayerByNameEx(name); if(!player){ return false; } // savePlayerHere is an ugly hack // to avoid saving 2 times a not online player // when items are transferred to his depot bool savePlayerHere = true; bool hasPaidRent = payRent(player, house, time); if(!hasPaidRent && time >= house->getLastWarning() + 24 * 60 * 60){ if(house->getPayRentWarnings() >= 7){ house->setHouseOwner(0); // setHouseOwner will load the player, // transfer house items to his depot and then // will save it, so here should not be saved // again savePlayerHere = false; } else{ Depot* depot = player->getDepot(town->getTownID(), true); if(depot){ int 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; case RENTPERIOD_NEVER: // break; } std::stringstream warningText; warningText << "Warning! \n" << "The " << period << " rent of " << house->getRent() << " gold for your house \"" << house->getName() << "\" is payable. Have it available within " << daysLeft << " days, or you will lose this house."; letter->setText(warningText.str()); g_game.internalAddItem(NULL, depot, letter, INDEX_WHEREEVER); house->setPayRentWarnings(house->getPayRentWarnings() + 1); house->setLastWarning(time); } } } if(player->isOffline()){ if(savePlayerHere){ IOPlayer::instance()->savePlayer(player); } delete player; } return hasPaidRent; }