コード例 #1
0
ファイル: house.cpp プロジェクト: 081421/otxserver
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;
}
コード例 #2
0
ファイル: house.cpp プロジェクト: OMARTINEZ210/server
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;
}