Advertisement
Guest User

Untitled

a guest
Dec 19th, 2014
156
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 45.71 KB | None | 0 0
  1. package ru.catssoftware.gameserver.model.entity;
  2.  
  3. import javolution.util.FastList;
  4. import org.apache.log4j.Logger;
  5. import ru.catssoftware.Config;
  6. import ru.catssoftware.L2DatabaseFactory;
  7. import ru.catssoftware.Message;
  8. import ru.catssoftware.gameserver.Announcements;
  9. import ru.catssoftware.gameserver.SevenSigns;
  10. import ru.catssoftware.gameserver.datatables.ClanTable;
  11. import ru.catssoftware.gameserver.datatables.NpcTable;
  12. import ru.catssoftware.gameserver.idfactory.IdFactory;
  13. import ru.catssoftware.gameserver.instancemanager.MercTicketManager;
  14. import ru.catssoftware.gameserver.instancemanager.SiegeGuardManager;
  15. import ru.catssoftware.gameserver.instancemanager.SiegeManager;
  16. import ru.catssoftware.gameserver.instancemanager.SiegeManager.SiegeSpawn;
  17. import ru.catssoftware.gameserver.instancemanager.TownManager;
  18. import ru.catssoftware.gameserver.model.*;
  19. import ru.catssoftware.gameserver.model.L2SiegeClan.SiegeClanType;
  20. import ru.catssoftware.gameserver.model.actor.instance.L2ControlTowerInstance;
  21. import ru.catssoftware.gameserver.model.actor.instance.L2NpcInstance;
  22. import ru.catssoftware.gameserver.model.actor.instance.L2PcInstance;
  23. import ru.catssoftware.gameserver.model.mapregion.TeleportWhereType;
  24. import ru.catssoftware.gameserver.model.zone.L2SiegeZone;
  25. import ru.catssoftware.gameserver.model.zone.L2Zone;
  26. import ru.catssoftware.gameserver.network.SystemMessageId;
  27. import ru.catssoftware.gameserver.network.serverpackets.SiegeInfo;
  28. import ru.catssoftware.gameserver.network.serverpackets.SystemMessage;
  29. import ru.catssoftware.gameserver.network.serverpackets.UserInfo;
  30. import ru.catssoftware.gameserver.templates.chars.L2NpcTemplate;
  31. import ru.catssoftware.gameserver.threadmanager.ExclusiveTask;
  32. import ru.catssoftware.gameserver.util.Broadcast;
  33.  
  34. import java.sql.Connection;
  35. import java.sql.PreparedStatement;
  36. import java.sql.ResultSet;
  37. import java.sql.SQLException;
  38. import java.util.Calendar;
  39. import java.util.Set;
  40.  
  41.  
  42. public class Siege
  43. {
  44.     private final static Logger _log    = Logger.getLogger(Siege.class.getName());
  45.  
  46.     public static enum TeleportWhoType
  47.     {
  48.         All, Attacker, DefenderNotOwner, Owner, Spectator
  49.     }
  50.  
  51.     private int _controlTowerCount;
  52.     private int _controlTowerMaxCount;
  53.  
  54.     // ===============================================================
  55.     // Schedule task
  56.    
  57.     private final ExclusiveTask _endSiegeTask = new ExclusiveTask() {
  58.         @Override
  59.         protected void onElapsed()
  60.         {
  61.             if (!getIsInProgress())
  62.             {
  63.                 cancel();
  64.                 return;
  65.             }
  66.            
  67.             final long timeRemaining = _siegeEndDate.getTimeInMillis() - System.currentTimeMillis();
  68.            
  69.             if (timeRemaining <= 0)
  70.             {
  71.                 endSiege();
  72.                 cancel();
  73.                 return;
  74.             }
  75.            
  76.             if (3600000 > timeRemaining)
  77.             {
  78.                 if (timeRemaining > 120000)
  79.                     announceToPlayer(Math.round(timeRemaining / 60000.0) + " минут(а) до конца осады замка " + getCastle().getName() + ".", true);
  80.                
  81.                 else
  82.                     announceToPlayer("Осада замка " + getCastle().getName() + " закончится через " + Math.round(timeRemaining / 1000.0) + " секунд(а)!", true);
  83.             }
  84.            
  85.             int divider;
  86.            
  87.             if (timeRemaining > 3600000)
  88.                 divider = 3600000; // 1 hour
  89.            
  90.             else if (timeRemaining > 600000)
  91.                 divider = 600000; // 10 min
  92.            
  93.             else if (timeRemaining > 60000)
  94.                 divider = 60000; // 1 min
  95.            
  96.             else if (timeRemaining > 10000)
  97.                 divider = 10000; // 10 sec
  98.            
  99.             else
  100.                 divider = 1000; // 1 sec
  101.            
  102.             schedule(timeRemaining-((timeRemaining-500) / divider * divider));
  103.         }
  104.     };
  105.  
  106.     private final ExclusiveTask _startSiegeTask = new ExclusiveTask()
  107.     {
  108.         @Override
  109.         protected void onElapsed()
  110.         {
  111.             if (getIsInProgress())
  112.             {
  113.                 cancel();
  114.                 return;
  115.             }
  116.  
  117.             if (!getIsTimeRegistrationOver())
  118.             {
  119.                 long regTimeRemaining = getTimeRegistrationOverDate().getTimeInMillis() - System.currentTimeMillis();
  120.                
  121.                 if (regTimeRemaining > 0)
  122.                 {
  123.                     schedule(regTimeRemaining);
  124.                     return;
  125.                 }
  126.                
  127.                 endTimeRegistration(true);
  128.             }
  129.            
  130.             final long timeRemaining = getSiegeDate().getTimeInMillis() - System.currentTimeMillis();
  131.            
  132.             if (timeRemaining <= 0)
  133.             {
  134.                 startSiege();
  135.                 cancel();
  136.                 return;
  137.             }
  138.            
  139.             if (86400000 > timeRemaining)
  140.             {
  141.                 if (!_isRegistrationOver)
  142.                 {
  143.                     _isRegistrationOver = true;
  144.                     announceToPlayer("Период регистрации на атаку замка " + getCastle().getName() + " окончен.", false);
  145.                     clearSiegeWaitingClan();
  146.                 }
  147.                
  148.                 if (timeRemaining > 7200000)
  149.                     announceToPlayer(Math.round(timeRemaining / 3600000.0) + " часов до начала осады замка: " + getCastle().getName() + ".", false);
  150.                
  151.                 else if (timeRemaining > 120000)
  152.                     announceToPlayer(Math.round(timeRemaining / 60000.0) + " минут до начала осады замка: " + getCastle().getName() + ".", false);
  153.                
  154.                 else
  155.                     announceToPlayer("Осада замка: " + getCastle().getName() + " начнется через " + Math.round(timeRemaining / 1000.0) + " секунд!", false);
  156.             }
  157.            
  158.             int divider;
  159.            
  160.             if (timeRemaining > 86400000)
  161.                 divider = 86400000; // 1 day
  162.            
  163.             else if (timeRemaining > 3600000)
  164.                 divider = 3600000; // 1 hour
  165.            
  166.             else if (timeRemaining > 600000)
  167.                 divider = 600000; // 10 min
  168.            
  169.             else if (timeRemaining > 60000)
  170.                 divider = 60000; // 1 min
  171.            
  172.             else if (timeRemaining > 10000)
  173.                 divider = 10000; // 10 sec
  174.            
  175.             else
  176.                 divider = 1000; // 1 sec
  177.            
  178.             schedule(timeRemaining-((timeRemaining-500) / divider * divider));
  179.         }
  180.     };
  181.    
  182.     // =========================================================
  183.     // Data Field
  184.     // Attacker and Defender
  185.     private FastList<L2SiegeClan>               _attackerClans          = new FastList<L2SiegeClan>();              // L2SiegeClan
  186.  
  187.     private FastList<L2SiegeClan>               _defenderClans          = new FastList<L2SiegeClan>();              // L2SiegeClan
  188.     private FastList<L2SiegeClan>               _defenderWaitingClans   = new FastList<L2SiegeClan>();              // L2SiegeClan
  189.  
  190.     // Castle setting
  191.     private FastList<L2ControlTowerInstance>    _controlTowers          = new FastList<L2ControlTowerInstance>();
  192.  
  193.     private Castle                              _castle;
  194.     private boolean                             _isInProgress           = false;
  195.     private boolean                             _isNormalSide           = true;     // true = Atk is Atk, false = Atk is Def
  196.     protected boolean                           _isRegistrationOver     = false;
  197.     protected Calendar                          _siegeEndDate;
  198.     private SiegeGuardManager                   _siegeGuardManager;
  199.     private int oldOwner = 0; // 0 - NPC, > 0 - clan
  200.    
  201.     public Siege(Castle castle)
  202.     {
  203.         _castle = castle;
  204.         _siegeGuardManager = new SiegeGuardManager(getCastle().getName(),getCastle().getCastleId(),getCastle().getOwnerId());
  205.         startAutoTask();
  206.     }
  207.  
  208.     /**
  209.      * When siege ends<BR><BR>
  210.      */
  211.     public void endSiege()
  212.     {
  213.         if (getIsInProgress())
  214.         {
  215.             announceToPlayer(new SystemMessage(SystemMessageId.CASTLE_SIEGE_HAS_ENDED), true);
  216.             SystemMessage sm;
  217.             sm = new SystemMessage(SystemMessageId.SIEGE_OF_S1_FINISHED);
  218.             sm.addString(getCastle().getName());
  219.             announceToPlayer(sm, false);
  220.             announceToParticipants(SystemMessageId.TEMPORARY_ALLIANCE_DISSOLVED.getSystemMessage());
  221.  
  222.             if (getCastle().getOwnerId() <= 0)
  223.             {
  224.                 sm = new SystemMessage(SystemMessageId.SIEGE_S1_DRAW);
  225.                 sm.addString(getCastle().getName());
  226.                 announceToPlayer(sm, false);
  227.             }
  228.             _castle.setBloodAliance(0);        
  229.             if (oldOwner != getCastle().getOwnerId())
  230.             {
  231.                 announceToPlayer(new SystemMessage(SystemMessageId.NEW_CASTLE_LORD), true); //is it really true?
  232.                 sm = new SystemMessage(SystemMessageId.CLAN_S1_VICTORIOUS_OVER_S2_S_SIEGE);
  233.                 sm.addString(ClanTable.getInstance().getClan(getCastle().getOwnerId()).getName());
  234.                 sm.addString(getCastle().getName());
  235.                 announceToPlayer(sm, false);
  236.             }
  237.             else if (oldOwner>0)
  238.             {
  239.                 // Owner is unchanged
  240.                 _castle.setBloodAliance(Config.SIEGE_BLOODALIANCE_REWARD_CNT);
  241.             }
  242.             removeFlags(); // Removes all flags. Note: Remove flag before teleporting players
  243.             teleportPlayer(Siege.TeleportWhoType.Attacker, TeleportWhereType.Town); // Teleport to the second closest town
  244.             teleportPlayer(Siege.TeleportWhoType.DefenderNotOwner, TeleportWhereType.Town); // Teleport to the second closest town
  245.             teleportPlayer(Siege.TeleportWhoType.Spectator, TeleportWhereType.Town); // Teleport to the second closest town
  246.             _isInProgress = false; // Flag so that siege instance can be started
  247.             updatePlayerSiegeStateFlags(true);
  248.             getZone().updateSiegeStatus();
  249.             saveCastleSiege(); // Save castle specific data
  250.             clearSiegeClan(); // Clear siege clan from db
  251.             removeControlTower(); // Remove all control tower from this castle
  252.             _siegeGuardManager.unspawnSiegeGuard(); // Remove all spawned siege guard from this castle
  253.             if (getCastle().getOwnerId() > 0)
  254.                 _siegeGuardManager.removeMercs();
  255.             getCastle().spawnDoor(); // Respawn door to castle
  256.         }
  257.     }
  258.  
  259.     private void removeDefender(L2SiegeClan sc)
  260.     {
  261.         if (sc != null)
  262.             getDefenderClans().remove(sc);
  263.     }
  264.  
  265.     private void removeAttacker(L2SiegeClan sc)
  266.     {
  267.         if (sc != null)
  268.             getAttackerClans().remove(sc);
  269.     }
  270.  
  271.     private void addDefender(L2SiegeClan sc, SiegeClanType type)
  272.     {
  273.         if (sc == null)
  274.             return;
  275.         sc.setType(type);
  276.         getDefenderClans().add(sc);
  277.     }
  278.  
  279.     private void addAttacker(L2SiegeClan sc)
  280.     {
  281.         if (sc == null)
  282.             return;
  283.         sc.setType(SiegeClanType.ATTACKER);
  284.         getAttackerClans().add(sc);
  285.     }
  286.  
  287.     /**
  288.      * When control of castle changed during siege<BR><BR>
  289.      */
  290.     public void midVictory()
  291.     {
  292.         if (getIsInProgress()) // Siege still in progress
  293.         {
  294.             if (getCastle().getOwnerId() > 0)
  295.                 _siegeGuardManager.removeMercs(); // Remove all merc entry from db
  296.  
  297.             if (getDefenderClans().size() == 0 && // If defender doesn't exist (Pc vs Npc)
  298.                     getAttackerClans().size() == 1 // Only 1 attacker
  299.             )
  300.             {
  301.                 L2SiegeClan sc_newowner = getAttackerClan(getCastle().getOwnerId());
  302.                 removeAttacker(sc_newowner);
  303.                 addDefender(sc_newowner, SiegeClanType.OWNER);
  304.                 endSiege();
  305.                 return;
  306.             }
  307.             if (getCastle().getOwnerId() > 0)
  308.             {
  309.                 int allyId = ClanTable.getInstance().getClan(getCastle().getOwnerId()).getAllyId();
  310.                 if (getDefenderClans().size() == 0) // If defender doesn't exist (Pc vs Npc)
  311.                 // and only an alliance attacks
  312.                 {
  313.                     // The player's clan is in an alliance
  314.                     if (allyId != 0)
  315.                     {
  316.                         boolean allinsamealliance = true;
  317.                         for (L2SiegeClan sc : getAttackerClans())
  318.                         {
  319.                             if (sc != null)
  320.                             {
  321.                                 if (ClanTable.getInstance().getClan(sc.getClanId()).getAllyId() != allyId)
  322.                                     allinsamealliance = false;
  323.                             }
  324.                         }
  325.                         if (allinsamealliance)
  326.                         {
  327.                             L2SiegeClan sc_newowner = getAttackerClan(getCastle().getOwnerId());
  328.                             removeAttacker(sc_newowner);
  329.                             addDefender(sc_newowner, SiegeClanType.OWNER);
  330.                             endSiege();
  331.                             return;
  332.                         }
  333.                     }
  334.                 }
  335.  
  336.                 for (L2SiegeClan sc : getDefenderClans())
  337.                 {
  338.                     if (sc != null)
  339.                     {
  340.                         removeDefender(sc);
  341.                         addAttacker(sc);
  342.                     }
  343.                 }
  344.  
  345.                 L2SiegeClan sc_newowner = getAttackerClan(getCastle().getOwnerId());
  346.                 removeAttacker(sc_newowner);
  347.                 addDefender(sc_newowner, SiegeClanType.OWNER);
  348.  
  349.                 // The player's clan is in an alliance
  350.                 if (allyId != 0)
  351.                 {
  352.                     L2Clan[] clanList = ClanTable.getInstance().getClans();
  353.  
  354.                     for (L2Clan clan : clanList)
  355.                     {
  356.                         if (clan.getAllyId() == allyId)
  357.                         {
  358.                             L2SiegeClan sc = getAttackerClan(clan.getClanId());
  359.                             if (sc != null)
  360.                             {
  361.                                 removeAttacker(sc);
  362.                                 addDefender(sc, SiegeClanType.DEFENDER);
  363.                             }
  364.                         }
  365.                     }
  366.                 }
  367.                 for(L2Character cha : getZone().getCharactersInside().values()) {
  368.                     if(cha instanceof L2PcInstance)
  369.                         if(!checkIsDefender(((L2PcInstance)cha).getClan()))
  370.                                 cha.teleToLocation(TeleportWhereType.Town);
  371.                         else
  372.                             cha.broadcastFullInfo();
  373.                 }
  374.                 removeDefenderFlags(); // Removes defenders' flags
  375.                 getCastle().removeUpgrade(); // Remove all castle upgrade
  376.                 getCastle().spawnDoor(true); // Respawn door to castle but make them weaker (50% hp)
  377.                 removeControlTower(); // Remove all control tower from this castle
  378.                 _controlTowerCount = 0;//Each new siege midvictory CT are completely respawned.
  379.                 _controlTowerMaxCount = 0;
  380.                 spawnControlTower(getCastle().getCastleId());
  381.                 updatePlayerSiegeStateFlags(false);
  382.                 announceToParticipants(SystemMessageId.TEMPORARY_ALLIANCE.getSystemMessage());
  383.             }
  384.         }
  385.     }
  386.  
  387.     /**
  388.      * When siege starts<BR><BR>
  389.      */
  390.     public void startSiege()
  391.     {
  392.         if (!getIsInProgress())
  393.         {
  394.             if (getAttackerClans().size() <= 0)
  395.             {
  396.                 SystemMessage sm;
  397.                 if (getCastle().getOwnerId() <= 0)
  398.                     sm = new SystemMessage(SystemMessageId.SIEGE_OF_S1_HAS_BEEN_CANCELED_DUE_TO_LACK_OF_INTEREST);
  399.                 else
  400.                     sm = new SystemMessage(SystemMessageId.S1_SIEGE_WAS_CANCELED_BECAUSE_NO_CLANS_PARTICIPATED);
  401.                 sm.addString(getCastle().getName());
  402.                 Announcements.getInstance().announceToAll(sm);
  403.                 saveCastleSiege();
  404.                 return;
  405.             }
  406.  
  407.             _isNormalSide = true; // Atk is now atk
  408.             _isInProgress = true; // Flag so that same siege instance cannot be started again
  409.             loadSiegeClan(true); // Load siege clan from db
  410.             updatePlayerSiegeStateFlags(false);
  411.             for(L2Character cha : getZone().getCharactersInside().values()) {
  412.                 if(cha instanceof L2PcInstance) {
  413.                     L2PcInstance pc = (L2PcInstance)cha;
  414.                     if(!checkIsDefender(pc.getClan()))
  415.                         pc.teleToLocation(TeleportWhereType.Town);
  416.                     else
  417.                         pc.broadcastFullInfo();
  418.                 }
  419.             }
  420.  
  421.             _controlTowerCount = 0;
  422.             _controlTowerMaxCount = 0;
  423.             spawnControlTower(getCastle().getCastleId()); // Spawn control tower
  424.             getCastle().resetArtifact(); // artifact prepair
  425.             getCastle().spawnDoor(); // Spawn door
  426.             spawnSiegeGuard(); // Spawn siege guard
  427.             MercTicketManager.getInstance().deleteTickets(getCastle().getCastleId()); // remove the tickets from the ground
  428.             getZone().updateSiegeStatus();
  429.             // Schedule a task to prepare auto siege end
  430.             _siegeEndDate = Calendar.getInstance();
  431.             _siegeEndDate.add(Calendar.MINUTE, Config.SIEGE_LENGTH_MINUTES);
  432.             _endSiegeTask.schedule(1000);
  433.  
  434.             announceToPlayer(new SystemMessage(SystemMessageId.CASTLE_SIEGE_HAS_BEGUN), true);
  435.             SystemMessage sm;
  436.             sm = new SystemMessage(SystemMessageId.SIEGE_OF_S1_HAS_STARTED);
  437.             sm.addString(getCastle().getName());
  438.             announceToPlayer(sm, false);
  439.             sm = new SystemMessage(SystemMessageId.S1);
  440.             sm.addString("Вы зарегистрированы на осаду "+getCastle().getName());
  441.             announceToParticipants(sm);
  442.             oldOwner = getCastle().getOwnerId();
  443.         }
  444.     }
  445.  
  446.     /**
  447.      * Announce to player.<BR><BR>
  448.      * @param message The String of the message to send to player
  449.      * @param inAreaOnly The boolean flag to show message to players in area only.
  450.      */
  451.     public void announceToPlayer(String message, boolean inAreaOnly)
  452.     {
  453.         // Get all players
  454.         for (L2PcInstance player : L2World.getInstance().getAllPlayers())
  455.         {
  456.             if (!inAreaOnly || (inAreaOnly && checkIfInZone(player.getX(), player.getY(), player.getZ())))
  457.                 player.sendMessage(message);
  458.         }
  459.     }
  460.  
  461.     public void announceToPlayer(SystemMessage sm, boolean inAreaOnly)
  462.     {
  463.         for (L2PcInstance player : L2World.getInstance().getAllPlayers())
  464.         {
  465.             if (!inAreaOnly || (inAreaOnly && checkIfInZone(player.getX(), player.getY(), player.getZ())))
  466.                 player.sendPacket(sm);
  467.         }
  468.     }
  469.  
  470.     public void announceToParticipants(SystemMessage sm)
  471.     {
  472.         for(L2SiegeClan siegeclan : getAttackerClans())
  473.             if(ClanTable.getInstance().getClan(siegeclan.getClanId())!=null)
  474.                 ClanTable.getInstance().getClan(siegeclan.getClanId()).broadcastToOnlineMembers(sm);
  475.         for(L2SiegeClan siegeclan : getDefenderClans())
  476.             if(ClanTable.getInstance().getClan(siegeclan.getClanId())!=null)
  477.                 ClanTable.getInstance().getClan(siegeclan.getClanId()).broadcastToOnlineMembers(sm);
  478.     }
  479.  
  480.     public void announceToOpponent(SystemMessage sm, boolean toAtk) {
  481.         FastList<L2SiegeClan> clans = (toAtk ? getAttackerClans() : getDefenderClans());
  482.         for (L2SiegeClan siegeclan : clans)
  483.             ClanTable.getInstance().getClan(siegeclan.getClanId()).broadcastToOnlineMembers(sm);
  484.     }
  485.  
  486.     public void announceToOpponent(SystemMessage sm, L2Clan self)
  487.     {
  488.         if (self != null) {
  489.             boolean atk = true;
  490.             if (getAttackerClan(self) != null)
  491.                 atk = false;
  492.             else if (getDefenderClan(self) == null)
  493.                 return;
  494.             announceToOpponent(sm, atk);
  495.         }
  496.     }
  497.  
  498.     public void updatePlayerSiegeStateFlags(boolean clear)
  499.     {
  500.         L2Clan clan;
  501.         for (L2SiegeClan siegeClan : getAttackerClans())
  502.         {
  503.             if (siegeClan == null)
  504.                 continue;
  505.  
  506.             clan = ClanTable.getInstance().getClan(siegeClan.getClanId());
  507.             if(clan==null)
  508.                 continue;
  509.             for (L2PcInstance member : clan.getOnlineMembers(0))
  510.             {
  511.                 if (clear)
  512.                     member.setSiegeState((byte) 0);
  513.                 else
  514.                     member.setSiegeState((byte) 1);
  515.                 member.sendPacket(new UserInfo(member));
  516.                 member.revalidateZone(true);
  517.                 L2SiegeStatus.getInstance().addStatus(member.getClanId(), member.getObjectId());
  518.             }
  519.         }
  520.         for (L2SiegeClan siegeClan : getDefenderClans())
  521.         {
  522.             if (siegeClan == null)
  523.                 continue;
  524.  
  525.             clan = ClanTable.getInstance().getClan(siegeClan.getClanId());
  526.             for (L2PcInstance member : clan.getOnlineMembers(0))
  527.             {
  528.                 if (clear)
  529.                     member.setSiegeState((byte) 0);
  530.                 else
  531.                     member.setSiegeState((byte) 2);
  532.                 member.sendPacket(new UserInfo(member));
  533.                 member.revalidateZone(true);
  534.                 L2SiegeStatus.getInstance().addStatus(member.getClanId(), member.getObjectId());
  535.             }
  536.         }
  537.     }
  538.  
  539.     /**
  540.      * Approve clan as defender for siege<BR><BR>
  541.      * @param clanId The int of player's clan id
  542.      */
  543.     public void approveSiegeDefenderClan(int clanId)
  544.     {
  545.         if (clanId <= 0)
  546.             return;
  547.         saveSiegeClan(ClanTable.getInstance().getClan(clanId), 0, true);
  548.         loadSiegeClan(false);
  549.     }
  550.  
  551.     /** Return true if object is inside the zone */
  552.     public boolean checkIfInZone(L2Object object)
  553.     {
  554.         return checkIfInZone(object.getX(), object.getY(), object.getZ());
  555.     }
  556.  
  557.     /** Return true if object is inside the zone */
  558.     public boolean checkIfInZone(int x, int y, int z)
  559.     {
  560.         Town town = TownManager.getInstance().getTown(x, y, z);
  561.         return (getIsInProgress() && (getCastle().checkIfInZone(x, y, z) || getZone().isInsideZone(x, y) || (town != null && getCastle().getCastleId() == town.getCastleId())));
  562.     }
  563.  
  564.     /**
  565.      * Return true if clan is attacker<BR><BR>
  566.      * @param clan The L2Clan of the player
  567.      */
  568.     public boolean checkIsAttacker(L2Clan clan)
  569.     {
  570.         return (getAttackerClan(clan) != null);
  571.     }
  572.  
  573.     /**
  574.      * Return true if clan is defender<BR><BR>
  575.      * @param clan The L2Clan of the player
  576.      */
  577.     public boolean checkIsDefender(L2Clan clan)
  578.     {
  579.         if(clan==null)
  580.             return false;
  581.         return (getDefenderClan(clan) != null);
  582.     }
  583.  
  584.     /**
  585.      * Return true if clan is defender waiting approval<BR><BR>
  586.      * @param clan The L2Clan of the player
  587.      */
  588.     public boolean checkIsDefenderWaiting(L2Clan clan)
  589.     {
  590.         return (getDefenderWaitingClan(clan) != null);
  591.     }
  592.  
  593.     /** Clear all registered siege clans from database for castle */
  594.     public void clearSiegeClan()
  595.     {
  596.         Connection con = null;
  597.         try
  598.         {
  599.             con = L2DatabaseFactory.getInstance().getConnection(con);
  600.             PreparedStatement statement = con.prepareStatement("DELETE FROM siege_clans WHERE castle_id=?");
  601.             statement.setInt(1, getCastle().getCastleId());
  602.             statement.execute();
  603.             statement.close();
  604.  
  605.             if (getCastle().getOwnerId() > 0)
  606.             {
  607.                 PreparedStatement statement2 = con.prepareStatement("DELETE FROM siege_clans WHERE clan_id=?");
  608.                 statement2.setInt(1, getCastle().getOwnerId());
  609.                 statement2.execute();
  610.                 statement2.close();
  611.             }
  612.  
  613.             getAttackerClans().clear();
  614.             getDefenderClans().clear();
  615.             getDefenderWaitingClans().clear();
  616.         }
  617.         catch (Exception e)
  618.         {
  619.             _log.error("Exception: clearSiegeClan(): " + e.getMessage(), e);
  620.         }
  621.         finally
  622.         {
  623.             try
  624.             {
  625.                 if (con != null)
  626.                     con.close();
  627.             }
  628.             catch (SQLException e)
  629.             {
  630.                 e.printStackTrace();
  631.             }
  632.         }
  633.     }
  634.  
  635.     /** Clear all siege clans waiting for approval from database for castle */
  636.     public void clearSiegeWaitingClan()
  637.     {
  638.         Connection con = null;
  639.         try
  640.         {
  641.             con = L2DatabaseFactory.getInstance().getConnection(con);
  642.             PreparedStatement statement = con.prepareStatement("DELETE FROM siege_clans WHERE castle_id=? and type = 2");
  643.             statement.setInt(1, getCastle().getCastleId());
  644.             statement.execute();
  645.             statement.close();
  646.  
  647.             getDefenderWaitingClans().clear();
  648.         }
  649.         catch (Exception e)
  650.         {
  651.             _log.error("Exception: clearSiegeWaitingClan(): " + e.getMessage(), e);
  652.         }
  653.         finally
  654.         {
  655.             try
  656.             {
  657.                 if (con != null)
  658.                     con.close();
  659.             }
  660.             catch (SQLException e)
  661.             {
  662.                 e.printStackTrace();
  663.             }
  664.         }
  665.     }
  666.  
  667.     /** Return list of L2PcInstance registered as attacker in the zone. */
  668.     public FastList<L2PcInstance> getAttackersInZone()
  669.     {
  670.         FastList<L2PcInstance> players = new FastList<L2PcInstance>();
  671.         L2Clan clan;
  672.         for (L2SiegeClan siegeclan : getAttackerClans())
  673.         {
  674.             clan = ClanTable.getInstance().getClan(siegeclan.getClanId());
  675.             if(clan==null)
  676.                 continue;
  677.             for (L2PcInstance player : clan.getOnlineMembers(0))
  678.             {
  679.                 if (checkIfInZone(player.getX(), player.getY(), player.getZ()))
  680.                     players.add(player);
  681.             }
  682.         }
  683.         return players;
  684.     }
  685.  
  686.     /** Return list of L2PcInstance registered as defender but not owner in the zone. */
  687.     public FastList<L2PcInstance> getDefendersButNotOwnersInZone()
  688.     {
  689.         FastList<L2PcInstance> players = new FastList<L2PcInstance>();
  690.         L2Clan clan;
  691.         for (L2SiegeClan siegeclan : getDefenderClans())
  692.         {
  693.             clan = ClanTable.getInstance().getClan(siegeclan.getClanId());
  694.             if (clan.getClanId() == getCastle().getOwnerId())
  695.                 continue;
  696.             for (L2PcInstance player : clan.getOnlineMembers(0))
  697.             {
  698.                 if (checkIfInZone(player.getX(), player.getY(), player.getZ()))
  699.                     players.add(player);
  700.             }
  701.         }
  702.         return players;
  703.     }
  704.  
  705.     /** Return list of L2PcInstance in the zone. */
  706.     public FastList<L2PcInstance> getPlayersInZone()
  707.     {
  708.         FastList<L2PcInstance> players = new FastList<L2PcInstance>();
  709.  
  710.         for (L2PcInstance player : L2World.getInstance().getAllPlayers())
  711.         {
  712.             // quick check from player states, which don't include siege number however
  713.             if (!player.isInsideZone(L2Zone.FLAG_SIEGE))
  714.                 continue;
  715.             if (checkIfInZone(player.getX(), player.getY(), player.getZ()))
  716.                 players.add(player);
  717.         }
  718.  
  719.         return players;
  720.     }
  721.  
  722.     /** Return list of L2PcInstance owning the castle in the zone. */
  723.     public FastList<L2PcInstance> getOwnersInZone()
  724.     {
  725.         FastList<L2PcInstance> players = new FastList<L2PcInstance>();
  726.         L2Clan clan;
  727.         for (L2SiegeClan siegeclan : getDefenderClans())
  728.         {
  729.             clan = ClanTable.getInstance().getClan(siegeclan.getClanId());
  730.             if (clan.getClanId() != getCastle().getOwnerId())
  731.                 continue;
  732.             for (L2PcInstance player : clan.getOnlineMembers(0))
  733.             {
  734.                 if (checkIfInZone(player.getX(), player.getY(), player.getZ()))
  735.                     players.add(player);
  736.             }
  737.         }
  738.         return players;
  739.     }
  740.  
  741.     /** Return list of L2PcInstance not registered as attacker or defender in the zone. */
  742.     public FastList<L2PcInstance> getSpectatorsInZone()
  743.     {
  744.         FastList<L2PcInstance> players = new FastList<L2PcInstance>();
  745.  
  746.         for (L2PcInstance player : L2World.getInstance().getAllPlayers())
  747.         {
  748.             // quick check from player states, which don't include siege number however
  749.             if (!player.isInsideZone(L2Zone.FLAG_SIEGE) || player.getSiegeState() != 0)
  750.                 continue;
  751.             if (checkIfInZone(player.getX(), player.getY(), player.getZ()))
  752.                 players.add(player);
  753.         }
  754.  
  755.         return players;
  756.     }
  757.  
  758.     /** Control Tower was skilled
  759.      * @param ct */
  760.     public void killedCT(L2NpcInstance ct)
  761.     {
  762.         _controlTowerCount--;
  763.         if (_controlTowerCount < 0)
  764.             _controlTowerCount = 0;
  765.     }
  766.  
  767.     /** Remove the flag that was killed */
  768.     public void killedFlag(L2NpcInstance flag)
  769.     {
  770.         if (flag == null)
  771.             return;
  772.         for (L2SiegeClan clan : getAttackerClans())
  773.         {
  774.             if (clan.removeFlag(flag))
  775.                 return;
  776.         }
  777.     }
  778.  
  779.     /** Display list of registered clans */
  780.     public void listRegisterClan(L2PcInstance player)
  781.     {
  782.         player.sendPacket(new SiegeInfo(getCastle(),null,null));
  783.     }
  784.  
  785.     /**
  786.      * Register clan as attacker<BR><BR>
  787.      * @param player The L2PcInstance of the player trying to register
  788.      */
  789.     public void registerAttacker(L2PcInstance player)
  790.     {
  791.         registerAttacker(player, false);
  792.     }
  793.    
  794.     public void registerToSiege(L2PcInstance player, int id, int mode)
  795.     {
  796.         if (player.getClan() != null && !SiegeManager.getInstance().checkIsRegistered(player.getClan(), id))
  797.             saveSiegeClan(player.getClan(), mode, false);
  798.     }
  799.  
  800.     public void registerAttacker(L2PcInstance player, boolean force)
  801.     {
  802.         if (!force)
  803.         {
  804.             int allyId = 0;
  805.             if (getCastle().getOwnerId() != 0)
  806.                 allyId = ClanTable.getInstance().getClan(getCastle().getOwnerId()).getAllyId();
  807.  
  808.             if (allyId != 0 && player.getClan().getAllyId() == allyId)
  809.             {
  810.                 player.sendPacket(SystemMessageId.CANNOT_ATTACK_ALLIANCE_CASTLE);
  811.                 return;
  812.             }
  813.         }
  814.  
  815.         if ((force && player.getClan() != null) || checkIfCanRegister(player, 1))
  816.             saveSiegeClan(player.getClan(), 1, false); // Save to database
  817.     }
  818.  
  819.     /**
  820.      * Register clan as defender<BR><BR>
  821.      * @param player The L2PcInstance of the player trying to register
  822.      */
  823.     public void registerDefender(L2PcInstance player)
  824.     {
  825.         registerDefender(player, false);
  826.     }
  827.  
  828.     public void registerDefender(L2PcInstance player, boolean force)
  829.     {
  830.         if(!force)
  831.         {
  832.             if (getCastle().getOwnerId() <= 0)
  833.             {
  834.                 player.sendPacket(SystemMessageId.DEFENDER_SIDE_FULL);
  835.                 return;
  836.             }
  837.             if (SevenSigns.getInstance().getSealOwner(SevenSigns.SEAL_STRIFE) == SevenSigns.CABAL_DUSK)
  838.             {
  839.                 //strife restricts defenders to only clan's alliance
  840.                 int allyId = 0;
  841.                 if (getCastle().getOwnerId() != 0)
  842.                     allyId = ClanTable.getInstance().getClan(getCastle().getOwnerId()).getAllyId();
  843.                 if (allyId != 0 && player.getClan().getAllyId() != allyId)
  844.                 {
  845.                     player.sendPacket(SystemMessageId.DEFENDER_SIDE_FULL);
  846.                     return;
  847.                 }
  848.             }
  849.         }
  850.  
  851.         if ((force && player.getClan() != null) || checkIfCanRegister(player, 2))
  852.             saveSiegeClan(player.getClan(), 2, false); // Save to database
  853.     }
  854.  
  855.     /**
  856.      * Remove clan from siege<BR><BR>
  857.      * @param clanId The int of player's clan id
  858.      */
  859.     public void removeSiegeClan(int clanId)
  860.     {
  861.         if (clanId <= 0)
  862.             return;
  863.  
  864.         Connection con = null;
  865.         try
  866.         {
  867.             con = L2DatabaseFactory.getInstance().getConnection(con);
  868.             PreparedStatement statement = con.prepareStatement("DELETE FROM siege_clans WHERE castle_id=? and clan_id=?");
  869.             statement.setInt(1, getCastle().getCastleId());
  870.             statement.setInt(2, clanId);
  871.             statement.execute();
  872.             statement.close();
  873.             SiegeManager.getInstance().removeClan(getCastle().getCastleId(), clanId);
  874.             loadSiegeClan(false);
  875.            
  876.         }
  877.         catch (Exception e)
  878.         {
  879.             _log.error(e.getMessage(), e);
  880.         }
  881.         finally
  882.         {
  883.             try
  884.             {
  885.                 if (con != null)
  886.                     con.close();
  887.             }
  888.             catch (SQLException e)
  889.             {
  890.                 e.printStackTrace();
  891.             }
  892.         }
  893.     }
  894.  
  895.     /**
  896.      * Remove clan from siege<BR><BR>
  897.      */
  898.     public void removeSiegeClan(L2Clan clan)
  899.     {
  900.         if (clan == null || clan.getHasCastle() == getCastle().getCastleId() || !SiegeManager.getInstance().checkIsRegistered(clan, getCastle().getCastleId()))
  901.             return;
  902.         removeSiegeClan(clan.getClanId());
  903.     }
  904.  
  905.     /**
  906.      * Remove clan from siege<BR><BR>
  907.      * @param player The L2PcInstance of player/clan being removed
  908.      */
  909.     public void removeSiegeClan(L2PcInstance player)
  910.     {
  911.         removeSiegeClan(player.getClan());
  912.     }
  913.  
  914.     /**
  915.      * Start the auto tasks<BR><BR>
  916.      */
  917.     public void startAutoTask()
  918.     {
  919.         correctSiegeDateTime();
  920.  
  921.         _log.info("Siege of " + getCastle().getName() + ": " + getCastle().getSiegeDate().getTime());
  922.  
  923.         loadSiegeClan(false);
  924.  
  925.         // Schedule siege auto start
  926.         _startSiegeTask.schedule(1000);
  927.     }
  928.  
  929.     /**
  930.      * Teleport players
  931.      */
  932.     public void teleportPlayer(TeleportWhoType teleportWho, TeleportWhereType teleportWhere)
  933.     {
  934.         FastList<L2PcInstance> players;
  935.         switch (teleportWho)
  936.         {
  937.             case Owner:
  938.                 players = getOwnersInZone();
  939.                 break;
  940.             case Attacker:
  941.                 players = getAttackersInZone();
  942.                 break;
  943.             case DefenderNotOwner:
  944.                 players = getDefendersButNotOwnersInZone();
  945.                 break;
  946.             case Spectator:
  947.                 players = getSpectatorsInZone();
  948.                 break;
  949.             default:
  950.                 players = getPlayersInZone();
  951.         }
  952.  
  953.         for (L2PcInstance player : players)
  954.         {
  955.             if (player.isGM() || player.isInJail())
  956.                 continue;
  957.             L2SiegeStatus.getInstance().addStatus(player.getClanId(), player.getCharId());
  958.             player.teleToLocation(teleportWhere);
  959.         }
  960.     }
  961.  
  962.     /**
  963.      * Add clan as attacker<BR><BR>
  964.      * @param clanId The int of clan's id
  965.      */
  966.     private void addAttacker(int clanId)
  967.     {
  968.         getAttackerClans().add(new L2SiegeClan(clanId, SiegeClanType.ATTACKER)); // Add registered attacker to attacker list
  969.     }
  970.  
  971.     /**
  972.      * Add clan as defender<BR><BR>
  973.      * @param clanId The int of clan's id
  974.      */
  975.     private void addDefender(int clanId)
  976.     {
  977.         getDefenderClans().add(new L2SiegeClan(clanId, SiegeClanType.DEFENDER)); // Add registered defender to defender list
  978.     }
  979.  
  980.     /**
  981.      * <p>Add clan as defender with the specified type</p>
  982.      * @param clanId The int of clan's id
  983.      * @param type the type of the clan
  984.      */
  985.     private void addDefender(int clanId, SiegeClanType type)
  986.     {
  987.         getDefenderClans().add(new L2SiegeClan(clanId, type));
  988.     }
  989.  
  990.     /**
  991.      * Add clan as defender waiting approval<BR><BR>
  992.      * @param clanId The int of clan's id
  993.      */
  994.     private void addDefenderWaiting(int clanId)
  995.     {
  996.         getDefenderWaitingClans().add(new L2SiegeClan(clanId, SiegeClanType.DEFENDER_PENDING)); // Add registered defender to defender list
  997.     }
  998.  
  999.     /**
  1000.      * Return true if the player can register.<BR><BR>
  1001.      * @param player The L2PcInstance of the player trying to register
  1002.      */
  1003.     private boolean checkIfCanRegister(L2PcInstance player, int typeId)
  1004.     {
  1005.         L2Clan clan = player.getClan();
  1006.         if (clan == null || clan.getLevel() < Config.SIEGE_CLAN_MIN_LEVEL)
  1007.         {
  1008.             player.sendMessage(String.format(Message.getMessage(player, Message.MessageId.MSG_LOW_CLAN_LEVEL),Config.SIEGE_CLAN_MIN_LEVEL));
  1009.             return false;
  1010.         }
  1011.         else if (clan.getMembersCount() < Config.SIEGE_CLAN_MIN_MEMBERCOUNT)
  1012.         {
  1013.             player.sendMessage(String.format(Message.getMessage(player, Message.MessageId.MSG_NOT_ENOUGH_CLAN_MEMBERS),Config.SIEGE_CLAN_MIN_MEMBERCOUNT));
  1014.             return false;
  1015.         }
  1016.         else if (getIsRegistrationOver())
  1017.         {
  1018.             SystemMessage sm = new SystemMessage(SystemMessageId.DEADLINE_FOR_SIEGE_S1_PASSED);
  1019.             sm.addString(getCastle().getName());
  1020.             player.sendPacket(sm);
  1021.             return false;
  1022.         }
  1023.         else if (getIsInProgress())
  1024.         {
  1025.             player.sendPacket(SystemMessageId.NOT_SIEGE_REGISTRATION_TIME2);
  1026.             return false;
  1027.         }
  1028.         else if (clan.getHasCastle() > 0)
  1029.         {
  1030.             player.sendPacket(SystemMessageId.CLAN_THAT_OWNS_CASTLE_CANNOT_PARTICIPATE_OTHER_SIEGE);
  1031.             return false;
  1032.         }
  1033.         else if (clan.getClanId() == getCastle().getOwnerId())
  1034.         {
  1035.             player.sendPacket(SystemMessageId.CLAN_THAT_OWNS_CASTLE_IS_AUTOMATICALLY_REGISTERED_DEFENDING);
  1036.             return false;
  1037.         }
  1038.         else if (checkIfAlreadyRegisteredForSameDay(player.getClan()))
  1039.         {
  1040.             player.sendPacket(SystemMessageId.APPLICATION_DENIED_BECAUSE_ALREADY_SUBMITTED_A_REQUEST_FOR_ANOTHER_SIEGE_BATTLE);
  1041.             return false;
  1042.         }
  1043.         else
  1044.         {
  1045.             for (int i = 0; i < 10; i++)
  1046.             {
  1047.                 if (SiegeManager.getInstance().checkIsRegistered(player.getClan(), i))
  1048.                 {
  1049.                     player.sendPacket(SystemMessageId.ALREADY_REQUESTED_SIEGE_BATTLE);
  1050.                     return false;
  1051.                 }
  1052.             }
  1053.         }
  1054.  
  1055.         if (typeId == 0 || typeId == 2 || typeId == -1)
  1056.         {
  1057.             if (getDefenderClans().size() + getDefenderWaitingClans().size() >= Config.SIEGE_MAX_DEFENDER)
  1058.             {
  1059.                 player.sendPacket(SystemMessageId.DEFENDER_SIDE_FULL);
  1060.                 return false;
  1061.             }
  1062.         }
  1063.         if (typeId == 1)
  1064.         {
  1065.             if (getAttackerClans().size() >= Config.SIEGE_MAX_ATTACKER)
  1066.             {
  1067.                 player.sendPacket(SystemMessageId.ATTACKER_SIDE_FULL);
  1068.                 return false;
  1069.             }
  1070.         }
  1071.  
  1072.         return true;
  1073.     }
  1074.  
  1075.     /**
  1076.      * Return true if the clan has already registered to a siege for the same day.<BR><BR>
  1077.      * @param clan The L2Clan of the player trying to register
  1078.      */
  1079.     public boolean checkIfAlreadyRegisteredForSameDay(L2Clan clan)
  1080.     {
  1081.         for (Siege siege : SiegeManager.getInstance().getSieges())
  1082.         {
  1083.             if (siege == this)
  1084.                 continue;
  1085.             if (siege.getSiegeDate().get(Calendar.DAY_OF_WEEK) == this.getSiegeDate().get(Calendar.DAY_OF_WEEK))
  1086.             {
  1087.                 if (siege.checkIsAttacker(clan))
  1088.                     return true;
  1089.                 if (siege.checkIsDefender(clan))
  1090.                     return true;
  1091.                 if (siege.checkIsDefenderWaiting(clan))
  1092.                     return true;
  1093.             }
  1094.         }
  1095.         return false;
  1096.     }
  1097.  
  1098.     /**
  1099.      * Коректировка времени осад
  1100.      **/
  1101.     public void correctSiegeDateTime()
  1102.     {
  1103.         boolean corrected = false;
  1104.  
  1105.         if (getCastle().getSiegeDate().getTimeInMillis() < System.currentTimeMillis())
  1106.         {
  1107.             corrected = true;
  1108.             setNextSiegeDate();
  1109.         }
  1110.  
  1111.         if (!SevenSigns.getInstance().isDateInSealValidPeriod(getCastle().getSiegeDate()))
  1112.         {
  1113.             corrected = true;
  1114.             setNextSiegeDate();
  1115.         }
  1116.  
  1117.         if (corrected)
  1118.             saveSiegeDate();
  1119.     }
  1120.  
  1121.     /**
  1122.      * Загружаем зарегестрированы на осаду кланы
  1123.      */
  1124.     private void loadSiegeClan(boolean clearStatus)
  1125.     {
  1126.         Connection con = null;
  1127.         try
  1128.         {
  1129.             getAttackerClans().clear();
  1130.             getDefenderClans().clear();
  1131.             getDefenderWaitingClans().clear();
  1132.  
  1133.             // Add castle owner as defender (add owner first so that they are on the top of the defender list)
  1134.             if (getCastle().getOwnerId() > 0)
  1135.                 addDefender(getCastle().getOwnerId(), SiegeClanType.OWNER);
  1136.  
  1137.             PreparedStatement statement = null;
  1138.             ResultSet rs = null;
  1139.  
  1140.             con = L2DatabaseFactory.getInstance().getConnection(con);
  1141.  
  1142.             statement = con.prepareStatement("SELECT clan_id,type FROM siege_clans where castle_id=?");
  1143.             statement.setInt(1, getCastle().getCastleId());
  1144.             rs = statement.executeQuery();
  1145.  
  1146.             int typeId;
  1147.             int clanId;
  1148.             while (rs.next())
  1149.             {
  1150.                 typeId = rs.getInt("type");
  1151.                 clanId =rs.getInt("clan_id");
  1152.                 if (typeId == 0)
  1153.                     addDefender(clanId);
  1154.                 else if (typeId == 1)
  1155.                     addAttacker(clanId);
  1156.                 else if (typeId == 2)
  1157.                     addDefenderWaiting(clanId);
  1158.                 if (clearStatus)
  1159.                     L2SiegeStatus.getInstance().clearClanStatus(clanId);
  1160.             }
  1161.  
  1162.             statement.close();
  1163.         }
  1164.         catch (Exception e)
  1165.         {
  1166.             _log.error("Exception: loadSiegeClan(): " + e.getMessage(), e);
  1167.         }
  1168.         finally
  1169.         {
  1170.             try
  1171.             {
  1172.                 if (con != null)
  1173.                     con.close();
  1174.             }
  1175.             catch (SQLException e)
  1176.             {
  1177.                 e.printStackTrace();
  1178.             }
  1179.         }
  1180.     }
  1181.  
  1182.     /** Remove all control tower spawned. */
  1183.     private void removeControlTower()
  1184.     {
  1185.         if (_controlTowers != null)
  1186.         {
  1187.             // Remove all instance of control tower for this castle
  1188.             for (L2ControlTowerInstance ct : _controlTowers)
  1189.             {
  1190.                 if (ct != null)
  1191.                     ct.decayMe();
  1192.             }
  1193.  
  1194.             _controlTowers = null;
  1195.         }
  1196.     }
  1197.  
  1198.     /** Remove all flags. */
  1199.     private void removeFlags()
  1200.     {
  1201.         for (L2SiegeClan sc : getAttackerClans())
  1202.         {
  1203.             if (sc != null)
  1204.                 sc.removeFlags();
  1205.         }
  1206.         for (L2SiegeClan sc : getDefenderClans())
  1207.         {
  1208.             if (sc != null)
  1209.                 sc.removeFlags();
  1210.         }
  1211.     }
  1212.  
  1213.     /** Remove flags from defenders. */
  1214.     private void removeDefenderFlags()
  1215.     {
  1216.         for (L2SiegeClan sc : getDefenderClans())
  1217.         {
  1218.             if (sc != null)
  1219.                 sc.removeFlags();
  1220.         }
  1221.     }
  1222.  
  1223.     private void saveCastleSiege()
  1224.     {
  1225.         setNextSiegeDate();
  1226.         getTimeRegistrationOverDate().setTimeInMillis(Calendar.getInstance().getTimeInMillis());
  1227.         getTimeRegistrationOverDate().add(Calendar.DAY_OF_MONTH, 1);
  1228.         getCastle().setIsTimeRegistrationOver(false);
  1229.         saveSiegeDate();
  1230.         startAutoTask();
  1231.     }
  1232.  
  1233.     public void saveSiegeDate()
  1234.     {
  1235.         if (_startSiegeTask.isScheduled())
  1236.             _startSiegeTask.schedule(1000);
  1237.  
  1238.         Connection con = null;
  1239.         try
  1240.         {
  1241.             con = L2DatabaseFactory.getInstance().getConnection(con);
  1242.             PreparedStatement statement = con.prepareStatement("UPDATE castle SET siegeDate = ?, regTimeEnd = ?, regTimeOver = ?, AutoTime = ?  WHERE id = ?");
  1243.             statement.setLong(1, getSiegeDate().getTimeInMillis());
  1244.             statement.setLong(2, getTimeRegistrationOverDate().getTimeInMillis());
  1245.             statement.setString(3, String.valueOf(getIsTimeRegistrationOver()));
  1246.             statement.setString(4, "true");
  1247.             statement.setInt(5, getCastle().getCastleId());
  1248.             statement.execute();
  1249.  
  1250.             statement.close();
  1251.         }
  1252.         catch (Exception e)
  1253.         {
  1254.             _log.error("Exception: saveSiegeDate(): " + e.getMessage(), e);
  1255.         }
  1256.         finally
  1257.         {
  1258.             try
  1259.             {
  1260.                 if (con != null)
  1261.                     con.close();
  1262.             }
  1263.             catch (SQLException e)
  1264.             {
  1265.                 e.printStackTrace();
  1266.             }
  1267.         }
  1268.     }
  1269.  
  1270.     /**
  1271.      * Save registration to database.<BR><BR>
  1272.      * @param clan The L2Clan of player
  1273.      * @param typeId -1 = owner 0 = defender, 1 = attacker, 2 = defender waiting
  1274.      */
  1275.     private void saveSiegeClan(L2Clan clan, int typeId, boolean isUpdateRegistration)
  1276.     {
  1277.         if (clan.getHasCastle() > 0)
  1278.             return;
  1279.        
  1280.         Connection con = null;
  1281.         try
  1282.         {
  1283.             con = L2DatabaseFactory.getInstance().getConnection(con);
  1284.             PreparedStatement statement;
  1285.             if (!isUpdateRegistration)
  1286.             {
  1287.                 statement = con.prepareStatement("INSERT INTO siege_clans (clan_id,castle_id,type,castle_owner) VALUES (?,?,?,0)");
  1288.                 statement.setInt(1, clan.getClanId());
  1289.                 statement.setInt(2, getCastle().getCastleId());
  1290.                 statement.setInt(3, typeId);
  1291.                 statement.execute();
  1292.                 statement.close();
  1293.                 SiegeManager.getInstance().registerClan(getCastle().getCastleId(), clan);
  1294.             }
  1295.             else
  1296.             {
  1297.                 statement = con.prepareStatement("UPDATE siege_clans SET type = ? WHERE castle_id = ? AND clan_id = ?");
  1298.                 statement.setInt(1, typeId);
  1299.                 statement.setInt(2, getCastle().getCastleId());
  1300.                 statement.setInt(3, clan.getClanId());
  1301.                 statement.execute();
  1302.                 statement.close();
  1303.             }
  1304.  
  1305.             if (typeId == 0 || typeId == -1)
  1306.             {
  1307.                 addDefender(clan.getClanId());
  1308.                 announceToPlayer(clan.getName()+" зарегистрирован на защиту замка: "+getCastle().getName(), false);
  1309.             }
  1310.             else if (typeId == 1)
  1311.             {
  1312.                 addAttacker(clan.getClanId());
  1313.                 announceToPlayer(clan.getName()+" зарегистрирован на атаку замка: "+getCastle().getName(), false);
  1314.             }
  1315.             else if (typeId == 2)
  1316.             {
  1317.                 addDefenderWaiting(clan.getClanId());
  1318.                 announceToPlayer(clan.getName()+" обращается с просьбой защитить замок: "+getCastle().getName(), false);
  1319.             }
  1320.         }
  1321.         catch (Exception e)
  1322.         {
  1323.             _log.error("Exception: saveSiegeClan(L2Clan clan, int typeId, boolean isUpdateRegistration): " + e.getMessage(), e);
  1324.         }
  1325.         finally
  1326.         {
  1327.             try
  1328.             {
  1329.                 if (con != null)
  1330.                     con.close();
  1331.             }
  1332.             catch (SQLException e)
  1333.             {
  1334.                 e.printStackTrace();
  1335.             }
  1336.         }
  1337.     }
  1338.  
  1339.     /**
  1340.      * Устанавливаем дату следующей осады
  1341.      * Если нужно коректируем время осад
  1342.      **/
  1343.     private void setNextSiegeDate()
  1344.     {
  1345.         while (getCastle().getSiegeDate().getTimeInMillis() < System.currentTimeMillis())
  1346.         {
  1347.             if (getCastle().getSiegeDate().get(Calendar.DAY_OF_WEEK) != Calendar.SATURDAY && getCastle().getSiegeDate().get(Calendar.DAY_OF_WEEK) != Calendar.SUNDAY)
  1348.             {
  1349.                 switch (getCastle().getCastleId())
  1350.                 {
  1351.                     case 1:
  1352.                     case 2:
  1353.                     case 5:
  1354.                     case 8:
  1355.                         getCastle().getSiegeDate().set(Calendar.DAY_OF_WEEK, Calendar.SATURDAY);
  1356.                         break;
  1357.                     case 3:
  1358.                     case 4:
  1359.                     case 6:
  1360.                     case 7:
  1361.                     case 9:
  1362.                         getCastle().getSiegeDate().set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);
  1363.                         break;
  1364.                     default:
  1365.                         _log.info("Could't set siege day for castle ID: " + getCastle().getCastleId());
  1366.                         break;
  1367.                 }
  1368.             }
  1369.  
  1370.             /**
  1371.              * Переносим время осад на неделю позже
  1372.              * Если необходимо, коректируем дату осад
  1373.              **/
  1374.             getCastle().getSiegeDate().add(Calendar.DAY_OF_MONTH, 7);
  1375.             if (!getCastle().isAutoTime())
  1376.             {
  1377.                 switch (getCastle().getCastleId())
  1378.                 {
  1379.                     case 1:
  1380.                     case 2:
  1381.                     case 5:
  1382.                     case 8:
  1383.                         getCastle().getSiegeDate().set(Calendar.DAY_OF_WEEK, Calendar.SATURDAY);
  1384.                         getCastle().getSiegeDate().set(Calendar.HOUR_OF_DAY, 20);
  1385.                         break;
  1386.                     case 3:
  1387.                     case 4:
  1388.                     case 6:
  1389.                     case 7:
  1390.                     case 9:
  1391.                         getCastle().getSiegeDate().set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);
  1392.                         getCastle().getSiegeDate().set(Calendar.HOUR_OF_DAY, 16);
  1393.                         break;
  1394.                     default:
  1395.                         _log.info("Could't set siege day for castle ID: " + getCastle().getCastleId());
  1396.                         break;
  1397.                 }
  1398.                 getCastle().getSiegeDate().set(Calendar.MINUTE, 00);
  1399.             }
  1400.         }
  1401.  
  1402.         if (!SevenSigns.getInstance().isDateInSealValidPeriod(getCastle().getSiegeDate()) && Config.CORECT_SIEGE_DATE_BY_7S)
  1403.             getCastle().getSiegeDate().add(Calendar.DAY_OF_MONTH, 7);
  1404.  
  1405.         SystemMessage sm = new SystemMessage(SystemMessageId.S1_ANNOUNCED_SIEGE_TIME);
  1406.         sm.addString(getCastle().getName());
  1407.         Announcements.getInstance().announceToAll(sm);
  1408.  
  1409.         _isRegistrationOver = false; // Allow registration for next siege
  1410.     }
  1411.  
  1412.     /** Spawn control tower. */
  1413.     private void spawnControlTower(int Id)
  1414.     {
  1415.         //Set control tower array size if one does not exist
  1416.         if (_controlTowers == null)
  1417.             _controlTowers = new FastList<L2ControlTowerInstance>();
  1418.  
  1419.         for (SiegeSpawn _sp : SiegeManager.getInstance().getControlTowerSpawnList(Id))
  1420.         {
  1421.             L2ControlTowerInstance ct;
  1422.  
  1423.             L2NpcTemplate template = NpcTable.getInstance().getTemplate(_sp.getNpcId());
  1424.  
  1425.             template.setBaseHpMax(_sp.getHp());
  1426.  
  1427.             ct = new L2ControlTowerInstance(IdFactory.getInstance().getNextId(), template);
  1428.             ct.getStatus().setCurrentHpMp(_sp.getHp(), ct.getMaxMp());
  1429.             ct.spawnMe(_sp.getLocation().getX(), _sp.getLocation().getY(), _sp.getLocation().getZ() + 20);
  1430.  
  1431.             _controlTowerCount++;
  1432.             _controlTowerMaxCount++;
  1433.             _controlTowers.add(ct);
  1434.         }
  1435.     }
  1436.  
  1437.     /**
  1438.      * Spawn siege guard.<BR><BR>
  1439.      */
  1440.     private void spawnSiegeGuard()
  1441.     {
  1442.         getSiegeGuardManager().spawnSiegeGuard();
  1443.  
  1444.         // Register guard to the closest Control Tower
  1445.         // When CT dies, so do all the guards that it controls
  1446.         if (!getSiegeGuardManager().getSiegeGuardSpawn().isEmpty() && !_controlTowers.isEmpty())
  1447.         {
  1448.             L2ControlTowerInstance closestCt;
  1449.             double distance, x, y, z;
  1450.             double distanceClosest = 0;
  1451.             for (L2Spawn spawn : getSiegeGuardManager().getSiegeGuardSpawn())
  1452.             {
  1453.                 if (spawn == null)
  1454.                     continue;
  1455.                 closestCt = null;
  1456.                 distanceClosest = 0;
  1457.                 for (L2ControlTowerInstance ct : _controlTowers)
  1458.                 {
  1459.                     if (ct == null)
  1460.                         continue;
  1461.                     x = (spawn.getLocx() - ct.getX());
  1462.                     y = (spawn.getLocy() - ct.getY());
  1463.                     z = (spawn.getLocz() - ct.getZ());
  1464.  
  1465.                     distance = (x * x) + (y * y) + (z * z);
  1466.  
  1467.                     if (closestCt == null || distance < distanceClosest)
  1468.                     {
  1469.                         closestCt = ct;
  1470.                         distanceClosest = distance;
  1471.                     }
  1472.                 }
  1473.  
  1474.                 if (closestCt != null)
  1475.                     closestCt.registerGuard(spawn);
  1476.             }
  1477.         }
  1478.     }
  1479.  
  1480.     public final L2SiegeClan getAttackerClan(L2Clan clan)
  1481.     {
  1482.         if (clan == null)
  1483.             return null;
  1484.         return getAttackerClan(clan.getClanId());
  1485.     }
  1486.  
  1487.     public final L2SiegeClan getAttackerClan(int clanId)
  1488.     {
  1489.         for (L2SiegeClan sc : getAttackerClans())
  1490.             if (sc != null && sc.getClanId() == clanId)
  1491.                 return sc;
  1492.         return null;
  1493.     }
  1494.  
  1495.     public final FastList<L2SiegeClan> getAttackerClans()
  1496.     {
  1497.         if (_isNormalSide)
  1498.             return _attackerClans;
  1499.         return _defenderClans;
  1500.     }
  1501.  
  1502.     public final int getAttackerRespawnDelay()
  1503.     {
  1504.         return (Config.SIEGE_RESPAWN_DELAY_ATTACKER);
  1505.     }
  1506.  
  1507.     public final Castle getCastle()
  1508.     {
  1509.         return _castle;
  1510.     }
  1511.  
  1512.     public final L2SiegeClan getDefenderClan(L2Clan clan)
  1513.     {
  1514.         if (clan == null)
  1515.             return null;
  1516.         return getDefenderClan(clan.getClanId());
  1517.     }
  1518.  
  1519.     public final L2SiegeClan getDefenderClan(int clanId)
  1520.     {
  1521.         for (L2SiegeClan sc : getDefenderClans())
  1522.         {
  1523.             if (sc != null && sc.getClanId() == clanId)
  1524.                 return sc;
  1525.         }
  1526.         return null;
  1527.     }
  1528.  
  1529.     public final FastList<L2SiegeClan> getDefenderClans()
  1530.     {
  1531.         if (_isNormalSide)
  1532.             return _defenderClans;
  1533.         return _attackerClans;
  1534.     }
  1535.  
  1536.     public final L2SiegeClan getDefenderWaitingClan(L2Clan clan)
  1537.     {
  1538.         if (clan == null)
  1539.             return null;
  1540.         return getDefenderWaitingClan(clan.getClanId());
  1541.     }
  1542.  
  1543.     public final L2SiegeClan getDefenderWaitingClan(int clanId)
  1544.     {
  1545.         for (L2SiegeClan sc : getDefenderWaitingClans())
  1546.             if (sc != null && sc.getClanId() == clanId)
  1547.                 return sc;
  1548.         return null;
  1549.     }
  1550.  
  1551.     public final FastList<L2SiegeClan> getDefenderWaitingClans()
  1552.     {
  1553.         return _defenderWaitingClans;
  1554.     }
  1555.  
  1556.     public final boolean getIsInProgress()
  1557.     {
  1558.         return _isInProgress;
  1559.     }
  1560.  
  1561.     public final boolean getIsRegistrationOver()
  1562.     {
  1563.         return _isRegistrationOver;
  1564.     }
  1565.  
  1566.     public final boolean getIsTimeRegistrationOver()
  1567.     {
  1568.         return getCastle().getIsTimeRegistrationOver();
  1569.     }
  1570.  
  1571.     public final Calendar getSiegeDate()
  1572.     {
  1573.         return getCastle().getSiegeDate();
  1574.     }
  1575.  
  1576.     public final Calendar getTimeRegistrationOverDate()
  1577.     {
  1578.         return getCastle().getTimeRegistrationOverDate();
  1579.     }
  1580.  
  1581.     public void endTimeRegistration(boolean automatic)
  1582.     {
  1583.         getCastle().setIsTimeRegistrationOver(true);
  1584.         if (!automatic) {
  1585.             saveSiegeDate();
  1586.             Broadcast.toAllOnlinePlayers(new SystemMessage(SystemMessageId.S1_ANNOUNCED_SIEGE_TIME).addString(getCastle().getName()));
  1587.         }
  1588.     }
  1589.  
  1590.     public Set<L2NpcInstance> getFlag(L2Clan clan)
  1591.     {
  1592.         if (clan != null)
  1593.         {
  1594.             L2SiegeClan sc = getAttackerClan(clan);
  1595.             if (sc != null)
  1596.                 return sc.getFlag();
  1597.         }
  1598.         return null;
  1599.     }
  1600.  
  1601.     public L2NpcInstance getClosestFlag(L2Object obj)
  1602.     {
  1603.         if ((obj != null) && (obj instanceof L2PcInstance))
  1604.         {
  1605.             if (((L2PcInstance) obj).getClan() != null)
  1606.             {
  1607.                 L2SiegeClan sc = getAttackerClan(((L2PcInstance) obj).getClan());
  1608.                 if (sc != null)
  1609.                     return sc.getClosestFlag(obj);
  1610.             }
  1611.         }
  1612.         return null;
  1613.     }
  1614.  
  1615.     public final SiegeGuardManager getSiegeGuardManager()
  1616.     {
  1617.         if (_siegeGuardManager == null)
  1618.             _siegeGuardManager = new SiegeGuardManager(getCastle().getName(),getCastle().getCastleId(),getCastle().getOwnerId());
  1619.  
  1620.         return _siegeGuardManager;
  1621.     }
  1622.  
  1623.     public final L2SiegeZone getZone()
  1624.     {
  1625.         return getCastle().getBattlefield();
  1626.     }
  1627.  
  1628.     public int getControlTowerCount()
  1629.     {
  1630.         return _controlTowerCount;
  1631.     }
  1632. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement