pvpgate 11 Опубликовано 4 июня, 2018 Добрый день, пытаюсь разбираться с инстансами. Сборка Lostworld Создал xml инстанс зоны в data/instances Как теперь создать активный канал этой инстанс зоны и телепортировать туда игрока, например при клике на диалог у нпц? Хотел глянуть по аналогии с камой, но в html нпц диалог ссылается на _kamaloka 78 , не могу найти этот метод. Подскажите плз где копать, или дайте простой пример создания и телепорта в инстанс зону. Большое спасибо за любые подсказки! 1 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Gaikotsu 620 Опубликовано 4 июня, 2018 (изменено) ReflectionUtils.simpleEnterInstancedZone(player, izId); или ReflectionUtils.simpleEnterInstancedZone(player, refClass, izId); если инстанс имеет свой класс refClass, наследный от Reflection Изменено 4 июня, 2018 пользователем Gaikotsu 1 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
pvpgate 11 Опубликовано 4 июня, 2018 (изменено) 21 минуту назад, Gaikotsu сказал: ReflectionUtils.simpleEnterInstancedZone(player, izId); или ReflectionUtils.simpleEnterInstancedZone(player, refClass, izId); если инстанс имеет свой класс refClass, наследный от Reflection а izid регенится при создании канала? это интовое число или что? И как создать сам канал инстанса? Изменено 4 июня, 2018 пользователем pvpgate Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Gaikotsu 620 Опубликовано 4 июня, 2018 izId - это ид инстанса, которое ты указал в его хмлке и метод сам создает и возвращает класс инстанса открой ReflectionUtils в ядре серва и поизучай - там же все просто. 1 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
pvpgate 11 Опубликовано 4 июня, 2018 (изменено) 37 минут назад, Gaikotsu сказал: izId - это ид инстанса, которое ты указал в его хмлке и метод сам создает и возвращает класс инстанса открой ReflectionUtils в ядре серва и поизучай - там же все просто. а как понять на какой канал я отправил игрока? Если я хочу двух игроков отправить на один канал этой инсты, а третьего на другой, а четвертого снова к первым двум, например? Изменено 4 июня, 2018 пользователем pvpgate Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
zGosu 396 Опубликовано 4 июня, 2018 1 час назад, pvpgate сказал: а как понять на какой канал я отправил игрока? Если я хочу двух игроков отправить на один канал этой инсты, а третьего на другой, а четвертого снова к первым двум, например? отдельно каждого ТПхаешь в разные локи, указывая разный ID инстанса. Можете рандомно отправлять их в разные локи, можете смотреть сколько в какой локе людей и какие классы (можно даже шмоту xDDDDDDDDDD) 1 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Gaikotsu 620 Опубликовано 4 июня, 2018 2 часа назад, pvpgate сказал: а как понять на какой канал я отправил игрока? Если я хочу двух игроков отправить на один канал этой инсты, а третьего на другой, а четвертого снова к первым двум, например? эти методы возвращают объект созданного инстанса - эти объекты храни и с ними и работай, если тебе надо в те же самые инстансы еще кого-то переместить после первого вошедшего в них игрока. каждая созданная копия инстанса имеет свой уникальный reflectionId, с которым и можно манипулировать. например телепортировать в уже существующий инстанс: player.teleToLocation(x, y, z, reflectionId); блин, это же все самые основы... далеко с такими куцыми знаниями программирования ты не уйдешь... 1 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
pvpgate 11 Опубликовано 4 июня, 2018 (изменено) 2 часа назад, Gaikotsu сказал: эти методы возвращают объект созданного инстанса - эти объекты храни и с ними и работай, если тебе надо в те же самые инстансы еще кого-то переместить после первого вошедшего в них игрока. каждая созданная копия инстанса имеет свой уникальный reflectionId, с которым и можно манипулировать. например телепортировать в уже существующий инстанс: player.teleToLocation(x, y, z, reflectionId); блин, это же все самые основы... далеко с такими куцыми знаниями программирования ты не уйдешь... Я только начинаю разбираться, ранее вообще с ооп не сталкивался, из программирования пишу только простенькие скрипты на Python для машинного обучения. Если можно, чуть чуть более структурировано. Спасибо заранее. В каком месте мы создаем новый инстанс того типа, который я указал в xml ? Как это делается? Я так понимаю после создания инстанс зоны этого типа ему присваивается ID, который уже и является уникальным ID локации, куда можно телепортировать игроков через teleToLocation(координаты, ID инсты). Но в каком именно месте мы говорим что, скажем, создадим-ка мы 10 инстанс зон одного типа и потом будем распихивать по ним игроков? Изменено 4 июня, 2018 пользователем pvpgate Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
zGosu 396 Опубликовано 5 июня, 2018 9 часов назад, pvpgate сказал: Я только начинаю разбираться, ранее вообще с ооп не сталкивался, из программирования пишу только простенькие скрипты на Python для машинного обучения. Если можно, чуть чуть более структурировано. Спасибо заранее. В каком месте мы создаем новый инстанс того типа, который я указал в xml ? Как это делается? Я так понимаю после создания инстанс зоны этого типа ему присваивается ID, который уже и является уникальным ID локации, куда можно телепортировать игроков через teleToLocation(координаты, ID инсты). Но в каком именно месте мы говорим что, скажем, создадим-ка мы 10 инстанс зон одного типа и потом будем распихивать по ним игроков? Зоны сами подгружаются из XML. Тебе нужно создать скрипт, который будет юзать твой нпс, и в него уже добавлять код на ТП. Скрипт делаешь на подобии уже существующих скриптов для НПС, например тех, которые делают ТП в инстансы. Ну или отдельный байпас как у камолки 1 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
pvpgate 11 Опубликовано 5 июня, 2018 2 часа назад, zGosu сказал: Зоны сами подгружаются из XML. Тебе нужно создать скрипт, который будет юзать твой нпс, и в него уже добавлять код на ТП. Скрипт делаешь на подобии уже существующих скриптов для НПС, например тех, которые делают ТП в инстансы. Ну или отдельный байпас как у камолки Спасибо, вроде разобрался, правда пока не получилось сделать SimpleEnterInstancedZone в зону со своим классом, наследующим Reflection. Если я делаю это из другого класса он должен наследовать класс инстанс зоны? Или просто надо заимпортить класс инстанс зоны? И еще вопрос, я инстанс зону копировал с олимп арены, почему после входа у меня появляется откат? Где он указан по умолчанию и как убрать? Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
zGosu 396 Опубликовано 5 июня, 2018 2 часа назад, pvpgate сказал: Спасибо, вроде разобрался, правда пока не получилось сделать SimpleEnterInstancedZone в зону со своим классом, наследующим Reflection. Если я делаю это из другого класса он должен наследовать класс инстанс зоны? Или просто надо заимпортить класс инстанс зоны? И еще вопрос, я инстанс зону копировал с олимп арены, почему после входа у меня появляется откат? Где он указан по умолчанию и как убрать? Ты можешь сам выбрать методы, которые будут наследоваться или просто доступны в других классах (protected & public). Что за откат? Если ТПхает из зоны, то смотри параметры инстанса. Но вроде как все инстансы после релога выкидывают игрока. Это уже в EnterWorld смотреть надо. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
pvpgate 11 Опубликовано 5 июня, 2018 3 часа назад, zGosu сказал: Ты можешь сам выбрать методы, которые будут наследоваться или просто доступны в других классах (protected & public). Что за откат? Если ТПхает из зоны, то смотри параметры инстанса. Но вроде как все инстансы после релога выкидывают игрока. Это уже в EnterWorld смотреть надо. откат - имеется ввиду что после выхода из зоны мне пишет что в след. раз я смогу зайти в нее после 6 утра. Я так понимаю в xml зоны это параметр reuse resetReuse но у меня в инстанс его нет, почему же он ставит по умолчанию 1 заход в сутки? Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Gaikotsu 620 Опубликовано 5 июня, 2018 значит значение по умолчанию такое задано если хочешь другое - то же самое отсутствие реюза - задавай это явно, этим параметром Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
pvpgate 11 Опубликовано 7 июня, 2018 В 04.06.2018 в 20:08, zGosu сказал: отдельно каждого ТПхаешь в разные локи, указывая разный ID инстанса. Можете рандомно отправлять их в разные локи, можете смотреть сколько в какой локе людей и какие классы (можно даже шмоту xDDDDDDDDDD) привет, у меня возник очередной вопрос, может ты, или кто-нибудь еще сможете подсказать, что-бы не создавтаь новых тем. Вобщем, вроде как разобрался с созданием нового рефлекта через ReflectionUtils.simpleEnterInstancedZone(player, id); Теперь хочу сделать так, что-бы рефлект этой зоны мог быть только один. Т.е если таких зон нет - создавать новый рефлект. Если такая зона существует - телепортировать в существующий рефлект. Вот что пока навоял public class L2Arena_impl { @Bypass("services.L2Arena_impl:goto_arena") public void goto_arena(Player player, NpcInstance npc, String[] arg) { for(Reflection reflection : ReflectionManager.getInstance().getAll()) { if(reflection.getName() == "PVP") { Reflection rexist = reflection; } } if(rexist.getName() == "PVP") //в этой строке ошибка rexist cannot be resolveв player.teleToLocation(84696, -16824, -1824, rexist); //в этой rexist cannot be resolved to a variable else ReflectionUtils.simpleEnterInstancedZone(player, 777); } @Bypass("services.L2Arena_impl:goto_back") public void goto_back(Player player, NpcInstance npc, String[] arg) { final Reflection ar = player.getActiveReflection(); player.teleToLocation(ar.getReturnLoc(), 0); } } Собственно что я делаю не так, и как это сделать правильно? Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
zGosu 396 Опубликовано 7 июня, 2018 Эта часть когда мне вообще не понятна (не логична): if(reflection.getName() == "PVP") { Reflection rexist = reflection; } Поэтому у тебя и ошибка: rexist cannot be resolved to a variable Правильней будет: code public class L2Arena_impl { @Bypass("services.L2Arena_impl:goto_arena") public void goto_arena(Player player, NpcInstance npc, String[] arg) { Reflection rexist; for(Reflection reflection : ReflectionManager.getInstance().getAll()) { if(reflection.getName() == "PVP") { rexist = reflection; } } if(rexist != null && rexist.getName() == "PVP") player.teleToLocation(84696, -16824, -1824, rexist); else ReflectionUtils.simpleEnterInstancedZone(player, 777); } @Bypass("services.L2Arena_impl:goto_back") public void goto_back(Player player, NpcInstance npc, String[] arg) { final Reflection ar = player.getActiveReflection(); player.teleToLocation(ar.getReturnLoc(), 0); } } Hide 1 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
pvpgate 11 Опубликовано 7 июня, 2018 5 минут назад, zGosu сказал: Правильней будет: Спасибо, понял, я тип присвоил на уровень ниже чем вызывал потом видимо.. 1 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
pvpgate 11 Опубликовано 7 июня, 2018 24 минуты назад, zGosu сказал: Правильней будет: code public class L2Arena_impl { @Bypass("services.L2Arena_impl:goto_arena") public void goto_arena(Player player, NpcInstance npc, String[] arg) { Reflection rexist; for(Reflection reflection : ReflectionManager.getInstance().getAll()) { if(reflection.getName() == "PVP") { rexist = reflection; } } if(rexist != null && rexist.getName() == "PVP") player.teleToLocation(84696, -16824, -1824, rexist); else ReflectionUtils.simpleEnterInstancedZone(player, 777); } @Bypass("services.L2Arena_impl:goto_back") public void goto_back(Player player, NpcInstance npc, String[] arg) { final Reflection ar = player.getActiveReflection(); player.teleToLocation(ar.getReturnLoc(), 0); } } Скрыть Пришлось еще добавить значение по умолчанию для rexist, а то The local variable may not have been initialized сделал это так: Reflection rexist = player.getReflection(); Сервер запустился без ошибок, но при попытке полететь в зону, когда она существует, каждый раз создается новый рефлект, т.е. всегда идет по ветке else ReflectionUtils.simpleEnterInstancedZone(player, 777); не понимаю почему, зона называется PVP, через //instance вижу ее название и что в ней есть игрок. Сам инстанс: <!DOCTYPE list SYSTEM "instances.dtd"> <list> <instance id="777" name="PVP" maxChannels="40" collapseIfEmpty="1" timelimit="1440" dispelBuffs="true"> <level min="1" max="85"/> <party min="1" max="1"/> <geodata map="22_17" /> <return loc="-88536 142104 -3648"/> <teleport loc="84696 -16824 -1824 29412" /> <reuse resetReuse="* * * * *" setUponEntry="false" sharedReuseGroup="0" /> <spawn mobId="32534" type="point"> <coords loc="84648 -16808 -1824 61567"/> </spawn> </instance> </list> Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
zGosu 396 Опубликовано 7 июня, 2018 1 минуту назад, pvpgate сказал: Пришлось еще добавить значение по умолчанию для rexist, а то The local variable may not have been initialized сделал это так: Reflection rexist = player.getReflection(); Сервер запустился без ошибок, но при попытке полететь в зону, когда она существует, каждый раз создается новый рефлект, т.е. всегда идет по ветке else ReflectionUtils.simpleEnterInstancedZone(player, 777); не понимаю почему, зона называется PVP, через //instance вижу ее название и что в ней есть игрок. Сам инстанс: <!DOCTYPE list SYSTEM "instances.dtd"> <list> <instance id="777" name="PVP" maxChannels="40" collapseIfEmpty="1" timelimit="1440" dispelBuffs="true"> <level min="1" max="85"/> <party min="1" max="1"/> <geodata map="22_17" /> <return loc="-88536 142104 -3648"/> <teleport loc="84696 -16824 -1824 29412" /> <reuse resetReuse="* * * * *" setUponEntry="false" sharedReuseGroup="0" /> <spawn mobId="32534" type="point"> <coords loc="84648 -16808 -1824 61567"/> </spawn> </instance> </list> Правильней в код проверять не по названию, а по ID. Лучше для начала прологируй код, если не понимаешь, что сейчас происходит с ним. 1 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
pvpgate 11 Опубликовано 7 июня, 2018 13 минут назад, zGosu сказал: Правильней в код проверять не по названию, а по ID. Лучше для начала прологируй код, если не понимаешь, что сейчас происходит с ним. и по ID не получилось if(rexist != null && rexist.getId() == 777) player.teleToLocation(84696, -16824, -1824, rexist); тоже улетает в новый рефлект. А есть какие то игровые методы логгирования? Я никаких IDE не использую... Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
zGosu 396 Опубликовано 7 июня, 2018 2 минуты назад, pvpgate сказал: и по ID не получилось if(rexist != null && rexist.getId() == 777) player.teleToLocation(84696, -16824, -1824, rexist); тоже улетает в новый рефлект. А есть какие то игровые методы логгирования? Я никаких IDE не использую... И тут на ID поменяй: if(reflection.getName() == "PVP") Логировать можно с помощью: System.out.println("hello"); player.sendMessage("hello2"); и т.п. 1 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Gaikotsu 620 Опубликовано 7 июня, 2018 (изменено) не знаю как в лосте, но в оригинальном овере наличие существующего инастанса с заданным izId можно проверить так if (ReflectionManager.getCountByIzId(izId) > 0) System.out.println("found"); ну а вытащить список всех инстансов с заданным izId можно через ArrayList<Reflection> list = ReflectionManager.getAll(izId); Изменено 7 июня, 2018 пользователем Gaikotsu 1 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Gaikotsu 620 Опубликовано 7 июня, 2018 1 час назад, pvpgate сказал: Я никаких IDE не использую... зря... писание кода в обычном блокноте или чем-то сопоставимом - это та еще степень мазохизма IDE типа эклипса или идеи уже на этапе написания кода позволит избежать кучи ошибок, т.к. будет указывать на многие ошибки в реальном времени Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Gaikotsu 620 Опубликовано 7 июня, 2018 (изменено) 1 час назад, pvpgate сказал: тоже улетает в новый рефлект. А есть какие то игровые методы логгирования? Я никаких IDE не использую... а ты уверен что на момент повторной попытки входа старый инстанс у тебя еще существует? т.к. у тебя в его свойствах указано что он уничтожается уже через минуту как его покинули все игроки if(reflection.getName() == "PVP") нельзя так делать, ибо строки в яве на эквивалентность так не сравниваются сравнивать надо так if(reflection.getName().equals("PVP")) или так if(reflection.getName().equalsIgnoreCase("PVP")) Изменено 7 июня, 2018 пользователем Gaikotsu 1 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
pvpgate 11 Опубликовано 7 июня, 2018 1 минуту назад, Gaikotsu сказал: а ты уверен что на момент повторной попытки входа старый инстанс у тебя еще существует? т.к. у тебя в его свойствах указано что он уничтожается уже через минуту как его покинули все игроки да, уверен, я сперва захожу первым чаром в эту инсту, потом, не выходя, пытаюсь зайти вторым - создается новый рефлект. getCountByIzId у меня есть, сейчас попробоую таким способом Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
pvpgate 11 Опубликовано 7 июня, 2018 (изменено) 1 час назад, zGosu сказал: И тут на ID поменяй: if(reflection.getName() == "PVP") Логировать можно с помощью: System.out.println("hello"); player.sendMessage("hello2"); и т.п. интересно получается при логировании. getId() не подходит, т.к. дает Id рефлекта а не инстанс зоны. Кстати, при попытке логировать getId() во время цикла for(Reflection reflection : ReflectionManager.getInstance().getAll()) { .... } получаю сходу список из следующих id рефлктов: -3, -2, -1, 0 - я так понимаю это какие то стандартные рефлекты, типа под парнас, гиран харбор и т.д., ну а нулевой это основной мир. Не суть. Далее пробую логировать по getName() и тут становится все интереснее вариант с player.sendMessage(reflection.getName()); выдает пустое значение Но если сделать так: s=String.valueOf(reflection.getName()); player.sendMessage(s); то выдает пустые значения для рефлектов -3 -2 -1 и 0, и значнеие PVP для моего рефлекта. А вот самое интересное получается если логировать сразу название инст и ветки if: Reflection rexist = player.getReflection(); String s = "null"; for(Reflection reflection : ReflectionManager.getInstance().getAll()) { s=String.valueOf(reflection.getName()); player.sendMessage("s1 instance name = "+s); if(s == "PVP") { rexist = reflection; player.sendMessage("find PVP instance"); } else { player.sendMessage("s1!=PVP"); } } получаем следующий набор сообщений: s1 instance name = s1!=PVP s1 instance name = s1!=PVP s1 instance name = s1!=PVP s1 instance name =PVP s1!=PVP //upd разобрался, как написал Gaikotsu дело в том что надо сравнивать строки через equals Изменено 7 июня, 2018 пользователем pvpgate Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты