Package com.l2jfrozen.gameserver.model.entity.event

Source Code of com.l2jfrozen.gameserver.model.entity.event.DM

/*
* 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 com.l2jfrozen.gameserver.model.entity.event;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import java.util.Vector;

import javolution.text.TextBuilder;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.l2jfrozen.Config;
import com.l2jfrozen.gameserver.datatables.SkillTable;
import com.l2jfrozen.gameserver.datatables.csv.MapRegionTable;
import com.l2jfrozen.gameserver.datatables.sql.ItemTable;
import com.l2jfrozen.gameserver.managers.CastleManager;
import com.l2jfrozen.gameserver.model.L2Character;
import com.l2jfrozen.gameserver.model.L2Party;
import com.l2jfrozen.gameserver.model.L2Summon;
import com.l2jfrozen.gameserver.model.L2World;
import com.l2jfrozen.gameserver.model.Location;
import com.l2jfrozen.gameserver.model.actor.instance.L2PcInstance;
import com.l2jfrozen.gameserver.model.actor.instance.L2PetInstance;
import com.l2jfrozen.gameserver.model.base.ClassId;
import com.l2jfrozen.gameserver.model.entity.Announcements;
import com.l2jfrozen.gameserver.model.entity.event.manager.EventTask;
import com.l2jfrozen.gameserver.model.entity.olympiad.Olympiad;
import com.l2jfrozen.gameserver.model.entity.siege.Castle;
import com.l2jfrozen.gameserver.network.serverpackets.ActionFailed;
import com.l2jfrozen.gameserver.network.serverpackets.NpcHtmlMessage;
import com.l2jfrozen.gameserver.network.serverpackets.Ride;
import com.l2jfrozen.gameserver.network.serverpackets.StatusUpdate;
import com.l2jfrozen.gameserver.thread.ThreadPoolManager;
import com.l2jfrozen.util.CloseUtil;
import com.l2jfrozen.util.database.L2DatabaseFactory;
import com.l2jfrozen.util.random.Rnd;

/**
* The Class DM.
*/
public class DM implements EventTask
{
 
  /** The Constant LOGGER. */
  protected static final Logger LOGGER = LoggerFactory.getLogger(DM.class.getName());
 
  /** The _joining location name. */
  private static String _eventName = new String(), _eventDesc = new String(), _joiningLocationName = new String();
 
  /** The _in progress. */
  public static boolean _joining = false, _teleport = false, _started = false, _aborted = false, _sitForced = false, _inProgress = false, _isEventMobDM = false;
 
  /** The _player z. */
  protected static int _npcId = 0, _npcX = 0, _npcY = 0, _npcZ = 0, _npcHeading = 0, _rewardId = 0, _rewardAmount = 0, _minlvl = 0, _maxlvl = 0, _joinTime = 0, _eventTime = 0, _minPlayers = 0, _maxPlayers = 0, _topKills = 0, _playerColors = 0, _playerX = 0, _playerY = 0, _playerZ = 0;
 
  /** The _interval between matchs. */
  private static long _intervalBetweenMatchs = 0;
 
  /** The start event time. */
  private String startEventTime;
 
  /** The _team event. */
  protected static boolean _teamEvent = false; // TODO to be integrated
 
  /** The _players. */
  public static Vector<L2PcInstance> _players = new Vector<L2PcInstance>();
 
  /** The _top players. */
  public static List<L2PcInstance> _topPlayers = new ArrayList<L2PcInstance>();
 
  /** The _save players. */
  public static Vector<String> _savePlayers = new Vector<String>();
 
  /**
   * Instantiates a new dM.
   */
  private DM()
  {
  }
 
  /**
   * Gets the new instance.
   * @return the new instance
   */
  public static DM getNewInstance()
  {
    return new DM();
  }
 
  /**
   * Gets the _event name.
   * @return the _eventName
   */
  public static String get_eventName()
  {
    return _eventName;
  }
 
  /**
   * Set_event name.
   * @param _eventName the _eventName to set
   * @return true, if successful
   */
  public static boolean set_eventName(String _eventName)
  {
    if (!is_inProgress())
    {
      DM._eventName = _eventName;
      return true;
    }
    return false;
  }
 
  /**
   * Gets the _event desc.
   * @return the _eventDesc
   */
  public static String get_eventDesc()
  {
    return _eventDesc;
  }
 
  /**
   * Set_event desc.
   * @param _eventDesc the _eventDesc to set
   * @return true, if successful
   */
  public static boolean set_eventDesc(String _eventDesc)
  {
    if (!is_inProgress())
    {
      DM._eventDesc = _eventDesc;
      return true;
    }
    return false;
  }
 
  /**
   * Gets the _joining location name.
   * @return the _joiningLocationName
   */
  public static String get_joiningLocationName()
  {
    return _joiningLocationName;
  }
 
  /**
   * Set_joining location name.
   * @param _joiningLocationName the _joiningLocationName to set
   * @return true, if successful
   */
  public static boolean set_joiningLocationName(String _joiningLocationName)
  {
    if (!is_inProgress())
    {
      DM._joiningLocationName = _joiningLocationName;
      return true;
    }
    return false;
  }
 
  /**
   * Gets the _npc id.
   * @return the _npcId
   */
  public static int get_npcId()
  {
    return _npcId;
  }
 
  /**
   * Set_npc id.
   * @param _npcId the _npcId to set
   * @return true, if successful
   */
  public static boolean set_npcId(int _npcId)
  {
    if (!is_inProgress())
    {
      DM._npcId = _npcId;
      return true;
    }
    return false;
  }
 
  /**
   * Gets the _npc location.
   * @return the _npc location
   */
  public static Location get_npcLocation()
  {
    Location npc_loc = new Location(_npcX, _npcY, _npcZ, _npcHeading);
   
    return npc_loc;
  }
 
  /**
   * Gets the _reward id.
   * @return the _rewardId
   */
  public static int get_rewardId()
  {
    return _rewardId;
  }
 
  /**
   * Set_reward id.
   * @param _rewardId the _rewardId to set
   * @return true, if successful
   */
  public static boolean set_rewardId(int _rewardId)
  {
    if (!is_inProgress())
    {
      DM._rewardId = _rewardId;
      return true;
    }
    return false;
  }
 
  /**
   * Gets the _reward amount.
   * @return the _rewardAmount
   */
  public static int get_rewardAmount()
  {
    return _rewardAmount;
  }
 
  /**
   * Set_reward amount.
   * @param _rewardAmount the _rewardAmount to set
   * @return true, if successful
   */
  public static boolean set_rewardAmount(int _rewardAmount)
  {
    if (!is_inProgress())
    {
      DM._rewardAmount = _rewardAmount;
      return true;
    }
    return false;
  }
 
  /**
   * Gets the _minlvl.
   * @return the _minlvl
   */
  public static int get_minlvl()
  {
    return _minlvl;
  }
 
