lineage2.gameserver.handler.voicecommands.impl.Wedding.java Source code

Java tutorial

Introduction

Here is the source code for lineage2.gameserver.handler.voicecommands.impl.Wedding.java

Source

/*
 * 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() {
    }
}