Package lineage2.gameserver.model.pledge

Source Code of lineage2.gameserver.model.pledge.Clan$ClanReputationComparator

/*
* 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 lineage2.gameserver.model.pledge;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
import lineage2.commons.collections.JoinedIterator;
import lineage2.commons.dbutils.DbUtils;
import lineage2.gameserver.Config;
import lineage2.gameserver.cache.CrestCache;
import lineage2.gameserver.cache.Msg;
import lineage2.gameserver.data.xml.holder.ResidenceHolder;
import lineage2.gameserver.database.DatabaseFactory;
import lineage2.gameserver.database.mysql;
import lineage2.gameserver.model.Effect;
import lineage2.gameserver.model.Player;
import lineage2.gameserver.model.Skill;
import lineage2.gameserver.model.entity.boat.ClanAirShip;
import lineage2.gameserver.model.entity.residence.Castle;
import lineage2.gameserver.model.entity.residence.Fortress;
import lineage2.gameserver.model.entity.residence.ResidenceType;
import lineage2.gameserver.model.items.ClanWarehouse;
import lineage2.gameserver.model.items.ItemInstance;
import lineage2.gameserver.network.serverpackets.L2GameServerPacket;
import lineage2.gameserver.network.serverpackets.PledgeReceiveSubPledgeCreated;
import lineage2.gameserver.network.serverpackets.PledgeShowInfoUpdate;
import lineage2.gameserver.network.serverpackets.PledgeShowMemberListAll;
import lineage2.gameserver.network.serverpackets.PledgeShowMemberListDeleteAll;
import lineage2.gameserver.network.serverpackets.PledgeSkillList;
import lineage2.gameserver.network.serverpackets.PledgeSkillListAdd;
import lineage2.gameserver.network.serverpackets.components.IStaticPacket;
import lineage2.gameserver.skills.effects.EffectTemplate;
import lineage2.gameserver.stats.Env;
import lineage2.gameserver.tables.ClanTable;
import lineage2.gameserver.tables.SkillTable;
import lineage2.gameserver.utils.Log;

import org.apache.commons.lang3.StringUtils;
import org.napile.primitive.maps.IntObjectMap;
import org.napile.primitive.maps.impl.CTreeIntObjectMap;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
* @author Mobius
* @version $Revision: 1.0 $
*/
public class Clan implements Iterable<UnitMember>
{
  /**
   * Field _log.
   */
  private static final Logger _log = LoggerFactory.getLogger(Clan.class);
  /**
   * Field _clanId.
   */
  private final int _clanId;
  /**
   * Field _allyId.
   */
  private int _allyId;
  /**
   * Field _level.
   */
  private int _level;
  /**
   * Field _hasCastle.
   */
  private int _hasCastle;
  /**
   * Field _hasFortress.
   */
  private int _hasFortress;
  /**
   * Field _hasHideout.
   */
  private int _hasHideout;
  /**
   * Field _crestId.
   */
  private int _crestId;
  /**
   * Field _crestLargeId.
   */
  private int _crestLargeId;
  /**
   * Field _expelledMemberTime.
   */
  private long _expelledMemberTime;
  /**
   * Field _leavedAllyTime.
   */
  private long _leavedAllyTime;
  /**
   * Field _dissolvedAllyTime.
   */
  private long _dissolvedAllyTime;
  /**
   * Field _airship.
   */
  private ClanAirShip _airship;
  /**
   * Field _airshipLicense.
   */
  private boolean _airshipLicense;
  /**
   * Field _airshipFuel.
   */
  private int _airshipFuel;
  /**
   * Field EXPELLED_MEMBER_PENALTY.
   */
  public static long EXPELLED_MEMBER_PENALTY = 24 * 60 * 60 * 1000L;
  /**
   * Field LEAVED_ALLY_PENALTY.
   */
  public static long LEAVED_ALLY_PENALTY = 24 * 60 * 60 * 1000L;
  /**
   * Field DISSOLVED_ALLY_PENALTY.
   */
  public static long DISSOLVED_ALLY_PENALTY = 24 * 60 * 60 * 1000L;
  /**
   * Field _warehouse.
   */
  private final ClanWarehouse _warehouse;
  /**
   * Field _whBonus.
   */
  private int _whBonus = -1;
  /**
   * Field _notice.
   */
  private String _notice = null;
  /**
   * Field _atWarWith.
   */
  private final List<Clan> _atWarWith = new ArrayList<>();
  /**
   * Field _underAttackFrom.
   */
  private final List<Clan> _underAttackFrom = new ArrayList<>();
  /**
   * Field _skills.
   */
  protected IntObjectMap<Skill> _skills = new CTreeIntObjectMap<>();
  /**
   * Field _privs.
   */
  protected IntObjectMap<RankPrivs> _privs = new CTreeIntObjectMap<>();
  /**
   * Field _subUnits.
   */
  protected IntObjectMap<SubUnit> _subUnits = new CTreeIntObjectMap<>();
  /**
   * Field _clanLeaderSkill.
   */
  static Skill _clanLeaderSkill = SkillTable.getInstance().getInfo(19009, 1);
  /**
   * Field _reputation.
   */
  private int _reputation = 0;
  /**
   * Field CP_NOTHING. (value is 0)
   */
  public static final int CP_NOTHING = 0;
  /**
   * Field CP_CL_INVITE_CLAN. (value is 2)
   */
  public static final int CP_CL_INVITE_CLAN = 2;
  /**
   * Field CP_CL_MANAGE_TITLES. (value is 4)
   */
  public static final int CP_CL_MANAGE_TITLES = 4;
  /**
   * Field CP_CL_WAREHOUSE_SEARCH. (value is 8)
   */
  public static final int CP_CL_WAREHOUSE_SEARCH = 8;
  /**
   * Field CP_CL_MANAGE_RANKS. (value is 16)
   */
  public static final int CP_CL_MANAGE_RANKS = 16;
  /**
   * Field CP_CL_CLAN_WAR. (value is 32)
   */
  public static final int CP_CL_CLAN_WAR = 32;
  /**
   * Field CP_CL_DISMISS. (value is 64)
   */
  public static final int CP_CL_DISMISS = 64;
  /**
   * Field CP_CL_EDIT_CREST. (value is 128)
   */
  public static final int CP_CL_EDIT_CREST = 128;
  /**
   * Field CP_CL_APPRENTICE. (value is 256)
   */
  public static final int CP_CL_APPRENTICE = 256;
  /**
   * Field CP_CL_TROOPS_FAME. (value is 512)
   */
  public static final int CP_CL_TROOPS_FAME = 512;
  /**
   * Field CP_CL_SUMMON_AIRSHIP. (value is 1024)
   */
  public static final int CP_CL_SUMMON_AIRSHIP = 1024;
  /**
   * Field CP_CH_ENTRY_EXIT. (value is 2048)
   */
  public static final int CP_CH_ENTRY_EXIT = 2048;
  /**
   * Field CP_CH_USE_FUNCTIONS. (value is 4096)
   */
  public static final int CP_CH_USE_FUNCTIONS = 4096;
  /**
   * Field CP_CH_AUCTION. (value is 8192)
   */
  public static final int CP_CH_AUCTION = 8192;
  /**
   * Field CP_CH_DISMISS. (value is 16384)
   */
  public static final int CP_CH_DISMISS = 16384;
  /**
   * Field CP_CH_SET_FUNCTIONS. (value is 32768)
   */
  public static final int CP_CH_SET_FUNCTIONS = 32768;
  /**
   * Field CP_CS_ENTRY_EXIT. (value is 65536)
   */
  public static final int CP_CS_ENTRY_EXIT = 65536;
  /**
   * Field CP_CS_MANOR_ADMIN. (value is 131072)
   */
  public static final int CP_CS_MANOR_ADMIN = 131072;
  /**
   * Field CP_CS_MANAGE_SIEGE. (value is 262144)
   */
  public static final int CP_CS_MANAGE_SIEGE = 262144;
  /**
   * Field CP_CS_USE_FUNCTIONS. (value is 524288)
   */
  public static final int CP_CS_USE_FUNCTIONS = 524288;
  /**
   * Field CP_CS_DISMISS. (value is 1048576)
   */
  public static final int CP_CS_DISMISS = 1048576;
  /**
   * Field CP_CS_TAXES. (value is 2097152)
   */
  public static final int CP_CS_TAXES = 2097152;
  /**
   * Field CP_CS_MERCENARIES. (value is 4194304)
   */
  public static final int CP_CS_MERCENARIES = 4194304;
  /**
   * Field CP_CS_SET_FUNCTIONS. (value is 8388606)
   */
  public static final int CP_CS_SET_FUNCTIONS = 8388606;
  /**
   * Field CP_ALL. (value is 16777214)
   */
  public static final int CP_ALL = 16777214;
  /**
   * Field RANK_FIRST. (value is 1)
   */
  public static final int RANK_FIRST = 1;
  /**
   * Field RANK_LAST. (value is 9)
   */
  public static final int RANK_LAST = 9;
  /**
   * Field SUBUNIT_NONE.
   */
  public static final int SUBUNIT_NONE = Byte.MIN_VALUE;
  /**
   * Field SUBUNIT_ACADEMY. (value is -1)
   */
  public static final int SUBUNIT_ACADEMY = -1;
  /**
   * Field SUBUNIT_MAIN_CLAN. (value is 0)
   */
  public static final int SUBUNIT_MAIN_CLAN = 0;
  /**
   * Field SUBUNIT_ROYAL1. (value is 100)
   */
  public static final int SUBUNIT_ROYAL1 = 100;
  /**
   * Field SUBUNIT_ROYAL2. (value is 200)
   */
  public static final int SUBUNIT_ROYAL2 = 200;
  /**
   * Field SUBUNIT_KNIGHT1. (value is 1001)
   */
  public static final int SUBUNIT_KNIGHT1 = 1001;
  /**
   * Field SUBUNIT_KNIGHT2. (value is 1002)
   */
  public static final int SUBUNIT_KNIGHT2 = 1002;
  /**
   * Field SUBUNIT_KNIGHT3. (value is 2001)
   */
  public static final int SUBUNIT_KNIGHT3 = 2001;
  /**
   * Field SUBUNIT_KNIGHT4. (value is 2002)
   */
  public static final int SUBUNIT_KNIGHT4 = 2002;
  /**
   * Field REPUTATION_COMPARATOR.
   */
  private final static ClanReputationComparator REPUTATION_COMPARATOR = new ClanReputationComparator();
  /**
   * Field REPUTATION_PLACES. (value is 100)
   */
  private final static int REPUTATION_PLACES = 100;
 
