940 lines
		
	
	
		
			23 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
			
		
		
	
	
			940 lines
		
	
	
		
			23 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
| /*
 | |
|  * Copyright (C) 2004-2015 L2J DataPack
 | |
|  * 
 | |
|  * This file is part of L2J DataPack.
 | |
|  * 
 | |
|  * L2J DataPack is free software: you can redistribute it and/or modify
 | |
|  * it under the terms of the GNU General Public License as published by
 | |
|  * the Free Software Foundation, either version 3 of the License, or
 | |
|  * (at your option) any later version.
 | |
|  * 
 | |
|  * L2J DataPack 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 conquerablehalls.RainbowSpringsChateau;
 | |
| 
 | |
| import java.sql.Connection;
 | |
| import java.sql.PreparedStatement;
 | |
| import java.sql.ResultSet;
 | |
| import java.util.ArrayList;
 | |
| import java.util.Calendar;
 | |
| import java.util.Collection;
 | |
| import java.util.Date;
 | |
| import java.util.HashMap;
 | |
| import java.util.List;
 | |
| import java.util.Map;
 | |
| import java.util.concurrent.ScheduledFuture;
 | |
| 
 | |
| import com.l2jserver.Config;
 | |
| import com.l2jserver.L2DatabaseFactory;
 | |
| import com.l2jserver.gameserver.ThreadPoolManager;
 | |
| import com.l2jserver.gameserver.cache.HtmCache;
 | |
| import com.l2jserver.gameserver.data.sql.impl.ClanTable;
 | |
| import com.l2jserver.gameserver.datatables.SpawnTable;
 | |
| import com.l2jserver.gameserver.enums.ChatType;
 | |
| import com.l2jserver.gameserver.instancemanager.CHSiegeManager;
 | |
| import com.l2jserver.gameserver.instancemanager.ZoneManager;
 | |
| import com.l2jserver.gameserver.model.L2Clan;
 | |
| import com.l2jserver.gameserver.model.L2Object;
 | |
| import com.l2jserver.gameserver.model.L2Party;
 | |
| import com.l2jserver.gameserver.model.L2Spawn;
 | |
| import com.l2jserver.gameserver.model.Location;
 | |
| import com.l2jserver.gameserver.model.TeleportWhereType;
 | |
| import com.l2jserver.gameserver.model.actor.L2Character;
 | |
| import com.l2jserver.gameserver.model.actor.L2Npc;
 | |
| import com.l2jserver.gameserver.model.actor.L2Summon;
 | |
| import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 | |
| import com.l2jserver.gameserver.model.entity.clanhall.ClanHallSiegeEngine;
 | |
| import com.l2jserver.gameserver.model.entity.clanhall.SiegableHall;
 | |
| import com.l2jserver.gameserver.model.entity.clanhall.SiegeStatus;
 | |
| import com.l2jserver.gameserver.model.items.L2Item;
 | |
| import com.l2jserver.gameserver.model.items.instance.L2ItemInstance;
 | |
| import com.l2jserver.gameserver.model.skills.Skill;
 | |
| import com.l2jserver.gameserver.network.serverpackets.NpcSay;
 | |
| import com.l2jserver.gameserver.util.Broadcast;
 | |
| import com.l2jserver.gameserver.util.Util;
 | |
| 
 | |
| /**
 | |
|  * Rainbow Springs Chateau clan hall siege script.
 | |
|  * @author BiggBoss
 | |
|  */
 | |
| public final class RainbowSpringsChateau extends ClanHallSiegeEngine
 | |
