Перейти к содержанию

По поводу инстансов (ЕТ и ОМ)


Рекомендуемые сообщения

В данный момент я пытаюсь понять смысл работы инстансов ЕТ и ОМ, есть пара вопросов, если кто знает ответ был бы очень признателен:

Код обоих инстансов копирует друг друга за мелкими изменениями ?

Я очень давно был в ЕТ и совершенно забыл принцип доступа в инстанс игроков, как именно код реализует доступ множества партий в инстанс ? Как он делает разграничение что бы игроки не пересекались ?

Если он использует отдельную карту на всех, создает ли он блоки если впереди партия ? Если он создает отдельные временные локи то где кусок кода ?

Использует ли инстанс какой либо код из сорцов специально для него внедренный или другие функции извне ?

Спасибо.

Ссылка на комментарий
Поделиться на другие сайты

Так и не пересекаются по патям.

Используется одна карта.

Инстанс это есть вещь которая сделана чтобы не пересекались пати.

При создании инсанса создается виртуальная карта именно для одной пати/человека.

Принцип как у OpenVZ например. Создается виртуальная копия одной карты, на базе одной физической которая в клиенте.

Код в сосрах смотри там где функции создания инсансов.

instance_create("instance name", party id);

и т.д.

Ссылка на комментарий
Поделиться на другие сайты

Все в принципе нашел, а вот такой вопрос, попробовал изменить карту в инстанте не будем придираться к имени карты, полностью грамотно в дефолтовом скрипте ЕТ заменил карту на другую, в итоге сервер пишет ошибку, опять не важно какую, суть - после изменения имени карты с 1@tower на mycustommap, сервер продолжает видеть дефолтовую карту скрипта, 1@tower, куда копнуть ? На ночь глядя не особо соображаю...

Ссылка на комментарий
Поделиться на другие сайты

Возможно в этом проблема


if( instance_attachmap(.@i + "@tower", .@instance) == "" )

или гугл

http://www.eathena.ws/board/index.php?autocom=bugtracker&showbug=4004

Либо изменил не везде название, ибо там много карт 1@tower 2@tower...

и вот еще переписывал старый эвент на инстанс систему, гораздо проще понять чем задротские инсансы типа ET

http://dsro.ru/?action=thread&id=3060

Ссылка на комментарий
Поделиться на другие сайты

там есть режим эмуляции инстов так, чтобы с клиентом проблем не было. То есть клиенту будет даваться одно и то же название карты. Насчет патей - для пати лишь создается инстанс и привязывается к пати. После этого, получив instance id можно туда телепортировать любых игроков.

Ссылка на комментарий
Поделиться на другие сайты

Исходный код ЕТ, именил проверки на количество человек в пати, все работает нормально, но есть проблема: по факту после варпа в инстанс, первое событие, появление мобов, срабатывает если на карте более 1 человека, не могу найти проверку на запуск, и зависимость. Может я нетуда смотрю ??

Задача - изменить ЕТ что бы он мог стартануть с 1 человеком в пати.

Изменено пользователем Nezdeshniy
Ссылка на комментарий
Поделиться на другие сайты