  /**
   * Set_minlvl.
   * @param _minlvl the _minlvl to set
   * @return true, if successful
   */
  public static boolean set_minlvl(int _minlvl)
  {
    if (!is_inProgress())
    {
      DM._minlvl = _minlvl;
      return true;
    }
    return false;
  }
 
  /**
   * Gets the _maxlvl.
   * @return the _maxlvl
   */
  public static int get_maxlvl()
  {
    return _maxlvl;
  }
 
  /**
   * Set_maxlvl.
   * @param _maxlvl the _maxlvl to set
   * @return true, if successful
   */
  public static boolean set_maxlvl(int _maxlvl)
  {
    if (!is_inProgress())
    {
      DM._maxlvl = _maxlvl;
      return true;
    }
    return false;
  }
 
  /**
   * Gets the _join time.
   * @return the _joinTime
   */
  public static int get_joinTime()
  {
    return _joinTime;
  }
 
  /**
   * Set_join time.
   * @param _joinTime the _joinTime to set
   * @return true, if successful
   */
  public static boolean set_joinTime(int _joinTime)
  {
    if (!is_inProgress())
    {
      DM._joinTime = _joinTime;
      return true;
    }
    return false;
  }
 
  /**
   * Gets the _event time.
   * @return the _eventTime
   */
  public static int get_eventTime()
  {
    return _eventTime;
  }
 
  /**
   * Set_event time.
   * @param _eventTime the _eventTime to set
   * @return true, if successful
   */
  public static boolean set_eventTime(int _eventTime)
  {
    if (!is_inProgress())
    {
      DM._eventTime = _eventTime;
      return true;
    }
    return false;
  }
 
  /**
   * Gets the _min players.
   * @return the _minPlayers
   */
  public static int get_minPlayers()
  {
    return _minPlayers;
  }
 
  /**
   * Set_min players.
   * @param _minPlayers the _minPlayers to set
   * @return true, if successful
   */
  public static boolean set_minPlayers(int _minPlayers)
  {
    if (!is_inProgress())
    {
      DM._minPlayers = _minPlayers;
      return true;
    }
    return false;
  }
 
  /**
   * Gets the _max players.
   * @return the _maxPlayers
   */
  public static int get_maxPlayers()
  {
    return _maxPlayers;
  }
 
  /**
   * Set_max players.
   * @param _maxPlayers the _maxPlayers to set
   * @return true, if successful
   */
  public static boolean set_maxPlayers(int _maxPlayers)
  {
    if (!is_inProgress())
    {
      DM._maxPlayers = _maxPlayers;
      return true;
    }
    return false;
  }
 
  /**
   * Gets the _interval between matchs.
   * @return the _intervalBetweenMatchs
   */
  public static long get_intervalBetweenMatchs()
  {
    return _intervalBetweenMatchs;
  }
 
  /**
   * Set_interval between matchs.
   * @param _intervalBetweenMatchs the _intervalBetweenMatchs to set
   * @return true, if successful
   */
  public static boolean set_intervalBetweenMatchs(long _intervalBetweenMatchs)
  {
    if (!is_inProgress())
    {
      DM._intervalBetweenMatchs = _intervalBetweenMatchs;
      return true;
    }
    return false;
  }
 
  /**
   * Gets the start event time.
   * @return the startEventTime
   */
  public String getStartEventTime()
  {
    return startEventTime;
  }
 
  /**
   * Sets the start event time.
   * @param startEventTime the startEventTime to set
   * @return true, if successful
   */
  public boolean setStartEventTime(String startEventTime)
  {
    if (!is_inProgress())
    {
      this.startEventTime = startEventTime;
      return true;
    }
    return false;
  }
 
  /**
   * Checks if is _joining.
   * @return the _joining
   */
  public static boolean is_joining()
  {
    return _joining;
  }
 
  /**
   * Checks if is _teleport.
   * @return the _teleport
   */
  public static boolean is_teleport()
  {
    return _teleport;
  }
 
  /**
   * Checks if is _started.
   * @return the _started
   */
  public static boolean is_started()
  {
    return _started;
  }
 
  /**
   * Checks if is _aborted.
   * @return the _aborted
   */
  public static boolean is_aborted()
  {
    return _aborted;
  }
 
  /**
   * Checks if is _sit forced.
   * @return the _sitForced
   */
  public static boolean is_sitForced()
  {
    return _sitForced;
  }
 
  /**
   * Checks if is _in progress.
   * @return the _inProgress
   */
  public static boolean is_inProgress()
  {
    return _inProgress;
  }
 
  /**
   * Check max level.
   * @param maxlvl the maxlvl
   * @return true, if successful
   */
  public static boolean checkMaxLevel(int maxlvl)
  {
    if (_minlvl >= maxlvl)
      return false;
   
    return true;
  }
 
  /**
   * Check min level.
   * @param minlvl the minlvl
   * @return true, if successful
   */
  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.
   * @param players the players
   * @return true, if successful
   */
  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.
   * @param players the players
   * @return true, if successful
   */
  public static boolean checkMaxPlayers(int players)
  {
    if (_maxPlayers > players)
      return true;
   
    return false;
  }
 
  /**
   * Check start join ok.
   * @return true, if successful
   */
  public static boolean checkStartJoinOk()
  {
    if (_started || _teleport || _joining || _eventName.equals("") || _joiningLocationName.equals("") || _eventDesc.equals("") || _npcId == 0 || _npcX == 0 || _npcY == 0 || _npcZ == 0 || _rewardId == 0 || _rewardAmount == 0)
      return false;
   
    if (_teamEvent)
    {
      if (!checkStartJoinTeamInfo())
        return false;
    }
    else
    {
      if (!checkStartJoinPlayerInfo())
        return false;
    }
   
    if (!Config.ALLOW_EVENTS_DURING_OLY && Olympiad.getInstance().inCompPeriod())
      return false;
   
    for (Castle castle : CastleManager.getInstance().getCastles())
    {
      if (castle != null && castle.getSiege() != null && castle.getSiege().getIsInProgress())
        return false;
    }
   
    if (!checkOptionalEventStartJoinOk())
      return false;
   
    return true;
  }
 
  /**
   * Check start join team info.
   * @return true, if successful
   */
  private static boolean checkStartJoinTeamInfo()
  {
    // TODO be integrated
    return true;
  }
 
  /**
   * Check start join player info.
   * @return true, if successful
   */
  private static boolean checkStartJoinPlayerInfo()
  {
    if (_playerX == 0 || _playerY == 0 || _playerZ == 0 || _playerColors == 0)
    {
      return false;
    }
   
    return true;
  }
 
  /**
   * Check auto event start join ok.
   * @return true, if successful
   */
  private static boolean checkAutoEventStartJoinOk()
  {
    if (_joinTime == 0 || _eventTime == 0)
    {
      return false;
    }
   
    return true;
  }
 
  /**
   * Check optional event start join ok.
   * @return true, if successful
   */
  private static boolean checkOptionalEventStartJoinOk()
  {
    // TODO be integrated
    return true;
  }
 
