196 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
			
		
		
	
	
			196 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
| /*
 | |
|  * This file is part of the L2J Mobius project.
 | |
|  * 
 | |
|  * This program is free software: you can redistribute it and/or modify
 | |
|  * it under the terms of the GNU General Public License as published by
 | |
|  * the Free Software Foundation, either version 3 of the License, or
 | |
|  * (at your option) any later version.
 | |
|  * 
 | |
|  * This program is distributed in the hope that it will be useful,
 | |
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 | |
|  * General Public License for more details.
 | |
|  * 
 | |
|  * You should have received a copy of the GNU General Public License
 | |
|  * along with this program. If not, see <http://www.gnu.org/licenses/>.
 | |
|  */
 | |
| package com.l2jmobius.gameserver.model.clanhallauction;
 | |
| 
 | |
| import java.sql.Connection;
 | |
| import java.sql.PreparedStatement;
 | |
| import java.sql.ResultSet;
 | |
| import java.sql.SQLException;
 | |
| import java.util.Collections;
 | |
| import java.util.Comparator;
 | |
| import java.util.Map;
 | |
| import java.util.Optional;
 | |
| import java.util.concurrent.ConcurrentHashMap;
 | |
| import java.util.concurrent.TimeUnit;
 | |
| import java.util.logging.Level;
 | |
| import java.util.logging.Logger;
 | |
| 
 | |
| import com.l2jmobius.commons.database.DatabaseFactory;
 | |
| import com.l2jmobius.gameserver.data.sql.impl.ClanTable;
 | |
| import com.l2jmobius.gameserver.data.xml.impl.ClanHallData;
 | |
| import com.l2jmobius.gameserver.instancemanager.ClanHallAuctionManager;
 | |
| import com.l2jmobius.gameserver.model.L2Clan;
 | |
| import com.l2jmobius.gameserver.model.entity.ClanHall;
 | |
| import com.l2jmobius.gameserver.model.itemcontainer.Inventory;
 | |
| 
 | |
| /**
 | |
|  * @author Sdw
 | |
|  */
 | |
| public class ClanHallAuction
 | |
