Полный гайд по инстансам (Kamaloka и что угодно)

1. Нам необходимо создать XML файл в которой будет описан наш инстанц (Для наглядного примера берем Kamaloka)

Путь: gameserver\data\instances\[72] Kamaloka, Hall of the Abyss.xml
Сама схема:
XML:
<!DOCTYPE list SYSTEM "instances.dtd">
<list>
    <instance id="72" name="Kamaloka, Hall of the Abyss" maxChannels="10" collapseIfEmpty="5" timelimit="30" dispelBuffs="true">
        <collapse on-party-dismiss="true" timer="60"/>
        <level min="70" max="80"/>
        <party min="2" max="6"/>
        <return loc="43928 -49144 -792"/>
        <teleport loc="180056 -88968 -7216"/>
        <geodata map="25_15"/>
        <remove itemId="0" count="0" necessary="false"/>
        <give itemId="0" count="0"/>
        <quest id="0"/>
        <reuse resetReuse="30 6 * * *" setUponEntry="true" sharedReuseGroup="1"/> <!-- Instance reuse at 6:30 every day -->
        <spawns>
            <spawn mobId="25657" type="point" respawn="0>
                <coords loc="180375 -88984 -7216"/>
            </spawn>
            <spawn mobId="25658" type="point" respawn="0>
                <coords loc="182168 -88968 -7216"/>
            </spawn>
            <spawn mobId="25659" type="point" respawn="0>
                <coords loc="183911 -88969 -7216 "/>
            </spawn>
        </spawns>
        <doors>
            <door id="25150001" opened="false"/>
            <door id="25150002" opened="false"/>
            <door id="25150003" opened="false"/>
            <door id="25150004" opened="false"/>
        </doors>
    </instance>
</list>

Где:
  • name - название инста
  • maxChannels - сколько может быть создано реплик этого инстанса
  • collapseIfEmpty -время через которое игроков при успешном проходе или истечении времени инстанса будет автоматически закрыт и игроки перемещены в <return loc="43928 -49144 -792"/>
  • timelimit - время жизни инстанса
  • dispelBuffs - удалять баффы при входе в инстанс или нет
  • <collapse on-party-dismiss="true" timer="60"/> - закрывать инстанс и возвращать игроков назад через timer="60" если пати была разорвана
  • <level min="70" max="80"/> - минимальный и максимальный уровень для входа в инстанс
  • <party min="2" max="6"/> - минимальное количество и максимальное количество игроков в пати
  • <teleport loc="180056 -88968 -7216"/> - точка телепорта при входе в инстанс
  • <return loc="43928 -49144 -792"/> - координата в которую будет возвращать игроков при закрытии инстанса
  • <geodata map="25_15"/> - квадрат геодаты текущего инстанса (нужно ставить если у вас есть там двери, нет - можете забить)
  • <remove itemId="0" count="0" necessary="false"/> какой итем нужен для входа в инстанс. По умолчанию ничего не забираем
  • <give itemId="0" count="0"/> - предмет который будет выдан после входа в инстанс
  • <quest id="0"/> - необходимый квест для входа в инстанса.
  • <reuse resetReuse="30 6 * * *" setUponEntry="true" sharedReuseGroup="1"/> - когда произойдёт сброс отката инста. setUponEntry ture -откат ставится сразу после входа, а не по завершению. sharedReuseGroup - шарить его во всю группу инстансов
  • <spawns></spawns> - блок для спауна НПЦ или мобов которые вы хотите или описываете своим скриптом.
  • <doors></doors> - двери которые есть в инсте, обязательно указывать или игроки будут через них пробегать якобы нет геодаты внутри.
  • <add_parameters><param name="hwidLimit" value="true"/></add_parameters> - если активировать этот параметр, откат будет записываться на HWID и не пускать в инст если HWID тот же.
  • <zones></zones> - блок с массивом зон (необязательный). Как пример: <zones><zone name="[my_zone_1]" active="true"/><zone name="[my_zone_1]" active="true"/></zones>


2. Делаем своего НПЦ или берем стандартного id 40031
Пример:
По факту у вас должен быть тип НПЦ <set name="type" value="EventReflectionManager" />
Но так же выкладываю полного