| {
 | |
| 	protected static class SetFinalAttackers implements Runnable
 | |
| 	{
 | |
| 		@Override
 | |
| 		public void run()
 | |
| 		{
 | |
| 			if (_rainbow == null)
 | |
| 			{
 | |
| 				_rainbow = CHSiegeManager.getInstance().getSiegableHall(RAINBOW_SPRINGS);
 | |
| 			}
 | |
| 			
 | |
| 			int spotLeft = 4;
 | |
| 			if (_rainbow.getOwnerId() > 0)
 | |
| 			{
 | |
| 				L2Clan owner = ClanTable.getInstance().getClan(_rainbow.getOwnerId());
 | |
| 				if (owner != null)
 | |
| 				{
 | |
| 					_rainbow.free();
 | |
| 					owner.setHideoutId(0);
 | |
| 					_acceptedClans.add(owner);
 | |
| 					--spotLeft;
 | |
| 				}
 | |
| 				
 | |
| 				for (int i = 0; i < spotLeft; i++)
 | |
| 				{
 | |
| 					long counter = 0;
 | |
| 					L2Clan clan = null;
 | |
| 					for (int clanId : _warDecreesCount.keySet())
 | |
| 					{
 | |
| 						L2Clan actingClan = ClanTable.getInstance().getClan(clanId);
 | |
| 						if ((actingClan == null) || (actingClan.getDissolvingExpiryTime() > 0))
 | |
| 						{
 | |
| 							_warDecreesCount.remove(clanId);
 | |
| 							continue;
 | |
| 						}
 | |
| 						
 | |
| 						final long count = _warDecreesCount.get(clanId);
 | |
| 						if (count > counter)
 | |
| 						{
 | |
| 							counter = count;
 | |
| 							clan = actingClan;
 | |
| 						}
 | |
| 					}
 | |
| 					if ((clan != null) && (_acceptedClans.size() < 4))
 | |
| 					{
 | |
| 						_acceptedClans.add(clan);
 | |
| 						L2PcInstance leader = clan.getLeader().getPlayerInstance();
 | |
| 						if (leader != null)
 | |
| 						{
 | |
| 							leader.sendMessage("Your clan has been accepted to join the RainBow Srpings Chateau siege!");
 | |
| 						}
 | |
| 					}
 | |
| 				}
 | |
| 				if (_acceptedClans.size() >= 2)
 | |
| 				{
 | |
| 					_nextSiege = ThreadPoolManager.getInstance().scheduleGeneral(new SiegeStart(), 3600000);
 | |
| 					_rainbow.updateSiegeStatus(SiegeStatus.WAITING_BATTLE);
 | |
| 				}
 | |
| 				else
 | |
| 				{
 | |
| 					Broadcast.toAllOnlinePlayers("Rainbow Springs Chateau siege aborted due lack of population");
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| 	
 | |
| 	protected static class SiegeStart implements Runnable
 | |
| 	{
 | |
| 		@Override
 | |
| 		public void run()
 | |
| 		{
 | |
| 			if (_rainbow == null)
 | |
| 			{
 | |
| 				_rainbow = CHSiegeManager.getInstance().getSiegableHall(RAINBOW_SPRINGS);
 | |
| 			}
 | |
| 			
 | |
| 			// XXX _rainbow.siegeStarts();
 | |
| 			
 | |
| 			spawnGourds();
 | |
| 			_siegeEnd = ThreadPoolManager.getInstance().scheduleGeneral(new SiegeEnd(null), _rainbow.getSiegeLenght() - 120000);
 | |
| 		}
 | |
| 	}
 | |
| 	
 | |
| 	public static L2Clan _winner;
 | |
| 	
 | |
| 	@Override
 | |
| 	public L2Clan getWinner()
 | |
| 	{
 | |
| 		return _winner;
 | |
| 	}
 | |
| 	
 | |
| 	private static class SiegeEnd implements Runnable
 | |
| 	{
 | |
| 		private final L2Clan _winner;
 | |
| 		
 | |
| 		protected SiegeEnd(L2Clan winner)
 | |
| 		{
 | |
| 			_winner = winner;
 | |
| 		}
 | |
| 		
 | |
| 		@Override
 | |
| 		public void run()
 | |
| 		{
 | |
| 			if (_rainbow == null)
 | |
| 			{
 | |
| 				_rainbow = CHSiegeManager.getInstance().getSiegableHall(RAINBOW_SPRINGS);
 | |
| 			}
 | |
| 			
 | |
| 			unSpawnGourds();
 | |
| 			
 | |
| 			if (_winner != null)
 | |
| 			{
 | |
| 				_rainbow.setOwner(_winner);
 | |
| 			}
 | |
| 			
 | |
| 			// XXX _rainbow.siegeEnds();
 | |
| 			
 | |
| 			ThreadPoolManager.getInstance().scheduleGeneral(new SetFinalAttackers(), _rainbow.getNextSiegeTime());
 | |
| 			setRegistrationEndString((_rainbow.getNextSiegeTime() + System.currentTimeMillis()) - 3600000);
 | |
| 			// Teleport out of the arenas is made 2 mins after game ends
 | |
| 			ThreadPoolManager.getInstance().scheduleGeneral(new TeleportBack(), 120000);
 | |
| 		}
 | |
| 	}
 | |
| 	
 | |
| 	protected static class TeleportBack implements Runnable
 | |
| 	{
 | |
| 		@Override
 | |
| 		public void run()
 | |
| 		{
 | |
| 			for (int arenaId : ARENA_ZONES)
 | |
| 			{
 | |
| 				final Collection<L2Character> chars = ZoneManager.getInstance().getZoneById(arenaId).getCharactersInside();
 | |
| 				for (L2Character chr : chars)
 | |
| 				{
 | |
| 					if (chr != null)
 | |
| 					{
 | |
| 						chr.teleToLocation(TeleportWhereType.TOWN);
 | |
| 					}
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| 	
 | |
| 	private static final int RAINBOW_SPRINGS = 62;
 | |
| 	
 | |
| 	private static final int WAR_DECREES = 8034;
 | |
| 	private static final int RAINBOW_NECTAR = 8030;
 | |
| 	private static final int RAINBOW_MWATER = 8031;
 | |
| 	private static final int RAINBOW_WATER = 8032;
 | |
| 	private static final int RAINBOW_SULFUR = 8033;
 | |
| 	
 | |
| 	private static final int MESSENGER = 35604;
 | |
| 	private static final int CARETAKER = 35603;
 | |
| 	private static final int CHEST = 35593;
 | |
| 	
 | |
| 	private static final int[] GOURDS =
 | |
| 	{
 | |
| 		35588,
 | |
| 		35589,
 | |
| 		35590,
 | |
| 		35591
 | |
| 	};
 | |
| 	private static L2Spawn[] _gourds = new L2Spawn[4];
 | |
| 	
 | |
| 	private static final int[] YETIS =
 | |
| 	{
 | |
| 		35596,
 | |
| 		35597,
 | |
| 		35598,
 | |
| 		35599
 | |
| 	};
 | |
| 	
 | |
| 	private static final Location[] ARENAS = new Location[]
 | |
| 	{
 | |
| 		new Location(151562, -127080, -2214), // Arena 1
 | |
| 		new Location(153141, -125335, -2214), // Arena 2
 | |
| 		new Location(153892, -127530, -2214), // Arena 3
 | |
| 		new Location(155657, -125752, -2214), // Arena 4
 | |
| 	};
 | |
| 	
 | |
| 	protected static final int[] ARENA_ZONES =
 | |
| 	{
 | |
| 		112081,
 | |
| 		112082,
 | |
| 		112083,
 | |
| 		112084
 | |
| 	};
 | |
| 	
 | |
| 	private static final String[] _textPassages =
 | |
| 	{
 | |
| 		"Fight for Rainbow Springs!",
 | |
| 		"Are you a match for the Yetti?",
 | |
| 		"Did somebody order a knuckle sandwich?"
 | |
| 	};
 | |
| 	
 | |
| 	private static final Skill[] DEBUFFS = {};
 | |
| 	
 | |
| 	protected static Map<Integer, Long> _warDecreesCount = new HashMap<>();
 | |
| 	protected static List<L2Clan> _acceptedClans = new ArrayList<>(4);
 | |
| 	private static Map<String, ArrayList<L2Clan>> _usedTextPassages = new HashMap<>();
 | |
| 	private static Map<L2Clan, Integer> _pendingItemToGet = new HashMap<>();
 | |
| 	
 | |
| 	protected static SiegableHall _rainbow;
 | |
| 	protected static ScheduledFuture<?> _nextSiege, _siegeEnd;
 | |
| 	private static String _registrationEnds;
 | |
| 	
 | |
| 	public RainbowSpringsChateau()
 | |
| 	{
 | |
| 		super(RainbowSpringsChateau.class.getSimpleName(), "conquerablehalls", RAINBOW_SPRINGS);
 | |
| 		
 | |
| 		addFirstTalkId(MESSENGER);
 | |
| 		addTalkId(MESSENGER);
 | |
| 		addFirstTalkId(CARETAKER);
 | |
| 		addTalkId(CARETAKER);
 | |
| 		addFirstTalkId(YETIS);
 | |
| 		addTalkId(YETIS);
 | |
| 		
 | |
| 		loadAttackers();
 | |
| 		
 | |
| 		_rainbow = CHSiegeManager.getInstance().getSiegableHall(RAINBOW_SPRINGS);
 | |
| 		if (_rainbow != null)
 | |
| 		{
 | |
| 			long delay = _rainbow.getNextSiegeTime();
 | |
| 			if (delay > -1)
 | |
| 			{
 | |
| 				setRegistrationEndString(delay - 3600000);
 | |
| 				_nextSiege = ThreadPoolManager.getInstance().scheduleGeneral(new SetFinalAttackers(), delay);
 | |
| 			}
 | |
| 			else
 | |
| 			{
 | |
| 				_log.warning("CHSiegeManager: No Date setted for RainBow Springs Chateau Clan hall siege!. SIEGE CANCELED!");
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| 	
 | |
| 	@Override
 | |
| 	public String onFirstTalk(L2Npc npc, L2PcInstance player)
 | |
| 	{
 | |
| 		String html = "";
 | |
| 		final int npcId = npc.getId();
 | |
| 		if (npcId == MESSENGER)
 | |
| 		{
 | |
| 			final String main = (_rainbow.getOwnerId() > 0) ? "messenger_yetti001.htm" : "messenger_yetti001a.htm";
 | |
| 			html = HtmCache.getInstance().getHtm(player.getHtmlPrefix(), "data/scripts/conquerablehalls/RainbowSpringsChateau/" + main);
 | |
| 			html = html.replace("%time%", _registrationEnds);
 | |
| 			if (_rainbow.getOwnerId() > 0)
 | |
| 			{
 | |
| 				html = html.replace("%owner%", ClanTable.getInstance().getClan(_rainbow.getOwnerId()).getName());
 | |
| 			}
 | |
| 		}
 | |
| 		else if (npcId == CARETAKER)
 | |
| 		{
 | |
| 			if (_rainbow.isInSiege())
 | |
| 			{
 | |
| 				html = "game_manager003.htm";
 | |
| 			}
 | |
| 			else
 | |
| 			{
 | |
| 				html = "game_manager001.htm";
 | |
| 			}
 | |
| 		}
 | |
| 		else if (Util.contains(YETIS, npcId))
 | |
| 		{
 | |
| 			// TODO: Review.
 | |
| 			if (_rainbow.isInSiege())
 | |
| 			{
 | |
| 				if (!player.isClanLeader())
 | |
| 				{
 | |
| 					html = "no_clan_leader.htm";
 | |
| 				}
 | |
| 				else
 | |
| 				{
 | |
| 					L2Clan clan = player.getClan();
 | |
| 					if (_acceptedClans.contains(clan))
 | |
| 					{
 | |
| 						int index = _acceptedClans.indexOf(clan);
 | |
| 						if (npcId == YETIS[index])
 | |
| 						{
 | |
| 							html = "yeti_main.htm";
 | |
| 						}
 | |
| 					}
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 		player.setLastQuestNpcObject(npc.getObjectId());
 | |
| 		return html;
 | |
| 	}
 | |
| 	
 | |
| 	@Override
 | |
| 	public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
 | |
| 	{
 | |
| 		String html = event;
 | |
| 		final L2Clan clan = player.getClan();
 | |
| 		switch (npc.getId())
 | |
| 		{
 | |
| 			case MESSENGER:
 | |
| 				switch (event)
 | |
| 				{
 | |
| 					case "register":
 | |
| 						if (!player.isClanLeader())
 | |
| 						{
 | |
| 							html = "messenger_yetti010.htm";
 | |
| 						}
 | |
| 						else if ((clan.getCastleId() > 0) || (clan.getFortId() > 0) || (clan.getHideoutId() > 0))
 | |
| 						{
 | |
| 							html = "messenger_yetti012.htm";
 | |
| 						}
 | |
| 						else if (!_rainbow.isRegistering())
 | |
| 						{
 | |
| 							html = "messenger_yetti014.htm";
 | |
| 						}
 | |
| 						else if (_warDecreesCount.containsKey(clan.getId()))
 | |
| 						{
 | |
| 							html = "messenger_yetti013.htm";
 | |
| 						}
 | |
| 						else if ((clan.getLevel() < 3) || (clan.getMembersCount() < 5))
 | |
| 						{
 | |
| 							html = "messenger_yetti011.htm";
 | |
| 						}
 | |
| 						else
 | |
| 						{
 | |
| 							final L2ItemInstance warDecrees = player.getInventory().getItemByItemId(WAR_DECREES);
 | |
| 							if (warDecrees == null)
 | |
| 							{
 | |
| 								html = "messenger_yetti008.htm";
 | |
| 							}
 | |
| 							else
 | |
| 							{
 | |
| 								long count = warDecrees.getCount();
 | |
| 								_warDecreesCount.put(clan.getId(), count);
 | |
| 								player.destroyItem("Rainbow Springs Registration", warDecrees, npc, true);
 | |
| 								updateAttacker(clan.getId(), count, false);
 | |
| 								html = "messenger_yetti009.htm";
 | |
| 							}
 | |
| 						}
 | |
| 						break;
 | |
| 					case "cancel":
 | |
| 						if (!player.isClanLeader())
 | |
| 						{
 | |
| 							html = "messenger_yetti010.htm";
 | |
| 						}
 | |
| 						else if (!_warDecreesCount.containsKey(clan.getId()))
 | |
| 						{
 | |
| 							html = "messenger_yetti016.htm";
 | |
| 						}
 | |
| 						else if (!_rainbow.isRegistering())
 | |
| 						{
 | |
| 							html = "messenger_yetti017.htm";
 | |
| 						}
 | |
| 						else
 | |
| 						{
 | |
| 							updateAttacker(clan.getId(), 0, true);
 | |
| 							html = "messenger_yetti018.htm";
 | |
| 						}
 | |
| 						break;
 | |
| 					case "unregister":
 | |
| 						if (_rainbow.isRegistering())
 | |
| 						{
 | |
| 							if (_warDecreesCount.containsKey(clan.getId()))
 | |
| 							{
 | |
| 								player.addItem("Rainbow Spring unregister", WAR_DECREES, _warDecreesCount.get(clan.getId()) / 2, npc, true);
 | |
| 								_warDecreesCount.remove(clan.getId());
 | |
| 								html = "messenger_yetti019.htm";
 | |
| 							}
 | |
| 							else
 | |
| 							{
 | |
| 								html = "messenger_yetti020.htm";
 | |
| 							}
 | |
| 						}
 | |
| 						else if (_rainbow.isWaitingBattle())
 | |
| 						{
 | |
| 							_acceptedClans.remove(clan);
 | |
| 							html = "messenger_yetti020.htm";
 | |
| 						}
 | |
| 						break;
 | |
| 				}
 | |
| 				break;
 | |
| 			case CARETAKER:
 | |
| 				if (event.equals("portToArena"))
 | |
| 				{
 | |
| 					final L2Party party = player.getParty();
 | |
| 					if (clan == null)
 | |
| 					{
 | |
| 						html = "game_manager009.htm";
 | |
| 					}
 | |
| 					else if (!player.isClanLeader())
 | |
| 					{
 | |
| 						html = "game_manager004.htm";
 | |
| 					}
 | |
| 					else if (!player.isInParty())
 | |
| 					{
 | |
| 						html = "game_manager005.htm";
 | |
| 					}
 | |
| 					else if (party.getLeaderObjectId() != player.getObjectId())
 | |
| 					{
 | |
| 						html = "game_manager006.htm";
 | |
| 					}
 | |
| 					else
 | |
| 					{
 | |
| 						final int clanId = player.getClanId();
 | |
| 						boolean nonClanMemberInParty = false;
 | |
| 						for (L2PcInstance member : party.getMembers())
 | |
| 						{
 | |
| 							if (member.getClanId() != clanId)
 | |
| 							{
 | |
| 								nonClanMemberInParty = true;
 | |
| 								break;
 | |
| 							}
 | |
| 						}
 | |
| 						
 | |
| 						if (nonClanMemberInParty)
 | |
| 						{
 | |
| 							html = "game_manager007.htm";
 | |
| 						}
 | |
| 						else if (party.getMemberCount() < 5)
 | |
| 						{
 | |
| 							html = "game_manager008.htm";
 | |
| 						}
 | |
| 						else if ((clan.getCastleId() > 0) || (clan.getFortId() > 0) || (clan.getHideoutId() > 0))
 | |
| 						{
 | |
| 							html = "game_manager010.htm";
 | |
| 						}
 | |
| 						else if (clan.getLevel() < Config.CHS_CLAN_MINLEVEL)
 | |
| 						{
 | |
| 							html = "game_manager011.htm";
 | |
| 						}
 | |
| 						// else if () // Something about the rules.
 | |
| 						// {
 | |
| 						// html = "game_manager012.htm";
 | |
| 						// }
 | |
| 						// else if () // Already registered.
 | |
| 						// {
 | |
| 						// html = "game_manager013.htm";
 | |
| 						// }
 | |
| 						else if (!_acceptedClans.contains(clan))
 | |
| 						{
 | |
| 							html = "game_manager014.htm";
 | |
| 						}
 | |
| 						// else if () // Not have enough cards to register.
 | |
| 						// {
 | |
| 						// html = "game_manager015.htm";
 | |
| 						// }
 | |
| 						else
 | |
| 						{
 | |
| 							portToArena(player, _acceptedClans.indexOf(clan));
 | |
| 						}
 | |
| 					}
 | |
| 				}
 | |
| 				break;
 | |
| 		}
 | |
| 		
 | |
| 		if (event.startsWith("enterText"))
 | |
| 		{
 | |
| 			// Shouldn't happen
 | |
| 			if (!_acceptedClans.contains(clan))
 | |
| 			{
 | |
| 				return null;
 | |
| 			}
 | |
| 			
 | |
| 			String[] split = event.split("_ ");
 | |
| 			if (split.length < 2)
 | |
| 			{
 | |
| 				return null;
 | |
| 			}
 | |
| 			
 | |
| 			final String passage = split[1];
 | |
| 			
 | |
| 			if (!isValidPassage(passage))
 | |
| 			{
 | |
| 				return null;
 | |
| 			}
 | |
| 			
 | |
| 			if (_usedTextPassages.containsKey(passage))
 | |
| 			{
 | |
| 				ArrayList<L2Clan> list = _usedTextPassages.get(passage);
 | |
| 				
 | |
| 				if (list.contains(clan))
 | |
| 				{
 | |
| 					html = "yeti_passage_used.htm";
 | |
| 				}
 | |
| 				else
 | |
| 				{
 | |
| 					list.add(clan);
 | |
| 					synchronized (_pendingItemToGet)
 | |
| 					{
 | |
| 						if (_pendingItemToGet.containsKey(clan))
 | |
| 						{
 | |
| 							int left = _pendingItemToGet.get(clan);
 | |
| 							++left;
 | |
| 							_pendingItemToGet.put(clan, left);
 | |
| 						}
 | |
| 						else
 | |
| 						{
 | |
| 							_pendingItemToGet.put(clan, 1);
 | |
| 						}
 | |
| 					}
 | |
| 					html = "yeti_item_exchange.htm";
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 		else if (event.startsWith("getItem"))
 | |
| 		{
 | |
| 			if (!_pendingItemToGet.containsKey(clan))
 | |
| 			{
 | |
| 				html = "yeti_cannot_exchange.htm";
 | |
| 			}
 | |
| 			
 | |
| 			int left = _pendingItemToGet.get(clan);
 | |
| 			if (left > 0)
 | |
| 			{
 | |
| 				int itemId = Integer.parseInt(event.split("_")[1]);
 | |
| 				player.addItem("Rainbow Spring Chateau Siege", itemId, 1, npc, true);
 | |
| 				--left;
 | |
| 				_pendingItemToGet.put(clan, left);
 | |
| 				html = "yeti_main.htm";
 | |
| 			}
 | |
| 			else
 | |
| 			{
 | |
| 				html = "yeti_cannot_exchange.htm";
 | |
| 			}
 | |
| 		}
 | |
| 		
 | |
| 		return html;
 | |
| 	}
 | |
| 	
 | |
| 	@Override
 | |
| 	public String onKill(L2Npc npc, L2PcInstance killer, boolean isSummon)
 | |
| 	{
 | |
| 		if (!_rainbow.isInSiege())
 | |
| 		{
 | |
| 			return null;
 | |
| 		}
 | |
| 		
 | |
| 		final L2Clan clan = killer.getClan();
 | |
| 		if ((clan == null) || !_acceptedClans.contains(clan))
 | |
| 		{
 | |
| 			return null;
 | |
| 		}
 | |
| 		
 | |
| 		final int npcId = npc.getId();
 | |
| 		final int index = _acceptedClans.indexOf(clan);
 | |
| 		
 | |
| 		if (npcId == CHEST)
 | |
| 		{
 | |
| 			shoutRandomText(npc);
 | |
| 		}
 | |
| 		else if (npcId == GOURDS[index])
 | |
| 		{
 | |
| 			synchronized (this)
 | |
| 			{
 | |
| 				if (_siegeEnd != null)
 | |
| 				{
 | |
| 					_siegeEnd.cancel(false);
 | |
| 				}
 | |
| 				ThreadPoolManager.getInstance().executeGeneral(new SiegeEnd(clan));
 | |
| 			}
 | |
| 		}
 | |
| 		
 | |
| 		return null;
 | |
| 	}
 | |
| 	
 | |
| 	@Override
 | |
| 	public String onItemUse(L2Item item, L2PcInstance player)
 | |
| 	{
 | |
| 		if (!_rainbow.isInSiege())
 | |
| 		{
 | |
| 			return null;
 | |
| 		}
 | |
| 		
 | |
| 		L2Object target = player.getTarget();
 | |
| 		
 | |
| 		if ((target == null) || !(target instanceof L2Npc))
 | |
| 		{
 | |
| 			return null;
 | |
| 		}
 | |
| 		
 | |
| 		int yeti = target.getId();
 | |
| 		if (!isYetiTarget(yeti))
 | |
| 		{
 | |
| 			return null;
 | |
| 		}
 | |
| 		
 | |
| 		final L2Clan clan = player.getClan();
 | |
| 		if ((clan == null) || !_acceptedClans.contains(clan))
 | |
| 		{
 | |
| 			return null;
 | |
| 		}
 | |
| 		
 | |
| 		// Nectar must spawn the enraged yeti. Dunno if it makes any other thing
 | |
| 		// Also, the items must execute:
 | |
| 		// - Reduce gourd hpb ( reduceGourdHp(int, L2PcInstance) )
 | |
| 		// - Cast debuffs on enemy clans ( castDebuffsOnEnemies(int) )
 | |
| 		// - Change arena gourds ( moveGourds() )
 | |
| 		// - Increase gourd hp ( increaseGourdHp(int) )
 | |
| 		
 | |
| 		final int itemId = item.getId();
 | |
| 		if (itemId == RAINBOW_NECTAR)
 | |
| 		{
 | |
| 			// Spawn enraged (where?)
 | |
| 			reduceGourdHp(_acceptedClans.indexOf(clan), player);
 | |
| 		}
 | |
| 		else if (itemId == RAINBOW_MWATER)
 | |
| 		{
 | |
| 			increaseGourdHp(_acceptedClans.indexOf(clan));
 | |
| 		}
 | |
| 		else if (itemId == RAINBOW_WATER)
 | |
| 		{
 | |
| 			moveGourds();
 | |
| 		}
 | |
| 		else if (itemId == RAINBOW_SULFUR)
 | |
| 		{
 | |
| 			castDebuffsOnEnemies(_acceptedClans.indexOf(clan));
 | |
| 		}
 | |
| 		return null;
 | |
| 	}
 | |
| 	
 | |
| 	private void portToArena(L2PcInstance leader, int arena)
 | |
| 	{
 | |
| 		if ((arena < 0) || (arena > 3))
 | |
| 		{
 | |
| 			_log.warning("RainbowSptringChateau siege: Wrong arena id passed: " + arena);
 | |
| 			return;
 | |
| 		}
 | |
| 		for (L2PcInstance pc : leader.getParty().getMembers())
 | |
| 		{
 | |
| 			if (pc != null)
 | |
| 			{
 | |
| 				pc.stopAllEffects();
 | |
| 				final L2Summon pet = pc.getPet();
 | |
| 				if (pet != null)
 | |
| 				{
 | |
| 					pet.unSummon(pc);
 | |
| 				}
 | |
| 				pc.getServitors().values().forEach(s ->
 | |
| 				{
 | |
| 					s.unSummon(pc);
 | |
| 				});
 | |
| 				pc.teleToLocation(ARENAS[arena]);
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| 	
 | |
| 	protected static void spawnGourds()
 | |
| 	{
 | |
| 		for (int i = 0; i < _acceptedClans.size(); i++)
 | |
| 		{
 | |
| 			if (_gourds[i] == null)
 | |
| 			{
 | |
| 				try
 | |
| 				{
 | |
| 					_gourds[i] = new L2Spawn(GOURDS[i]);
 | |
| 					_gourds[i].setX(ARENAS[i].getX() + 150);
 | |
| 					_gourds[i].setY(ARENAS[i].getY() + 150);
 | |
| 					_gourds[i].setZ(ARENAS[i].getZ());
 | |
| 					_gourds[i].setHeading(1);
 | |
| 					_gourds[i].setAmount(1);
 | |
| 				}
 | |
| 				catch (Exception e)
 | |
| 				{
 | |
| 					e.printStackTrace();
 | |
| 				}
 | |
| 			}
 | |
| 			SpawnTable.getInstance().addNewSpawn(_gourds[i], false);
 | |
| 			_gourds[i].init();
 | |
| 		}
 | |
| 	}
 | |
| 	
 | |
| 	protected static void unSpawnGourds()
 | |
| 	{
 | |
| 		for (int i = 0; i < _acceptedClans.size(); i++)
 | |
| 		{
 | |
| 			_gourds[i].getLastSpawn().deleteMe();
 | |
| 			SpawnTable.getInstance().deleteSpawn(_gourds[i], false);
 | |
| 		}
 | |
| 	}
 | |
| 	
 | |
| 	private static void moveGourds()
 | |
| 	{
 | |
| 		L2Spawn[] tempArray = _gourds;
 | |
| 		int iterator = _acceptedClans.size();
 | |
| 		for (int i = 0; i < iterator; i++)
 | |
| 		{
 | |
| 			L2Spawn oldSpawn = _gourds[(iterator - 1) - i];
 | |
| 			L2Spawn curSpawn = tempArray[i];
 | |
| 			
 | |
| 			_gourds[(iterator - 1) - i] = curSpawn;
 | |
| 			
 | |
| 			curSpawn.getLastSpawn().teleToLocation(oldSpawn.getLocation());
 | |
| 		}
 | |
| 	}
 | |
| 	
 | |
| 	private static void reduceGourdHp(int index, L2PcInstance player)
 | |
| 	{
 | |
| 		L2Spawn gourd = _gourds[index];
 | |
| 		gourd.getLastSpawn().reduceCurrentHp(1000, player, null);
 | |
| 	}
 | |
| 	
 | |
| 	private static void increaseGourdHp(int index)
 | |
| 	{
 | |
| 		L2Spawn gourd = _gourds[index];
 | |
| 		L2Npc gourdNpc = gourd.getLastSpawn();
 | |
| 		gourdNpc.setCurrentHp(gourdNpc.getCurrentHp() + 1000);
 | |
| 	}
 | |
| 	
 | |
| 	private static void castDebuffsOnEnemies(int myArena)
 | |
| 	{
 | |
| 		for (int id : ARENA_ZONES)
 | |
| 		{
 | |
| 			if (id == myArena)
 | |
| 			{
 | |
| 				continue;
 | |
| 			}
 | |
| 			
 | |
| 			final Collection<L2Character> chars = ZoneManager.getInstance().getZoneById(id).getCharactersInside();
 | |
| 			for (L2Character chr : chars)
 | |
| 			{
 | |
| 				if (chr != null)
 | |
| 				{
 | |
| 					for (Skill sk : DEBUFFS)
 | |
| 					{
 | |
| 						sk.applyEffects(chr, chr);
 | |
| 					}
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| 	
 | |
| 	private static void shoutRandomText(L2Npc npc)
 | |
| 	{
 | |
| 		int length = _textPassages.length;
 | |
| 		
 | |
| 		if (_usedTextPassages.size() >= length)
 | |
| 		{
 | |
| 			return;
 | |
| 		}
 | |
| 		
 | |
| 		int randomPos = getRandom(length);
 | |
| 		String message = _textPassages[randomPos];
 | |
| 		
 | |
| 		if (_usedTextPassages.containsKey(message))
 | |
| 		{
 | |
| 			shoutRandomText(npc);
 | |
| 		}
 | |
| 		else
 | |
| 		{
 | |
| 			_usedTextPassages.put(message, new ArrayList<L2Clan>());
 | |
| 			final NpcSay say = new NpcSay(npc.getObjectId(), ChatType.NPC_SHOUT, npc.getId(), message);
 | |
| 			npc.broadcastPacket(say);
 | |
| 		}
 | |
| 	}
 | |
| 	
 | |
| 	private static boolean isValidPassage(String text)
 | |
| 	{
 | |
| 		for (String st : _textPassages)
 | |
| 		{
 | |
| 			if (st.equalsIgnoreCase(text))
 | |
| 			{
 | |
| 				return true;
 | |
| 			}
 | |
| 		}
 | |
| 		return false;
 | |
| 	}
 | |
| 	
 | |
| 	private static boolean isYetiTarget(int npcId)
 | |
| 	{
 | |
| 		for (int yeti : YETIS)
 | |
| 		{
 | |
| 			if (yeti == npcId)
 | |
| 			{
 | |
| 				return true;
 | |
| 			}
 | |
| 		}
 | |
| 		return false;
 | |
| 	}
 | |
| 	
 | |
| 	private static void updateAttacker(int clanId, long count, boolean remove)
 | |
| 	{
 | |
| 		try (Connection con = L2DatabaseFactory.getInstance().getConnection())
 | |
| 		{
 | |
| 			PreparedStatement statement;
 | |
| 			if (remove)
 | |
| 			{
 | |
| 				statement = con.prepareStatement("DELETE FROM rainbowsprings_attacker_list WHERE clanId = ?");
 | |
| 				statement.setInt(1, clanId);
 | |
| 			}
 | |
| 			else
 | |
| 			{
 | |
| 				statement = con.prepareStatement("INSERT INTO rainbowsprings_attacker_list VALUES (?,?)");
 | |
| 				statement.setInt(1, clanId);
 | |
| 				statement.setLong(2, count);
 | |
| 			}
 | |
| 			statement.execute();
 | |
| 			statement.close();
 | |
| 		}
 | |
| 		catch (Exception e)
 | |
| 		{
 | |
| 			e.printStackTrace();
 | |
| 		}
 | |
| 	}
 | |
| 	
 | |
| 	@Override
 | |
| 	public void loadAttackers()
 | |
| 	{
 | |
| 		try (Connection con = L2DatabaseFactory.getInstance().getConnection())
 | |
| 		{
 | |
| 			PreparedStatement statement = con.prepareStatement("SELECT * FROM rainbowsprings_attacker_list");
 | |
| 			ResultSet rset = statement.executeQuery();
 | |
| 			while (rset.next())
 | |
| 			{
 | |
| 				int clanId = rset.getInt("clan_id");
 | |
| 				long count = rset.getLong("decrees_count");
 | |
| 				_warDecreesCount.put(clanId, count);
 | |
| 			}
 | |
| 			rset.close();
 | |
| 			statement.close();
 | |
| 		}
 | |
| 		catch (Exception e)
 | |
| 		{
 | |
| 			e.printStackTrace();
 | |
| 		}
 | |
| 	}
 | |
| 	
 | |
| 	protected static void setRegistrationEndString(long time)
 | |
| 	{
 | |
| 		Calendar c = Calendar.getInstance();
 | |
| 		c.setTime(new Date(time));
 | |
| 		int year = c.get(Calendar.YEAR);
 | |
| 		int month = c.get(Calendar.MONTH) + 1;
 | |
| 		int day = c.get(Calendar.DAY_OF_MONTH);
 | |
| 		int hour = c.get(Calendar.HOUR);
 | |
| 		int mins = c.get(Calendar.MINUTE);
 | |
| 		
 | |
| 		_registrationEnds = year + "-" + month + "-" + day + " " + hour + (mins < 10 ? ":0" : ":") + mins;
 | |
| 	}
 | |
| 	
 | |
| 	public static void launchSiege()
 | |
| 	{
 | |
| 		_nextSiege.cancel(false);
 | |
| 		ThreadPoolManager.getInstance().executeGeneral(new SiegeStart());
 | |
| 	}
 | |
| 	
 | |
| 	@Override
 | |
| 	public void endSiege()
 | |
| 	{
 | |
| 		if (_siegeEnd != null)
 | |
| 		{
 | |
| 			_siegeEnd.cancel(false);
 | |
| 		}
 | |
| 		ThreadPoolManager.getInstance().executeGeneral(new SiegeEnd(null));
 | |
| 	}
 | |
| 	
 | |
| 	public static void updateAdminDate(long date)
 | |
| 	{
 | |
| 		if (_rainbow == null)
 | |
| 		{
 | |
| 			_rainbow = CHSiegeManager.getInstance().getSiegableHall(RAINBOW_SPRINGS);
 | |
| 		}
 | |
| 		
 | |
| 		_rainbow.setNextSiegeDate(date);
 | |
| 		if (_nextSiege != null)
 | |
| 		{
 | |
| 			_nextSiege.cancel(true);
 | |
| 		}
 | |
| 		date -= 3600000;
 | |
| 		setRegistrationEndString(date);
 | |
| 		_nextSiege = ThreadPoolManager.getInstance().scheduleGeneral(new SetFinalAttackers(), _rainbow.getNextSiegeTime());
 | |
| 	}
 | |
| 	
 | |
| 	public static void main(String[] args)
 | |
| 	{
 | |
| 		new RainbowSpringsChateau();
 | |
| 	}
 | |
| }
 | 