  /**
   * Sets the npc pos.
   * @param activeChar the new npc pos
   */
  public static void setNpcPos(L2PcInstance activeChar)
  {
    _npcX = activeChar.getX();
    _npcY = activeChar.getY();
    _npcZ = activeChar.getZ();
    _npcHeading = activeChar.getHeading();
  }
 
  /**
   * Start join.
   * @return true, if successful
   */
  public static boolean startJoin()
  {
    if (!checkStartJoinOk())
    {
      if (Config.DEBUG)
        LOGGER.info( _eventName + " Engine[startJoin]: startJoinOk() = false");
      return false;
    }
    removeNoneParticipantsInZone();
    _inProgress = true;
    _joining = true;
    _isEventMobDM = true;
    Announcements.getInstance().gameAnnounceToAll(_eventName + " Event");
    if (Config.DM_ANNOUNCE_REWARD && ItemTable.getInstance().getTemplate(_rewardId) != null)
      Announcements.getInstance().gameAnnounceToAll("Reward: " + _rewardAmount + " " + ItemTable.getInstance().getTemplate(_rewardId).getName());
    Announcements.getInstance().gameAnnounceToAll("DM: Recruiting levels: " + _minlvl + " to " + _maxlvl);
    Announcements.getInstance().gameAnnounceToAll("DM: Joinable in " + _joiningLocationName);
   
    if (Config.DM_COMMAND)
      Announcements.getInstance().gameAnnounceToAll(" or by command .dmjoin! To leave .dmleave! For Info .dminfo!");   
    return true;
  }
 
  /**
   * Start teleport.
   * @return true, if successful
   */
  public static boolean startTeleport()
  {
    if (!_joining || _started || _teleport)
      return false;
   
    removeOfflinePlayers();
   
    if (_teamEvent)
    {
      /*
       * if(Config.EVEN_TEAMS.equals("SHUFFLE") && checkMinPlayers(_playersShuffle.size())) { shuffleTeams(); } else if(Config.EVEN_TEAMS.equals("SHUFFLE") && !checkMinPlayers(_playersShuffle.size())) {
       * Announcements.getInstance().gameAnnounceToAll("Not enough players for event. Min Requested : " + _minPlayers +", Participating : " + _playersShuffle.size()); return false; }
       */
    }
    else
    {
      // final int size = getPlayers().size();
      synchronized (_players)
      {
        final int size = _players.size();
        if (!checkMinPlayers(size))
        {
          Announcements.getInstance().gameAnnounceToAll("DM: Not enough players for event. Min Requested : " + _minPlayers + ", Participating : " + size);
          if (Config.DM_STATS_LOGGER)
            LOGGER.info(_eventName + ": Not enough players for event. Min Requested : " + _minPlayers + ", Participating : " + size);
         
          return false;
        }
      }
    }
   
    _joining = false;
    Announcements.getInstance().gameAnnounceToAll(_eventName + ": Teleport to team spot in 20 seconds!");
   
    setUserData();
    ThreadPoolManager.getInstance().scheduleGeneral(new Runnable()
    {
      @Override
      public void run()
      {
        sit();
        afterTeleportOperations();
       
        // final Vector<L2PcInstance> players = getPlayers();
        synchronized (_players)
        {
         
          for (final L2PcInstance player : _players)
          {
            if (player != null)
            {
              if (Config.DM_ON_START_UNSUMMON_PET)
              {
                // Remove Summon's buffs
                if (player.getPet() != null)
                {
                  L2Summon summon = player.getPet();
                  summon.stopAllEffects();
                 
                  if (summon instanceof L2PetInstance)
                    summon.unSummon(player);
                }
              }
             
              if (Config.DM_ON_START_REMOVE_ALL_EFFECTS)
              {
                player.stopAllEffects();
               
              }
             
              // Remove player from his party
              if (player.getParty() != null)
              {
                L2Party party = player.getParty();
                party.removePartyMember(player);
              }
             
              // player._originalTitleDM = player.getTitle();
              // player.setTitle("Kills: " + player._countDMkills);
             
              if (_teamEvent)
              {
                // player.teleToLocation(_teamsX.get(_teams.indexOf(player._teamNameCTF)), _teamsY.get(_teams.indexOf(player._teamNameCTF)), _teamsZ.get(_teams.indexOf(player._teamNameCTF)));
               
              }
              else
              {
                int offset = Config.DM_SPAWN_OFFSET;
                player.teleToLocation(_playerX + Rnd.get(offset), _playerY + Rnd.get(offset), _playerZ);
              }
            }
          }
         
        }
       
      }
    }, 20000);
    _teleport = true;
    return true;
  }
 
  /**
   * After teleport operations.
   */
  protected static void afterTeleportOperations()
  {
   
  }
 
  /**
   * Start event.
   * @return true, if successful
   */
  public static boolean startEvent()
  {
    if (!startEventOk())
    {
      if (Config.DEBUG)
        LOGGER.info( _eventName + " Engine[startEvent()]: startEventOk() = false");
      return false;
    }
   
    _teleport = false;
   
    sit();
    removeParties();
   
    afterStartOperations();
   
    Announcements.getInstance().gameAnnounceToAll(_eventName + ": Started. Go kill your enemies!");
    _started = true;
   
    return true;
  }
 
  /**
   * Removes the parties.
   */
  private static void removeParties()
  {
    // final Vector<L2PcInstance> players = getPlayers();
    synchronized (_players)
    {
     
      for (final L2PcInstance player : _players)
      {
        if (player.getParty() != null)
        {
          L2Party party = player.getParty();
          party.removePartyMember(player);
        }
      }
    }
  }
 
  /**
   * After start operations.
   */
  private static void afterStartOperations()
  {
   
  }
 
  /**
   * Restarts Event checks if event was aborted. and if true cancels restart task
   */
  public synchronized static void restartEvent()
  {
    LOGGER.info(_eventName + ": Event has been restarted...");
    _joining = false;
    _started = false;
    _inProgress = false;
    _aborted = false;
    long delay = _intervalBetweenMatchs;
   
    Announcements.getInstance().gameAnnounceToAll(_eventName + ": joining period will be avaible again in " + _intervalBetweenMatchs + " minute(s)!");
   
    waiter(delay);
   
    try
    {
      if (!_aborted)
        autoEvent(); // start a new event
      else
        Announcements.getInstance().gameAnnounceToAll(_eventName + ": next event aborted!");
    }
    catch (Exception e)
    {
      LOGGER.info( _eventName + ": Error While Trying to restart Event...", e);
      e.printStackTrace();
    }
  }
 
