Перейти к содержанию
Авторизация  
pvpgate

Создание инстанс зоны

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

Добрый день, пытаюсь разбираться с инстансами. 

Сборка Lostworld

Создал xml инстанс зоны в data/instances

Как теперь создать активный канал этой инстанс зоны и телепортировать туда игрока, например при клике на диалог у нпц?

Хотел глянуть по аналогии с камой, но в html нпц диалог ссылается на _kamaloka 78 , не могу найти этот метод. Подскажите плз где копать, или дайте простой пример создания и телепорта в инстанс зону.

Большое спасибо за любые подсказки!

  • Upvote 1

Поделиться сообщением


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

ReflectionUtils.simpleEnterInstancedZone(player, izId);

или

ReflectionUtils.simpleEnterInstancedZone(player, refClass, izId);

если инстанс имеет свой класс refClass, наследный от Reflection

Изменено пользователем Gaikotsu
  • Upvote 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
21 минуту назад, Gaikotsu сказал:

ReflectionUtils.simpleEnterInstancedZone(player, izId);

или

ReflectionUtils.simpleEnterInstancedZone(player, refClass, izId);

если инстанс имеет свой класс refClass, наследный от Reflection

а izid регенится при создании канала? это интовое число или что?

И как создать сам канал инстанса?

Изменено пользователем pvpgate

Поделиться сообщением


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

izId - это ид инстанса, которое ты указал в его хмлке

и метод сам создает и возвращает класс инстанса

открой ReflectionUtils  в ядре серва и поизучай - там же все просто.

  • Upvote 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
37 минут назад, Gaikotsu сказал:

izId - это ид инстанса, которое ты указал в его хмлке

и метод сам создает и возвращает класс инстанса

открой ReflectionUtils  в ядре серва и поизучай - там же все просто.

а как понять на какой канал я отправил игрока? Если я хочу двух игроков отправить на один канал этой инсты, а третьего на другой, а четвертого снова к первым двум, например?

Изменено пользователем pvpgate

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
1 час назад, pvpgate сказал:

а как понять на какой канал я отправил игрока? Если я хочу двух игроков отправить на один канал этой инсты, а третьего на другой, а четвертого снова к первым двум, например?

отдельно каждого ТПхаешь в разные локи, указывая разный ID инстанса.
Можете рандомно отправлять их в разные локи, можете смотреть сколько в какой локе людей и какие классы (можно даже шмоту xDDDDDDDDDD)
 

  • Upvote 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
2 часа назад, pvpgate сказал:

а как понять на какой канал я отправил игрока? Если я хочу двух игроков отправить на один канал этой инсты, а третьего на другой, а четвертого снова к первым двум, например?

эти методы возвращают объект созданного инстанса - эти объекты храни и с ними и работай, если тебе надо в те же самые инстансы еще кого-то переместить после первого вошедшего в них игрока.

каждая созданная копия инстанса имеет свой уникальный reflectionId, с которым и можно манипулировать.

например телепортировать в уже существующий инстанс:

player.teleToLocation(x, y, z, reflectionId);

 

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

  • Upvote 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
2 часа назад, Gaikotsu сказал:

эти методы возвращают объект созданного инстанса - эти объекты храни и с ними и работай, если тебе надо в те же самые инстансы еще кого-то переместить после первого вошедшего в них игрока.

каждая созданная копия инстанса имеет свой уникальный reflectionId, с которым и можно манипулировать.

например телепортировать в уже существующий инстанс:

player.teleToLocation(x, y, z, reflectionId);

 

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

Я только начинаю разбираться, ранее вообще с ооп не сталкивался, из программирования пишу только простенькие скрипты на Python для машинного обучения.

Если можно, чуть чуть более структурировано. Спасибо заранее.

В каком месте мы создаем новый инстанс того типа, который я указал в xml ? Как это делается?
Я так понимаю после создания инстанс зоны этого типа ему присваивается ID, который уже и является уникальным ID локации, куда можно телепортировать игроков через teleToLocation(координаты, ID инсты). Но в каком именно месте мы говорим что, скажем, создадим-ка мы 10 инстанс зон одного типа и потом будем распихивать по ним игроков?

Изменено пользователем pvpgate

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
9 часов назад, pvpgate сказал:

Я только начинаю разбираться, ранее вообще с ооп не сталкивался, из программирования пишу только простенькие скрипты на Python для машинного обучения.

Если можно, чуть чуть более структурировано. Спасибо заранее.

В каком месте мы создаем новый инстанс того типа, который я указал в xml ? Как это делается?
Я так понимаю после создания инстанс зоны этого типа ему присваивается ID, который уже и является уникальным ID локации, куда можно телепортировать игроков через teleToLocation(координаты, ID инсты). Но в каком именно месте мы говорим что, скажем, создадим-ка мы 10 инстанс зон одного типа и потом будем распихивать по ним игроков?

Зоны сами подгружаются из XML.

