Noticias:

No tienes permiso para ver los enlaces. Para poder verlos Registrate o Conectate.

Menú Principal

Evento Solo

Iniciado por Swarlog, Jul 25, 2025, 11:59 PM

Tema anterior - Siguiente tema

Swarlog

/*
 * 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 net.sf.l2j.gameserver.model.entity.events;

import java.util.Vector;

import net.sf.l2j.gameserver.ThreadPoolManager;
import net.sf.l2j.gameserver.datatables.NpcTable;
import net.sf.l2j.gameserver.datatables.SpawnTable;
import net.sf.l2j.gameserver.datatables.MapRegionTable.TeleportWhereType;
import net.sf.l2j.gameserver.model.L2Spawn;
import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
import net.sf.l2j.gameserver.skills.AbnormalEffect;
import net.sf.l2j.gameserver.templates.chars.L2NpcTemplate;
/**
 * @author Anarchy
 *
 */
public class SoloEvent
{
	public static boolean full = false,
	start = false;
	public static int highLs = 0,
	topLs = 0;
	private static String playerName = null;
	public static L2PcInstance player = null;
	public static long enterTime = 0;
	private static Vector<L2Spawn> _monsters = new Vector<L2Spawn>();
	public static Vector<String> _savedPlayers = new Vector<String>();
	
	public static void getInstance()
	{
		ThreadPoolManager.getInstance().scheduleGeneralAtFixedRate(new Runnable()
		{
			@Override
			public void run()
			{
				if (start)
				{
					start = false;
					startEvent();
					return;
				}
			}
		}, 5000, 5000);
	}
	
	private static void startEvent()
	{
		enterTime = System.currentTimeMillis();
		playerName = player.getName();
		player.teleToLocation(184133, 114298, -8221);
		player.startAbnormalEffect(AbnormalEffect.ROOT);
		player.setIsParalyzed(true);
		player.sendMessage("10 seconds till the monsters get spawned.");
		wait(10);
		player.stopAbnormalEffect(AbnormalEffect.ROOT);
		player.setIsParalyzed(false);
		spawnMonsters();
		player.sendMessage("The monsters were spawned. You have 2 minutes and 50 seconds to kill as many as possible.");
		wait(50);
		if (!checkPlayer())
		{
			return;
		}
		wait(30);
		if (!checkPlayer())
		{
			return;
		}
		wait(30);
		if (!checkPlayer())
		{
			return;
		}
		wait(30);
		if (!checkPlayer())
		{
			return;
		}
		wait(30);
		if (!checkPlayer())
		{
			return;
		}
		player.sendMessage("The event is over. You were rewarded and teleported back to Giran.");
		reward();
	}
	
	private static boolean checkPlayer()
	{
		if (player == null || !player.isOnline())
		{
			_savedPlayers.add(playerName);
			playerName = null;
			highLs = 0;
			topLs = 0;
			full = false;
			enterTime = 0;
			for (L2Spawn s : _monsters)
			{
				s.getLastSpawn().deleteMe();
				s.stopRespawn();
				SpawnTable.getInstance().deleteSpawn(s, false);
			}
			_monsters.clear();
			return false;
		}
		
		return true;
	}
	
	private static void reward()
	{
		player.addItem("Solo Event.", 8762, topLs, player, true);
		player.addItem("Solo Event.", 8752, highLs, player, true);
		player.teleToLocation(TeleportWhereType.Town);
		player = null;
		playerName = null;
		highLs = 0;
		topLs = 0;
		full = false;
		enterTime = 0;
		for (L2Spawn s : _monsters)
		{
			s.getLastSpawn().deleteMe();
			s.stopRespawn();
			SpawnTable.getInstance().deleteSpawn(s, false);
		}
		_monsters.clear();
	}
	
	private static void spawnMonsters()
	{
		spawnAMonster(184868, 114281, -8219);
		spawnAMonster(185044, 114442, -8219);
		spawnAMonster(184880, 114720, -8219);
		spawnAMonster(185206, 115010, -8219);
		spawnAMonster(185474, 114886, -8219);
		spawnAMonster(185789, 115153, -8219);
		spawnAMonster(186002, 115058, -8219);
		spawnAMonster(186077, 114780, -8219);
		spawnAMonster(186018, 114594, -8219);
		spawnAMonster(186503, 114608, -8219);
		spawnAMonster(186717, 115616, -8219);
		spawnAMonster(186285, 115503, -8219);
		spawnAMonster(185990, 115797, -8219);
		spawnAMonster(185698, 115763, -8219);
		spawnAMonster(185571, 115514, -8219);
		spawnAMonster(185269, 115602, -8219);
		spawnAMonster(184880, 115599, -8219);
		spawnAMonster(185027, 115063, -8219);
		spawnAMonster(185220, 114434, -8219);
		spawnAMonster(185616, 113609, -8219);
	}
	