XML:
<npc id="40031" name="Pathfinder Worker" title="Dimensional Manager">
   <set name="aggroRange" value="0" />
   <set name="ai_type" value="CharacterAI" />
   <set name="baseAtkRange" value="40" />
   <set name="baseCON" value="43" />
   <set name="baseCritRate" value="40" />
   <set name="baseDEX" value="30" />
   <set name="baseHpMax" value="2444.468" />
   <set name="baseHpRate" value="1" />
   <set name="baseHpReg" value="7.5" />
   <set name="baseINT" value="21" />
   <set name="baseMAtk" value="780" />
   <set name="baseMAtkSpd" value="500" />
   <set name="baseMDef" value="382" />
   <set name="baseMEN" value="20" />
   <set name="baseMpMax" value="1345.8" />
   <set name="baseMpReg" value="2.7" />
   <set name="basePAtk" value="1303" />
   <set name="basePAtkSpd" value="253" />
   <set name="basePDef" value="471" />
   <set name="baseRunSpd" value="120" />
   <set name="baseSTR" value="40" />
   <set name="baseShldDef" value="0" />
   <set name="baseShldRate" value="0" />
   <set name="baseWIT" value="20" />
   <set name="baseWalkSpd" value="30" />
   <set name="collision_height" value="23.0" />
   <set name="collision_radius" value="8.0" />
   <set name="level" value="70" />
   <set name="rewardExp" value="0" />
   <set name="rewardRp" value="0" />
   <set name="rewardSp" value="0" />
   <set name="shots" value="NONE" />
   <set name="texture" value="" />
   <set name="displayId" value="35579"/>
   <set name="type" value="EventReflectionManager" />
   <skills>
      <skill id="4416" level="14" /> <!--Humans-->
   </skills>
   <attributes>
      <defence attribute="fire" value="150" />
      <defence attribute="water" value="150" />
      <defence attribute="wind" value="150" />
      <defence attribute="earth" value="150" />
      <defence attribute="holy" value="150" />
      <defence attribute="unholy" value="150" />
   </attributes>
</npc>

Теперь смотрим его диалог и наглядно цепляем к нему вход в нужный нам инстанс:
Путь обязательно должен быть gameserver\data\html\events\instances\40031.htm
Теперь сам диалог:
и сразу смотрим на строку [npc_%objectId%_Chat 1|Войти в Камалоку.] которое перекинет нас для входа в инстанс 40031-1.htm

HTML:
Pathfinder Worker:

Да? Хотите войти в Камалоку?

[npc_%objectId%_event_instance 72|Войти в Камалоку, Зал Бездны (Уровень 70-80).]

Где npc_%objectId%_event_instance 72 id нашего инстанца! Который мы уже предварительно создали в gameserver\data\instances\[72] Kamaloka, Hall of the Abyss.xml

3. Как открывать двери или делать любые какие угодно вам действия при убийстве Рейдов или мобов внутри инстанса. Мы рассмотрим конкретно открытия дверей и вам необходимо знать хотя бы чуток яву.
Переходим к примеру:
Где при убийстве моба id 25657 будет открываться дверь id 25150002 и при убийстве 25658 будет открываться дверь id 25150003.
У самих же этих мобов id 25657 и id 25658 в data/npc стоит тип <set name="type" value="EventReflectionMob"/>
Вы можете создавать любой нужный себе сценарий или открывать двери при убийстве нужного вам моба внутри инстанса.
Исходный код прикладываю, как компилировать ваши скрипты и загружать их >>> Гайд <<<

Java:
package npc.model;

import l2.gameserver.instancemanager.ReflectionManager;
import l2.gameserver.model.Creature;
import l2.gameserver.model.instances.DoorInstance;
import l2.gameserver.model.instances.MonsterInstance;
import l2.gameserver.templates.npc.NpcTemplate;

public class EventReflectionMobInstance extends MonsterInstance
{
  public EventReflectionMobInstance(int objectId, NpcTemplate template)
  {
    super(objectId, template);
  }

  @Override
  protected void onDeath(Creature killer)
  {
    super.onDeath(killer);
    if(getReflection() == killer.getReflection() && getReflection() != ReflectionManager.DEFAULT)
    {
      switch(getNpcId())
      {
        case 25657:
        {
          DoorInstance door = getReflection().getDoor(25150002);
          if(door != null)
          {
            door.openMe();
          }
        }
        break;
        case 25658:
        {
          DoorInstance door = getReflection().getDoor(25150003);
          if(door != null)
          {
            door.openMe();
          }
        }
        break;
      }
    }
  }
}