if ((.@party_id > 0) && (.@partymembercount > 1)) {

не?

Это часть кода первого скрипта инстанса:

e_tower,81,105,0 script Tower Protection Stone 406,{

Который отвечает за первоначальное создание и регистрацию, после всех своих действий он варпает игрока на карту 1@tower, после чего срабатывает первый скрипт инстанса:


1@tower,29,365,1 script #1F Controller 844,{
end;
OnInstanceInit:
areamonster "1@tower",7,351,17,387,"Metaling",1613,15,instance_npcname("#1F Controller", instance_id())+"::OnMyMobDead";
areamonster "1@tower",7,351,17,387,"Marin",1242,5,instance_npcname("#1F Controller", instance_id())+"::OnMyMobDead";
areamonster "1@tower",7,351,17,387,"Poporing",1031,5,instance_npcname("#1F Controller", instance_id())+"::OnMyMobDead";
areamonster "1@tower",7,351,17,387,"Drops",1113,5,instance_npcname("#1F Controller", instance_id())+"::OnMyMobDead";
areamonster "1@tower",7,351,17,387,"Mastering",1090,1,instance_npcname("#1F Controller", instance_id())+"::OnMyMobDead";
areamonster "1@tower",7,351,17,387,"Poring",1002,5,instance_npcname("#1F Controller", instance_id())+"::OnMyMobDead";
end;
OnMyMobDead:
set .@mob_dead_num,mobcount("1@tower",instance_npcname("#1F Controller", instance_id())+"::OnMyMobDead");
if (.@mob_dead_num < 1) {
instance_announce 0, "All Monsters on the 1st Floor have been defeated.",bc_map,"0xffff00";
donpcevent instance_npcname("1FGate102tower", instance_id())+"::OnEnable";
//SetItemPartyInMap in_102floor 1
}
else
instance_announce 0, "Remaining Monsters on the 1st Floor - " + .@mob_dead_num,bc_map,"0x00ff99";
end;
}

Собственно этот код срабатывает только если на карте более одного человека из пати, и яне могу понять пок акому принципу он это проверяет.

В коде есть OnInstanceInit, который ссылается на часть первого как раз скрипта:


{
mes "^0000ff"+.@md_name$+"^000000 - Try to reserve";
mes "After making a reservation, you have to talk to NPC behind and select the menu 'Enter the Dungeon' to enter the dungeon.";
for( set .@i, 1; .@i <= 6; set .@i, .@i + 1 ) {
if( instance_attachmap(.@i + "@tower", .@instance) == "" )
break;
}
if( .@i < 6 ) {
mes "^0000ff"+.@md_name$+" ^000000- Reservation Failed!";
instance_destroy(.@instance);
close;
}
instance_attach(.@instance);
instance_set_timeout 14400,300,.@instance;
instance_init(.@instance);
// Spawn the first floor of each map, which will then spawn the rest when cleared.
donpcevent instance_npcname("#1F Controller", instance_id())+"::OnInstanceInit";
donpcevent instance_npcname("Immortal Furnace#1", instance_id())+"::OnInstanceInit";
donpcevent instance_npcname("Immortal Furnace#2", instance_id())+"::OnInstanceInit";
donpcevent instance_npcname("Immortal Furnace#3", instance_id())+"::OnInstanceInit";
// Disable the warps on all floor. (enable as floors are cleared)
for( set .@i, 1; .@i <= 99; set .@i, .@i + 1 )
donpcevent instance_npcname(.@i+"FGate102tower", instance_id())+"::OnInstanceInit";
// Warps activate on timer, so players can't get unlimited Ashes.
donpcevent instance_npcname("25FGate102tower-2", instance_id())+"::OnInstanceInit";
donpcevent instance_npcname("50FGate102tower-2", instance_id())+"::OnInstanceInit";
donpcevent instance_npcname("75FGate102tower-2", instance_id())+"::OnInstanceInit";
donpcevent instance_npcname("99FGate102tower-2", instance_id())+"::OnInstanceInit";
// Disable and ready NPCs for the 100th and 101st floors.
donpcevent instance_npcname("Lucid Crystal#102", instance_id())+"::OnInstanceInit";
donpcevent instance_npcname("#102Effect1", instance_id())+"::OnInstanceInit";
donpcevent instance_npcname("#102Effect2", instance_id())+"::OnInstanceInit";
donpcevent instance_npcname("#102FShadowDust1", instance_id())+"::OnInstanceInit";
donpcevent instance_npcname("#102FShadowDust", instance_id())+"::OnInstanceInit";
donpcevent instance_npcname("Spring of Life#1", instance_id())+"::OnInstanceInit";
donpcevent instance_npcname("Tyrant's Throne#", instance_id())+"::OnInstanceInit";
donpcevent instance_npcname("Lost Soul#102", instance_id())+"::OnInstanceInit";
donpcevent instance_npcname("#Effect30", instance_id())+"::OnInstanceInit";
donpcevent instance_npcname("#Effect31", instance_id())+"::OnInstanceInit";
}

Но опять совершенно не могу понять принцип проверки на количество человек на карте. Ни выше по коду ни ниже ни один параметр вроде как не берет за свою переменную игрока на карте...

Ссылка на комментарий
Поделиться на другие сайты

по факту после варпа в инстанс, первое событие, появление мобов, срабатывает если на карте более 1 человека

В коде, приведенном вами ясно же, что спаун мобов на первых этажах происходит при создании инстанса, а не при варпе.

Ссылка на комментарий
Поделиться на другие сайты

Всем спасибо за ответы, полностью разобрался в коде ЕТ, Сан, твой пример к сожалению не использовал. К вопросу важности @mymap name:

Before you start, you have to choose the map, that you want to have instanced. Various restrictions are put on the map names on client-side. If you ignore them, the client usually crashes upon entering the instanced map.

  • Only maps, that begin with a number and @ (e. g. 1@tower) are recognized as instance map by the client. If you want to use a map, that does not match this naming scheme, just must attach it with emulation (parameter <use basename> in command instance_attachmap), which makes the client think, that it is on the actual map, instead of an instance.
  • Map name length limitations:
    • For emulated instance maps you cannot use maps, whose names are longer than 7 characters, because the instance map name is composed of 3 digits, followed by # and the original map name.
    • For client-recognized instance maps, the map name limit is 8 characters, because the instance map name is composed of 3 digits and the original map name.

    [*]Client-recognized instance maps require a self-reference inside the data\resnametable.txt file. Example:


1@tower.gnd#1@tower.gnd#
1@tower.gat#1@tower.gat#
1@tower.rsw#1@tower.rsw#
유저인터페이스\map\1@tower.bmp#유저인터페이스\map\1@tower.bmp#

Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...
Яндекс.Метрика