  /**
   * Constructor for Clan.
   * @param clanId int
   */
  public Clan(int clanId)
  {
    _clanId = clanId;
    InitializePrivs();
    _warehouse = new ClanWarehouse(this);
    _warehouse.restore();
  }
 
  /**
   * Method getClanId.
   * @return int
   */
  public int getClanId()
  {
    return _clanId;
  }
 
  /**
   * Method getLeaderId.
   * @return int
   */
  public int getLeaderId()
  {
    return getLeaderId(SUBUNIT_MAIN_CLAN);
  }
 
  /**
   * Method getLeader.
   * @return UnitMember
   */
  public UnitMember getLeader()
  {
    return getLeader(SUBUNIT_MAIN_CLAN);
  }
 
  /**
   * Method getLeaderName.
   * @return String
   */
  public String getLeaderName()
  {
    return getLeaderName(SUBUNIT_MAIN_CLAN);
  }
 
  /**
   * Method getName.
   * @return String
   */
  public String getName()
  {
    return getUnitName(SUBUNIT_MAIN_CLAN);
  }
 
  /**
   * Method getAnyMember.
   * @param id int
   * @return UnitMember
   */
  public UnitMember getAnyMember(int id)
  {
    for (SubUnit unit : getAllSubUnits())
    {
      UnitMember m = unit.getUnitMember(id);
      if (m != null)
      {
        return m;
      }
    }
    return null;
  }
 
  /**
   * Method getAnyMember.
   * @param name String
   * @return UnitMember
   */
  public UnitMember getAnyMember(String name)
  {
    for (SubUnit unit : getAllSubUnits())
    {
      UnitMember m = unit.getUnitMember(name);
      if (m != null)
      {
        return m;
      }
    }
    return null;
  }
 
  /**
   * Method getAllSize.
   * @return int
   */
  public int getAllSize()
  {
    int size = 0;
    for (SubUnit unit : getAllSubUnits())
    {
      size += unit.size();
    }
    return size;
  }
 
  /**
   * Method getUnitName.
   * @param unitType int
   * @return String
   */
  public String getUnitName(int unitType)
  {
    if ((unitType == SUBUNIT_NONE) || !_subUnits.containsKey(unitType))
    {
      return StringUtils.EMPTY;
    }
    return getSubUnit(unitType).getName();
  }
 
  /**
   * Method getLeaderName.
   * @param unitType int
   * @return String
   */
  public String getLeaderName(int unitType)
  {
    if ((unitType == SUBUNIT_NONE) || !_subUnits.containsKey(unitType))
    {
      return StringUtils.EMPTY;
    }
    return getSubUnit(unitType).getLeaderName();
  }
 
  /**
   * Method getLeaderId.
   * @param unitType int
   * @return int
   */
  public int getLeaderId(int unitType)
  {
    if ((unitType == SUBUNIT_NONE) || !_subUnits.containsKey(unitType))
    {
      return 0;
    }
    return getSubUnit(unitType).getLeaderObjectId();
  }
 
  /**
   * Method getLeader.
   * @param unitType int
   * @return UnitMember
   */
  public UnitMember getLeader(int unitType)
  {
    if ((unitType == SUBUNIT_NONE) || !_subUnits.containsKey(unitType))
    {
      return null;
    }
    return getSubUnit(unitType).getLeader();
  }
 
  /**
   * Method flush.
   */
  public void flush()
  {
    for (UnitMember member : this)
    {
      removeClanMember(member.getObjectId());
    }
    _warehouse.writeLock();
    try
    {
      for (ItemInstance item : _warehouse.getItems())
      {
        _warehouse.destroyItem(item);
      }
    }
    finally
    {
      _warehouse.writeUnlock();
    }
    if (_hasCastle != 0)
    {
      ResidenceHolder.getInstance().getResidence(Castle.class, _hasCastle).changeOwner(null);
    }
    if (_hasFortress != 0)
    {
      ResidenceHolder.getInstance().getResidence(Fortress.class, _hasFortress).changeOwner(null);
    }
  }
 
