Java tutorial
/* * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA. * * http://www.gnu.org/copyleft/gpl.html */ /** * * @author FBIagent / fixed and moded for l2jfree by SqueezeD * */ package net.sf.l2j.gameserver.model.entity.L2JOneoRusEvents; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.Vector; import javolution.text.TextBuilder; import net.sf.l2j.Config; import net.sf.l2j.L2DatabaseFactory; import net.sf.l2j.gameserver.Announcements; import net.sf.l2j.gameserver.ThreadPoolManager; import net.sf.l2j.gameserver.datatables.NpcTable; import net.sf.l2j.gameserver.datatables.SpawnTable; import net.sf.l2j.gameserver.lib.Rnd; import net.sf.l2j.gameserver.model.L2Effect; import net.sf.l2j.gameserver.model.L2Party; import net.sf.l2j.gameserver.model.L2Spawn; import net.sf.l2j.gameserver.model.L2Summon; import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance; import net.sf.l2j.gameserver.model.actor.instance.L2PetInstance; import net.sf.l2j.gameserver.network.serverpackets.ActionFailed; import net.sf.l2j.gameserver.network.serverpackets.MagicSkillUser; import net.sf.l2j.gameserver.network.serverpackets.NpcHtmlMessage; import net.sf.l2j.gameserver.network.serverpackets.SocialAction; import net.sf.l2j.gameserver.templates.L2NpcTemplate; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; public class TvT { private final static Log _log = LogFactory.getLog(TvT.class.getName()); public static String _eventName = new String(), _eventDesc = new String(), _topTeam = new String(), _joiningLocationName = new String(); public static Vector<String> _teams = new Vector<String>(), _savePlayers = new Vector<String>(), _savePlayerTeams = new Vector<String>(); public static Vector<L2PcInstance> _players = new Vector<L2PcInstance>(), _playersShuffle = new Vector<L2PcInstance>(); public static Vector<Integer> _teamPlayersCount = new Vector<Integer>(), _teamKillsCount = new Vector<Integer>(), _teamColors = new Vector<Integer>(), _teamsX = new Vector<Integer>(), _teamsY = new Vector<Integer>(), _teamsZ = new Vector<Integer>(); public static boolean _joining = false, _teleport = false, _started = false, _sitForced = false; public static L2Spawn _npcSpawn; public static int _npcId = 0, _npcX = 0, _npcY = 0, _npcZ = 0, _npcHeading = 0, _rewardId = 0, _rewardAmount = 0, _topKills = 0, _minlvl = 0, _maxlvl = 0, _joinTime = 0, _eventTime = 0, _minPlayers = 0, _maxPlayers = 0; public static void setNpcPos(L2PcInstance activeChar) { _npcX = activeChar.getX(); _npcY = activeChar.getY(); _npcZ = activeChar.getZ(); _npcHeading = activeChar.getHeading(); } public static void setNpcPos(int x, int y, int z) { _npcX = x; _npcY = y; _npcZ = z; } public static void addTeam(String teamName) { if (!checkTeamOk()) { if (_log.isDebugEnabled()) _log.debug("TvT Engine[addTeam(" + teamName + ")]: checkTeamOk() = false"); return; } if (teamName.equals(" ")) return; _teams.add(teamName); _teamPlayersCount.add(0); _teamKillsCount.add(0); _teamColors.add(0); _teamsX.add(0); _teamsY.add(0); _teamsZ.add(0); } public static boolean checkMaxLevel(int maxlvl) { if (_minlvl >= maxlvl) return false; return true; } public static boolean checkMinLevel(int minlvl) { if (_maxlvl <= minlvl) return false; return true; } /** returns true if participated players is higher or equal then minimum needed players */ public static boolean checkMinPlayers(int players) { if (_minPlayers <= players) return true; return false; } /** returns true if max players is higher or equal then participated players */ public static boolean checkMaxPlayers(int players) { if (_maxPlayers > players) return true; return false; } public static void removeTeam(String teamName) { if (!checkTeamOk() || _teams.isEmpty()) { if (_log.isDebugEnabled()) _log.debug("TvT Engine[removeTeam(" + teamName + ")]: checkTeamOk() = false"); return; } if (teamPlayersCount(teamName) > 0) { if (_log.isDebugEnabled()) _log.debug("TvT Engine[removeTeam(" + teamName + ")]: teamPlayersCount(teamName) > 0"); return; } int index = _teams.indexOf(teamName); if (index == -1) return; _teamsZ.remove(index); _teamsY.remove(index); _teamsX.remove(index); _teamColors.remove(index); _teamKillsCount.remove(index); _teamPlayersCount.remove(index); _teams.remove(index); } public static void setTeamPos(String teamName, L2PcInstance activeChar) { int index = _teams.indexOf(teamName); if (index == -1) return; _teamsX.set(index, activeChar.getX()); _teamsY.set(index, activeChar.getY()); _teamsZ.set(index, activeChar.getZ()); } public static void setTeamPos(String teamName, int x, int y, int z) { int index = _teams.indexOf(teamName); if (index == -1) return; _teamsX.set(index, x); _teamsY.set(index, y); _teamsZ.set(index, z); } public static void setTeamColor(String teamName, int color) { if (!checkTeamOk()) return; int index = _teams.indexOf(teamName); if (index == -1) return; _teamColors.set(index, color); } public static boolean checkTeamOk() { if (_started || _teleport || _joining) return false; return true; } public static void startJoin(L2PcInstance activeChar) { if (!startJoinOk()) { activeChar.sendMessage("Event not setted propertly."); if (_log.isDebugEnabled()) _log.debug("TvT Engine[startJoin(" + activeChar.getName() + ")]: startJoinOk() = false"); return; } _joining = true; spawnEventNpc(activeChar); Announcements.getInstance().announceToAll(_eventName + "(TvT): Joinable in " + _joiningLocationName + "!"); } public static void startJoin() { if (!startJoinOk()) { _log.warn("Event not setted propertly."); if (_log.isDebugEnabled()) _log.debug("TvT Engine[startJoin(startJoinOk() = false"); return; } _joining = true; spawnEventNpc(); Announcements.getInstance().announceToAll(_eventName + "(TvT): Joinable in " + _joiningLocationName + "!"); } public static boolean startAutoJoin() { if (!startJoinOk()) { if (_log.isDebugEnabled()) _log.debug("TvT Engine[startJoin]: startJoinOk() = false"); return false; } _joining = true; spawnEventNpc(); Announcements.getInstance().announceToAll(_eventName + "(TvT): Joinable in " + _joiningLocationName + "!"); return true; } public static boolean startJoinOk() { if (_started || _teleport || _joining || _teams.size() < 2 || _eventName.equals("") || _joiningLocationName.equals("") || _eventDesc.equals("") || _npcId == 0 || _npcX == 0 || _npcY == 0 || _npcZ == 0 || _rewardId == 0 || _rewardAmount == 0 || _teamsX.contains(0) || _teamsY.contains(0) || _teamsZ.contains(0)) return false; return true; } private static void spawnEventNpc(L2PcInstance activeChar) { L2NpcTemplate tmpl = NpcTable.getInstance().getTemplate(_npcId); try { _npcSpawn = new L2Spawn(tmpl); _npcSpawn.setLocx(_npcX); _npcSpawn.setLocy(_npcY); _npcSpawn.setLocz(_npcZ); _npcSpawn.setAmount(1); _npcSpawn.setHeading(_npcHeading); _npcSpawn.setRespawnDelay(1); SpawnTable.getInstance().addNewSpawn(_npcSpawn, false); _npcSpawn.init(); _npcSpawn.getLastSpawn().getStatus().setCurrentHp(999999999); _npcSpawn.getLastSpawn().setTitle(_eventName); _npcSpawn.getLastSpawn()._isEventMobTvT = true; _npcSpawn.getLastSpawn().isAggressive(); _npcSpawn.getLastSpawn().decayMe(); _npcSpawn.getLastSpawn().spawnMe(_npcSpawn.getLastSpawn().getX(), _npcSpawn.getLastSpawn().getY(), _npcSpawn.getLastSpawn().getZ()); _npcSpawn.getLastSpawn().broadcastPacket( new MagicSkillUser(_npcSpawn.getLastSpawn(), _npcSpawn.getLastSpawn(), 1034, 1, 1, 1)); } catch (Exception e) { _log.error("TvT Engine[spawnEventNpc(" + activeChar.getName() + ")]: exception: " + e.getMessage()); } } private static void spawnEventNpc() { L2NpcTemplate tmpl = NpcTable.getInstance().getTemplate(_npcId); try { _npcSpawn = new L2Spawn(tmpl); _npcSpawn.setLocx(_npcX); _npcSpawn.setLocy(_npcY); _npcSpawn.setLocz(_npcZ); _npcSpawn.setAmount(1); _npcSpawn.setHeading(_npcHeading); _npcSpawn.setRespawnDelay(1); SpawnTable.getInstance().addNewSpawn(_npcSpawn, false); _npcSpawn.init(); _npcSpawn.getLastSpawn().getStatus().setCurrentHp(999999999); _npcSpawn.getLastSpawn().setTitle(_eventName); _npcSpawn.getLastSpawn()._isEventMobTvT = true; _npcSpawn.getLastSpawn().isAggressive(); _npcSpawn.getLastSpawn().decayMe(); _npcSpawn.getLastSpawn().spawnMe(_npcSpawn.getLastSpawn().getX(), _npcSpawn.getLastSpawn().getY(), _npcSpawn.getLastSpawn().getZ()); _npcSpawn.getLastSpawn().broadcastPacket( new MagicSkillUser(_npcSpawn.getLastSpawn(), _npcSpawn.getLastSpawn(), 1034, 1, 1, 1)); } catch (Exception e) { _log.error("TvT Engine[spawnEventNpc(exception: " + e.getMessage()); } } public static void teleportStart() { if (!_joining || _started || _teleport) return; if (Config.TVT_EVEN_TEAMS.equals("SHUFFLE") && checkMinPlayers(_playersShuffle.size())) { removeOfflinePlayers(); shuffleTeams(); } else if (Config.TVT_EVEN_TEAMS.equals("SHUFFLE") && !checkMinPlayers(_playersShuffle.size())) { Announcements.getInstance().announceToAll("Not enough players for event. Min Requested : " + _minPlayers + ", Participating : " + _playersShuffle.size()); return; } _joining = false; Announcements.getInstance().announceToAll(_eventName + "(TvT): Teleport to team spot in 20 seconds!"); setUserData(); ThreadPoolManager.getInstance().scheduleGeneral(new Runnable() { public void run() { TvT.sit(); for (L2PcInstance player : _players) { if (player != null) { if (Config.TVT_ON_START_UNSUMMON_PET) { // Remove Summon's buffs if (player.getPet() != null) { L2Summon summon = player.getPet(); for (L2Effect e : summon.getAllEffects()) if (e != null) e.exit(); if (summon instanceof L2PetInstance) summon.unSummon(player); } } if (Config.TVT_ON_START_REMOVE_ALL_EFFECTS) { for (L2Effect e : player.getAllEffects()) { if (e != null) e.exit(); } } // Remove player from his party if (player.getParty() != null) { L2Party party = player.getParty(); party.removePartyMember(player); } player.teleToLocation(_teamsX.get(_teams.indexOf(player._teamNameTvT)), _teamsY.get(_teams.indexOf(player._teamNameTvT)), _teamsZ.get(_teams.indexOf(player._teamNameTvT))); } } } }, 20000); _teleport = true; } public static boolean teleportAutoStart() { if (!_joining || _started || _teleport) return false; if (Config.TVT_EVEN_TEAMS.equals("SHUFFLE") && checkMinPlayers(_playersShuffle.size())) { removeOfflinePlayers(); shuffleTeams(); } else if (Config.TVT_EVEN_TEAMS.equals("SHUFFLE") && !checkMinPlayers(_playersShuffle.size())) { Announcements.getInstance().announceToAll("Not enough players for event. Min Requested : " + _minPlayers + ", Participating : " + _playersShuffle.size()); return false; } _joining = false; Announcements.getInstance().announceToAll(_eventName + "(TvT): Teleport to team spot in 20 seconds!"); setUserData(); ThreadPoolManager.getInstance().scheduleGeneral(new Runnable() { public void run() { TvT.sit(); for (L2PcInstance player : _players) { if (player != null) { if (Config.TVT_ON_START_UNSUMMON_PET) { // Remove Summon's buffs if (player.getPet() != null) { L2Summon summon = player.getPet(); for (L2Effect e : summon.getAllEffects()) if (e != null) e.exit(); if (summon instanceof L2PetInstance) summon.unSummon(player); } } if (Config.TVT_ON_START_REMOVE_ALL_EFFECTS) { for (L2Effect e : player.getAllEffects()) { if (e != null) e.exit(); } } // Remove player from his party if (player.getParty() != null) { L2Party party = player.getParty(); party.removePartyMember(player); } player.teleToLocation(_teamsX.get(_teams.indexOf(player._teamNameTvT)), _teamsY.get(_teams.indexOf(player._teamNameTvT)), _teamsZ.get(_teams.indexOf(player._teamNameTvT))); } } } }, 20000); _teleport = true; return true; } public static void startEvent(L2PcInstance activeChar) { if (!startEventOk()) { if (_log.isDebugEnabled()) _log.debug("TvT Engine[startEvent(" + activeChar.getName() + ")]: startEventOk() = false"); return; } _teleport = false; sit(); Announcements.getInstance().announceToAll(_eventName + "(TvT): Started. Go to kill your enemies!"); _started = true; } public static void setJoinTime(int time) { _joinTime = time; } public static void setEventTime(int time) { _eventTime = time; } public static boolean startAutoEvent() { if (!startEventOk()) { if (_log.isDebugEnabled()) _log.debug("TvT Engine[startEvent]: startEventOk() = false"); return false; } _teleport = false; sit(); Announcements.getInstance().announceToAll(_eventName + "(TvT): Started. Go to kill your enemies!"); _started = true; return true; } public static void autoEvent() { if (startAutoJoin()) { if (_joinTime > 0) waiter(_joinTime * 60 * 1000); // minutes for join event else if (_joinTime <= 0) { abortEvent(); return; } if (teleportAutoStart()) { waiter(1 * 60 * 1000); // 1 min wait time untill start fight after teleported if (startAutoEvent()) { waiter(_eventTime * 60 * 1000); // minutes for event time finishEvent(); } } else if (!teleportAutoStart()) { abortEvent(); } } } private static void waiter(long interval) { long startWaiterTime = System.currentTimeMillis(); int seconds = (int) (interval / 1000); while (startWaiterTime + interval > System.currentTimeMillis()) { seconds--; // here because we don't want to see two time announce at the same time if (_joining || _started || _teleport) { switch (seconds) { case 3600: // 1 hour left if (_joining) { Announcements.getInstance() .announceToAll(_eventName + "(TvT): Joinable in " + _joiningLocationName + "!"); Announcements.getInstance().announceToAll( "TvT Event: " + seconds / 60 / 60 + " hour(s) till registration close!"); } else if (_started) Announcements.getInstance() .announceToAll("TvT Event: " + seconds / 60 / 60 + " hour(s) till event finish!"); break; case 1800: // 30 minutes left case 900: // 15 minutes left case 600: // 10 minutes left case 300: // 5 minutes left case 240: // 4 minutes left case 180: // 3 minutes left case 120: // 2 minutes left case 60: // 1 minute left if (_joining) { removeOfflinePlayers(); Announcements.getInstance() .announceToAll(_eventName + "(TvT): Joinable in " + _joiningLocationName + "!"); Announcements.getInstance().announceToAll( "TvT Event: " + seconds / 60 + " minute(s) till registration close!"); } else if (_started) Announcements.getInstance() .announceToAll("TvT Event: " + seconds / 60 + " minute(s) till event finish!"); break; case 30: // 30 seconds left case 15: // 15 seconds left case 10: // 10 seconds left case 5: // 5 seconds left case 4: // 4 seconds left case 3: // 3 seconds left case 2: // 2 seconds left case 1: // 1 seconds left if (_joining) Announcements.getInstance() .announceToAll("TvT Event: " + seconds + " second(s) till registration close!"); else if (_teleport) Announcements.getInstance() .announceToAll("TvT Event: " + seconds + " seconds(s) till start fight!"); else if (_started) Announcements.getInstance() .announceToAll("TvT Event: " + seconds + " second(s) till event finish!"); break; } } long startOneSecondWaiterStartTime = System.currentTimeMillis(); // only the try catch with Thread.sleep(1000) give bad countdown on high wait times while (startOneSecondWaiterStartTime + 1000 > System.currentTimeMillis()) { try { Thread.sleep(1); } catch (InterruptedException ie) { } } } } private static boolean startEventOk() { if (_joining || !_teleport || _started) return false; if (Config.TVT_EVEN_TEAMS.equals("NO") || Config.TVT_EVEN_TEAMS.equals("BALANCE")) { if (_teamPlayersCount.contains(0)) return false; } else if (Config.TVT_EVEN_TEAMS.equals("SHUFFLE")) { Vector<L2PcInstance> playersShuffleTemp = new Vector<L2PcInstance>(); int loopCount = 0; loopCount = _playersShuffle.size(); for (int i = 0; i < loopCount; i++) { if (_playersShuffle != null) playersShuffleTemp.add(_playersShuffle.get(i)); } _playersShuffle = playersShuffleTemp; playersShuffleTemp.clear(); // if (_playersShuffle.size() < (_teams.size()*2)){ // return false; // } } return true; } public static void shuffleTeams() { int teamCount = 0, playersCount = 0; for (;;) { if (_playersShuffle.isEmpty()) break; int playerToAddIndex = Rnd.nextInt(_playersShuffle.size()); L2PcInstance player = null; player = _playersShuffle.get(playerToAddIndex); player._originalNameColorTvT = player.getAppearance().getNameColor(); player._originalKarmaTvT = player.getKarma(); _players.add(player); _players.get(playersCount)._teamNameTvT = _teams.get(teamCount); _savePlayers.add(_players.get(playersCount).getName()); _savePlayerTeams.add(_teams.get(teamCount)); playersCount++; if (teamCount == _teams.size() - 1) teamCount = 0; else teamCount++; _playersShuffle.remove(playerToAddIndex); } } public static void setUserData() { for (L2PcInstance player : _players) { player.getAppearance().setNameColor(_teamColors.get(_teams.indexOf(player._teamNameTvT))); player.setKarma(0); player.broadcastUserInfo(); } } public static void finishEvent() { if (!finishEventOk()) { if (_log.isDebugEnabled()) _log.debug("TvT Engine[finishEvent]: finishEventOk() = false"); return; } _started = false; unspawnEventNpc(); processTopTeam(); if (_topKills == 0) Announcements.getInstance().announceToAll(_eventName + "(TvT): No team wins the match(nobody killed)."); else { Announcements.getInstance().announceToAll( _eventName + "(TvT): " + _topTeam + "'s win the match! " + _topKills + " kills."); rewardTeam(_topTeam); playKneelAnimation(_topTeam); } if (Config.TVT_ANNOUNCE_TEAM_STATS) { Announcements.getInstance().announceToAll(_eventName + " Team Statistics:"); for (String team : _teams) { int _kills = teamKillsCount(team); Announcements.getInstance().announceToAll("Team: " + team + " - Kills: " + _kills); } } teleportFinish(); } // show loosers and winners animations public static void playKneelAnimation(String teamName) { for (L2PcInstance player : _players) { if (player != null) { if (!player._teamNameTvT.equals(teamName)) { player.broadcastPacket(new SocialAction(player.getObjectId(), 7)); } else if (player._teamNameTvT.equals(teamName)) { player.broadcastPacket(new SocialAction(player.getObjectId(), 3)); } } } } private static boolean finishEventOk() { if (!_started) return false; return true; } public static void processTopTeam() { for (String team : _teams) { if (teamKillsCount(team) > _topKills) { _topTeam = team; _topKills = teamKillsCount(team); } } } public static void rewardTeam(String teamName) { for (L2PcInstance player : _players) { if (player != null) { if (player._teamNameTvT.equals(teamName) && (player._countTvTkills > 0 || Config.TVT_PRICE_NO_KILLS)) { player.addItem("TvT Event: " + _eventName, _rewardId, _rewardAmount, player, true); NpcHtmlMessage nhm = new NpcHtmlMessage(5); TextBuilder replyMSG = new TextBuilder(""); replyMSG.append( "<html><body>Your team wins the event. Look in your inventory for the reward.</body></html>"); nhm.setHtml(replyMSG.toString()); player.sendPacket(nhm); // Send a Server->Client ActionFailed to the L2PcInstance in order to avoid that the client wait another packet player.sendPacket(ActionFailed.STATIC_PACKET); } } } } public static void abortEvent() { if (!_joining && !_teleport && !_started) return; if (_joining && !_teleport && !_started) { unspawnEventNpc(); cleanTvT(); _joining = false; Announcements.getInstance().announceToAll(_eventName + "(TvT): Match aborted!"); return; } _joining = false; _teleport = false; _started = false; unspawnEventNpc(); Announcements.getInstance().announceToAll(_eventName + "(TvT): Match aborted!"); teleportFinish(); } public static void sit() { if (_sitForced) _sitForced = false; else _sitForced = true; for (L2PcInstance player : _players) { if (player != null) { if (_sitForced) { player.stopMove(null, false); player.abortAttack(); player.abortCast(); if (!player.isSitting()) player.sitDown(); } else { if (player.isSitting()) player.standUp(); } } } } public static void dumpData() { _log.info(""); _log.info(""); if (!_joining && !_teleport && !_started) { _log.info("<<---------------------------------->>"); _log.info(">> TvT Engine infos dump (INACTIVE) <<"); _log.info("<<--^----^^-----^----^^------^^----->>"); } else if (_joining && !_teleport && !_started) { _log.info("<<--------------------------------->>"); _log.info(">> TvT Engine infos dump (JOINING) <<"); _log.info("<<--^----^^-----^----^^------^----->>"); } else if (!_joining && _teleport && !_started) { _log.info("<<---------------------------------->>"); _log.info(">> TvT Engine infos dump (TELEPORT) <<"); _log.info("<<--^----^^-----^----^^------^^----->>"); } else if (!_joining && !_teleport && _started) { _log.info("<<--------------------------------->>"); _log.info(">> TvT Engine infos dump (STARTED) <<"); _log.info("<<--^----^^-----^----^^------^----->>"); } _log.info("Name: " + _eventName); _log.info("Desc: " + _eventDesc); _log.info("Join location: " + _joiningLocationName); _log.info("Min lvl: " + _minlvl); _log.info("Max lvl: " + _maxlvl); _log.info(""); _log.info("##########################"); _log.info("# _teams(Vector<String>) #"); _log.info("##########################"); for (String team : _teams) _log.info(team + " Kills Done :" + _teamKillsCount.get(_teams.indexOf(team))); if (Config.TVT_EVEN_TEAMS.equals("SHUFFLE")) { _log.info(""); _log.info("#########################################"); _log.info("# _playersShuffle(Vector<L2PcInstance>) #"); _log.info("#########################################"); for (L2PcInstance player : _playersShuffle) { if (player != null) _log.info("Name: " + player.getName()); } } _log.info(""); _log.info("##################################"); _log.info("# _players(Vector<L2PcInstance>) #"); _log.info("##################################"); for (L2PcInstance player : _players) { if (player != null) _log.info("Name: " + player.getName() + " Team: " + player._teamNameTvT + " Kills Done:" + player._countTvTkills); } _log.info(""); _log.info("#####################################################################"); _log.info("# _savePlayers(Vector<String>) and _savePlayerTeams(Vector<String>) #"); _log.info("#####################################################################"); for (String player : _savePlayers) _log.info("Name: " + player + " Team: " + _savePlayerTeams.get(_savePlayers.indexOf(player))); _log.info(""); _log.info(""); } public static void loadData() { _eventName = new String(); _eventDesc = new String(); _topTeam = new String(); _joiningLocationName = new String(); _teams = new Vector<String>(); _savePlayers = new Vector<String>(); _savePlayerTeams = new Vector<String>(); _players = new Vector<L2PcInstance>(); _playersShuffle = new Vector<L2PcInstance>(); _teamPlayersCount = new Vector<Integer>(); _teamKillsCount = new Vector<Integer>(); _teamColors = new Vector<Integer>(); _teamsX = new Vector<Integer>(); _teamsY = new Vector<Integer>(); _teamsZ = new Vector<Integer>(); _joining = false; _teleport = false; _started = false; _sitForced = false; _npcId = 0; _npcX = 0; _npcY = 0; _npcZ = 0; _npcHeading = 0; _rewardId = 0; _rewardAmount = 0; _topKills = 0; _minlvl = 0; _maxlvl = 0; _joinTime = 0; _eventTime = 0; _minPlayers = 0; _maxPlayers = 0; java.sql.Connection con = null; try { PreparedStatement statement; ResultSet rs; con = L2DatabaseFactory.getInstance().getConnection(); statement = con.prepareStatement("Select * from tvt"); rs = statement.executeQuery(); int teams = 0; while (rs.next()) { _eventName = rs.getString("eventName"); _eventDesc = rs.getString("eventDesc"); _joiningLocationName = rs.getString("joiningLocation"); _minlvl = rs.getInt("minlvl"); _maxlvl = rs.getInt("maxlvl"); _npcId = rs.getInt("npcId"); _npcX = rs.getInt("npcX"); _npcY = rs.getInt("npcY"); _npcZ = rs.getInt("npcZ"); _npcHeading = rs.getInt("npcHeading"); _rewardId = rs.getInt("rewardId"); _rewardAmount = rs.getInt("rewardAmount"); teams = rs.getInt("teamsCount"); _joinTime = rs.getInt("joinTime"); _eventTime = rs.getInt("eventTime"); _minPlayers = rs.getInt("minPlayers"); _maxPlayers = rs.getInt("maxPlayers"); } statement.close(); int index = -1; if (teams > 0) index = 0; while (index < teams && index > -1) { statement = con.prepareStatement("Select * from tvt_teams where teamId = ?"); statement.setInt(1, index); rs = statement.executeQuery(); while (rs.next()) { _teams.add(rs.getString("teamName")); _teamPlayersCount.add(0); _teamKillsCount.add(0); _teamColors.add(0); _teamsX.add(0); _teamsY.add(0); _teamsZ.add(0); _teamsX.set(index, rs.getInt("teamX")); _teamsY.set(index, rs.getInt("teamY")); _teamsZ.set(index, rs.getInt("teamZ")); _teamColors.set(index, rs.getInt("teamColor")); } index++; statement.close(); } } catch (Exception e) { _log.error("Exception: TvT.loadData(): " + e.getMessage()); } finally { try { con.close(); } catch (Exception e) { } } } public static void saveData() { java.sql.Connection con = null; try { con = L2DatabaseFactory.getInstance().getConnection(); PreparedStatement statement; statement = con.prepareStatement("Delete from tvt"); statement.execute(); statement.close(); statement = con.prepareStatement( "INSERT INTO tvt (eventName, eventDesc, joiningLocation, minlvl, maxlvl, npcId, npcX, npcY, npcZ, npcHeading, rewardId, rewardAmount, teamsCount, joinTime, eventTime, minPlayers, maxPlayers) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"); statement.setString(1, _eventName); statement.setString(2, _eventDesc); statement.setString(3, _joiningLocationName); statement.setInt(4, _minlvl); statement.setInt(5, _maxlvl); statement.setInt(6, _npcId); statement.setInt(7, _npcX); statement.setInt(8, _npcY); statement.setInt(9, _npcZ); statement.setInt(10, _npcHeading); statement.setInt(11, _rewardId); statement.setInt(12, _rewardAmount); statement.setInt(13, _teams.size()); statement.setInt(14, _joinTime); statement.setInt(15, _eventTime); statement.setInt(16, _minPlayers); statement.setInt(17, _maxPlayers); statement.execute(); statement.close(); statement = con.prepareStatement("Delete from tvt_teams"); statement.execute(); statement.close(); for (String teamName : _teams) { int index = _teams.indexOf(teamName); if (index == -1) return; statement = con.prepareStatement( "INSERT INTO tvt_teams (teamId ,teamName, teamX, teamY, teamZ, teamColor) VALUES (?, ?, ?, ?, ?, ?)"); statement.setInt(1, index); statement.setString(2, teamName); statement.setInt(3, _teamsX.get(index)); statement.setInt(4, _teamsY.get(index)); statement.setInt(5, _teamsZ.get(index)); statement.setInt(6, _teamColors.get(index)); statement.execute(); statement.close(); } } catch (Exception e) { _log.error("Exception: TvT.saveData(): " + e.getMessage()); } finally { try { con.close(); } catch (Exception e) { } } } public static void showEventHtml(L2PcInstance eventPlayer, String objectId) { try { NpcHtmlMessage adminReply = new NpcHtmlMessage(5); TextBuilder replyMSG = new TextBuilder("<html><body>"); replyMSG.append("TvT Match<br><br><br>"); replyMSG.append("Current event...<br1>"); replyMSG.append(" ... name: <font color=\"00FF00\">" + _eventName + "</font><br1>"); replyMSG.append(" ... description: <font color=\"00FF00\">" + _eventDesc + "</font><br><br>"); if (!_started && !_joining) replyMSG.append("<center>Wait till the admin/gm start the participation.</center>"); else if (Config.TVT_EVEN_TEAMS.equals("SHUFFLE") && !checkMaxPlayers(_playersShuffle.size())) { if (!TvT._started) { replyMSG.append("Currently participated : <font color=\"00FF00\">" + _playersShuffle.size() + ".</font><br>"); replyMSG.append( "Admin set max players : <font color=\"00FF00\">" + _maxPlayers + "</font><br><br>"); replyMSG.append("<font color=\"FFFF00\">You can't participate to this event.</font><br>"); } } else if (eventPlayer.isCursedWeaponEquiped() && !Config.TVT_JOIN_CURSED) { replyMSG.append( "<font color=\"FFFF00\">You can't participate to this event with a cursed Weapon.</font><br>"); } else if (!_started && _joining && eventPlayer.getLevel() >= _minlvl && eventPlayer.getLevel() <= _maxlvl) { if (_players.contains(eventPlayer) || _playersShuffle.contains(eventPlayer) || checkShufflePlayers(eventPlayer)) { if (Config.TVT_EVEN_TEAMS.equals("NO") || Config.TVT_EVEN_TEAMS.equals("BALANCE")) replyMSG.append("You participated already in team <font color=\"LEVEL\">" + eventPlayer._teamNameTvT + "</font><br><br>"); else if (Config.TVT_EVEN_TEAMS.equals("SHUFFLE")) replyMSG.append("You participated already!<br><br>"); replyMSG.append("<table border=\"0\"><tr>"); replyMSG.append("<td width=\"200\">Wait till event start or</td>"); replyMSG.append("<td width=\"60\"><center><button value=\"remove\" action=\"bypass -h npc_" + objectId + "_tvt_player_leave\" width=50 height=15 back=\"sek.cbui94\" fore=\"sek.cbui92\"></center></td>"); replyMSG.append("<td width=\"100\">your participation!</td>"); replyMSG.append("</tr></table>"); } else { replyMSG.append("You want to participate in the event?<br><br>"); replyMSG.append("<td width=\"200\">Admin set min lvl : <font color=\"00FF00\">" + _minlvl + "</font></td><br>"); replyMSG.append("<td width=\"200\">Admin set max lvl : <font color=\"00FF00\">" + _maxlvl + "</font></td><br><br>"); if (Config.TVT_EVEN_TEAMS.equals("NO") || Config.TVT_EVEN_TEAMS.equals("BALANCE")) { replyMSG.append("<center><table border=\"0\">"); for (String team : _teams) { replyMSG.append("<tr><td width=\"100\"><font color=\"LEVEL\">" + team + "</font> (" + teamPlayersCount(team) + " joined)</td>"); replyMSG.append("<td width=\"60\"><button value=\"Join\" action=\"bypass -h npc_" + objectId + "_tvt_player_join " + team + "\" width=50 height=15 back=\"sek.cbui94\" fore=\"sek.cbui92\"></td></tr>"); } replyMSG.append("</table></center>"); } else if (Config.TVT_EVEN_TEAMS.equals("SHUFFLE")) { replyMSG.append("<center><table border=\"0\">"); for (String team : _teams) replyMSG.append("<tr><td width=\"100\"><font color=\"LEVEL\">" + team + "</font></td>"); replyMSG.append("</table></center><br>"); replyMSG.append("<button value=\"Join\" action=\"bypass -h npc_" + objectId + "_tvt_player_join eventShuffle\" width=50 height=15 back=\"sek.cbui94\" fore=\"sek.cbui92\">"); replyMSG.append("Teams will be reandomly generated!"); } } } else if (_started && !_joining) replyMSG.append("<center>TvT match is in progress.</center>"); else if (eventPlayer.getLevel() < _minlvl || eventPlayer.getLevel() > _maxlvl) { replyMSG.append("Your lvl : <font color=\"00FF00\">" + eventPlayer.getLevel() + "</font><br>"); replyMSG.append("Admin set min lvl : <font color=\"00FF00\">" + _minlvl + "</font><br>"); replyMSG.append("Admin set max lvl : <font color=\"00FF00\">" + _maxlvl + "</font><br><br>"); replyMSG.append("<font color=\"FFFF00\">You can't participate to this event.</font><br>"); } replyMSG.append("</body></html>"); adminReply.setHtml(replyMSG.toString()); eventPlayer.sendPacket(adminReply); // Send a Server->Client ActionFailed to the L2PcInstance in order to avoid that the client wait another packet eventPlayer.sendPacket(ActionFailed.STATIC_PACKET); } catch (Exception e) { _log.error("TvT Engine[showEventHtlm(" + eventPlayer.getName() + ", " + objectId + ")]: exception" + e.getMessage()); } } public static void addPlayer(L2PcInstance player, String teamName) { if (!addPlayerOk(teamName, player)) return; if (Config.TVT_EVEN_TEAMS.equals("NO") || Config.TVT_EVEN_TEAMS.equals("BALANCE")) { player._teamNameTvT = teamName; _players.add(player); setTeamPlayersCount(teamName, teamPlayersCount(teamName) + 1); } else if (Config.TVT_EVEN_TEAMS.equals("SHUFFLE")) _playersShuffle.add(player); player._inEventTvT = true; player._countTvTkills = 0; } public static void removeOfflinePlayers() { try { if (_playersShuffle == null || _playersShuffle.isEmpty()) return; if (_playersShuffle != null && !_playersShuffle.isEmpty()) { for (L2PcInstance player : _playersShuffle) { if (player == null || player.isOnline() == 0) _playersShuffle.remove(player); } } } catch (Exception e) { return; } } public static boolean checkShufflePlayers(L2PcInstance eventPlayer) { try { for (L2PcInstance player : _playersShuffle) { if (player == null) { _playersShuffle.remove(player); continue; } else if (player.getObjectId() == eventPlayer.getObjectId()) { eventPlayer._inEventTvT = true; eventPlayer._countTvTkills = 0; return true; } // this 1 is incase player got new objectid after DC or reconnect else if (player.getName().equals(eventPlayer.getName())) { _playersShuffle.remove(player); _playersShuffle.add(eventPlayer); eventPlayer._inEventTvT = true; eventPlayer._countTvTkills = 0; return true; } } } catch (Exception e) { } return false; } public static boolean addPlayerOk(String teamName, L2PcInstance eventPlayer) { if (checkShufflePlayers(eventPlayer) || eventPlayer._inEventTvT) { eventPlayer.sendMessage("You already participated in the event!"); return false; } if (eventPlayer._inEventFOS || eventPlayer._inEventCTF || eventPlayer._inEventDM) { eventPlayer.sendMessage("You already participated in another event!"); return false; } for (L2PcInstance player : _players) { if (player.getObjectId() == eventPlayer.getObjectId()) { eventPlayer.sendMessage("You already participated in the event!"); return false; } else if (player.getName() == eventPlayer.getName()) { eventPlayer.sendMessage("You already participated in the event!"); return false; } } if (_players.contains(eventPlayer)) { eventPlayer.sendMessage("You already participated in the event!"); return false; } if (CTF._savePlayers.contains(eventPlayer.getName())) { eventPlayer.sendMessage("You already participated in another event!"); return false; } if (Config.TVT_EVEN_TEAMS.equals("NO")) return true; else if (Config.TVT_EVEN_TEAMS.equals("BALANCE")) { boolean allTeamsEqual = true; int countBefore = -1; for (int playersCount : _teamPlayersCount) { if (countBefore == -1) countBefore = playersCount; if (countBefore != playersCount) { allTeamsEqual = false; break; } countBefore = playersCount; } if (allTeamsEqual) return true; countBefore = Integer.MAX_VALUE; for (int teamPlayerCount : _teamPlayersCount) { if (teamPlayerCount < countBefore) countBefore = teamPlayerCount; } Vector<String> joinableTeams = new Vector<String>(); for (String team : _teams) { if (teamPlayersCount(team) == countBefore) joinableTeams.add(team); } if (joinableTeams.contains(teamName)) return true; } else if (Config.TVT_EVEN_TEAMS.equals("SHUFFLE")) return true; eventPlayer.sendMessage("Too many players in team \"" + teamName + "\""); return false; } public static synchronized void addDisconnectedPlayer(L2PcInstance player) { if (Config.TVT_EVEN_TEAMS.equals("SHUFFLE") && (_teleport || _started) || Config.TVT_EVEN_TEAMS.equals("NO") || Config.TVT_EVEN_TEAMS.equals("BALANCE") && (_teleport || _started)) { if (Config.TVT_ON_START_REMOVE_ALL_EFFECTS) { for (L2Effect e : player.getAllEffects()) { if (e != null) e.exit(); } } player._teamNameTvT = _savePlayerTeams.get(_savePlayers.indexOf(player.getName())); if (!_players.contains(player.getName())) _players.add(player); player._originalNameColorTvT = player.getAppearance().getNameColor(); player._originalKarmaTvT = player.getKarma(); player._inEventTvT = true; player._countTvTkills = 0; player.getAppearance().setNameColor(_teamColors.get(_teams.indexOf(player._teamNameTvT))); player.setKarma(0); player.broadcastUserInfo(); player.teleToLocation(_teamsX.get(_teams.indexOf(player._teamNameTvT)), _teamsY.get(_teams.indexOf(player._teamNameTvT)), _teamsZ.get(_teams.indexOf(player._teamNameTvT))); } } public static void removePlayer(L2PcInstance player) { if (player._inEventTvT) { if (!_joining) { player.getAppearance().setNameColor(player._originalNameColorTvT); player.setKarma(player._originalKarmaTvT); player.broadcastUserInfo(); } player._teamNameTvT = new String(); player._countTvTkills = 0; player._inEventTvT = false; if ((Config.TVT_EVEN_TEAMS.equals("NO") || Config.TVT_EVEN_TEAMS.equals("BALANCE")) && _players.contains(player)) { setTeamPlayersCount(player._teamNameTvT, teamPlayersCount(player._teamNameTvT) - 1); _players.remove(player); } else if (Config.TVT_EVEN_TEAMS.equals("SHUFFLE") && !_playersShuffle.isEmpty() && _playersShuffle.contains(player)) _playersShuffle.remove(player); } } public static void cleanTvT() { _log.info("TvT : Cleaning players."); for (L2PcInstance player : _players) { if (player != null) { removePlayer(player); if (_savePlayers.contains(player.getName())) _savePlayers.remove(player.getName()); player._inEventTvT = false; } } if (_playersShuffle != null && !_playersShuffle.isEmpty()) { for (L2PcInstance player : _playersShuffle) { if (player != null) player._inEventTvT = false; } } _log.info("TvT : Cleaning teams."); for (String team : _teams) { int index = _teams.indexOf(team); _teamPlayersCount.set(index, 0); _teamKillsCount.set(index, 0); } _topKills = 0; _topTeam = new String(); _players = new Vector<L2PcInstance>(); _playersShuffle = new Vector<L2PcInstance>(); _savePlayers = new Vector<String>(); _savePlayerTeams = new Vector<String>(); _log.info("Cleaning TvT done."); } public static void unspawnEventNpc() { if (_npcSpawn == null) return; _npcSpawn.getLastSpawn().deleteMe(); _npcSpawn.stopRespawn(); SpawnTable.getInstance().deleteSpawn(_npcSpawn, true); } public static void teleportFinish() { Announcements.getInstance() .announceToAll(_eventName + "(TvT): Teleport back to participation NPC in 20 seconds!"); ThreadPoolManager.getInstance().scheduleGeneral(new Runnable() { public void run() { for (L2PcInstance player : _players) { if (player != null) player.teleToLocation(_npcX, _npcY, _npcZ); } cleanTvT(); } }, 20000); } public static int teamKillsCount(String teamName) { int index = _teams.indexOf(teamName); if (index == -1) return -1; return _teamKillsCount.get(index); } public static void setTeamKillsCount(String teamName, int teamKillsCount) { int index = _teams.indexOf(teamName); if (index == -1) return; _teamKillsCount.set(index, teamKillsCount); } public static int teamPlayersCount(String teamName) { int index = _teams.indexOf(teamName); if (index == -1) return -1; return _teamPlayersCount.get(index); } public static void setTeamPlayersCount(String teamName, int teamPlayersCount) { int index = _teams.indexOf(teamName); if (index == -1) return; _teamPlayersCount.set(index, teamPlayersCount); } }