  /**
   * Finish event.
   */
  public static void finishEvent()
  {
    if (!finishEventOk())
    {
      if (Config.DEBUG)
        LOGGER.info( _eventName + " Engine[finishEvent]: finishEventOk() = false");
      return;
    }
   
    _started = false;
    _aborted = false;
    _isEventMobDM = false;
   
    afterFinishOperations();
   
    if (_teamEvent)
    {
      processTopTeam();
    }
    else
    {
      processTopPlayer();
     
      if (_topKills != 0)
      {
        String winners = "";
        for (L2PcInstance winner : _topPlayers)
        {
          winners = winners + " " + winner.getName();
        }
        Announcements.getInstance().gameAnnounceToAll(_eventName + ": " + winners + " win the match! " + _topKills + " kills.");
        rewardPlayer();
       
        if (Config.DM_STATS_LOGGER)
        {
          LOGGER.info("**** " + _eventName + " ****");
          LOGGER.info(_eventName + ": " + winners + " win the match! " + _topKills + " kills.");
        }
      }
      else
      {
       
        Announcements.getInstance().gameAnnounceToAll(_eventName + ": No players win the match(nobody killed).");
        if (Config.DM_STATS_LOGGER)
          LOGGER.info(_eventName + ": No players win the match(nobody killed).");
      }
    }
   
    teleportFinish();
  }
 
  /**
   * After finish operations.
   */
  private static void afterFinishOperations()
  {
   
  }
 
  /**
   * Abort event.
   */
  public static void abortEvent()
  {
    if (!_joining && !_teleport && !_started)
      return;
   
    if (_joining && !_teleport && !_started)
    {
      cleanDM();
      _isEventMobDM = false;
      _joining = false;
      _inProgress = false;
      Announcements.getInstance().gameAnnounceToAll(_eventName + ": Match aborted!");
      return;
    }
    _joining = false;
    _teleport = false;
    _started = false;
    _aborted = true;
    _isEventMobDM = false;
   
    afterFinish();
   
    Announcements.getInstance().gameAnnounceToAll(_eventName + ": Match aborted!");
    teleportFinish();
  }
 
  /**
   * After finish.
   */
  private static void afterFinish()
  {
   
  }
 
  /**
   * Teleport finish.
   */
  public static void teleportFinish()
  {
    sit();
   
    Announcements.getInstance().gameAnnounceToAll(_eventName + ": Teleport back to participation NPC in 20 seconds!");
   
    removeUserData();
    ThreadPoolManager.getInstance().scheduleGeneral(new Runnable()
    {
      @Override
      public void run()
      {
        // final Vector<L2PcInstance> players = getPlayers();
        synchronized (_players)
        {
         
          for (final L2PcInstance player : _players)
          {
            if (player != null)
            {
              if (player.isOnline() != 0)
                player.teleToLocation(_npcX, _npcY, _npcZ, false);
              else
              {
                java.sql.Connection con = null;
                try
                {
                  con = L2DatabaseFactory.getInstance().getConnection(false);
                 
                  PreparedStatement statement = con.prepareStatement("UPDATE characters SET x=?, y=?, z=? WHERE char_name=?");
                  statement.setInt(1, _npcX);
                  statement.setInt(2, _npcY);
                  statement.setInt(3, _npcZ);
                  statement.setString(4, player.getName());
                  statement.execute();
                  statement.close();
                }
                catch (Exception e) {
                                    LOGGER.error("", e);

                                    LOGGER.info(e.getMessage(), e);
                                }
                finally
                {
                  CloseUtil.close(con);
                  con = null;
                }
              }
            }
          }
         
        }
       
        sit();
        cleanDM();
      }
    }, 20000);
  }
 
  /**
   * Auto event.
   */
  public static void autoEvent()
  {
    LOGGER.info("Starting " + _eventName + "!");
    LOGGER.info("Matchs Are Restarted At Every: " + getIntervalBetweenMatchs() + " Minutes.");
    if (checkAutoEventStartJoinOk() && startJoin() && !_aborted)
    {
      if (_joinTime > 0)
        waiter(_joinTime * 60 * 1000); // minutes for join event
      else if (_joinTime <= 0)
      {
        LOGGER.info(_eventName + ": join time <=0 aborting event.");
        abortEvent();
        return;
      }
      if (startTeleport() && !_aborted)
      {
        waiter(30 * 1000); // 30 sec wait time untill start fight after teleported
        if (startEvent() && !_aborted)
        {
          LOGGER.info( _eventName + ": waiting.....minutes for event time " + _eventTime);
         
          waiter(_eventTime * 60 * 1000); // minutes for event time
          finishEvent();
         
          LOGGER.info(_eventName + ": waiting... delay for final messages ");
          waiter(60000);// just a give a delay delay for final messages
          sendFinalMessages();
         
          if (!_started && !_aborted)
          { // if is not already started and it's not aborted
         
            LOGGER.info(_eventName + ": waiting.....delay for restart event  " + _intervalBetweenMatchs + " minutes.");
            waiter(60000);// just a give a delay to next restart
           
            try
            {
              if (!_aborted)
                restartEvent();
            }
            catch (Exception e)
            {
              LOGGER.info( "Error while tying to Restart Event", e);
              e.printStackTrace();
            }
           
          }
         
        }
      }
      else if (!_aborted)
      {
       
        abortEvent();
        restartEvent();
       
      }
    }
  }
 
  // start without restart
  /**
   * Event once start.
   */
  public static void eventOnceStart()
  {
    if (startJoin() && !_aborted)
    {
      if (_joinTime > 0)
        waiter(_joinTime * 60 * 1000); // minutes for join event
      else if (_joinTime <= 0)
      {
        abortEvent();
        return;
      }
      if (startTeleport() && !_aborted)
      {
        waiter(1 * 60 * 1000); // 1 min wait time untill start fight after teleported
        if (startEvent() && !_aborted)
        {
          waiter(_eventTime * 60 * 1000); // minutes for event time
          finishEvent();
        }
      }
      else if (!_aborted)
      {
        abortEvent();
      }
    }
  }
 
  /**
   * Waiter.
   * @param interval the interval
   */
  private static void waiter(long interval)
  {
    long startWaiterTime = System.currentTimeMillis();
    int seconds = (int) (interval / 1000);
   
    while (startWaiterTime + interval > System.currentTimeMillis() && !_aborted)
    {
      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
            removeOfflinePlayers();
           
            if (_joining)
            {
              Announcements.getInstance().gameAnnounceToAll(_eventName + ": Joinable in " + _joiningLocationName + "!");
              Announcements.getInstance().gameAnnounceToAll(_eventName + ": " + seconds / 60 / 60 + " hour(s) till registration close!");
            }
            else if (_started)
              Announcements.getInstance().gameAnnounceToAll(_eventName + ": " + 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
            // removeOfflinePlayers();
           
            if (_joining)
            {
              Announcements.getInstance().gameAnnounceToAll(_eventName + ": Joinable in " + _joiningLocationName + "!");
              Announcements.getInstance().gameAnnounceToAll(_eventName + ": " + seconds / 60 + " minute(s) till registration close!");
            }
            else if (_started)
              Announcements.getInstance().gameAnnounceToAll(_eventName + ": " + seconds / 60 + " minute(s) till event finish!");
           
            break;
          case 30: // 30 seconds left
          case 15: // 15 seconds left
          case 10: // 10 seconds left
            removeOfflinePlayers();
          case 3: // 3 seconds left
          case 2: // 2 seconds left
          case 1: // 1 seconds left
           
            if (_joining)
              Announcements.getInstance().gameAnnounceToAll(_eventName + ": " + seconds + " second(s) till registration close!");
            else if (_teleport)
              Announcements.getInstance().gameAnnounceToAll(_eventName + ": " + seconds + " seconds(s) till start fight!");
            else if (_started)
              Announcements.getInstance().gameAnnounceToAll(_eventName + ": " + 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) {
                    LOGGER.error("", ie);
                }
      }
    }
  }
 