Тебе нужно создать скрипт, который будет юзать твой нпс, и в него уже добавлять код на ТП.

Скрипт делаешь на подобии уже существующих скриптов для НПС, например тех, которые делают ТП в инстансы. Ну или отдельный байпас как у камолки

  • Upvote 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
2 часа назад, zGosu сказал:

Зоны сами подгружаются из XML.

Тебе нужно создать скрипт, который будет юзать твой нпс, и в него уже добавлять код на ТП.

Скрипт делаешь на подобии уже существующих скриптов для НПС, например тех, которые делают ТП в инстансы. Ну или отдельный байпас как у камолки

Спасибо, вроде разобрался, правда пока не получилось сделать SimpleEnterInstancedZone в зону со своим классом, наследующим Reflection. Если я делаю это из другого класса он должен наследовать класс инстанс зоны? Или просто надо заимпортить класс инстанс зоны?

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
2 часа назад, pvpgate сказал:

Спасибо, вроде разобрался, правда пока не получилось сделать SimpleEnterInstancedZone в зону со своим классом, наследующим Reflection. Если я делаю это из другого класса он должен наследовать класс инстанс зоны? Или просто надо заимпортить класс инстанс зоны?

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

Ты можешь сам выбрать методы, которые будут наследоваться или просто доступны в других классах (protected & public).

Что за откат? Если ТПхает из зоны, то смотри параметры инстанса. Но вроде как все инстансы после релога выкидывают игрока. Это уже в EnterWorld смотреть надо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
3 часа назад, zGosu сказал:

Ты можешь сам выбрать методы, которые будут наследоваться или просто доступны в других классах (protected & public).

Что за откат? Если ТПхает из зоны, то смотри параметры инстанса. Но вроде как все инстансы после релога выкидывают игрока. Это уже в EnterWorld смотреть надо.

откат - имеется ввиду что после выхода из зоны мне пишет что в след. раз я смогу зайти в нее после 6 утра. Я так понимаю в xml зоны это параметр reuse resetReuse

но у меня в инстанс его нет, почему же он ставит по умолчанию 1 заход в сутки?

Поделиться сообщением


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

значит значение по умолчанию такое задано

если хочешь другое - то же самое отсутствие реюза - задавай это явно, этим параметром

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
В 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);
	}	

}

Собственно что я делаю не так, и как это сделать правильно?

Поделиться сообщением


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

Эта часть когда мне вообще не понятна (не логична):

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  
  • Upvote 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
5 минут назад, zGosu сказал:

Правильней будет:

 
 

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

  • Upvote 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
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>

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
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.
Лучше для начала прологируй код, если не понимаешь, что сейчас происходит с ним.

  • Upvote 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
13 минут назад, zGosu сказал:

Правильней в код проверять не по названию, а по ID.
Лучше для начала прологируй код, если не понимаешь, что сейчас происходит с ним.

и по ID не получилось

if(rexist != null && rexist.getId() == 777)                   
	player.teleToLocation(84696, -16824, -1824, rexist);

тоже улетает в новый рефлект.
А есть какие то игровые методы логгирования? Я никаких IDE не использую...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
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"); и т.п.

  • Upvote 1

Поделиться сообщением


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

не знаю как в лосте, но в оригинальном овере наличие существующего инастанса с заданным izId можно проверить так

if (ReflectionManager.getCountByIzId(izId) > 0)
	System.out.println("found");

ну а вытащить список всех инстансов с заданным izId можно через

ArrayList<Reflection> list = ReflectionManager.getAll(izId);

 

Изменено пользователем Gaikotsu
  • Upvote 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
1 час назад, pvpgate сказал:

Я никаких IDE не использую...

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
1 час назад, pvpgate сказал:

тоже улетает в новый рефлект.
А есть какие то игровые методы логгирования? Я никаких IDE не использую...

а ты уверен что на момент повторной попытки входа старый инстанс у тебя еще существует?

т.к. у тебя в его свойствах указано что он уничтожается уже через минуту как его покинули все игроки

 

if(reflection.getName() == "PVP")

нельзя так делать, ибо строки в яве на эквивалентность так не сравниваются

сравнивать надо так

if(reflection.getName().equals("PVP"))

или так

if(reflection.getName().equalsIgnoreCase("PVP"))

 

Изменено пользователем Gaikotsu
  • Upvote 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
1 минуту назад, Gaikotsu сказал:

а ты уверен что на момент повторной попытки входа старый инстанс у тебя еще существует?

т.к. у тебя в его свойствах указано что он уничтожается уже через минуту как его покинули все игроки

да, уверен, я сперва захожу первым чаром в эту инсту, потом, не выходя, пытаюсь зайти вторым - создается новый рефлект. 

getCountByIzId у меня есть, сейчас попробоую таким способом

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
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
 

Изменено пользователем pvpgate

Поделиться сообщением


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

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация  

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...