package instances.SpiritForest;
import java.util.List;
import org.l2jmobius.gameserver.instancemanager.InstanceManager;
import org.l2jmobius.gameserver.model.Party;
import org.l2jmobius.gameserver.model.actor.Npc;
import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.instancezone.Instance;
import org.l2jmobius.gameserver.network.NpcStringId;
import org.l2jmobius.gameserver.network.SystemMessageId;
import org.l2jmobius.gameserver.network.serverpackets.ExSendUIEvent;
import org.l2jmobius.gameserver.network.serverpackets.SystemMessage;
import instances.AbstractInstance;
public class SpiritForest extends AbstractInstance
{
private static final int[] TEMPLATE_IDS =
{
310, // lv. 110
314, // lv. 105
318, // lv. 115
};
public SpiritForest()
{
super(TEMPLATE_IDS);
addInstanceLeaveId(TEMPLATE_IDS);
}
@Override
public String onAdvEvent(String event, Npc npc, Player player)
{
if (event.contains("enterInstance"))
{
final int templateId = event.contains("110") ? TEMPLATE_IDS[0] : TEMPLATE_IDS[1];
if (player.isInParty())
{
final Party party = player.getParty();
if (!party.isLeader(player))
{
player.sendPacket(SystemMessageId.ONLY_A_PARTY_LEADER_CAN_MAKE_THE_REQUEST_TO_ENTER);
return null;
}
if (player.isInCommandChannel())
{
player.sendPacket(SystemMessageId.YOU_CANNOT_ENTER_AS_YOU_DON_T_MEET_THE_REQUIREMENTS);
return null;
}
final long currentTime = System.currentTimeMillis();
final List<Player> members = party.getMembers();
for (Player member : members)
{
if (!member.isInsideRadius3D(npc, 1000))
{
player.sendMessage("Player " + member.getName() + " must go closer to Gatekeeper Spirit.");
return null;
}
for (int id : TEMPLATE_IDS)
{
if (currentTime < InstanceManager.getInstance().getInstanceTime(member, id))
{
final SystemMessage msg = new SystemMessage(SystemMessageId.SINCE_C1_ENTERED_ANOTHER_INSTANCE_ZONE_THEREFORE_YOU_CANNOT_ENTER_THIS_DUNGEON);
msg.addString(member.getName());
party.broadcastToPartyMembers(member, msg);
return null;
}
}
}
for (Player member : members)
{
enterInstance(member, npc, templateId);
}
}
else if (player.isGM())
{
enterInstance(player, npc, templateId);
}
else
{
player.sendPacket(SystemMessageId.YOU_ARE_NOT_IN_A_PARTY_SO_YOU_CANNOT_ENTER);
}
}
return null;
}
@Override
protected void onEnter(Player player, Instance instance, boolean firstEnter)
{
super.onEnter(player, instance, firstEnter);
player.sendPacket(new ExSendUIEvent(player, false, false, Math.min(3600000, (int) (instance.getRemainingTime() / 1000)), 0, NpcStringId.TIME_LEFT));
}
@Override
public void onInstanceLeave(Player player, Instance instance)
{
player.sendPacket(new ExSendUIEvent(player, true, false, 3600, 0, NpcStringId.TIME_LEFT));
}
public static void main(String[] args)
{
new SpiritForest();
}
}
их и так 3.private static final int[] TEMPLATE_IDS = { 310, // lv. 110 314, // lv. 105 318, // lv. 115 };
нужно создать файл в папке Instance в которой будет 318 ид инсты, далее выставить там мобов + нужно в глобальный перечень инстов записать, после чего добавить диалог с возможности входа в инсту к бенусте.318, // lv. 115 я дописал, но инст не ресается такой, так как что то еще дописать надо в скрипте....
ну так вход по байпасу enterInstance и лвл инста или ид что тамнужно создать файл в папке Instance в которой будет 318 ид инсты, далее выставить там мобов + нужно в глобальный перечень инстов записать, после чего добавить диалог с возможности входа в инсту к бенусте.
это в какой файл ?+ нужно в глобальный перечень инстов записать
куда дописать эту строку в скрипте нужно?дальше нужно получить верное число 110, 105 или 115
final int templateId = event.substring(14);
ответил же Demoncool,куда дописать эту строку в скрипте нужно?
final int templateId = event.contains("110") ? TEMPLATE_IDS[0] : TEMPLATE_IDS[1];
final int templateId = Integer.parseInt(event.substring(13));
<button action="bypass -h Quest SpiritForest enterInstance318" value="Лес Духов Ур. 115" width=200 height=31 back="L2UI_CT1.OlympiadWnd_DF_Apply_Down" fore="L2UI_CT1.OlympiadWnd_DF_Apply"></td>
На мой взгляд, так лучше не делать, т.к. так можно будет в любой инст зайти, либо нужен будет список "разрешенных" инстов, по которому проверять переданный в байпасе.ну и к байпасу писать уже непосредственно айди инстанса
private static final int[] TEMPLATE_IDS =
{
314, // lv. 105
310, // lv. 110
318, // lv. 115
};
<button action="bypass -h Quest SpiritForest enterInstance-2" value="Лес Духов Ур. 115" width=200 height=31 back="L2UI_CT1.OlympiadWnd_DF_Apply_Down" fore="L2UI_CT1.OlympiadWnd_DF_Apply"></td>
Напиши так:вот таким вот образомJava:final int templateId = Integer.parseInt(event.substring(13));
StringTokenizer strTok = new StringTokenizer( event, "-" );
strTok.nextToken(); // пропускаем enterInstance
final String templateIdIdx = strTok.nextToken();
final int templateId = TEMPLATE_IDS[Integer.parseInt(templateIdIdx)];
import java.util.StringTokenizer;
import java.util.List;
С этим неправ, скорее всего. AbstractInstance при попытке зайти эту проверку делает. Но так или иначе, по-моему, лучше с индексами массива в байпасе работать, чем с ID инста, хоть и менее наглядно получается.т.к. так можно будет в любой инст зайти, либо нужен будет список "разрешенных" инстов, по которому проверять переданный в байпасе.
<button action="bypass -h Quest SpiritForest enterInstance-318" value="Лес Духов Ур. 115" width=200 height=31 back="L2UI_CT1.OlympiadWnd_DF_Apply_Down" fore="L2UI_CT1.OlympiadWnd_DF_Apply"></td>
final String templateIdIdx = strTok.nextToken();
final int templateId = TEMPLATE_IDS[Integer.parseInt(templateIdIdx)];
final int templateId = Integer.parseInt(strTok.nextToken());
вот тут пожалуй соглашусь. В остальном, как проверять и доставать айди инстанса из массива уже зависит от фантазии кодера)На мой взгляд, так лучше не делать, т.к. так можно будет в любой инст зайти, либо нужен будет список "разрешенных" инстов, по которому проверять переданный в байпасе.
Для таких вещей валидатор байпасов существуетНа мой взгляд, так лучше не делать, т.к. так можно будет в любой инст зайти, либо нужен будет список "разрешенных" инстов, по которому проверять переданный в байпасе.
<html><body>
<table border=0 cellpadding=0 cellspacing=0 width=292 height=350 background="L2UI_CH3.refinewnd_back_Pattern">
<tr>
<td align=center>
<img src="L2UI_EPIC.HtmlWnd_InstantZone_01" width=256 height=170><br>
<font color="LEVEL"> - Spirit Forest - </font><br1>
Pick a difficulty<br>
<button action="bypass -h Quest SpiritForest instance_105" value="Spirit Forest (Lv.105)" width=230 height=31 back="L2UI_CT1.OlympiadWnd_DF_Apply_Down" fore="L2UI_CT1.OlympiadWnd_DF_Apply">
<button action="bypass -h Quest SpiritForest instance_110" value="Spirit Forest (Lv.110)" width=230 height=31 back="L2UI_CT1.OlympiadWnd_DF_Apply_Down" fore="L2UI_CT1.OlympiadWnd_DF_Apply">
<button action="bypass -h Quest SpiritForest instance_115" value="Spirit Forest (Lv.115)" width=230 height=31 back="L2UI_CT1.OlympiadWnd_DF_Apply_Down" fore="L2UI_CT1.OlympiadWnd_DF_Apply">
</td>
</tr>
</table>
</body></html>
как раз наоборот - для этого нужно велосипед придумать, и задаётся мне что он как всегда будет на очень касесьтвенном уровнеДа неправильно всё это
318 инста не для 115-го уровня!
InstantZoneData_begin id=318 name=[Spirit Forest] InstantZoneData_end
Корейцы упростили всё это дело, в этом инсте стоит отдельный НПЦ бенуста (ID: 34650), у кого, после всех проверок и захода пати в инсту, пати-лидер выбирает какогова уровня монстров он хочет спавнить и нажимает на соответствующую кнопку, то есть одна инста для всех 105,110,115 скоро аж 120 будет. во всех пати инстах сделали так.
ну для леса хтмл выглядит так
HTML:<html><body> <table border=0 cellpadding=0 cellspacing=0 width=292 height=350 background="L2UI_CH3.refinewnd_back_Pattern"> <tr> <td align=center> <img src="L2UI_EPIC.HtmlWnd_InstantZone_01" width=256 height=170><br> <font color="LEVEL"> - Spirit Forest - </font><br1> Pick a difficulty<br> <button action="bypass -h Quest SpiritForest instance_105" value="Spirit Forest (Lv.105)" width=230 height=31 back="L2UI_CT1.OlympiadWnd_DF_Apply_Down" fore="L2UI_CT1.OlympiadWnd_DF_Apply"> <button action="bypass -h Quest SpiritForest instance_110" value="Spirit Forest (Lv.110)" width=230 height=31 back="L2UI_CT1.OlympiadWnd_DF_Apply_Down" fore="L2UI_CT1.OlympiadWnd_DF_Apply"> <button action="bypass -h Quest SpiritForest instance_115" value="Spirit Forest (Lv.115)" width=230 height=31 back="L2UI_CT1.OlympiadWnd_DF_Apply_Down" fore="L2UI_CT1.OlympiadWnd_DF_Apply"> </td> </tr> </table> </body></html>
Так что не надо новые велосипеди придумывать и так на душе тошна во что линейку превратили изверги
case "instance_105":
{
final Instance world = npc.getInstanceWorld();
final Party party = player.getParty();
if ((!player.isInParty() || !party.isLeader(player)) && !player.isGM())
{
player.sendPacket(SystemMessageId.ONLY_A_PARTY_LEADER_CAN_MAKE_THE_REQUEST_TO_ENTER);
break;
}
world.spawnGroup("spiritForest_105");
for (Player pl : world.getPlayers())
{
pl.sendPacket(new ExShowScreenMessage(NpcStringId.YOUVE_CHOSEN_LV_105_GET_READY_FOR_THE_BATTLE, ExShowScreenMessage.TOP_CENTER, 8000, true));
ThreadPool.schedule(() -> pl.sendPacket(new ExSendUIEvent(pl, false, false, Math.min(3600000, (int) (world.getRemainingTime() / 1000)), 0, NpcStringId.TIME_LEFT)), 15000);
}
npc.deleteMe();
break;
}
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?