	private static void spawnAMonster(int x, int y, int z)
	{
		L2Spawn _monster = null;
		L2NpcTemplate monster = NpcTable.getInstance().getTemplate(65527);
		
		try
		{
			_monster = new L2Spawn(monster);
			_monster.setLocx(x);
			_monster.setLocy(y);
			_monster.setLocz(z);
			_monster.setHeading(1);
			_monster.setRespawnDelay(15);
			_monster.init();
			_monster.getLastSpawn().decayMe();
			_monster.getLastSpawn().spawnMe(_monster.getLastSpawn().getX(), _monster.getLastSpawn().getY(), _monster.getLastSpawn().getZ());
			SpawnTable.getInstance().addNewSpawn(_monster, false);
			_monsters.add(_monster);
		}
		catch (Exception e)
		{ }
	}
	
	private static void wait(int seconds)
	{
		try
		{
			Thread.sleep(seconds*1000);
		}
		catch (Exception e)
		{ }
	}
}

/*
 * 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 net.sf.l2j.gameserver.handler.itemhandlers;

import javolution.text.TextBuilder;

import net.sf.l2j.gameserver.handler.IItemHandler;
import net.sf.l2j.gameserver.model.L2ItemInstance;
import net.sf.l2j.gameserver.model.actor.L2Playable;
import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
import net.sf.l2j.gameserver.model.entity.events.SoloEvent;
import net.sf.l2j.gameserver.network.serverpackets.NpcHtmlMessage;
/**
 * @author Anarchy
 *
 */
public class SoloEventTeleportationCube implements IItemHandler
{
	public void useItem(L2Playable playable, L2ItemInstance item, boolean forceUse)
	{
		if (!(playable instanceof L2PcInstance))
		{
			return;
		}
		
		L2PcInstance player = (L2PcInstance)playable;
		
		if (player.isInOlympiadMode())
		{
			player.sendMessage("You may not enter Solo Event while being in olympiad mode.");
			return;
		}
		if (player.getPvpFlag() > 0 || player.getKarma() > 0)
		{
			player.sendMessage("You may not enter Solo Event while fighting.");
			return;
		}
		if (player.getActiveTradeList() != null)
		{
			player.sendMessage("You may not enter Solo Event while trading.");
			return;
		}
		if (player.getActiveWarehouse() != null)
		{
			player.sendMessage("You may not enter Solo Event while using the warehouse.");
			return;
		}
		if (SoloEvent.player == player)
		{
			player.sendMessage("You can't use this while being in a Solo Event.");
			return;
		}
		
		NpcHtmlMessage htm = new NpcHtmlMessage(0);
		TextBuilder tb = new TextBuilder("<html><body>");
		tb.append("<center>Solo Event room is "+(SoloEvent.full ? "full." : "empty."));
		if (SoloEvent.full)
		{
			tb.append("<br1>Player inside: "+SoloEvent.player.getName());
			tb.append("<br1>Time left: "+(180-((System.currentTimeMillis()-SoloEvent.enterTime)/1000) < 60 ? 180-((System.currentTimeMillis()-SoloEvent.enterTime)/1000)+" seconds." : 3-((System.currentTimeMillis()-SoloEvent.enterTime)/1000/60)+" minutes."));
		}
		else
		{
			tb.append("<br><a action=\"bypass -h bp_enterSoloEvent\">Enter Solo Event.</a>");
		}
		tb.append("</center></body></html>");
		htm.setHtml(tb.toString());
		
		player.sendPacket(htm);
	}
}

if (_activeChar.getInventory().getItemByItemId(3481) == null)
			{
				_activeChar.sendMessage("You don't have a Solo-Event Teleportation Cube in your inventory.");
				return false;
			}
			if (SoloEvent.full)
			{
				_activeChar.sendMessage("Solo Event room is full.");
				return false;
			}
			
			SoloEvent.full = true;
			SoloEvent.player = _activeChar;
			SoloEvent.start = true;
			_activeChar.sendMessage("You will be teleported to Solo Event room in some seconds.");
			_activeChar.destroyItemByItemId("Solo Event teleportation cube.", 3481, 1, _activeChar, true);