Noticias:

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

Menú Principal

Zona PvP Instance

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

Tema anterior - Siguiente tema

Swarlog

Aqui os dejo otro script de zona PvP basada en una instancia, la cosa es crear vuestra propia zona partiendo de estos códigos y perfeccionarlas a vuestro gusto y estilo :D

CitarCODE:

package custom.pvpzone;

import java.util.logging.Level;
import java.util.logging.Logger;

import javolution.util.FastList;
import ai.npc.AbstractNpcAI;

import com.l2jserver.gameserver.ThreadPoolManager;
import com.l2jserver.gameserver.datatables.NpcData;
import com.l2jserver.gameserver.datatables.SkillData;
import com.l2jserver.gameserver.instancemanager.InstanceManager;
import com.l2jserver.gameserver.model.L2Spawn;
import com.l2jserver.gameserver.model.Location;
import com.l2jserver.gameserver.model.actor.L2Npc;
import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
import com.l2jserver.gameserver.model.actor.templates.L2NpcTemplate;
import com.l2jserver.gameserver.model.events.EventType;
import com.l2jserver.gameserver.model.events.ListenerRegisterType;
import com.l2jserver.gameserver.model.events.annotations.Priority;
import com.l2jserver.gameserver.model.events.annotations.RegisterEvent;
import com.l2jserver.gameserver.model.events.annotations.RegisterType;
import com.l2jserver.gameserver.model.events.impl.character.OnCreatureKill;
import com.l2jserver.gameserver.model.events.returns.TerminateReturn;
import com.l2jserver.gameserver.model.skills.Skill;
import com.l2jserver.util.Rnd;

public class PvpZone extends AbstractNpcAI
{
	protected ThreadPoolManager threadManager;
	
	public FastList<Location> positions = new FastList<>();
	
	protected static final Logger _log = Logger.getLogger(PvpZone.class.getName());
	
	protected static int InstanceId;
	
	private final Skill noblesse = SkillData.getInstance().getSkill(1323, 1);
	
	public PvpZone()
	{
		super(PvpZone.class.getSimpleName(), "custom");
		
		addFirstTalkId(10001);
		addTalkId(10001);
		addStartNpc(10001);
		
		threadManager = ThreadPoolManager.getInstance();
		
		positions.add(new Location(145598, 143723, -11813));
		
		positions.add(new Location(143819, 143218, -11907));
		positions.add(new Location(142158, 143430, -11851));
		positions.add(new Location(141972, 145145, -12027));
		positions.add(new Location(143974, 146205, -12030));
		positions.add(new Location(147656, 145601, -12221));
		
		positions.add(new Location(147263, 146969, -12263));
		positions.add(new Location(148718, 147016, -12307));
		positions.add(new Location(149645, 145573, -12320));
		positions.add(new Location(148444, 142724, -12225));
		
		try
		{
			PvpZone.InstanceId = InstanceManager.getInstance().createDynamicInstance(null);
			InstanceManager.getInstance().getInstance(PvpZone.InstanceId).setAllowSummon(false);
			InstanceManager.getInstance().getInstance(PvpZone.InstanceId).setPvPInstance(true);
		}
		catch (final Exception e)
		{
			PvpZone.InstanceId = 0;
			PvpZone._log.log(Level.WARNING, "PvpZone[PvpZone.createDynamicInstance]: exception: " + e.getMessage(), e);
		}
		
		for (final Location location : positions)
		{
			spawnGatekeeper(location);
		}
		
		PvpZone._log.info(" > PvpZone Loaded Successfully!");
		
	}
	