Вся система ограничена лишь вашей фантазией и при минимальных знаниях вы можете создавать какие угодно инстансы с любыми сценариями и событиями. Все в ваших руках!
 
Last edited:
40031-1.htm
Pathfinder Worker:

Yes? Do you want to enter Kamaloka?

[npc_%objectId%_event_instance 72|Enter Kamaloka, Hall of the Abyss (Level 70-80).]

[npc_%objectId%_event_instance 72|Enter Kamaloka, Hall of the Abyss (Level 70-80).]
how to attach my own buttons instead? what kind of bypass is needed?
I didn't find anything in the thong
what strings?
Shot00071.webp
beware: 23002 is the id that i have in my npc......look at your npc id
 

Attachments

  • Shot00071.webp
    Shot00071.webp
    27.5 KB · Views: 7
what strings?
View attachment 4848
beware: 23002 is the id that i have in my npc......look at your npc id
Pathfinder Worker:

What! You want to enter Kamaloka?

[npc_%objectId%_event_instance 72|Enter Kamaloka, Hall of the Abyss (level 70-80).]


[npc_%objectId%_event_instance 72|Enter Kamaloka, Hall of the Abyss (level 70-80).]
is a button for entering/teleporting to Kamaloka.

I want to change the button's appearance, something like:
<button value="kamaloka" action="bypass (here I don't understand which bypass to set)" width=120 height=21 back="my_button1" fore="my_button2">
 
Pathfinder Worker:

What! You want to enter Kamaloka?

[npc_%objectId%_event_instance 72|Enter Kamaloka, Hall of the Abyss (level 70-80).]


[npc_%objectId%_event_instance 72|Enter Kamaloka, Hall of the Abyss (level 70-80).]
is a button for entering/teleporting to Kamaloka.

I want to change the button's appearance, something like:
<button value="kamaloka" action="bypass (here I don't understand which bypass to set)" width=120 height=21 back="my_button1" fore="my_button2">
npc_%objectId%_event_instance 72
this is the link
Code:
<button value="kamaloka" action="npc_%objectId%_event_instance 72" width=120 height=21 back="my_button1" fore="my_button2">
 
npc_%objectId%_event_instance 72
this is the link
Code:
<button value="kamaloka" action="npc_%objectId%_event_instance 72" width=120 height=21 back="my_button1" fore="my_button2">
<button value="kamaloka" action="npc_%objectId%_event_instance 72" width=120 height=21 back="my_button1" fore="my_button2">
This doesn't work; after adding it, the button doesn't respond at all.
 
collapseIfEmpty="5"

Господа, какое бы значение здесь не выставлял, инст всё равно закрывается только через 5 минут, выставлял 0 1 2 3 4 никаких изменений не происходит, инст всё равно закрывается через 5 минут.

В чём может быть дело?
 
Хай гайс, нужна хелпа.

Сделал копию 72 камы, только под 73 + добавил еще 1 рб , проблема в том что дверь не открывается после 3 босса.


package npc.model;

import l2.gameserver.instancemanager.ReflectionManager;
import l2.gameserver.model.Creature;
import l2.gameserver.model.instances.DoorInstance;
import l2.gameserver.model.instances.MonsterInstance;
import l2.gameserver.templates.npc.NpcTemplate;

public class EventReflectionMobInstance extends MonsterInstance
{
public EventReflectionMobInstance(int objectId, NpcTemplate template)
{
super(objectId, template);
}

@Override
protected void onDeath(Creature killer)
{
super.onDeath(killer);
if(getReflection() == killer.getReflection() && getReflection() != ReflectionManager.DEFAULT)
{
switch(getNpcId())
{
case 25657:
{
DoorInstance door = getReflection().getDoor(25150002);
if(door != null)
{
door.openMe();
}
}
break;
case 25658:
{
DoorInstance door = getReflection().getDoor(25150003);
if(door != null)
{
door.openMe();
}
}
break;
case 25659:
{
DoorInstance door = getReflection().getDoor(25150004);
if(door != null)
{
door.openMe();
}
}
break;
}
}
}
}


Скрипт переделал но почему-то не пашет, в чем беда мб кто-то сталкивался?
 
Хай гайс, нужна хелпа.

Сделал копию 72 камы, только под 73 + добавил еще 1 рб , проблема в том что дверь не открывается после 3 босса.


package npc.model;