| {
 | |
| 	private static final Logger LOGGER = Logger.getLogger(ClanHallAuction.class.getName());
 | |
| 	
 | |
| 	private final int _clanHallId;
 | |
| 	private static final String LOAD_CLANHALL_BIDDERS = "SELECT * FROM clanhall_auctions_bidders WHERE clanHallId=?";
 | |
| 	private static final String DELETE_CLANHALL_BIDDERS = "DELETE TABLE clanhall_auctions_bidders WHERE clanHallId=?";
 | |
| 	private static final String INSERT_CLANHALL_BIDDER = "REPLACE INTO clanhall_auctions_bidders (clanHallId, clanId, bid, bidTime) VALUES (?,?,?,?)";
 | |
| 	private static final String DELETE_CLANHALL_BIDDER = "DELETE FROM clanhall_auctions_bidders WHERE clanId=?";
 | |
| 	
 | |
| 	public ClanHallAuction(int clanHallId)
 | |
| 	{
 | |
| 		_clanHallId = clanHallId;
 | |
| 		loadBidder();
 | |
| 	}
 | |
| 	
 | |
| 	private final void loadBidder()
 | |
| 	{
 | |
| 		try (Connection con = DatabaseFactory.getInstance().getConnection();
 | |
| 			PreparedStatement ps = con.prepareStatement(LOAD_CLANHALL_BIDDERS))
 | |
| 		{
 | |
| 			ps.setInt(1, _clanHallId);
 | |
| 			try (ResultSet rs = ps.executeQuery())
 | |
| 			{
 | |
| 				while (rs.next())
 | |
| 				{
 | |
| 					final L2Clan clan = ClanTable.getInstance().getClan(rs.getInt("clanId"));
 | |
| 					addBid(clan, rs.getLong("bid"), rs.getLong("bidTime"));
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 		catch (SQLException e)
 | |
| 		{
 | |
| 			LOGGER.log(Level.WARNING, "Failed loading clan hall auctions bidder for clan hall " + _clanHallId + ".", e);
 | |
| 		}
 | |
| 	}
 | |
| 	
 | |
| 	private volatile Map<Integer, Bidder> _bidders;
 | |
| 	
 | |
| 	public Map<Integer, Bidder> getBids()
 | |
| 	{
 | |
| 		return _bidders == null ? Collections.emptyMap() : _bidders;
 | |
| 	}
 | |
| 	
 | |
| 	public void addBid(L2Clan clan, long bid)
 | |
| 	{
 | |
| 		addBid(clan, bid, System.currentTimeMillis());
 | |
| 	}
 | |
| 	
 | |
| 	public void addBid(L2Clan clan, long bid, long bidTime)
 | |
| 	{
 | |
| 		if (_bidders == null)
 | |
| 		{
 | |
| 			synchronized (this)
 | |
| 			{
 | |
| 				if (_bidders == null)
 | |
| 				{
 | |
| 					_bidders = new ConcurrentHashMap<>();
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 		
 | |
| 		try (Connection con = DatabaseFactory.getInstance().getConnection();
 | |
| 			PreparedStatement ps = con.prepareStatement(INSERT_CLANHALL_BIDDER))
 | |
| 		{
 | |
| 			ps.setInt(1, _clanHallId);
 | |
| 			ps.setInt(2, clan.getId());
 | |
| 			ps.setLong(3, bid);
 | |
| 			ps.setLong(4, bidTime);
 | |
| 			ps.execute();
 | |
| 			_bidders.put(clan.getId(), new Bidder(clan, bid, bidTime));
 | |
| 		}
 | |
| 		catch (SQLException e)
 | |
| 		{
 | |
| 			LOGGER.log(Level.WARNING, "Failed insert clan hall auctions bidder " + clan.getName() + " for clan hall " + _clanHallId + ".", e);
 | |
| 		}
 | |
| 	}
 | |
| 	
 | |
| 	public void removeBid(L2Clan clan)
 | |
| 	{
 | |
| 		getBids().remove(clan.getId());
 | |
| 		try (Connection con = DatabaseFactory.getInstance().getConnection();
 | |
| 			PreparedStatement ps = con.prepareStatement(DELETE_CLANHALL_BIDDER))
 | |
| 		{
 | |
| 			ps.setInt(1, clan.getId());
 | |
| 			ps.execute();
 | |
| 		}
 | |
| 		catch (Exception e)
 | |
| 		{
 | |
| 			LOGGER.log(Level.SEVERE, "Failed clearing bidder " + clan.getName() + " for clan hall " + _clanHallId + ": ", e);
 | |
| 		}
 | |
| 	}
 | |
| 	
 | |
| 	public long getHighestBid()
 | |
| 	{
 | |
| 		final ClanHall clanHall = ClanHallData.getInstance().getClanHallById(_clanHallId);
 | |
| 		return getBids().values().stream().mapToLong(Bidder::getBid).max().orElse(clanHall.getMinBid());
 | |
| 	}
 | |
| 	
 | |
| 	public long getClanBid(L2Clan clan)
 | |
| 	{
 | |
| 		return getBids().get(clan.getId()).getBid();
 | |
| 	}
 | |
| 	
 | |
| 	public Optional<Bidder> getHighestBidder()
 | |
| 	{
 | |
| 		return getBids().values().stream().sorted(Comparator.comparingLong(Bidder::getBid).reversed()).findFirst();
 | |
| 	}
 | |
| 	
 | |
| 	public int getBidCount()
 | |
| 	{
 | |
| 		return getBids().values().size();
 | |
| 	}
 | |
| 	
 | |
| 	public void returnAdenas(Bidder bidder)
 | |
| 	{
 | |
| 		bidder.getClan().getWarehouse().addItem("Clan Hall Auction Outbid", Inventory.ADENA_ID, bidder.getBid(), null, null);
 | |
| 	}
 | |
| 	
 | |
| 	public void finalizeAuctions()
 | |
| 	{
 | |
| 		final Optional<Bidder> potentialHighestBidder = getHighestBidder();
 | |
| 		
 | |
| 		if (potentialHighestBidder.isPresent())
 | |
| 		{
 | |
| 			final Bidder highestBidder = potentialHighestBidder.get();
 | |
| 			final ClanHall clanHall = ClanHallData.getInstance().getClanHallById(_clanHallId);
 | |
| 			clanHall.setOwner(highestBidder.getClan());
 | |
| 			getBids().clear();
 | |
| 			
 | |
| 			try (Connection con = DatabaseFactory.getInstance().getConnection();
 | |
| 				PreparedStatement ps = con.prepareStatement(DELETE_CLANHALL_BIDDERS))
 | |
| 			{
 | |
| 				ps.setInt(1, _clanHallId);
 | |
| 				ps.execute();
 | |
| 			}
 | |
| 			catch (Exception e)
 | |
| 			{
 | |
| 				LOGGER.log(Level.SEVERE, "Failed clearing bidder for clan hall " + _clanHallId + ": ", e);
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| 	
 | |
| 	public int getClanHallId()
 | |
| 	{
 | |
| 		return _clanHallId;
 | |
| 	}
 | |
| 	
 | |
| 	public long getRemaingTime()
 | |
| 	{
 | |
| 		return ClanHallAuctionManager.getInstance().getScheduler("endAuction").getRemainingTime(TimeUnit.MILLISECONDS);
 | |
| 	}
 | |
| }
 | 