  /**
   * Method removeClanMember.
   * @param id int
   */
  public void removeClanMember(int id)
  {
    if (id == getLeaderId(SUBUNIT_MAIN_CLAN))
    {
      return;
    }
    for (SubUnit unit : getAllSubUnits())
    {
      if (unit.isUnitMember(id))
      {
        removeClanMember(unit.getType(), id);
        break;
      }
    }
  }
 
  /**
   * Method removeClanMember.
   * @param subUnitId int
   * @param objectId int
   */
  public void removeClanMember(int subUnitId, int objectId)
  {
    SubUnit subUnit = getSubUnit(subUnitId);
    if (subUnit == null)
    {
      return;
    }
    subUnit.removeUnitMember(objectId);
  }
 
  /**
   * Method getAllMembers.
   * @return List<UnitMember>
   */
  public List<UnitMember> getAllMembers()
  {
    Collection<SubUnit> units = getAllSubUnits();
    int size = 0;
    for (SubUnit unit : units)
    {
      size += unit.size();
    }
    List<UnitMember> members = new ArrayList<>(size);
    for (SubUnit unit : units)
    {
      members.addAll(unit.getUnitMembers());
    }
    return members;
  }
 
  /**
   * Method getOnlineMembers.
   * @param exclude int
   * @return List<Player>
   */
  public List<Player> getOnlineMembers(int exclude)
  {
    final List<Player> result = new ArrayList<>(getAllSize() - 1);
    for (final UnitMember temp : this)
    {
      if ((temp != null) && temp.isOnline() && (temp.getObjectId() != exclude))
      {
        result.add(temp.getPlayer());
      }
    }
    return result;
  }
 
  /**
   * Method getAllyId.
   * @return int
   */
  public int getAllyId()
  {
    return _allyId;
  }
 
  /**
   * Method getLevel.
   * @return int
   */
  public int getLevel()
  {
    return _level;
  }
 
  /**
   * Method getCastle.
   * @return int
   */
  public int getCastle()
  {
    return _hasCastle;
  }
 
  /**
   * Method getHasFortress.
   * @return int
   */
  public int getHasFortress()
  {
    return _hasFortress;
  }
 
  /**
   * Method getHasHideout.
   * @return int
   */
  public int getHasHideout()
  {
    return _hasHideout;
  }
 
  /**
   * Method getResidenceId.
   * @param r ResidenceType
   * @return int
   */
  public int getResidenceId(ResidenceType r)
  {
    switch (r)
    {
      case Castle:
        return _hasCastle;
      case Fortress:
        return _hasFortress;
      case ClanHall:
        return _hasHideout;
      default:
        return 0;
    }
  }
 
  /**
   * Method setAllyId.
   * @param allyId int
   */
  public void setAllyId(int allyId)
  {
    _allyId = allyId;
  }
 
  /**
   * Method setHasCastle.
   * @param castle int
   */
  public void setHasCastle(int castle)
  {
    if (_hasFortress == 0)
    {
      _hasCastle = castle;
    }
  }
 
  /**
   * Method setHasFortress.
   * @param fortress int
   */
  public void setHasFortress(int fortress)
  {
    if (_hasCastle == 0)
    {
      _hasFortress = fortress;
    }
  }
 
  /**
   * Method setHasHideout.
   * @param hasHideout int
   */
  public void setHasHideout(int hasHideout)
  {
    _hasHideout = hasHideout;
  }
 
  /**
   * Method setLevel.
   * @param level int
   */
  public void setLevel(int level)
  {
    _level = level;
  }
 
  /**
   * Method isAnyMember.
   * @param id int
   * @return boolean
   */
  public boolean isAnyMember(int id)
  {
    for (SubUnit unit : getAllSubUnits())
    {
      if (unit.isUnitMember(id))
      {
        return true;
      }
    }
    return false;
  }
 
  /**
   * Method updateClanInDB.
   */
  public void updateClanInDB()
  {
    if (getLeaderId() == 0)
    {
      _log.warn("updateClanInDB with empty LeaderId");
      Thread.dumpStack();
      return;
    }
    if (getClanId() == 0)
    {
      _log.warn("updateClanInDB with empty ClanId");
      Thread.dumpStack();
      return;
    }
    Connection con = null;
    PreparedStatement statement = null;
    try
    {
      con = DatabaseFactory.getInstance().getConnection();
      statement = con.prepareStatement("UPDATE clan_data SET ally_id=?,reputation_score=?,expelled_member=?,leaved_ally=?,dissolved_ally=?,clan_level=?,warehouse=?,airship=? WHERE clan_id=?");
      statement.setInt(1, getAllyId());
      statement.setInt(2, getReputationScore());
      statement.setLong(3, getExpelledMemberTime() / 1000);
      statement.setLong(4, getLeavedAllyTime() / 1000);
      statement.setLong(5, getDissolvedAllyTime() / 1000);
      statement.setInt(6, _level);
      statement.setInt(7, getWhBonus());
      statement.setInt(8, isHaveAirshipLicense() ? getAirshipFuel() : -1);
      statement.setInt(9, getClanId());
      statement.execute();
    }
    catch (Exception e)
    {
      _log.warn("error while updating clan '" + getClanId() + "' data in db");
      _log.error("", e);
    }
    finally
    {
      DbUtils.closeQuietly(con, statement);
    }
  }
 
  /**
   * Method store.
   */
  public void store()
  {
    Connection con = null;
    PreparedStatement statement = null;
    try
    {
      con = DatabaseFactory.getInstance().getConnection();
      statement = con.prepareStatement("INSERT INTO clan_data (clan_id,clan_level,hasCastle,hasFortress,hasHideout,ally_id,expelled_member,leaved_ally,dissolved_ally,airship) values (?,?,?,?,?,?,?,?,?,?)");
      statement.setInt(1, _clanId);
      statement.setInt(2, _level);
      statement.setInt(3, _hasCastle);
      statement.setInt(4, _hasFortress);
      statement.setInt(5, _hasHideout);
      statement.setInt(6, _allyId);
      statement.setLong(7, getExpelledMemberTime() / 1000);
      statement.setLong(8, getLeavedAllyTime() / 1000);
      statement.setLong(9, getDissolvedAllyTime() / 1000);
      statement.setInt(10, isHaveAirshipLicense() ? getAirshipFuel() : -1);
      statement.execute();
      DbUtils.close(statement);
      SubUnit mainSubUnit = _subUnits.get(SUBUNIT_MAIN_CLAN);
      statement = con.prepareStatement("INSERT INTO clan_subpledges (clan_id, type, leader_id, name) VALUES (?,?,?,?)");
      statement.setInt(1, _clanId);
      statement.setInt(2, mainSubUnit.getType());
      statement.setInt(3, mainSubUnit.getLeaderObjectId());
      statement.setString(4, mainSubUnit.getName());
      statement.execute();
      DbUtils.close(statement);
      statement = con.prepareStatement("UPDATE characters SET clanid=?,pledge_type=? WHERE obj_Id=?");
      statement.setInt(1, getClanId());
      statement.setInt(2, mainSubUnit.getType());
      statement.setInt(3, getLeaderId());
      statement.execute();
    }
    catch (Exception e)
    {
      _log.warn("Exception: " + e, e);
    }
    finally
    {
      DbUtils.closeQuietly(con, statement);
    }
  }
 