import l2.gameserver.instancemanager.ReflectionManager;
import l2.gameserver.model.Creature;
import l2.gameserver.model.instances.DoorInstance;
import l2.gameserver.model.instances.MonsterInstance;
import l2.gameserver.templates.npc.NpcTemplate;

public class EventReflectionMobInstance extends MonsterInstance
{
public EventReflectionMobInstance(int objectId, NpcTemplate template)
{
super(objectId, template);
}

@Override
protected void onDeath(Creature killer)
{
super.onDeath(killer);
if(getReflection() == killer.getReflection() && getReflection() != ReflectionManager.DEFAULT)
{
switch(getNpcId())
{
case 25657:
{
DoorInstance door = getReflection().getDoor(25150002);
if(door != null)
{
door.openMe();
}
}
break;
case 25658:
{
DoorInstance door = getReflection().getDoor(25150003);
if(door != null)
{
door.openMe();
}
}
break;
case 25659:
{
DoorInstance door = getReflection().getDoor(25150004);
if(door != null)
{
door.openMe();
}
}
break;
}
}
}
}


Скрипт переделал но почему-то не пашет, в чем беда мб кто-то сталкивался?
Сделай экстеншен чтобы у класса было уникальное имя, допустим EventReflectionMob1Instance, так как EventReflectionMobInstance уже есть и по всей видимости твой экстеншен загружается раньше чем этот класс.
Так же не забудь указать в data/npc новый тип ему
 
Last edited:
Сделай экстеншен чтобы у класса было уникальное имя, допустим EventReflectionMob1Instance, так как EventReflectionMobInstance уже есть и по всей видимости твой экстеншен загружается раньше чем этот класс.
Так же не задудь указать в data/npc новый тип ему
Порядок, спасибо
 
timer="60 это минуты или секунды ?
Понять не могу, почему при убийстве РБ не возвращает в город.
<!DOCTYPE list SYSTEM "instances.dtd">
<list>
<instance id="73" name="Instance custom" maxChannels="20" collapseIfEmpty="1" timelimit="5" dispelBuffs="false">
<collapse on-party-dismiss="true" timer="1"/>
<level min="78" max="80"/>
<party min="1" max="3"/>
<return loc="-113837 254821 -1520"/>
<teleport loc="114276 -114372 -11200"/>
<geodata map="23_14"/>
<remove itemId="9762" count="3" necessary="true"/>
<give itemId="0" count="0"/>
<quest id="0"/>
<reuse resetReuse="0 * * * *" setUponEntry="true" sharedReuseGroup="0"/> <!-- Instance reuse at 6:30 every day -->
<spawns>
<spawn mobId="55559" type="point">
<coords loc="114717 -114795 -11200 24575"/>
</spawn>
</spawns>
<doors>
<door id="23140101" opened="false"/>
<door id="23140001" opened="false"/>
<door id="23140002" opened="false"/>
</doors>
<add_parameters>
<param name="hwidLimit" value="true"/>
</add_parameters>
</instance>
</list>
 
Last edited:
timer="60 это минуты или секунды ?
Понять не могу, почему при убийстве РБ не возвращает в город.
<!DOCTYPE list SYSTEM "instances.dtd">
<list>
<instance id="73" name="Instance custom" maxChannels="20" collapseIfEmpty="1" timelimit="5" dispelBuffs="false">
<collapse on-party-dismiss="true" timer="1"/>
<level min="78" max="80"/>
<party min="1" max="3"/>
<return loc="-113837 254821 -1520"/>
<teleport loc="114276 -114372 -11200"/>
<geodata map="23_14"/>
<remove itemId="9762" count="3" necessary="true"/>
<give itemId="0" count="0"/>
<quest id="0"/>
<reuse resetReuse="0 * * * *" setUponEntry="true" sharedReuseGroup="0"/> <!-- Instance reuse at 6:30 every day -->
<spawns>
<spawn mobId="55559" type="point">
<coords loc="114717 -114795 -11200 24575"/>
</spawn>
</spawns>
<doors>
<door id="23140101" opened="false"/>
<door id="23140001" opened="false"/>
<door id="23140002" opened="false"/>
</doors>
<add_parameters>
<param name="hwidLimit" value="true"/>
</add_parameters>
</instance>
</list>
у тебя скорее всего моб не тот тип стоит и оно ждет того кто будет в тем типом. Какой у тебя стоит? а по поводу таймера дизеру надо сделать секунды, потому что даже 1 минута это для игроков пиздец) кому вообще там нужно стоять больше и для чего хз. обычно 10 сек хватает с головой
 
