Лес духов

uter81

Пляшущий с бубном
Участник
Сообщения
215
Розыгрыши
0
Репутация
0
Реакции
11
Баллы
280
Хроники
  1. Shadow of the Kamael
Исходники
Присутствуют
Сборка
l2jMobius
Добрый день, подскажите пожалуйста как дописать третий уровень временной зоны Лес Духов на ID инсты 318

Код:
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();
    }
}
 
  • Ха-ха-ха
Реакции: raz
318, // lv. 115 я дописал, но инст не ресается такой, так как что то еще дописать надо в скрипте....
 
318, // lv. 115 я дописал, но инст не ресается такой, так как что то еще дописать надо в скрипте....
нужно создать файл в папке Instance в которой будет 318 ид инсты, далее выставить там мобов + нужно в глобальный перечень инстов записать, после чего добавить диалог с возможности входа в инсту к бенусте.
 
нужно создать файл в папке Instance в которой будет 318 ид инсты, далее выставить там мобов + нужно в глобальный перечень инстов записать, после чего добавить диалог с возможности входа в инсту к бенусте.
ну так вход по байпасу enterInstance и лвл инста или ид что там
final int templateId = event.contains("110") ? TEMPLATE_IDS[0] : TEMPLATE_IDS[1];
дальше нужно получить верное число 110, 105 или 115
final int templateId = event.substring(14);
но дальше упретесь
enterInstance
ибо тут только войти в инстанс и всё, если зона есть, тогда войдет
 
куда дописать эту строку в скрипте нужно?
ответил же Demoncool,
изменить строчку
Java:
final int templateId = event.contains("110") ? TEMPLATE_IDS[0] : TEMPLATE_IDS[1];
вот таким вот образом
Java:
final int templateId = Integer.parseInt(event.substring(13));
ну и к байпасу писать уже непосредственно айди инстанса
HTML:
<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>
 
Последнее редактирование:
ну и к байпасу писать уже непосредственно айди инстанса
На мой взгляд, так лучше не делать, т.к. так можно будет в любой инст зайти, либо нужен будет список "разрешенных" инстов, по которому проверять переданный в байпасе.

Расставь инсты по уровню в массиве:
Java:
private static final int[] TEMPLATE_IDS =
    {
        314, // lv. 105
        310, // lv. 110
        318, // lv. 115
    };

В байпасе передавай индекс из массива TEMPLATE_IDS, т.е. для 318 будет (нужно добавить знак "минуса" после "enterInstance"):
HTML:
<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));
Напиши так:
Java:
StringTokenizer strTok = new StringTokenizer( event, "-" );
strTok.nextToken(); // пропускаем enterInstance
final String templateIdIdx = strTok.nextToken();
final int templateId = TEMPLATE_IDS[Integer.parseInt(templateIdIdx)];

И нужно будет в начале файла импорт добавить:
Java:
import java.util.StringTokenizer;

Например, после строки:
Java:
import java.util.List;

(не могу сообщение предыдущее отредактировать, поэтому прошу как-то в одно слить, если можно)

т.к. так можно будет в любой инст зайти, либо нужен будет список "разрешенных" инстов, по которому проверять переданный в байпасе.
С этим неправ, скорее всего. AbstractInstance при попытке зайти эту проверку делает. Но так или иначе, по-моему, лучше с индексами массива в байпасе работать, чем с ID инста, хоть и менее наглядно получается.

Можно совместить оба варианта, т.е. в байпасе указывать ID инста, но через знак "минуса", как в моем предложении.
Например, для 318 будет:
HTML:
<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>

Тогда это:
Java:
final String templateIdIdx = strTok.nextToken();
final int templateId = TEMPLATE_IDS[Integer.parseInt(templateIdIdx)];

Нужно будет заменить на:
Java:
final int templateId = Integer.parseInt(strTok.nextToken());
 
  • Мне нравится
Реакции: Psycho и uter81

    uter81

    Баллов: 2
    очень содержательно, спасибо!
На мой взгляд, так лучше не делать, т.к. так можно будет в любой инст зайти, либо нужен будет список "разрешенных" инстов, по которому проверять переданный в байпасе.
вот тут пожалуй соглашусь. В остальном, как проверять и доставать айди инстанса из массива уже зависит от фантазии кодера)
 
получилось, спасибо большое за помощь
 
На мой взгляд, так лучше не делать, т.к. так можно будет в любой инст зайти, либо нужен будет список "разрешенных" инстов, по которому проверять переданный в байпасе.
Для таких вещей валидатор байпасов существует
Если сервер не отправлял данного байпаса, то он его и не примет
Но на выдачу предметов лучше перестраховаться конечно =)
 
Да неправильно всё это

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>

Так что не надо новые велосипеди придумывать и так на душе тошна во что линейку превратили изверги :)
 
Да неправильно всё это

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>

Так что не надо новые велосипеди придумывать и так на душе тошна во что линейку превратили изверги :)
как раз наоборот - для этого нужно велосипед придумать, и задаётся мне что он как всегда будет на очень касесьтвенном уровне :)
 

Вложения

  • image.png
    image.png
    279,6 КБ · Просмотры: 27
Ну эти диалоги не проблемма сделать, после выбора уровня этот НПЦ удаляется
ну пример одного байпасса как я сделал

Java:
            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;
            }

На 115 пока не знаю какие там монстры и что они едят, не дорос пока чтоб там ходить :)

а этот ХТМЛ я выше выложил
 
Назад
Сверху Снизу