  /**
   * Method restore.
   * @param clanId int
   * @return Clan
   */
  public static Clan restore(int clanId)
  {
    if (clanId == 0)
    {
      return null;
    }
    Clan clan = null;
    Connection con1 = null;
    PreparedStatement statement1 = null;
    ResultSet clanData = null;
    try
    {
      con1 = DatabaseFactory.getInstance().getConnection();
      statement1 = con1.prepareStatement("SELECT clan_level,hasCastle,hasFortress,hasHideout,ally_id,reputation_score,expelled_member,leaved_ally,dissolved_ally,warehouse,airship FROM clan_data where clan_id=?");
      statement1.setInt(1, clanId);
      clanData = statement1.executeQuery();
      if (clanData.next())
      {
        clan = new Clan(clanId);
        clan.setLevel(clanData.getInt("clan_level"));
        clan.setHasCastle(clanData.getInt("hasCastle"));
        clan.setHasFortress(clanData.getInt("hasFortress"));
        clan.setHasHideout(clanData.getInt("hasHideout"));
        clan.setAllyId(clanData.getInt("ally_id"));
        clan._reputation = clanData.getInt("reputation_score");
        clan.setExpelledMemberTime(clanData.getLong("expelled_member") * 1000L);
        clan.setLeavedAllyTime(clanData.getLong("leaved_ally") * 1000L);
        clan.setDissolvedAllyTime(clanData.getLong("dissolved_ally") * 1000L);
        clan.setWhBonus(clanData.getInt("warehouse"));
        clan.setAirshipLicense(clanData.getInt("airship") != -1);
        if (clan.isHaveAirshipLicense())
        {
          clan.setAirshipFuel(clanData.getInt("airship"));
        }
      }
      else
      {
        _log.warn("Clan " + clanId + " doesnt exists!");
        return null;
      }
    }
    catch (Exception e)
    {
      _log.error("Error while restoring clan!", e);
    }
    finally
    {
      DbUtils.closeQuietly(con1, statement1, clanData);
    }
    if (clan == null)
    {
      _log.warn("Clan " + clanId + " does't exist");
      return null;
    }
    clan.restoreSkills();
    clan.restoreSubPledges();
    for (SubUnit unit : clan.getAllSubUnits())
    {
      unit.restore();
      unit.restoreSkills();
    }
    clan.restoreRankPrivs();
    clan.setCrestId(CrestCache.getInstance().getPledgeCrestId(clanId));
    clan.setCrestLargeId(CrestCache.getInstance().getPledgeCrestLargeId(clanId));
    return clan;
  }
 
  /**
   * Method broadcastToOnlineMembers.
   * @param packets IStaticPacket[]
   */
  public void broadcastToOnlineMembers(IStaticPacket... packets)
  {
    for (UnitMember member : this)
    {
      if (member.isOnline())
      {
        member.getPlayer().sendPacket(packets);
      }
    }
  }
 
  /**
   * Method broadcastToOnlineMembers.
   * @param packets L2GameServerPacket[]
   */
  public void broadcastToOnlineMembers(L2GameServerPacket... packets)
  {
    for (UnitMember member : this)
    {
      if (member.isOnline())
      {
        member.getPlayer().sendPacket(packets);
      }
    }
  }
 
  /**
   * Method broadcastToOtherOnlineMembers.
   * @param packet L2GameServerPacket
   * @param player Player
   */
  public void broadcastToOtherOnlineMembers(L2GameServerPacket packet, Player player)
  {
    for (UnitMember member : this)
    {
      if (member.isOnline() && (member.getPlayer() != player))
      {
        member.getPlayer().sendPacket(packet);
      }
    }
  }
 
  /**
   * Method toString.
   * @return String
   */
  @Override
  public String toString()
  {
    return getName();
  }
 
  /**
   * Method setCrestId.
   * @param newcrest int
   */
  public void setCrestId(int newcrest)
  {
    _crestId = newcrest;
  }
 
  /**
   * Method getCrestId.
   * @return int
   */
  public int getCrestId()
  {
    return _crestId;
  }
 
  /**
   * Method hasCrest.
   * @return boolean
   */
  public boolean hasCrest()
  {
    return _crestId > 0;
  }
 
  /**
   * Method getCrestLargeId.
   * @return int
   */
  public int getCrestLargeId()
  {
    return _crestLargeId;
  }
 
  /**
   * Method setCrestLargeId.
   * @param newcrest int
   */
  public void setCrestLargeId(int newcrest)
  {
    _crestLargeId = newcrest;
  }
 
  /**
   * Method hasCrestLarge.
   * @return boolean
   */
  public boolean hasCrestLarge()
  {
    return _crestLargeId > 0;
  }
 
  /**
   * Method getAdenaCount.
   * @return long
   */
  public long getAdenaCount()
  {
    return _warehouse.getCountOfAdena();
  }
 
  /**
   * Method getWarehouse.
   * @return ClanWarehouse
   */
  public ClanWarehouse getWarehouse()
  {
    return _warehouse;
  }
 
  /**
   * Method isAtWar.
   * @return int
   */
  public int isAtWar()
  {
    if ((_atWarWith != null) && !_atWarWith.isEmpty())
    {
      return 1;
    }
    return 0;
  }
 
  /**
   * Method isAtWarOrUnderAttack.
   * @return int
   */
  public int isAtWarOrUnderAttack()
  {
    if (((_atWarWith != null) && !_atWarWith.isEmpty()) || ((_underAttackFrom != null) && !_underAttackFrom.isEmpty()))
    {
      return 1;
    }
    return 0;
  }
 
  /**
   * Method isAtWarWith.
   * @param id int
   * @return boolean
   */
  public boolean isAtWarWith(int id)
  {
    Clan clan = ClanTable.getInstance().getClan(id);
    if ((_atWarWith != null) && !_atWarWith.isEmpty())
    {
      if (_atWarWith.contains(clan))
      {
        return true;
      }
    }
    return false;
  }
 
  /**
   * Method isUnderAttackFrom.
   * @param id int
   * @return boolean
   */
  public boolean isUnderAttackFrom(int id)
  {
    Clan clan = ClanTable.getInstance().getClan(id);
    if ((_underAttackFrom != null) && !_underAttackFrom.isEmpty())
    {
      if (_underAttackFrom.contains(clan))
      {
        return true;
      }
    }
    return false;
  }
 
  /**
   * Method setEnemyClan.
   * @param clan Clan
   */
  public void setEnemyClan(Clan clan)
  {
    _atWarWith.add(clan);
  }
 
  /**
   * Method deleteEnemyClan.
   * @param clan Clan
   */
  public void deleteEnemyClan(Clan clan)
  {
    _atWarWith.remove(clan);
  }
 
  /**
   * Method setAttackerClan.
   * @param clan Clan
   */
  public void setAttackerClan(Clan clan)
  {
    _underAttackFrom.add(clan);
  }
 
  /**
   * Method deleteAttackerClan.
   * @param clan Clan
   */
  public void deleteAttackerClan(Clan clan)
  {
    _underAttackFrom.remove(clan);
  }
 
  /**
   * Method getEnemyClans.
   * @return List<Clan>
   */
  public List<Clan> getEnemyClans()
  {
    return _atWarWith;
  }
 
  /**
   * Method getWarsCount.
   * @return int
   */
  public int getWarsCount()
  {
    return _atWarWith.size();
  }
 