  /**
   * Sit.
   */
  public static void sit()
  {
    if (_sitForced)
      _sitForced = false;
    else
      _sitForced = true;
   
    // final Vector<L2PcInstance> players = getPlayers();
    synchronized (_players)
    {
     
      for (final 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();
          }
        }
      }
     
    }
   
  }
 
  /**
   * Removes the offline players.
   */
  public static void removeOfflinePlayers()
  {
    try
    {
      // final Vector<L2PcInstance> players = getPlayers();
      synchronized (_players)
      {
       
        if (_players == null || _players.isEmpty())
          return;
       
        List<L2PcInstance> toBeRemoved = new ArrayList<L2PcInstance>();
       
        for (L2PcInstance player : _players)
        {
          if (player == null)
            continue;
          else if (player._inEventDM && player.isOnline() == 0 || player.isInJail() || player.isOffline())
          {
           
            if (!_joining)
            {
              player.getAppearance().setNameColor(player._originalNameColorDM);
              player.setTitle(player._originalTitleDM);
              player.setKarma(player._originalKarmaDM);
             
              player.broadcastUserInfo();
             
            }
           
            // after remove, all event data must be cleaned in player
            player._originalNameColorDM = 0;
            player._originalTitleDM = null;
            player._originalKarmaDM = 0;
            player._countDMkills = 0;
            player._inEventDM = false;
           
            toBeRemoved.add(player);
            // _players.remove(player);
           
            player.sendMessage("Your participation in the DeathMatch event has been removed.");
          }
         
        }
        _players.removeAll(toBeRemoved);
       
      }
    }
    catch (Exception e) {
            LOGGER.error("", e);

            LOGGER.info(e.getMessage(), e);
            return;
        }
  }
 
  /**
   * Start event ok.
   * @return true, if successful
   */
  private static boolean startEventOk()
  {
    if (_joining || !_teleport || _started)
      return false;
   
    return true;
  }
 
  /**
   * Finish event ok.
   * @return true, if successful
   */
  private static boolean finishEventOk()
  {
    if (!_started)
      return false;
   
    return true;
  }
 
  /**
   * Adds the player ok.
   * @param eventPlayer the event player
   * @return true, if successful
   */
  private static boolean addPlayerOk(L2PcInstance eventPlayer)
  {
    if (eventPlayer._inEventDM)
    {
      eventPlayer.sendMessage("You already participated in the event!");
      return false;
    }
   
    if(eventPlayer._inEventCTF || eventPlayer._inEventTvT || eventPlayer._inEventRaid)
    {
      eventPlayer.sendMessage("You already participated to another event!");
      return false;
    }
   
    if (Olympiad.getInstance().isRegistered(eventPlayer) || eventPlayer.isInOlympiadMode())
    {
      eventPlayer.sendMessage("You already participated in Olympiad!");
      return false;
    }
   
    if (!Config.Allow_Same_HWID_On_Events && eventPlayer.getHWid() != null && eventPlayer.getHWid().length() != 0)
    {
      List<String> players_in_boxes = eventPlayer.active_boxes_characters;
      L2PcInstance pc = null;
      for(String character_name:  players_in_boxes)
      {
        pc = L2World.getInstance().getPlayer(character_name);
        if (pc != null && eventPlayer.getHWid().equals(pc.getHWid()))
        {
          if(pc._inEventDM)
          {
            eventPlayer.sendMessage("You already participated in event with a different char!");
            return false;
          }
        }
      }
    }
   
    if (eventPlayer._active_boxes > 1 && !Config.ALLOW_DUALBOX_EVENT)
    {
      List<String> players_in_boxes = eventPlayer.active_boxes_characters;
     
      if (players_in_boxes != null && players_in_boxes.size() > 1)
        for (String character_name : players_in_boxes)
        {
          L2PcInstance player = L2World.getInstance().getPlayer(character_name);
         
          if (player != null && player._inEventDM)
          {
            eventPlayer.sendMessage("You already participated in event with another char!");
            return false;
          }
        }
     
      /*
       * eventPlayer.sendMessage("Dual Box not allowed in Events"); return false;
       */
    }
   
    if (!Config.DM_ALLOW_HEALER_CLASSES && (eventPlayer.getClassId() == ClassId.cardinal || eventPlayer.getClassId() == ClassId.evaSaint || eventPlayer.getClassId() == ClassId.shillienSaint))
    {
      eventPlayer.sendMessage("You cant join with Healer Class!");
      return false;
    }
   
    // final Vector<L2PcInstance> players = getPlayers();
    synchronized (_players)
    {
      if (_players.contains(eventPlayer))
      {
        eventPlayer.sendMessage("You already participated in the 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().equalsIgnoreCase(eventPlayer.getName()))
        {
          eventPlayer.sendMessage("You already participated in the event!");
          return false;
        }
      }
     
    }
   
    return true;
  }
 
  /**
   * Sets the user data.
   */
  public static void setUserData()
  {
    // final Vector<L2PcInstance> players = getPlayers();
   
    synchronized (_players)
    {
     
      for (L2PcInstance player : _players)
      {
        player._originalNameColorDM = player.getAppearance().getNameColor();
        player._originalKarmaDM = player.getKarma();
        player._originalTitleDM = player.getTitle();
        player.getAppearance().setNameColor(_playerColors);
        player.setKarma(0);
        player.setTitle("Kills: " + player._countDMkills);
       
        if (player.isMounted())
        {
          if (player.setMountType(0))
          {
            if (player.isFlying())
            {
              player.removeSkill(SkillTable.getInstance().getInfo(4289, 1));
            }
           
            Ride dismount = new Ride(player.getObjectId(), Ride.ACTION_DISMOUNT, 0);
            player.broadcastPacket(dismount);
            player.setMountObjectID(0);
          }
        }
        player.broadcastUserInfo();
      }
    }
  }
 
  /**
   * Dump data.
   */
  public static void dumpData()
  {
    LOGGER.info("");
    LOGGER.info("");
   
    if (!_joining && !_teleport && !_started)
    {
      LOGGER.info("<<---------------------------------->>");
      LOGGER.info(">> " + _eventName + " Engine infos dump (INACTIVE) <<");
      LOGGER.info("<<--^----^^-----^----^^------^^----->>");
    }
    else if (_joining && !_teleport && !_started)
    {
      LOGGER.info("<<--------------------------------->>");
      LOGGER.info(">> " + _eventName + " Engine infos dump (JOINING) <<");
      LOGGER.info("<<--^----^^-----^----^^------^----->>");
    }
    else if (!_joining && _teleport && !_started)
    {
      LOGGER.info("<<---------------------------------->>");
      LOGGER.info(">> " + _eventName + " Engine infos dump (TELEPORT) <<");
      LOGGER.info("<<--^----^^-----^----^^------^^----->>");
    }
    else if (!_joining && !_teleport && _started)
    {
      LOGGER.info("<<--------------------------------->>");
      LOGGER.info(">> " + _eventName + " Engine infos dump (STARTED) <<");
      LOGGER.info("<<--^----^^-----^----^^------^----->>");
    }
   
    LOGGER.info("Name: " + _eventName);
    LOGGER.info("Desc: " + _eventDesc);
    LOGGER.info("Join location: " + _joiningLocationName);
    LOGGER.info("Min lvl: " + _minlvl);
    LOGGER.info("Max lvl: " + _maxlvl);
   
    LOGGER.warn("SYS_LOG: "+"");
    LOGGER.warn("SYS_LOG: "+"##################################");
    LOGGER.warn("SYS_LOG: "+"# _players(Vector<L2PcInstance>) #");
    LOGGER.warn("SYS_LOG: "+"##################################");
   
    // final Vector<L2PcInstance> players = getPlayers();
    synchronized (_players)
    {
      LOGGER.warn("SYS_LOG: "+"Total Players : " + _players.size());
     
      for (final L2PcInstance player : _players)
      {
        if (player != null)
          LOGGER.warn("SYS_LOG: "+"Name: " + player.getName() + " kills :" + player._countDMkills);
      }
    }
   
    LOGGER.warn("SYS_LOG: "+"");
    LOGGER.warn("SYS_LOG: "+"################################");
    LOGGER.warn("SYS_LOG: "+"# _savePlayers(Vector<String>) #");
    LOGGER.warn("SYS_LOG: "+"################################");
   
    for (String player : _savePlayers)
      LOGGER.warn("SYS_LOG: "+"Name: " + player);
   
    LOGGER.info("");
    LOGGER.info("");
   
    dumpLocalEventInfo();
  }
 
  /**
   * Dump local event info.
   */
  private static void dumpLocalEventInfo()
  {
   
  }
 
  /**
   * Load data.
   */
  public static void loadData()
  {
    _eventName = new String();
    _eventDesc = new String();
    _joiningLocationName = new String();
    _savePlayers = new Vector<String>();
   
    synchronized (_players)
    {
      _players.clear();
    }
   
    _topPlayers = new ArrayList<L2PcInstance>();
    _joining = false;
    _teleport = false;
    _started = false;
    _sitForced = false;
    _aborted = false;
    _inProgress = 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;
    _intervalBetweenMatchs = 0;
    _playerColors = 0;
    _playerX = 0;
    _playerY = 0;
    _playerZ = 0;
   
    java.sql.Connection con = null;
    try
    {
      PreparedStatement statement;
      ResultSet rs;
     
      con = L2DatabaseFactory.getInstance().getConnection(false);
     
      statement = con.prepareStatement("Select * from dm");
      rs = statement.executeQuery();
     
      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");
        _joinTime = rs.getInt("joinTime");
        _eventTime = rs.getInt("eventTime");
        _minPlayers = rs.getInt("minPlayers");
        _maxPlayers = rs.getInt("maxPlayers");
        _playerColors = rs.getInt("color");
        _playerX = rs.getInt("playerX");
        _playerY = rs.getInt("playerY");
        _playerZ = rs.getInt("playerZ");
        _intervalBetweenMatchs = rs.getInt("delayForNextEvent");
      }
      statement.close();
    }
    catch (Exception e) {
            LOGGER.error("", e);
            LOGGER.info("Exception: DM.loadData(): " + e.getMessage());
        }
    finally
    {
      CloseUtil.close(con);
      con = null;
    }
  }
 
  /**
   * Save data.
   */
  public static void saveData()
  {
    java.sql.Connection con = null;
    try
    {
      con = L2DatabaseFactory.getInstance().getConnection(false);
      PreparedStatement statement;
     
      statement = con.prepareStatement("Delete from dm");
      statement.execute();
      statement.close();
     
      statement = con.prepareStatement("INSERT INTO dm (eventName, eventDesc, joiningLocation, minlvl, maxlvl, npcId, npcX, npcY, npcZ, npcHeading, rewardId, rewardAmount, joinTime, eventTime, minPlayers, maxPlayers, color, playerX, playerY, playerZ, delayForNextEvent ) 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, _joinTime);
      statement.setInt(14, _eventTime);
      statement.setInt(15, _minPlayers);
      statement.setInt(16, _maxPlayers);
      statement.setInt(17, _playerColors);
      statement.setInt(18, _playerX);
      statement.setInt(19, _playerY);
      statement.setInt(20, _playerZ);
      statement.setLong(21, _intervalBetweenMatchs);
      statement.execute();
      statement.close();
    }
    catch (Exception e) {
            LOGGER.error("", e);

            LOGGER.info("Exception: DM.saveData(): " + e.getMessage());
        }
    finally
    {
      CloseUtil.close(con);
      con = null;
    }
  }
 
  /**
   * Show event html.
   * @param eventPlayer the event player
   * @param objectId the object id
   */
  public static void showEventHtml(L2PcInstance eventPlayer, String objectId)
  {
    try
    {
      NpcHtmlMessage adminReply = new NpcHtmlMessage(5);
     
      TextBuilder replyMSG = new TextBuilder("<html><title>" + _eventName + "</title><body>");
      replyMSG.append("<center><img src=\"L2UI_CH3.herotower_deco\" width=256 height=32></center><br1>");
      replyMSG.append("<center><font color=\"3366CC\">Current event:</font></center><br1>");
      replyMSG.append("<center>Name:&nbsp;<font color=\"00FF00\">" + _eventName + "</font></center><br1>");
      replyMSG.append("<center>Description:&nbsp;<font color=\"00FF00\">" + _eventDesc + "</font></center><br><br>");
      replyMSG.append("<center>Event Type:&nbsp;<font color=\"00FF00\"> Full Buff Event!!! </font></center><br><br>");
     
      // final Vector<L2PcInstance> players = getPlayers();
      synchronized (_players)
      {
       
        if (!_started && !_joining)
          replyMSG.append("<center>Wait till the admin/gm start the participation.</center>");
        else if (!checkMaxPlayers(_players.size()))
        {
          if (!_started)
          {
            replyMSG.append("Currently participated: <font color=\"00FF00\">" + _players.size() + ".</font><br>");
            replyMSG.append("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.DM_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))
          {
            replyMSG.append("<center><font color=\"3366CC\">You participated already!</font></center><br><br>");
           
            replyMSG.append("<center>Joined Players: <font color=\"00FF00\">" + _players.size() + "</font></center><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 + "_dmevent_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("<center>Joined Players: <font color=\"00FF00\">" + _players.size() + "</font></center><br>");
            replyMSG.append("<center><font color=\"3366CC\">You want to participate in the event?</font></center><br>");
            replyMSG.append("<center><td width=\"200\">Min lvl: <font color=\"00FF00\">" + _minlvl + "</font></center></td><br>");
            replyMSG.append("<center><td width=\"200\">Max lvl: <font color=\"00FF00\">" + _maxlvl + "</font></center></td><br><br>");
            replyMSG.append("<center><button value=\"Join\" action=\"bypass -h npc_" + objectId + "_dmevent_player_join\" width=50 height=15 back=\"sek.cbui94\" fore=\"sek.cbui92\"></center><br>");
           
          }
        }
        else if (_started && !_joining)
          replyMSG.append("<center>" + _eventName + " 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("Min lvl: <font color=\"00FF00\">" + _minlvl + "</font><br>");
          replyMSG.append("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) {
            LOGGER.error("", e);

            LOGGER.info(_eventName + " Engine[showEventHtlm(" + eventPlayer.getName() + ", " + objectId + ")]: exception" + e.getMessage());
        }
  }
 
  /*
   * public static void showEventHtml(L2PcInstance eventPlayer, String objectId) { try { NpcHtmlMessage adminReply = new NpcHtmlMessage(5); TextBuilder replyMSG = new TextBuilder("<html><body>"); replyMSG.append("DM Match<br><br><br>"); replyMSG.append("Current event...<br1>");
   * replyMSG.append("  ... name:&nbsp;<font color=\"00FF00\">" + _eventName + "</font><br1>"); replyMSG.append("  ... description:&nbsp;<font color=\"00FF00\">" + _eventDesc + "</font><br><br>"); if(!_started && !_joining)
   * replyMSG.append("<center>Wait till the admin/gm start the participation.</center>"); else if(!checkMaxPlayers(_players.size())){ if(!DM._started) { replyMSG.append("Currently participated: <font color=\"00FF00\">" + _players.size() + ".</font><br>");
   * replyMSG.append("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(!_started && _joining && eventPlayer.getLevel()>=_minlvl && eventPlayer.getLevel()<=_maxlvl) {
   * if(_players.contains(eventPlayer)) { 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 + "_dmevent_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>"); replyMSG.append("<button value=\"Join\" action=\"bypass -h npc_" + objectId + "_dmevent_player_join\" width=50 height=15 back=\"sek.cbui94\" fore=\"sek.cbui92\">"); } } else
   * if(_started && !_joining) replyMSG.append("<center>"+_eventName+" 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("Min lvl: <font color=\"00FF00\">" + _minlvl + "</font><br>"); replyMSG.append("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) { LOGGER.log(
   * _eventName+" Engine[showEventHtlm(" + eventPlayer.getName() + ", " + objectId + ")]: exception" + e.getMessage()); } }
   */
 
  /**
   * Adds the player.
   * @param player the player
   */
  public static void addPlayer(L2PcInstance player)
  {
    if (!addPlayerOk(player))
      return;
   
    synchronized (_players)
    {
      _players.add(player);
    }
   
    player._inEventDM = true;
    player._countDMkills = 0;
    _savePlayers.add(player.getName());
    player.sendMessage("DM: You successfully registered for the DeathMatch event.");
  }
 
  /**
   * Removes the player.
   * @param player the player
   */
  public static void removePlayer(L2PcInstance player)
  {
    if (player != null && player._inEventDM)
    {
      if (!_joining)
      {
        player.getAppearance().setNameColor(player._originalNameColorDM);
        player.setTitle(player._originalTitleDM);
        player.setKarma(player._originalKarmaDM);
       
        player.broadcastUserInfo();
       
      }
     
      // after remove, all event data must be cleaned in player
      player._originalNameColorDM = 0;
      player._originalTitleDM = null;
      player._originalKarmaDM = 0;
      player._countDMkills = 0;
      player._inEventDM = false;
     
      synchronized (_players)
      {
        _players.remove(player);
      }
     
      player.sendMessage("Your participation in the DeathMatch event has been removed.");
     
    }
  }
 
  /**
   * Clean dm.
   */
  public static void cleanDM()
  {
    // final Vector<L2PcInstance> players = getPlayers();
    synchronized (_players)
    {
     
      for (L2PcInstance player : _players)
      {
        if (player != null)
        {
         
          cleanEventPlayer(player);
         
          if (player._inEventDM)
          {
            if (!_joining)
            {
              player.getAppearance().setNameColor(player._originalNameColorDM);
              player.setTitle(player._originalTitleDM);
              player.setKarma(player._originalKarmaDM);
             
              player.broadcastUserInfo();
             
            }
           
            // after remove, all event data must be cleaned in player
            player._originalNameColorDM = 0;
            player._originalTitleDM = null;
            player._originalKarmaDM = 0;
            player._countDMkills = 0;
            player._inEventDM = false;
           
            // _players.remove(player);
           
            player.sendMessage("Your participation in the DeathMatch event has been removed.");
           
          }
         
          if (_savePlayers.contains(player.getName()))
            _savePlayers.remove(player.getName());
          player._inEventDM = false;
        }
      }
     
      _players.clear();
     
    }
   
    _topKills = 0;
    _savePlayers = new Vector<String>();
    _topPlayers = new ArrayList<L2PcInstance>();
   
    cleanLocalEventInfo();
   
    _inProgress = false;
   
    loadData();
  }
 
  /**
   * Clean local event info.
   */
  private static void cleanLocalEventInfo()
  {
    // nothing
  }
 
  /**
   * Clean event player.
   * @param player the player
   */
  private static void cleanEventPlayer(L2PcInstance player)
  {
    // nothing
  }
 
  /*
   * public static void cleanDM() { synchronized (_players){ for(L2PcInstance player : _players) { removePlayer(player); } _savePlayers = new Vector<String>(); _topPlayer = null; _npcSpawn = null; _joining = false; _teleport = false; _started = false; _inProgress = false; _sitForced = false;
   * _topKills = 0; _players = new Vector<L2PcInstance>(); } }
   */
 
  /**
   * Adds the disconnected player.
   * @param player the player
   */
  public static void addDisconnectedPlayer(L2PcInstance player)
  {
    // final Vector<L2PcInstance> players = getPlayers();
    synchronized (_players)
    {
     
      if (!_players.contains(player) && _savePlayers.contains(player.getName()))
      {
        if (Config.DM_ON_START_REMOVE_ALL_EFFECTS)
        {
          player.stopAllEffects();
         
        }
       
        _players.add(player);
       
        player._originalNameColorDM = player.getAppearance().getNameColor();
        player._originalTitleDM = player.getTitle();
        player._originalKarmaDM = player.getKarma();
        player._inEventDM = true;
        player._countDMkills = 0;
        if (_teleport || _started)
        {
          player.setTitle("Kills: " + player._countDMkills);
          player.getAppearance().setNameColor(_playerColors);
          player.setKarma(0);
          player.broadcastUserInfo();
          player.teleToLocation(_playerX + Rnd.get(Config.DM_SPAWN_OFFSET), _playerY + Rnd.get(Config.DM_SPAWN_OFFSET), _playerZ);
        }
      }
    }
  }
 
  /**
   * Gets the _player colors.
   * @return the _playerColors
   */
  public static int get_playerColors()
  {
    return _playerColors;
  }
 
  /**
   * Set_player colors.
   * @param _playerColors the _playerColors to set
   * @return true, if successful
   */
  public static boolean set_playerColors(int _playerColors)
  {
    if (!is_inProgress())
    {
      DM._playerColors = _playerColors;
      return true;
    }
    return false;
  }
 
  /**
   * Reward player.
   */
  public static void rewardPlayer()
  {
    if (_topPlayers.size() > 0)
    {
     
      for (L2PcInstance _topPlayer : _topPlayers)
      {
        _topPlayer.addItem("DM Event: " + _eventName, _rewardId, _rewardAmount, _topPlayer, true);
       
        StatusUpdate su = new StatusUpdate(_topPlayer.getObjectId());
        su.addAttribute(StatusUpdate.CUR_LOAD, _topPlayer.getCurrentLoad());
        _topPlayer.sendPacket(su);
       
        NpcHtmlMessage nhm = new NpcHtmlMessage(5);
        TextBuilder replyMSG = new TextBuilder("");
       
        replyMSG.append("<html><body>You won the event. Look in your inventory for the reward.</body></html>");
       
        nhm.setHtml(replyMSG.toString());
        _topPlayer.sendPacket(nhm);
       
        // Send a Server->Client ActionFailed to the L2PcInstance in order to avoid that the client wait another packet
        _topPlayer.sendPacket(ActionFailed.STATIC_PACKET);
      }
    }
    /*
     * if(_topPlayer != null) { _topPlayer.addItem("DM Event: " + _eventName, _rewardId, _rewardAmount, _topPlayer, true); StatusUpdate su = new StatusUpdate(_topPlayer.getObjectId()); su.addAttribute(StatusUpdate.CUR_LOAD, _topPlayer.getCurrentLoad()); _topPlayer.sendPacket(su); NpcHtmlMessage
     * nhm = new NpcHtmlMessage(5); TextBuilder replyMSG = new TextBuilder(""); replyMSG.append("<html><body>You won the event. Look in your inventory for the reward.</body></html>"); nhm.setHtml(replyMSG.toString()); _topPlayer.sendPacket(nhm); // Send a Server->Client ActionFailed to the
     * L2PcInstance in order to avoid that the client wait another packet _topPlayer.sendPacket( ActionFailed.STATIC_PACKET ); }
     */
  }
 
  /**
   * Process top player.
   */
  private static void processTopPlayer()
  {
    // final Vector<L2PcInstance> players = getPlayers();
    synchronized (_players)
    {
     
      for (L2PcInstance player : _players)
      {
        if (player._countDMkills > _topKills)
        {
          _topPlayers.clear();
          _topPlayers.add(player);
          _topKills = player._countDMkills;
         
        }
        else if (player._countDMkills == _topKills)
        {
          if (!_topPlayers.contains(player))
            _topPlayers.add(player);
        }
      }
    }
  }
 
  /**
   * Process top team.
   */
  private static void processTopTeam()
  {
   
  }
 
  /**
   * Gets the _players spawn location.
   * @return the _players spawn location
   */
  public static Location get_playersSpawnLocation()
  {
    Location npc_loc = new Location(_playerX + Rnd.get(Config.DM_SPAWN_OFFSET), _playerY + Rnd.get(Config.DM_SPAWN_OFFSET), _playerZ, 0);
   
    return npc_loc;
  }
 
  /**
   * Gets the players.
   * @return the players
   */
  /*
   * protected synchronized static Vector<L2PcInstance> getPlayers() { return _players; }
   */
 
  /**
   * Sets the players pos.
   * @param activeChar the new players pos
   */
  public static void setPlayersPos(L2PcInstance activeChar)
  {
    _playerX = activeChar.getX();
    _playerY = activeChar.getY();
    _playerZ = activeChar.getZ();
  }
 
  /**
   * Removes the user data.
   */
  public static void removeUserData()
  {
    // final Vector<L2PcInstance> players = getPlayers();
    synchronized (_players)
    {
      for (final L2PcInstance player : _players)
      {
        player.getAppearance().setNameColor(player._originalNameColorDM);
        player.setTitle(player._originalTitleDM);
        player.setKarma(player._originalKarmaDM);
        player._inEventDM = false;
        player._countDMkills = 0;
        player.broadcastUserInfo();
      }
    }
   
  }
 
  public static void removeNoneParticipantsInZone()
    {
      for(L2PcInstance p : L2World.getInstance().getAllPlayers())
    {
    if (p.isInsideZone(L2Character.ZONE_DM))
    {
      if (!p.isInLMS())
      {
        p.teleToLocation(MapRegionTable.TeleportWhereType.Town);
        p.sendMessage("This is an Event zone. None participants are not allowed inside.");
      }
    }
  }
   }
 
  /**
   * just an announcer to send termination messages.
   */
  public static void sendFinalMessages()
  {
    if (!_started && !_aborted)
      Announcements.getInstance().gameAnnounceToAll("Thank you for participating " + ".");
  }
 
  /**
   * returns the interval between each event.
   * @return the interval between matchs
   */
  public static int getIntervalBetweenMatchs()
  {
    long actualTime = System.currentTimeMillis();
    long totalTime = actualTime + _intervalBetweenMatchs;
    long interval = totalTime - actualTime;
    int seconds = (int) (interval / 1000);
   
    return seconds / 60;
  }
 
  /**
   * Sets the event start time.
   * @param newTime the new event start time
   */
  public void setEventStartTime(String newTime)
  {
    startEventTime = newTime;
  }
 
  /*
   * (non-Javadoc)
   * @see com.l2jfrozen.gameserver.model.entity.event.manager.EventTask#getEventIdentifier()
   */
  @Override
  public String getEventIdentifier()
  {
    return _eventName;
  }
 
  /*
   * (non-Javadoc)
   * @see java.lang.Runnable#run()
   */
  @Override
  public void run()
  {
    LOGGER.warn("SYS_LOG: "+"DM: Event notification start");
    eventOnceStart();
  }
 
  /*
   * (non-Javadoc)
   * @see com.l2jfrozen.gameserver.model.entity.event.manager.EventTask#getEventStartTime()
   */
  @Override
  public String getEventStartTime()
  {
    return startEventTime;
  }
 
  /**
   * On disconnect.
   * @param player the player
   */
  public static void onDisconnect(L2PcInstance player)
  {
    if (player._inEventDM)
    {
      removePlayer(player);
      player.teleToLocation(_npcX, _npcY, _npcZ);
    }
  }
}
TOP

Related Classes of com.l2jfrozen.gameserver.model.entity.event.DM

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.