Лес духов

uter81

Пляшущий с бубном
Участник
Сообщения
193
Розыгрыши
0
Репутация
0
Реакции
9
Баллы
280
Хроники
  1. Prologue: Prelude of War
Исходники
Присутствуют
Сборка
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 КБ · Просмотры: 26
Ну эти диалоги не проблемма сделать, после выбора уровня этот НПЦ удаляется
ну пример одного байпасса как я сделал

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 пока не знаю какие там монстры и что они едят, не дорос пока чтоб там ходить :)

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