  /**
   * Method getAttackerClans.
   * @return List<Clan>
   */
  public List<Clan> getAttackerClans()
  {
    return _underAttackFrom;
  }
 
  /**
   * Method broadcastClanStatus.
   * @param updateList boolean
   * @param needUserInfo boolean
   * @param relation boolean
   */
  public void broadcastClanStatus(boolean updateList, boolean needUserInfo, boolean relation)
  {
    List<L2GameServerPacket> listAll = updateList ? listAll() : null;
    PledgeShowInfoUpdate update = new PledgeShowInfoUpdate(this);
    for (UnitMember member : this)
    {
      if (member.isOnline())
      {
        if (updateList)
        {
          member.getPlayer().sendPacket(PledgeShowMemberListDeleteAll.STATIC);
          member.getPlayer().sendPacket(listAll);
        }
        member.getPlayer().sendPacket(update);
        if (needUserInfo)
        {
          member.getPlayer().broadcastCharInfo();
        }
        if (relation)
        {
          member.getPlayer().broadcastRelationChanged();
        }
      }
    }
  }
 
  /**
   * Method getAlliance.
   * @return Alliance
   */
  public Alliance getAlliance()
  {
    return _allyId == 0 ? null : ClanTable.getInstance().getAlliance(_allyId);
  }
 
  /**
   * Method setExpelledMemberTime.
   * @param time long
   */
  public void setExpelledMemberTime(long time)
  {
    _expelledMemberTime = time;
  }
 
  /**
   * Method getExpelledMemberTime.
   * @return long
   */
  public long getExpelledMemberTime()
  {
    return _expelledMemberTime;
  }
 
  /**
   * Method setExpelledMember.
   */
  public void setExpelledMember()
  {
    _expelledMemberTime = System.currentTimeMillis();
    updateClanInDB();
  }
 
  /**
   * Method setLeavedAllyTime.
   * @param time long
   */
  public void setLeavedAllyTime(long time)
  {
    _leavedAllyTime = time;
  }
 
  /**
   * Method getLeavedAllyTime.
   * @return long
   */
  public long getLeavedAllyTime()
  {
    return _leavedAllyTime;
  }
 
  /**
   * Method setLeavedAlly.
   */
  public void setLeavedAlly()
  {
    _leavedAllyTime = System.currentTimeMillis();
    updateClanInDB();
  }
 
  /**
   * Method setDissolvedAllyTime.
   * @param time long
   */
  public void setDissolvedAllyTime(long time)
  {
    _dissolvedAllyTime = time;
  }
 
  /**
   * Method getDissolvedAllyTime.
   * @return long
   */
  public long getDissolvedAllyTime()
  {
    return _dissolvedAllyTime;
  }
 
  /**
   * Method setDissolvedAlly.
   */
  public void setDissolvedAlly()
  {
    _dissolvedAllyTime = System.currentTimeMillis();
    updateClanInDB();
  }
 
  /**
   * Method canInvite.
   * @return boolean
   */
  public boolean canInvite()
  {
    return (System.currentTimeMillis() - _expelledMemberTime) >= EXPELLED_MEMBER_PENALTY;
  }
 
  /**
   * Method canJoinAlly.
   * @return boolean
   */
  public boolean canJoinAlly()
  {
    return (System.currentTimeMillis() - _leavedAllyTime) >= LEAVED_ALLY_PENALTY;
  }
 
  /**
   * Method canCreateAlly.
   * @return boolean
   */
  public boolean canCreateAlly()
  {
    return (System.currentTimeMillis() - _dissolvedAllyTime) >= DISSOLVED_ALLY_PENALTY;
  }
 
  /**
   * Method getRank.
   * @return int
   */
  public int getRank()
  {
    Clan[] clans = ClanTable.getInstance().getClans();
    Arrays.sort(clans, REPUTATION_COMPARATOR);
    int place = 1;
    for (int i = 0; i < clans.length; i++)
    {
      if (i == REPUTATION_PLACES)
      {
        return 0;
      }
      Clan clan = clans[i];
      if (clan == this)
      {
        return place + i;
      }
    }
    return 0;
  }
 
  /**
   * Method getReputationScore.
   * @return int
   */
  public int getReputationScore()
  {
    return _reputation;
  }
 
  /**
   * Method setReputationScore.
   * @param rep int
   */
  private void setReputationScore(int rep)
  {
    if ((_reputation >= 0) && (rep < 0))
    {
      broadcastToOnlineMembers(Msg.SINCE_THE_CLAN_REPUTATION_SCORE_HAS_DROPPED_TO_0_OR_LOWER_YOUR_CLAN_SKILLS_WILL_BE_DE_ACTIVATED);
      for (UnitMember member : this)
      {
        if (member.isOnline() && (member.getPlayer() != null))
        {
          disableSkills(member.getPlayer());
        }
      }
    }
    else if ((_reputation < 0) && (rep >= 0))
    {
      broadcastToOnlineMembers(Msg.THE_CLAN_SKILL_WILL_BE_ACTIVATED_BECAUSE_THE_CLANS_REPUTATION_SCORE_HAS_REACHED_TO_0_OR_HIGHER);
      for (UnitMember member : this)
      {
        if (member.isOnline() && (member.getPlayer() != null))
        {
          enableSkills(member.getPlayer());
        }
      }
    }
    if (_reputation != rep)
    {
      _reputation = rep;
      broadcastToOnlineMembers(new PledgeShowInfoUpdate(this));
    }
    updateClanInDB();
  }
 
  /**
   * Method incReputation.
   * @param inc int
   * @param rate boolean
   * @param source String
   * @return int
   */
  public int incReputation(int inc, boolean rate, String source)
  {
    if (_level < 5)
    {
      return 0;
    }
    if (rate && (Math.abs(inc) <= Config.RATE_CLAN_REP_SCORE_MAX_AFFECTED))
    {
      inc = (int) Math.round(inc * Config.RATE_CLAN_REP_SCORE);
    }
    setReputationScore(_reputation + inc);
    Log.add(getName() + "|" + inc + "|" + _reputation + "|" + source, "clan_reputation");
    return inc;
  }
 
  /**
   * Method restoreSkills.
   */
  private void restoreSkills()
  {
    Connection con = null;
    PreparedStatement statement = null;
    ResultSet rset = null;
    try
    {
      con = DatabaseFactory.getInstance().getConnection();
      statement = con.prepareStatement("SELECT skill_id,skill_level FROM clan_skills WHERE clan_id=?");
      statement.setInt(1, getClanId());
      rset = statement.executeQuery();
      while (rset.next())
      {
        int id = rset.getInt("skill_id");
        int level = rset.getInt("skill_level");
        Skill skill = SkillTable.getInstance().getInfo(id, level);
        _skills.put(skill.getId(), skill);
      }
    }
    catch (Exception e)
    {
      _log.warn("Could not restore clan skills: " + e);
      _log.error("", e);
    }
    finally
    {
      DbUtils.closeQuietly(con, statement, rset);
    }
  }
 
  /**
   * Method getSkills.
   * @return Collection<Skill>
   */
  public Collection<Skill> getSkills()
  {
    return _skills.values();
  }
 
  /**
   * Method getAllSkills.
   * @return Skill[]
   */
  public final Skill[] getAllSkills()
  {
    if (_reputation < 0)
    {
      return Skill.EMPTY_ARRAY;
    }
    return _skills.values().toArray(new Skill[_skills.values().size()]);
  }
 
