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 3 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package lineage2.gameserver.handler.voicecommands.impl; import static lineage2.gameserver.model.Zone.ZoneType.no_restart; import static lineage2.gameserver.model.Zone.ZoneType.no_summon; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import lineage2.commons.dbutils.DbUtils; import lineage2.commons.lang.reference.HardReference; import lineage2.commons.threading.RunnableImpl; import lineage2.gameserver.Config; import lineage2.gameserver.ThreadPoolManager; import lineage2.gameserver.ai.CtrlIntention; import lineage2.gameserver.cache.Msg; import lineage2.gameserver.database.DatabaseFactory; import lineage2.gameserver.handler.voicecommands.IVoicedCommandHandler; import lineage2.gameserver.handler.voicecommands.VoicedCommandHandler; import lineage2.gameserver.instancemanager.CoupleManager; import lineage2.gameserver.instancemanager.ReflectionManager; import lineage2.gameserver.listener.actor.player.OnAnswerListener; import lineage2.gameserver.model.GameObjectsStorage; import lineage2.gameserver.model.Player; import lineage2.gameserver.model.Skill; import lineage2.gameserver.model.Zone; import lineage2.gameserver.model.entity.Couple; import lineage2.gameserver.network.serverpackets.ConfirmDlg; import lineage2.gameserver.network.serverpackets.MagicSkillUse; import lineage2.gameserver.network.serverpackets.SetupGauge; import lineage2.gameserver.network.serverpackets.SystemMessage; import lineage2.gameserver.network.serverpackets.components.CustomMessage; import lineage2.gameserver.network.serverpackets.components.SystemMsg; import lineage2.gameserver.skills.AbnormalEffect; import lineage2.gameserver.tables.SkillTable; import lineage2.gameserver.utils.Location; import org.apache.commons.lang3.tuple.Pair; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * @author Mobius * @version $Revision: 1.0 $ */ public class Wedding implements IVoicedCommandHandler { /** * @author Mobius */ private static class CoupleAnswerListener implements OnAnswerListener { /** * Field _playerRef1. */ private final HardReference<Player> _playerRef1; /** * Field _playerRef2. */ private final HardReference<Player> _playerRef2; /** * Constructor for CoupleAnswerListener. * @param player1 Player * @param player2 Player */ public CoupleAnswerListener(Player player1, Player player2) { _playerRef1 = player1.getRef(); _playerRef2 = player2.getRef(); } /** * Method sayYes. * @see lineage2.gameserver.listener.actor.player.OnAnswerListener#sayYes() */ @Override public void sayYes() { Player player1, player2; if (((player1 = _playerRef1.get()) == null) || ((player2 = _playerRef2.get()) == null)) { return; } CoupleManager.getInstance().createCouple(player1, player2); player1.sendMessage(new CustomMessage("lineage2.gameserver.model.L2Player.EngageAnswerYes", player2)); } /** * Method sayNo. * @see lineage2.gameserver.listener.actor.player.OnAnswerListener#sayNo() */ @Override public void sayNo() { Player player1, player2; if (((player1 = _playerRef1.get()) == null) || ((player2 = _playerRef2.get()) == null)) { return; } player1.sendMessage(new CustomMessage("lineage2.gameserver.model.L2Player.EngageAnswerNo", player2)); } } /** * Field _log. */ private static final Logger _log = LoggerFactory.getLogger(Wedding.class); /** * Field _voicedCommands. */ private static String[] _voicedCommands = { "divorce", "engage", "gotolove" }; /** * Method useVoicedCommand. * @param command String * @param activeChar Player * @param target String * @return boolean * @see lineage2.gameserver.handler.voicecommands.IVoicedCommandHandler#useVoicedCommand(String, Player, String) */ @Override public boolean useVoicedCommand(String command, Player activeChar, String target) { if (!Config.ALLOW_WEDDING) { return false; } if (command.startsWith("engage")) { return engage(activeChar); } else if (command.startsWith("divorce")) { return divorce(activeChar); } else if (command.startsWith("gotolove")) { return goToLove(activeChar); } return false; } /** * Method divorce. * @param activeChar Player * @return boolean */ public boolean divorce(Player activeChar) { if (activeChar.getPartnerId() == 0) { return false; } int _partnerId = activeChar.getPartnerId(); long AdenaAmount = 0; if (activeChar.isMaried()) { activeChar.sendMessage(new CustomMessage("voicedcommandhandlers.Wedding.Divorced", activeChar)); AdenaAmount = Math.abs(((activeChar.getAdena() / 100) * Config.WEDDING_DIVORCE_COSTS) - 10); activeChar.reduceAdena(AdenaAmount, true); } else { activeChar.sendMessage(new CustomMessage("voicedcommandhandlers.Wedding.Disengaged", activeChar)); } activeChar.setMaried(false); activeChar.setPartnerId(0); Couple couple = CoupleManager.getInstance().getCouple(activeChar.getCoupleId()); couple.divorce(); couple = null; Player partner = GameObjectsStorage.getPlayer(_partnerId); if (partner != null) { partner.setPartnerId(0); if (partner.isMaried()) { partner.sendMessage(new CustomMessage("voicedcommandhandlers.Wedding.PartnerDivorce", partner)); } else { partner.sendMessage(new CustomMessage("voicedcommandhandlers.Wedding.PartnerDisengage", partner)); } partner.setMaried(false); if (AdenaAmount > 0) { partner.addAdena(AdenaAmount); } } return true; } /** * Method engage. * @param activeChar Player * @return boolean */ public boolean engage(final Player activeChar) { if (activeChar.getTarget() == null) { activeChar.sendMessage(new CustomMessage("voicedcommandhandlers.Wedding.NoneTargeted", activeChar)); return false; } if (!activeChar.getTarget().isPlayer()) { activeChar .sendMessage(new CustomMessage("voicedcommandhandlers.Wedding.OnlyAnotherPlayer", activeChar)); return false; } if (activeChar.getPartnerId() != 0) { activeChar.sendMessage(new CustomMessage("voicedcommandhandlers.Wedding.AlreadyEngaged", activeChar)); if (Config.WEDDING_PUNISH_INFIDELITY) { activeChar.startAbnormalEffect(AbnormalEffect.BIG_HEAD); int skillId; int skillLevel = 1; if (activeChar.getLevel() > 40) { skillLevel = 2; } if (activeChar.isMageClass()) { skillId = 4361; } else { skillId = 4362; } Skill skill = SkillTable.getInstance().getInfo(skillId, skillLevel); if (activeChar.getEffectList().getEffectsBySkill(skill) == null) { skill.getEffects(activeChar, activeChar, false, false); activeChar.sendPacket(new SystemMessage(SystemMessage.S1_S2S_EFFECT_CAN_BE_FELT) .addSkillName(skillId, skillLevel)); } } return false; } final Player ptarget = (Player) activeChar.getTarget(); if (ptarget.getObjectId() == activeChar.getObjectId()) { activeChar.sendMessage(new CustomMessage("voicedcommandhandlers.Wedding.EngagingYourself", activeChar)); return false; } if (ptarget.isMaried()) { activeChar.sendMessage( new CustomMessage("voicedcommandhandlers.Wedding.PlayerAlreadyMarried", activeChar)); return false; } if (ptarget.getPartnerId() != 0) { activeChar.sendMessage( new CustomMessage("voicedcommandhandlers.Wedding.PlayerAlreadyEngaged", activeChar)); return false; } Pair<Integer, OnAnswerListener> entry = ptarget.getAskListener(false); if ((entry != null) && (entry.getValue() instanceof CoupleAnswerListener)) { activeChar .sendMessage(new CustomMessage("voicedcommandhandlers.Wedding.PlayerAlreadyAsked", activeChar)); return false; } if (ptarget.getPartnerId() != 0) { activeChar.sendMessage( new CustomMessage("voicedcommandhandlers.Wedding.PlayerAlreadyEngaged", activeChar)); return false; } if ((ptarget.getSex() == activeChar.getSex()) && !Config.WEDDING_SAMESEX) { activeChar.sendMessage(new CustomMessage("voicedcommandhandlers.Wedding.SameSex", activeChar)); return false; } boolean FoundOnFriendList = false; int objectId; Connection con = null; PreparedStatement statement = null; ResultSet rset = null; try { con = DatabaseFactory.getInstance().getConnection(); statement = con.prepareStatement("SELECT friend_id FROM character_friends WHERE char_id=?"); statement.setInt(1, ptarget.getObjectId()); rset = statement.executeQuery(); while (rset.next()) { objectId = rset.getInt("friend_id"); if (objectId == activeChar.getObjectId()) { FoundOnFriendList = true; break; } } } catch (Exception e) { _log.error("", e); } finally { DbUtils.closeQuietly(con, statement, rset); } if (!FoundOnFriendList) { activeChar.sendMessage(new CustomMessage("voicedcommandhandlers.Wedding.NotInFriendlist", activeChar)); return false; } ConfirmDlg packet = new ConfirmDlg(SystemMsg.S1, 60000).addString( "Player " + activeChar.getName() + " asking you to engage. Do you want to start new relationship?"); ptarget.ask(packet, new CoupleAnswerListener(activeChar, ptarget)); return true; } /** * Method goToLove. * @param activeChar Player * @return boolean */ public boolean goToLove(Player activeChar) { if (!activeChar.isMaried()) { activeChar.sendMessage(new CustomMessage("voicedcommandhandlers.Wedding.YoureNotMarried", activeChar)); return false; } if (activeChar.getPartnerId() == 0) { activeChar.sendMessage(new CustomMessage("voicedcommandhandlers.Wedding.PartnerNotInDB", activeChar)); return false; } Player partner = GameObjectsStorage.getPlayer(activeChar.getPartnerId()); if (partner == null) { activeChar.sendMessage(new CustomMessage("voicedcommandhandlers.Wedding.PartnerOffline", activeChar)); return false; } if (partner.isInOlympiadMode() || activeChar.isMovementDisabled() || activeChar.isMuted(null) || activeChar.isInOlympiadMode() || activeChar.isInDuel() || activeChar.getPlayer().isTerritoryFlagEquipped() || partner.isInZone(no_summon)) { activeChar.sendMessage(new CustomMessage("common.TryLater", activeChar)); return false; } if ((activeChar.getTeleMode() != 0) || (activeChar.getReflection() != ReflectionManager.DEFAULT)) { activeChar.sendMessage(new CustomMessage("common.TryLater", activeChar)); return false; } if (partner.isInZoneBattle() || partner.isInZone(Zone.ZoneType.SIEGE) || partner.isInZone(no_restart) || partner.isInOlympiadMode() || activeChar.isInZoneBattle() || activeChar.isInZone(Zone.ZoneType.SIEGE) || activeChar.isInZone(no_restart) || activeChar.isInOlympiadMode() || (partner.getReflection() != ReflectionManager.DEFAULT) || partner.isInZone(no_summon) || activeChar.isInObserverMode() || partner.isInObserverMode()) { activeChar.sendPacket(Msg.YOUR_TARGET_IS_IN_AN_AREA_WHICH_BLOCKS_SUMMONING); return false; } if (!activeChar.reduceAdena(Config.WEDDING_TELEPORT_PRICE, true)) { activeChar.sendPacket(Msg.YOU_DO_NOT_HAVE_ENOUGH_ADENA); return false; } int teleportTimer = Config.WEDDING_TELEPORT_INTERVAL; activeChar.abortAttack(true, true); activeChar.abortCast(true, true); activeChar.sendActionFailed(); activeChar.stopMove(); activeChar.startParalyzed(); activeChar.sendMessage(new CustomMessage("voicedcommandhandlers.Wedding.Teleport", activeChar) .addNumber(teleportTimer / 60)); activeChar.getAI().setIntention(CtrlIntention.AI_INTENTION_ACTIVE); activeChar.broadcastPacket(new MagicSkillUse(activeChar, activeChar, 1050, 1, teleportTimer, 0)); activeChar.sendPacket(new SetupGauge(activeChar, SetupGauge.BLUE_DUAL, teleportTimer)); ThreadPoolManager.getInstance().schedule(new EscapeFinalizer(activeChar, partner.getLoc()), teleportTimer * 1000L); return true; } /** * @author Mobius */ static class EscapeFinalizer extends RunnableImpl { /** * Field _activeChar. */ private final Player _activeChar; /** * Field _loc. */ private final Location _loc; /** * Constructor for EscapeFinalizer. * @param activeChar Player * @param loc Location */ EscapeFinalizer(Player activeChar, Location loc) { _activeChar = activeChar; _loc = loc; } /** * Method runImpl. */ @Override public void runImpl() { _activeChar.stopParalyzed(); if (_activeChar.isDead()) { return; } _activeChar.teleToLocation(_loc); } } /** * Method getVoicedCommandList. * @return String[] * @see lineage2.gameserver.handler.voicecommands.IVoicedCommandHandler#getVoicedCommandList() */ @Override public String[] getVoicedCommandList() { return _voicedCommands; } /** * Method onLoad. */ public void onLoad() { VoicedCommandHandler.getInstance().registerVoicedCommandHandler(this); } /** * Method onReload. */ public void onReload() { } /** * Method onShutdown. */ public void onShutdown() { } }