	@RegisterEvent(EventType.ON_CREATURE_KILL)
	@RegisterType(ListenerRegisterType.GLOBAL_PLAYERS)
	@Priority(Integer.MAX_VALUE)
	public TerminateReturn onPlayerDeath(OnCreatureKill event)
	{
		// Make sure a player was killed
		if (event.getTarget().isPlayable())
		{
			// If the player and the attacker are on this instance
			if (event.getTarget().getInstanceId() == getInstanceId())
			{
				ThreadPoolManager.getInstance().scheduleGeneral(() ->
				{
					event.getTarget().doRevive();
					heal((L2PcInstance) event.getTarget());
					teleportPlayerToInstance((L2PcInstance) event.getTarget());
					
				}, 12 * 1000);
				
			}
			
		}
		return null;
	}
	
	static void heal(L2PcInstance player)
	{
		player.setCurrentHp(player.getMaxHp());
		player.setCurrentCp(player.getMaxCp());
		player.setCurrentMp(player.getMaxMp());
	}
	
	protected void spawnGatekeeper(final Location position)
	{
		
		final L2NpcTemplate template = NpcData.getInstance().getTemplate(10001);
		try
		{
			final L2Spawn spawn = new L2Spawn(template);
			spawn.setLocation(position);
			spawn.setInstanceId(PvpZone.InstanceId);
			spawn.setAmount(1);
			spawn.setHeading(0);
			spawn.doSpawn();
		}
		catch (final Exception e)
		{
			System.out.println("[PvpZone]Error on spawn NPC: 10001");
		}
	}
	
	public void teleportPlayerToInstance(final L2PcInstance player)
	{
		
		// player.teleToLocation(147656, 145601, -12221);
		
		// player.setInsideZone(ZoneId.MULTI_FUNCTION, true);
		
		player.sendMessage("You are enter in Pvpzone.");
		noblesse.applyEffects(player, player);
		player.setPvpFlag(1);
		
		teleportToRandomLocation(player);
		player.setInstanceId(getInstanceId());
		// addDeathNotify(player);
		// addAttackNotify(player);
		// addSkillUseNotify(player, -1);
		// player.teleToLocation(143974, 146205, -12030);
		
	}
	
	public void teleportPlayerOutOfInstance(final L2PcInstance player)
	{
		if (player.isInCombat())
		{
			player.sendMessage("You cannot teleport while in combat.");
			return;
		}
		player.sendMessage("You left PvpZone");
		// removeDeathNotify(player);
		// removeAttackNotify(player);
		// removeSkillUseNotify(player);
		
		// player.setInsideZone(ZoneId.MULTI_FUNCTION, false);
		player.setPvpFlag(0);
		
		// Teleport player out of instance
		player.teleToLocation(83327, 148595, -3405);
		
		// remove player from instance
		player.setInstanceId(0);
	}
	
	public void teleportToRandomLocation(final L2PcInstance player)
	{
		
		// Get random position
		final Location position = positions.get(Rnd.get(positions.size()));
		player.teleToLocation((position.getX() + Rnd.get(101)) - 50, (position.getY() + Rnd.get(101)) - 50, position.getZ(), false);
	}
	
	@Override
	public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
	{
		switch (event)
		{
		
			case "enter":
			{
				teleportPlayerToInstance(player);
				break;
			}
			
			case "leave":
			{
				
				teleportPlayerOutOfInstance(player);
				break;
			}
			
		}
		return super.onAdvEvent(event, npc, player);
	}
	
	public int getInstanceId()
	{
		return PvpZone.InstanceId;
	}
	
	public static PvpZone getInstance()
	{
		
		return SingletonHolder._instance;
	}
	
	private static class SingletonHolder
	{
		protected static final PvpZone _instance = new PvpZone();
	}
	
	public static void main(final String[] args)
	{
		PvpZone.getInstance();
	}
	
}

CitarNPC:

No olvides crear npc gatekeeper para entrar y salir de la instancia:

<html>
<title>PvP Zone</title>
<body>
<center>
<img src="L2UI_CH3.herotower_deco" width=256 height=32><br>
<font color="FF9900">PVP Instance</font><br><br>
<a action="bypass -h Quest PvpZone leave">Teleport Outside</a>
<a action="bypass -h Quest PvpZone enter">Teleport Inside</a>
</center>

</body>
</html>