  /**
   * Method addSkill.
   * @param newSkill Skill
   * @param store boolean
   * @return Skill
   */
  public Skill addSkill(Skill newSkill, boolean store)
  {
    Skill oldSkill = null;
    if (newSkill != null)
    {
      oldSkill = _skills.put(newSkill.getId(), newSkill);
      if (store)
      {
        Connection con = null;
        PreparedStatement statement = null;
        try
        {
          con = DatabaseFactory.getInstance().getConnection();
          if (oldSkill != null)
          {
            statement = con.prepareStatement("UPDATE clan_skills SET skill_level=? WHERE skill_id=? AND clan_id=?");
            statement.setInt(1, newSkill.getLevel());
            statement.setInt(2, oldSkill.getId());
            statement.setInt(3, getClanId());
            statement.execute();
          }
          else
          {
            statement = con.prepareStatement("INSERT INTO clan_skills (clan_id,skill_id,skill_level) VALUES (?,?,?)");
            statement.setInt(1, getClanId());
            statement.setInt(2, newSkill.getId());
            statement.setInt(3, newSkill.getLevel());
            statement.execute();
          }
        }
        catch (Exception e)
        {
          _log.warn("Error could not store char skills: " + e);
          _log.error("", e);
        }
        finally
        {
          DbUtils.closeQuietly(con, statement);
        }
      }
      PledgeSkillListAdd p = new PledgeSkillListAdd(newSkill.getId(), newSkill.getLevel());
      PledgeSkillList p2 = new PledgeSkillList(this);
      for (UnitMember temp : this)
      {
        if (temp.isOnline())
        {
          Player player = temp.getPlayer();
          if (player != null)
          {
            addSkill(player, newSkill);
            player.sendPacket(p, p2);
            player.sendSkillList();
          }
        }
      }
    }
    return oldSkill;
  }
 
  /**
   * Method addSkillsQuietly.
   * @param player Player
   */
  public void addSkillsQuietly(Player player)
  {
    for (Skill skill : _skills.values())
    {
      addSkill(player, skill);
    }
    final SubUnit subUnit = getSubUnit(player.getPledgeType());
    if (subUnit != null)
    {
      subUnit.addSkillsQuietly(player);
    }
  }
 
  /**
   * Method enableSkills.
   * @param player Player
   */
  public void enableSkills(Player player)
  {
    if (player.isInOlympiadMode())
    {
      return;
    }
    for (Skill skill : _skills.values())
    {
      if (skill.getMinPledgeClass() <= player.getPledgeClass())
      {
        player.removeUnActiveSkill(skill);
      }
    }
    final SubUnit subUnit = getSubUnit(player.getPledgeType());
    if (subUnit != null)
    {
      subUnit.enableSkills(player);
    }
  }
 
  /**
   * Method disableSkills.
   * @param player Player
   */
  public void disableSkills(Player player)
  {
    for (Skill skill : _skills.values())
    {
      player.addUnActiveSkill(skill);
    }
    final SubUnit subUnit = getSubUnit(player.getPledgeType());
    if (subUnit != null)
    {
      subUnit.disableSkills(player);
    }
  }
 
  /**
   * Method addSkill.
   * @param player Player
   * @param skill Skill
   */
  private void addSkill(Player player, Skill skill)
  {
    if (skill.getMinPledgeClass() <= player.getPledgeClass())
    {
      player.addSkill(skill, false);
      if ((_reputation < 0) || player.isInOlympiadMode())
      {
        player.addUnActiveSkill(skill);
      }
    }
  }
 
  /**
   * Method removeSkill.
   * @param skill int
   */
  public void removeSkill(int skill)
  {
    _skills.remove(skill);
    new PledgeSkillListAdd(skill, 0);
    for (UnitMember temp : this)
    {
      Player player = temp.getPlayer();
      if ((player != null) && player.isOnline())
      {
        player.removeSkillById(skill);
        player.sendSkillList();
      }
    }
  }
 
  /**
   * Method broadcastSkillListToOnlineMembers.
   */
  public void broadcastSkillListToOnlineMembers()
  {
    for (UnitMember temp : this)
    {
      Player player = temp.getPlayer();
      if ((player != null) && player.isOnline())
      {
        player.sendPacket(new PledgeSkillList(this));
        player.sendSkillList();
      }
    }
  }
 
  /**
   * Method isAcademy.
   * @param pledgeType int
   * @return boolean
   */
  public static boolean isAcademy(int pledgeType)
  {
    return pledgeType == SUBUNIT_ACADEMY;
  }
 
  /**
   * Method isRoyalGuard.
   * @param pledgeType int
   * @return boolean
   */
  public static boolean isRoyalGuard(int pledgeType)
  {
    return (pledgeType == SUBUNIT_ROYAL1) || (pledgeType == SUBUNIT_ROYAL2);
  }
 
  /**
   * Method isOrderOfKnights.
   * @param pledgeType int
   * @return boolean
   */
  public static boolean isOrderOfKnights(int pledgeType)
  {
    return (pledgeType == SUBUNIT_KNIGHT1) || (pledgeType == SUBUNIT_KNIGHT2) || (pledgeType == SUBUNIT_KNIGHT3) || (pledgeType == SUBUNIT_KNIGHT4);
  }
 
  /**
   * Method getAffiliationRank.
   * @param pledgeType int
   * @return int
   */
  public int getAffiliationRank(int pledgeType)
  {
    if (isAcademy(pledgeType))
    {
      return 9;
    }
    else if (isOrderOfKnights(pledgeType))
    {
      return 8;
    }
    else if (isRoyalGuard(pledgeType))
    {
      return 7;
    }
    else
    {
      return 6;
    }
  }
 
  /**
   * Method getSubUnit.
   * @param pledgeType int
   * @return SubUnit
   */
  public final SubUnit getSubUnit(int pledgeType)
  {
    return _subUnits.get(pledgeType);
  }
 
  /**
   * Method addSubUnit.
   * @param sp SubUnit
   * @param updateDb boolean
   */
  public final void addSubUnit(SubUnit sp, boolean updateDb)
  {
    _subUnits.put(sp.getType(), sp);
    if (updateDb)
    {
      broadcastToOnlineMembers(new PledgeReceiveSubPledgeCreated(sp));
      Connection con = null;
      PreparedStatement statement = null;
      try
      {
        con = DatabaseFactory.getInstance().getConnection();
        statement = con.prepareStatement("INSERT INTO `clan_subpledges` (clan_id,type,leader_id,name) VALUES (?,?,?,?)");
        statement.setInt(1, getClanId());
        statement.setInt(2, sp.getType());
        statement.setInt(3, sp.getLeaderObjectId());
        statement.setString(4, sp.getName());
        statement.execute();
      }
      catch (Exception e)
      {
        _log.warn("Could not store clan Sub pledges: " + e);
        _log.error("", e);
      }
      finally
      {
        DbUtils.closeQuietly(con, statement);
      }
    }
  }
 
