/* * Copyright (C) 2004-2015 L2J Server * * This file is part of L2J Server. * * L2J Server 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. * * L2J Server 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.l2jserver.gameserver.model.entity.clanhall; import java.sql.Connection; import java.sql.PreparedStatement; import java.util.Calendar; import java.util.logging.Level; import com.l2jserver.L2DatabaseFactory; import com.l2jserver.gameserver.enums.SiegeClanType; import com.l2jserver.gameserver.model.L2Clan; import com.l2jserver.gameserver.model.L2SiegeClan; import com.l2jserver.gameserver.model.StatsSet; import com.l2jserver.gameserver.model.actor.instance.L2DoorInstance; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.model.entity.ClanHall; import com.l2jserver.gameserver.model.zone.type.L2SiegableHallZone; import com.l2jserver.gameserver.model.zone.type.L2SiegeZone; import com.l2jserver.gameserver.network.serverpackets.SiegeInfo; /** * @author BiggBoss */ public final class SiegableHall extends ClanHall { private static final String SQL_SAVE = "UPDATE siegable_clanhall SET ownerId=?, nextSiege=? WHERE clanHallId=?"; private Calendar _nextSiege; private final long _siegeLength; private final int[] _scheduleConfig = { 7, 0, 0, 12, 0 }; private SiegeStatus _status = SiegeStatus.REGISTERING; private L2SiegeZone _siegeZone; private ClanHallSiegeEngine _siege; public SiegableHall(StatsSet set) { super(set); _siegeLength = set.getLong("siegeLenght"); String[] rawSchConfig = set.getString("scheduleConfig").split(";"); if (rawSchConfig.length == 5) { for (int i = 0; i < 5; i++) { try { _scheduleConfig[i] = Integer.parseInt(rawSchConfig[i]); } catch (Exception e) { _log.warning("SiegableHall - " + getName() + ": Wrong schedule_config parameters!"); } } } else { _log.warning(getName() + ": Wrong schedule_config value in siegable_halls table, using default (7 days)"); } _nextSiege = Calendar.getInstance(); long nextSiege = set.getLong("nextSiege"); if ((nextSiege - System.currentTimeMillis()) < 0) { updateNextSiege(); } else { _nextSiege.setTimeInMillis(nextSiege); } } public void spawnDoor() { spawnDoor(false); } public void spawnDoor(boolean isDoorWeak) { for (L2DoorInstance door : getDoors()) { if (door.isDead()) { door.doRevive(); if (isDoorWeak) { door.setCurrentHp(door.getMaxHp() / 2); } else { door.setCurrentHp(door.getMaxHp()); } } if (door.getOpen()) { door.closeMe(); } } } @Override public final void updateDb() { try (Connection con = L2DatabaseFactory.getInstance().getConnection(); PreparedStatement statement = con.prepareStatement(SQL_SAVE)) { statement.setInt(1, getOwnerId()); statement.setLong(2, getNextSiegeTime()); statement.setInt(3, getId()); statement.execute(); } catch (Exception e) { _log.log(Level.WARNING, "Exception: SiegableHall.updateDb(): " + e.getMessage(), e); } } public final void setSiege(final ClanHallSiegeEngine siegable) { _siege = siegable; _siegeZone.setSiegeInstance(siegable); } public final ClanHallSiegeEngine getSiege() { return _siege; } public final Calendar getSiegeDate() { return _nextSiege; } public final long getNextSiegeTime() { return _nextSiege.getTimeInMillis(); } public long getSiegeLenght() { return _siegeLength; } public final void setNextSiegeDate(long date) { _nextSiege.setTimeInMillis(date); } public final void setNextSiegeDate(final Calendar c) { _nextSiege = c; } public final void updateNextSiege() { Calendar c = Calendar.getInstance(); c.add(Calendar.DAY_OF_YEAR, _scheduleConfig[0]); c.add(Calendar.MONTH, _scheduleConfig[1]); c.add(Calendar.YEAR, _scheduleConfig[2]); c.set(Calendar.HOUR_OF_DAY, _scheduleConfig[3]); c.set(Calendar.MINUTE, _scheduleConfig[4]); c.set(Calendar.SECOND, 0); setNextSiegeDate(c); updateDb(); } public final void addAttacker(final L2Clan clan) { if (getSiege() != null) { getSiege().getAttackers().put(clan.getId(), new L2SiegeClan(clan.getId(), SiegeClanType.ATTACKER)); } } public final void removeAttacker(final L2Clan clan) { if (getSiege() != null) { getSiege().getAttackers().remove(clan.getId()); } } public final boolean isRegistered(L2Clan clan) { if (getSiege() == null) { return false; } return getSiege().checkIsAttacker(clan); } public SiegeStatus getSiegeStatus() { return _status; } public final boolean isRegistering() { return _status == SiegeStatus.REGISTERING; } public final boolean isInSiege() { return _status == SiegeStatus.RUNNING; } public final boolean isWaitingBattle() { return _status == SiegeStatus.WAITING_BATTLE; } public final void updateSiegeStatus(SiegeStatus status) { _status = status; } public final L2SiegeZone getSiegeZone() { return _siegeZone; } public final void setSiegeZone(L2SiegeZone zone) { _siegeZone = zone; } public final void updateSiegeZone(boolean active) { _siegeZone.setIsActive(active); } public final void showSiegeInfo(L2PcInstance player) { player.sendPacket(new SiegeInfo(this)); } @Override public final boolean isSiegableHall() { return true; } @Override public L2SiegableHallZone getZone() { return (L2SiegableHallZone) super.getZone(); } }