Да по поводу телепорта я разобрался, но да 1 минута для игроков просто так стоять это вилы, нужна возможность выставлять секунды после убийства
 
Да по поводу телепорта я разобрался, но да 1 минута для игроков просто так стоять это вилы, нужна возможность выставлять секунды после убийства
Сое крутить ))
 
Да по поводу телепорта я разобрался, но да 1 минута для игроков просто так стоять это вилы, нужна возможность выставлять секунды после убийства
проси дизера мб сделает)
 
да, ipLimit
как включить ип проверку чтобы и откат по истечению был? То есть не впускало людей с одним ип и не могли войти с этим же ип на других аккаунтах?

<add_parameters><param name="ipLimit" value="true"/></add_parameters> так в любое место?
 
как включить ип проверку чтобы и откат по истечению был? То есть не впускало людей с одним ип и не могли войти с этим же ип на других аккаунтах?

<add_parameters><param name="ipLimit" value="true"/></add_parameters> так в любое место?
Если да то не работает =)
 
Создал инстанс

<list>
<instance id="100" name="Kama 40lvl Party" maxChannels="10" collapseIfEmpty="1" timelimit="30" dispelBuffs="false">
<collapse on-party-dismiss="true" timer="1"/>
<level min="40" max="50"/>
<party min="1" max="9"/>
<return loc="83460 148620 -3408"/>
<teleport loc="184465 -13101 -5488"/>
<geodata map="25_17"/>
<remove itemId="0" count="0" necessary="false"/>
<give itemId="0" count="0"/>
<quest id="0"/>
<reuse resetReuse="30 6 * * *" setUponEntry="true" sharedReuseGroup="2"/> <!-- Instance reuse at 6:30 every day -->
<spawns>
<spawn mobId="11000" type="point">
<coords loc="185075 -12603 -5488"/>
</spawn>
</spawns>
<add_parameters>
<param name="hwidLimit" value="false"/>
</add_parameters>
</instance>
</list>

РБ

<npc id="11000" name="Instance 40 lvl" title="Raid Boss">
<!-- [Instance 40lvl] -->
<set name="aggroRange" value="0"/>
<set name="ai_type" value="Fighter"/>
<set name="baseAtkRange" value="40"/>
<set name="baseCON" value="57"/>
<set name="baseCritRate" value="40"/>
<set name="baseDEX" value="73"/>
<set name="baseHpMax" value="156185.297"/>
<set name="baseHpRate" value="1"/>
<set name="baseHpReg" value="56.114"/>
<set name="baseINT" value="76"/>
<set name="baseMAtk" value="113"/>
<set name="baseMAtkSpd" value="1972"/>
<set name="baseMDef" value="253"/>
<set name="baseMEN" value="80"/>
<set name="baseMpMax" value="584"/>
<set name="baseMpReg" value="2.1"/>
<set name="basePAtk" value="583"/>
<set name="basePAtkSpd" value="253"/>
<set name="basePDef" value="520"/>
<set name="baseRunSpd" value="170"/>
<set name="baseSTR" value="60"/>
<set name="baseShldDef" value="0"/>
<set name="baseShldRate" value="0"/>
<set name="baseWIT" value="70"/>
<set name="baseWalkSpd" value="36"/>
<set name="collision_height" value="51.0"/>
<set name="collision_radius" value="24.0"/>
<set name="level" value="45"/>
<set name="rewardExp" value="1200000"/>
<set name="rewardRp" value="1388"/>
<set name="rewardSp" value="200000"/>
<set name="shots" value="NONE"/>
<set name="texture" value=""/>
<set name="type" value="ReflectionBoss"/>

Проблема в том что после убийства рб приходится ждать 5 мин , хотя должно быть 1 мин collapseIfEmpty="1" , не могу понять что делаю не так.
 
Создал инстанс



РБ



Проблема в том что после убийства рб приходится ждать 5 мин , хотя должно быть 1 мин collapseIfEmpty="1" , не могу понять что делаю не так.
Поставь НПЦ после смерти РБ который будет выпускать сразу, это сделано чтобы игроки могли поднять дроп и так далее. А collapseIfEmpty это килять инстанц если никого нет в нем
 
Back
Top