  /**
   * Method createSubPledge.
   * @param player Player
   * @param pledgeType int
   * @param leader UnitMember
   * @param name String
   * @return int
   */
  public int createSubPledge(Player player, int pledgeType, UnitMember leader, String name)
  {
    int temp = pledgeType;
    pledgeType = getAvailablePledgeTypes(pledgeType);
    if (pledgeType == SUBUNIT_NONE)
    {
      if (temp == SUBUNIT_ACADEMY)
      {
        player.sendPacket(Msg.YOUR_CLAN_HAS_ALREADY_ESTABLISHED_A_CLAN_ACADEMY);
      }
      else
      {
        player.sendMessage("You can't create any more sub-units of this type");
      }
      return SUBUNIT_NONE;
    }
    switch (pledgeType)
    {
      case SUBUNIT_ACADEMY:
        break;
      case SUBUNIT_ROYAL1:
      case SUBUNIT_ROYAL2:
        if (getReputationScore() < 5000)
        {
          player.sendPacket(Msg.THE_CLAN_REPUTATION_SCORE_IS_TOO_LOW);
          return SUBUNIT_NONE;
        }
        incReputation(-5000, false, "SubunitCreate");
        break;
      case SUBUNIT_KNIGHT1:
      case SUBUNIT_KNIGHT2:
      case SUBUNIT_KNIGHT3:
      case SUBUNIT_KNIGHT4:
        if (getReputationScore() < 10000)
        {
          player.sendPacket(Msg.THE_CLAN_REPUTATION_SCORE_IS_TOO_LOW);
          return SUBUNIT_NONE;
        }
        incReputation(-10000, false, "SubunitCreate");
        break;
    }
    addSubUnit(new SubUnit(this, pledgeType, leader, name), true);
    return pledgeType;
  }
 
  /**
   * Method getAvailablePledgeTypes.
   * @param pledgeType int
   * @return int
   */
  public int getAvailablePledgeTypes(int pledgeType)
  {
    if (pledgeType == SUBUNIT_MAIN_CLAN)
    {
      return SUBUNIT_NONE;
    }
    if (_subUnits.get(pledgeType) != null)
    {
      switch (pledgeType)
      {
        case SUBUNIT_ACADEMY:
          return SUBUNIT_NONE;
        case SUBUNIT_ROYAL1:
          pledgeType = getAvailablePledgeTypes(SUBUNIT_ROYAL2);
          break;
        case SUBUNIT_ROYAL2:
          return SUBUNIT_NONE;
        case SUBUNIT_KNIGHT1:
          pledgeType = getAvailablePledgeTypes(SUBUNIT_KNIGHT2);
          break;
        case SUBUNIT_KNIGHT2:
          pledgeType = getAvailablePledgeTypes(SUBUNIT_KNIGHT3);
          break;
        case SUBUNIT_KNIGHT3:
          pledgeType = getAvailablePledgeTypes(SUBUNIT_KNIGHT4);
          break;
        case SUBUNIT_KNIGHT4:
          return SUBUNIT_NONE;
      }
    }
    return pledgeType;
  }
 
  /**
   * Method restoreSubPledges.
   */
  private void restoreSubPledges()
  {
    Connection con = null;
    PreparedStatement statement = null;
    ResultSet rset = null;
    try
    {
      con = DatabaseFactory.getInstance().getConnection();
      statement = con.prepareStatement("SELECT * FROM clan_subpledges WHERE clan_id=?");
      statement.setInt(1, getClanId());
      rset = statement.executeQuery();
      while (rset.next())
      {
        int type = rset.getInt("type");
        int leaderId = rset.getInt("leader_id");
        String name = rset.getString("name");
        SubUnit pledge = new SubUnit(this, type, leaderId, name);
        addSubUnit(pledge, false);
      }
    }
    catch (Exception e)
    {
      _log.warn("Could not restore clan SubPledges: " + e, e);
    }
    finally
    {
      DbUtils.closeQuietly(con, statement, rset);
    }
  }
 
  /**
   * Method getSubPledgeLimit.
   * @param pledgeType int
   * @return int
   */
  public int getSubPledgeLimit(int pledgeType)
  {
    int limit;
    switch (_level)
    {
      case 0:
        limit = 10;
        break;
      case 1:
        limit = 15;
        break;
      case 2:
        limit = 20;
        break;
      case 3:
        limit = 30;
        break;
      default:
        limit = 40;
        break;
    }
    switch (pledgeType)
    {
      case SUBUNIT_ACADEMY:
      case SUBUNIT_ROYAL1:
      case SUBUNIT_ROYAL2:
        if (getLevel() >= 11)
        {
          limit = 30;
        }
        else
        {
          limit = 20;
        }
        break;
      case SUBUNIT_KNIGHT1:
      case SUBUNIT_KNIGHT2:
        if (getLevel() >= 9)
        {
          limit = 25;
        }
        else
        {
          limit = 10;
        }
        break;
      case SUBUNIT_KNIGHT3:
      case SUBUNIT_KNIGHT4:
        if (getLevel() >= 10)
        {
          limit = 25;
        }
        else
        {
          limit = 10;
        }
        break;
    }
    return limit;
  }
 
  /**
   * Method getUnitMembersSize.
   * @param pledgeType int
   * @return int
   */
  public int getUnitMembersSize(int pledgeType)
  {
    if ((pledgeType == Clan.SUBUNIT_NONE) || !_subUnits.containsKey(pledgeType))
    {
      return 0;
    }
    return getSubUnit(pledgeType).size();
  }
 
  /**
   * Method restoreRankPrivs.
   */
  private void restoreRankPrivs()
  {
    if (_privs == null)
    {
      InitializePrivs();
    }
    Connection con = null;
    PreparedStatement statement = null;
    ResultSet rset = null;
    try
    {
      con = DatabaseFactory.getInstance().getConnection();
      statement = con.prepareStatement("SELECT privilleges,rank FROM clan_privs WHERE clan_id=?");
      statement.setInt(1, getClanId());
      rset = statement.executeQuery();
      while (rset.next())
      {
        int rank = rset.getInt("rank");
        int privileges = rset.getInt("privilleges");
        RankPrivs p = _privs.get(rank);
        if (p != null)
        {
          p.setPrivs(privileges);
        }
        else
        {
          _log.warn("Invalid rank value (" + rank + "), please check clan_privs table");
        }
      }
    }
    catch (Exception e)
    {
      _log.warn("Could not restore clan privs by rank: " + e);
      _log.error("", e);
    }
    finally
    {
      DbUtils.closeQuietly(con, statement, rset);
    }
  }
 
  /**
   * Method InitializePrivs.
   */
  public void InitializePrivs()
  {
    for (int i = RANK_FIRST; i <= RANK_LAST; i++)
    {
      _privs.put(i, new RankPrivs(i, 0, CP_NOTHING));
    }
  }
 
  /**
   * Method updatePrivsForRank.
   * @param rank int
   */
  public void updatePrivsForRank(int rank)
  {
    for (UnitMember member : this)
    {
      if (member.isOnline() && (member.getPlayer() != null) && (member.getPlayer().getPowerGrade() == rank))
      {
        if (member.getPlayer().isClanLeader())
        {
          continue;
        }
        member.getPlayer().sendUserInfo();
      }
    }
  }
 
  /**
   * Method getRankPrivs.
   * @param rank int
   * @return RankPrivs
   */
  public RankPrivs getRankPrivs(int rank)
  {
    if ((rank < RANK_FIRST) || (rank > RANK_LAST))
    {
      _log.warn("Requested invalid rank value: " + rank);
      Thread.dumpStack();
      return null;
    }
    if (_privs.get(rank) == null)
    {
      _log.warn("Request of rank before init: " + rank);
      Thread.dumpStack();
      setRankPrivs(rank, CP_NOTHING);
    }
    return _privs.get(rank);
  }
 
