/*
* 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 .
*/
package com.l2jserver.gameserver.model.entity;
import com.l2jserver.Config;
import com.l2jserver.gameserver.ThreadPoolManager;
import com.l2jserver.gameserver.model.actor.L2Summon;
import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
import com.l2jserver.util.Rnd;
public class TvTEventTeleporter implements Runnable
{
/** The instance of the player to teleport */
private L2PcInstance _playerInstance = null;
/** Coordinates of the spot to teleport to */
private int[] _coordinates = new int[3];
/** Admin removed this player from event */
private boolean _adminRemove = false;
/**
* Initialize the teleporter and start the delayed task
*
* @param playerInstance as L2PcInstance
* @param coordinates as int[]
* @param fastShedule as boolean
* @param adminRemove as boolean
*/
public TvTEventTeleporter(L2PcInstance playerInstance, int[] coordinates, boolean fastSchedule, boolean adminRemove)
{
_playerInstance = playerInstance;
_coordinates = coordinates;
_adminRemove = adminRemove;
long delay = (TvTEvent.isStarted() ? Config.TVT_EVENT_RESPAWN_TELEPORT_DELAY : Config.TVT_EVENT_START_LEAVE_TELEPORT_DELAY) * 1000;
ThreadPoolManager.getInstance().scheduleGeneral(this, fastSchedule ? 0 : delay);
}
/**
* The task method to teleport the player
* 1. Unsummon pet if there is one
* 2. Remove all effects
* 3. Revive and full heal the player
* 4. Teleport the player
* 5. Broadcast status and user info
*
* @see java.lang.Runnable#run()
*/
public void run()
{
if (_playerInstance == null)
return;
L2Summon summon = _playerInstance.getPet();
if (summon != null)
summon.unSummon(_playerInstance);
if (Config.TVT_EVENT_EFFECTS_REMOVAL == 0
|| (Config.TVT_EVENT_EFFECTS_REMOVAL == 1 && (_playerInstance.getTeam() == 0 || (_playerInstance.isInDuel() && _playerInstance.getDuelState() != Duel.DUELSTATE_INTERRUPTED))))
_playerInstance.stopAllEffectsExceptThoseThatLastThroughDeath();
if (_playerInstance.isInDuel())
_playerInstance.setDuelState(Duel.DUELSTATE_INTERRUPTED);
int TvTInstance = TvTEvent.getTvTEventInstance();
if (TvTInstance != 0)
{
if (TvTEvent.isStarted() && !_adminRemove)
{
_playerInstance.setInstanceId(TvTInstance);
}
else
{
_playerInstance.setInstanceId(0);
}
}
else
{
_playerInstance.setInstanceId(0);
}
_playerInstance.doRevive();
_playerInstance.teleToLocation( _coordinates[ 0 ] + Rnd.get(101)-50, _coordinates[ 1 ] + Rnd.get(101)-50, _coordinates[ 2 ], false );
if (TvTEvent.isStarted() && !_adminRemove)
_playerInstance.setTeam(TvTEvent.getParticipantTeamId(_playerInstance.getObjectId()) + 1);
else
_playerInstance.setTeam(0);
_playerInstance.setCurrentCp(_playerInstance.getMaxCp());
_playerInstance.setCurrentHp(_playerInstance.getMaxHp());
_playerInstance.setCurrentMp(_playerInstance.getMaxMp());
_playerInstance.broadcastStatusUpdate();
_playerInstance.broadcastUserInfo();
}
}