/* * 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 silentium.gameserver.instancemanager; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.ArrayList; import java.util.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import silentium.commons.database.DatabaseFactory; import silentium.gameserver.model.L2Clan; import silentium.gameserver.model.L2ClanMember; import silentium.gameserver.model.L2ItemInstance; import silentium.gameserver.model.L2Object; import silentium.gameserver.model.actor.instance.L2PcInstance; import silentium.gameserver.model.entity.Castle; import silentium.gameserver.model.entity.sevensigns.SevenSigns; public class CastleManager { protected static final Logger _log = LoggerFactory.getLogger(CastleManager.class.getName()); public static final CastleManager getInstance() { return SingletonHolder._instance; } private List<Castle> _castles; private static final int _castleCirclets[] = { 0, 6838, 6835, 6839, 6837, 6840, 6834, 6836, 8182, 8183 }; protected CastleManager() { } public final int findNearestCastleIndex(L2Object obj) { int index = getCastleIndex(obj); if (index < 0) { double closestDistance = 99999999; double distance; Castle castle; for (int i = 0; i < _castles.size(); i++) { castle = _castles.get(i); if (castle == null) continue; distance = castle.getDistance(obj); if (closestDistance > distance) { closestDistance = distance; index = i; } } } return index; } public final void load() { _castles = new ArrayList<>(); try (Connection con = DatabaseFactory.getConnection()) { PreparedStatement statement = con.prepareStatement("SELECT id FROM castle ORDER BY id"); ResultSet rs = statement.executeQuery(); while (rs.next()) _castles.add(new Castle(rs.getInt("id"))); statement.close(); _log.info("CastleManager: Loaded " + _castles.size() + " castles."); } catch (Exception e) { _log.warn("Exception: loadCastleData(): " + e.getMessage(), e); } } public final Castle getCastleById(int castleId) { for (Castle temp : _castles) { if (temp.getCastleId() == castleId) return temp; } return null; } public final Castle getCastleByOwner(L2Clan clan) { for (Castle temp : _castles) { if (temp.getOwnerId() == clan.getClanId()) return temp; } return null; } public final Castle getCastle(String name) { for (Castle temp : _castles) { if (temp.getName().equalsIgnoreCase(name.trim())) return temp; } return null; } public final Castle getCastle(int x, int y, int z) { for (Castle temp : _castles) { if (temp.checkIfInZone(x, y, z)) return temp; } return null; } public final Castle getCastle(L2Object activeObject) { return getCastle(activeObject.getX(), activeObject.getY(), activeObject.getZ()); } public final int getCastleIndex(int castleId) { Castle castle; for (int i = 0; i < _castles.size(); i++) { castle = _castles.get(i); if (castle != null && castle.getCastleId() == castleId) return i; } return -1; } public final int getCastleIndex(L2Object activeObject) { return getCastleIndex(activeObject.getX(), activeObject.getY(), activeObject.getZ()); } public final int getCastleIndex(int x, int y, int z) { Castle castle; for (int i = 0; i < _castles.size(); i++) { castle = _castles.get(i); if (castle != null && castle.checkIfInZone(x, y, z)) return i; } return -1; } public final List<Castle> getCastles() { return _castles; } public final void validateTaxes(int sealStrifeOwner) { int maxTax; switch (sealStrifeOwner) { case SevenSigns.CABAL_DUSK: maxTax = 5; break; case SevenSigns.CABAL_DAWN: maxTax = 25; break; default: // no owner maxTax = 15; break; } for (Castle castle : _castles) if (castle.getTaxPercent() > maxTax) castle.setTaxPercent(maxTax); } int _castleId = 1; // from this castle public int getCirclet() { return getCircletByCastleId(_castleId); } public int getCircletByCastleId(int castleId) { if (castleId > 0 && castleId < 10) return _castleCirclets[castleId]; return 0; } // remove this castle's circlets from the clan public void removeCirclet(L2Clan clan, int castleId) { for (L2ClanMember member : clan.getMembers()) removeCircletsAndCrown(member, castleId); } public void removeCircletsAndCrown(L2ClanMember member, int castleId) { if (member == null) return; L2PcInstance player = member.getPlayerInstance(); int circletId = getCircletByCastleId(castleId); // online player actions if (player != null) { // Circlets removal for all members L2ItemInstance circlet = player.getInventory().getItemByItemId(circletId); if (circlet != null) { if (circlet.isEquipped()) player.getInventory().unEquipItemInSlot(circlet.getLocationSlot()); player.destroyItemByItemId("CastleCircletRemoval", circletId, 1, player, true); } // If the actual checked player is the clan leader, check for crown if (player.isClanLeader()) { L2ItemInstance crown = player.getInventory().getItemByItemId(6841); if (crown != null) { if (crown.isEquipped()) player.getInventory().unEquipItemInSlot(crown.getLocationSlot()); player.destroyItemByItemId("CastleCrownRemoval", 6841, 1, player, true); } } return; } // offline player actions ; remove all circlets / crowns try (Connection con = DatabaseFactory.getConnection()) { PreparedStatement statement = con.prepareStatement("DELETE FROM items WHERE owner_id = ? AND item_id IN (?, 6841)"); statement.setInt(1, member.getObjectId()); statement.setInt(2, circletId); statement.execute(); statement.close(); } catch (Exception e) { _log.warn("Failed to remove castle circlets && crowns for offline player " + member.getName() + ": " + e.getMessage(), e); } } private static class SingletonHolder { protected static final CastleManager _instance = new CastleManager(); } }