  /**
   * Method countMembersByRank.
   * @param rank int
   * @return int
   */
  public int countMembersByRank(int rank)
  {
    int ret = 0;
    for (UnitMember m : this)
    {
      if (m.getPowerGrade() == rank)
      {
        ret++;
      }
    }
    return ret;
  }
 
  /**
   * Method setRankPrivs.
   * @param rank int
   * @param privs int
   */
  public void setRankPrivs(int rank, int privs)
  {
    if ((rank < RANK_FIRST) || (rank > RANK_LAST))
    {
      _log.warn("Requested set of invalid rank value: " + rank);
      Thread.dumpStack();
      return;
    }
    if (_privs.get(rank) != null)
    {
      _privs.get(rank).setPrivs(privs);
    }
    else
    {
      _privs.put(rank, new RankPrivs(rank, countMembersByRank(rank), privs));
    }
    Connection con = null;
    PreparedStatement statement = null;
    try
    {
      con = DatabaseFactory.getInstance().getConnection();
      statement = con.prepareStatement("REPLACE INTO clan_privs (clan_id,rank,privilleges) VALUES (?,?,?)");
      statement.setInt(1, getClanId());
      statement.setInt(2, rank);
      statement.setInt(3, privs);
      statement.execute();
    }
    catch (Exception e)
    {
      _log.warn("Could not store clan privs for rank: " + e);
      _log.error("", e);
    }
    finally
    {
      DbUtils.closeQuietly(con, statement);
    }
  }
 
  /**
   * Method getAllRankPrivs.
   * @return RankPrivs[]
   */
  public final RankPrivs[] getAllRankPrivs()
  {
    if (_privs == null)
    {
      return new RankPrivs[0];
    }
    return _privs.values().toArray(new RankPrivs[_privs.values().size()]);
  }
 
  /**
   * @author Mobius
   */
  private static class ClanReputationComparator implements Comparator<Clan>
  {
    /**
     * Constructor for ClanReputationComparator.
     */
    public ClanReputationComparator()
    {
      // TODO Auto-generated constructor stub
    }
   
    /**
     * Method compare.
     * @param o1 Clan
     * @param o2 Clan
     * @return int
     */
    @Override
    public int compare(Clan o1, Clan o2)
    {
      if ((o1 == null) || (o2 == null))
      {
        return 0;
      }
      return o2.getReputationScore() - o1.getReputationScore();
    }
  }
 
  /**
   * Method getWhBonus.
   * @return int
   */
  public int getWhBonus()
  {
    return _whBonus;
  }
 
  /**
   * Method setWhBonus.
   * @param i int
   */
  public void setWhBonus(int i)
  {
    if (_whBonus != -1)
    {
      mysql.set("UPDATE `clan_data` SET `warehouse`=? WHERE `clan_id`=?", i, getClanId());
    }
    _whBonus = i;
  }
 
  /**
   * Method setAirshipLicense.
   * @param val boolean
   */
  public void setAirshipLicense(boolean val)
  {
    _airshipLicense = val;
  }
 
  /**
   * Method isHaveAirshipLicense.
   * @return boolean
   */
  public boolean isHaveAirshipLicense()
  {
    return _airshipLicense;
  }
 
  /**
   * Method getAirship.
   * @return ClanAirShip
   */
  public ClanAirShip getAirship()
  {
    return _airship;
  }
 
  /**
   * Method setAirship.
   * @param airship ClanAirShip
   */
  public void setAirship(ClanAirShip airship)
  {
    _airship = airship;
  }
 
  /**
   * Method getAirshipFuel.
   * @return int
   */
  public int getAirshipFuel()
  {
    return _airshipFuel;
  }
 
  /**
   * Method setAirshipFuel.
   * @param fuel int
   */
  public void setAirshipFuel(int fuel)
  {
    _airshipFuel = fuel;
  }
 
  /**
   * Method getAllSubUnits.
   * @return Collection<SubUnit>
   */
  public final Collection<SubUnit> getAllSubUnits()
  {
    return _subUnits.values();
  }
 
  /**
   * Method listAll.
   * @return List<L2GameServerPacket>
   */
  public List<L2GameServerPacket> listAll()
  {
    List<L2GameServerPacket> p = new ArrayList<>(_subUnits.size());
    for (SubUnit unit : getAllSubUnits())
    {
      p.add(new PledgeShowMemberListAll(this, unit));
    }
    return p;
  }
 
  /**
   * Method getNotice.
   * @return String
   */
  public String getNotice()
  {
    return _notice;
  }
 
  /**
   * Method setNotice.
   * @param notice String
   */
  public void setNotice(String notice)
  {
    _notice = notice;
  }
 
  /**
   * Method getSkillLevel.
   * @param id int
   * @param def int
   * @return int
   */
  public int getSkillLevel(int id, int def)
  {
    Skill skill = _skills.get(id);
    return skill == null ? def : skill.getLevel();
  }
 
  /**
   * Method getSkillLevel.
   * @param id int
   * @return int
   */
  public int getSkillLevel(int id)
  {
    return getSkillLevel(id, -1);
  }
 
  /**
   * Method iterator.
   * @return Iterator<UnitMember> * @see java.lang.Iterable#iterator()
   */
  @Override
  public Iterator<UnitMember> iterator()
  {
    List<Iterator<UnitMember>> iterators = new ArrayList<>(_subUnits.size());
    for (SubUnit subUnit : _subUnits.values())
    {
      iterators.add(subUnit.getUnitMembers().iterator());
    }
    return new JoinedIterator<>(iterators);
  }
 
  /**
   * Method startNotifyClanEnterWorld.
   * @param activeChar Player
   */
  public void startNotifyClanEnterWorld(Player activeChar)
  {
    if (activeChar.isClanLeader())
    {
      _clanLeaderSkill = SkillTable.getInstance().getInfo(19009, 1);
      for (Player member : getOnlineMembers(0))
      {
        for (EffectTemplate et : _clanLeaderSkill.getEffectTemplates())
        {
          Effect effect = et.getEffect(new Env(member, member, _clanLeaderSkill));
          if (effect != null)
          {
            member.getEffectList().addEffect(effect);
          }
        }   
      }
    }
    else if (getLeader().isOnline())
    {
      _clanLeaderSkill = SkillTable.getInstance().getInfo(19009, 1);
      for (EffectTemplate et : _clanLeaderSkill.getEffectTemplates())
      {
        Effect effect = et.getEffect(new Env(activeChar, activeChar, _clanLeaderSkill));
        if (effect != null)
        {
          activeChar.getEffectList().addEffect(effect);
        }
      }   
    }
  }

  /**
   * Method startNotifyClanLogOut.
   * @param activeChar Player
   */
  public void startNotifyClanLogOut(Player activeChar)
  {
    if (activeChar.isClanLeader())
    {
      _clanLeaderSkill = SkillTable.getInstance().getInfo(19009, 1);
      for (Player member : getOnlineMembers(0))
      {
        member.getEffectList().stopEffect(_clanLeaderSkill);
      }
    }
  }
}
TOP

Related Classes of lineage2.gameserver.model.pledge.Clan$ClanReputationComparator

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.