Noticias:

Debes de estar registrado para poder ver el contenido indicado. Registrate o Conectate

Menú Principal

Zona PvP Instance

Iniciado por Swarlog, Ago 19, 2022, 12:46 AM

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>