[ РЕШЕНО ] Ресет мира для миниигры.

  • Автор темы Автор темы Stamorey
  • Дата начала Дата начала
Статус
Закрыто для дальнейших ответов.
тогда попробую, наверное это идеальное решение, если это сработает -_-)
хм, сервер просто крашнулся при запуске
А нет, помогло, сделал рид онли только папки с регионами.
 
Если ты про телепортацию по режимам/серверам, то устанавливай BungeeCord(Настройку его можно найти в интернете)
 
Если ты про телепортацию по режимам/серверам, то устанавливай BungeeCord(Настройку его можно найти в интернете)
Не совсем то что я хотел, сервер один, с несколькими мирами, через MultiWorld, с телепортацией я разабрался, щас другая проблема: заменить текст на табличке по клику на нее, вот код:

if(s.getLine(0).equals("SkyWars_1"))
{
e.getClickedBlock();
Material mtrl1;
mtrl1 = Material.WALL_SIGN;
mtrl1.
Player p = e.getPlayer();
World world_swl_1 = Bukkit.getWorld("lobby_sky1");
p.teleport(new Location(world_swl_1,-322,73,1354));
{


Помимо телепортации как-то надо заменить/изменить строки на табличках
Пока что понял только как заменить саму табличку на другой блок)
 
Не совсем то что я хотел, сервер один, с несколькими мирами, через MultiWorld, с телепортацией я разабрался, щас другая проблема: заменить текст на табличке по клику на нее, вот код:

if(s.getLine(0).equals("SkyWars_1"))
{
e.getClickedBlock();
Material mtrl1;
mtrl1 = Material.WALL_SIGN;
mtrl1.
Player p = e.getPlayer();
World world_swl_1 = Bukkit.getWorld("lobby_sky1");
p.teleport(new Location(world_swl_1,-322,73,1354));
{


Помимо телепортации как-то надо заменить/изменить строки на табличках
Пока что понял только как заменить саму табличку на другой блок)
SignChangeEvent e
if (e.getLine(0).equalsIgnoreCase("оппа")) {
e.setLine(0, "§3опоп");
}
 
(p.s. в коде ненужные строки есть, пытаюсь экспериментировать, так как в гугле ничего не смог найти)
SignChangeEvent e
if (e.getLine(0).equalsIgnoreCase("оппа")) {
e.setLine(0, "§3опоп");
}
щас попробую:rolleyes:
Спасибо огромное) все работает.
 
Не совсем то что я хотел, сервер один, с несколькими мирами, через MultiWorld, с телепортацией я разабрался, щас другая проблема: заменить текст на табличке по клику на нее, вот код:

if(s.getLine(0).equals("SkyWars_1"))
{
e.getClickedBlock();
Material mtrl1;
mtrl1 = Material.WALL_SIGN;
mtrl1.
Player p = e.getPlayer();
World world_swl_1 = Bukkit.getWorld("lobby_sky1");
p.teleport(new Location(world_swl_1,-322,73,1354));
{


Помимо телепортации как-то надо заменить/изменить строки на табличках
Пока что понял только как заменить саму табличку на другой блок)
Я не понимаю, где качество? Зачем делать все МГ на одном сервере? Банжи для кого изобрели? В первую очередь такой "строй" сервера - постоянные лаги из-за нагрузки. Я надеюсь, у тебя только SkyWars? Скажи что хоть выживание на другом сервере...
 
Ставишь сшмод на папку мира реадонли, пруфит. Не перезапишется.
Попытался сделать это для мира сгенерированного плагином multoworld , при попытке зайти в мир в консоле куча ошибок, а вместо мира появляется пустота... Что посоветуете ?
По прежнему нужен "регенерирующийся мир"...
 
Попытался сделать это для мира сгенерированного плагином multoworld , при попытке зайти в мир в консоле куча ошибок, а вместо мира появляется пустота... Что посоветуете ?
По прежнему нужен "регенерирующийся мир"...
КОнечно не мог, ты же поставил на readOnly, как он тебе туда игрока в бд внесет? Во и ошибки...
 
КОнечно не мог, ты же поставил на readOnly, как он тебе туда игрока в бд внесет? Во и ошибки...
как же тогда можно решить эту проблему?
может можно как-то отловить сохранение мира и отменять его самому...
 
как же тогда можно решить эту проблему?
может можно как-то отловить сохранение мира и отменять его самому...
Ты что то лишне зацепил chmod-ом. Или ты создал мир когда уже реадонли поставил.
 
Ты что то лишне зацепил chmod-ом. Или ты создал мир когда уже реадонли поставил.
реадонли стоит только на файлах в папке region (на всех) и ставлю его до того как включаю сервер, но мир уже есть, в результате вместо мира грузится пустота..
мне кажется можно реализовать это с помощью перезаписи самих файлов, попробую разобраться с этим... отпишусь если получится
Решил проблему так:
1. Стоит multiworld (мир который нужно ресетнуть создан с помощью него, поэтому его можно выгружать командой /mw unload world_name)
2. После того как mw выгрузил мир, удаляю папку region с помощью метода:
void deleteDirectory(File sourceLocation)
throws FileNotFoundException, IOException {

if (sourceLocation.isDirectory()) {

String[] children = sourceLocation.list();
for (int i=0; i<children.length; i++) {
deleteDirectory(new File(sourceLocation, children));

} sourceLocation.delete();
} else {
sourceLocation.delete();

}
}

3. Копирую заранее сохраненную папку region на место старой методом:
void copyDirectory(File sourceLocation , File targetLocation) throws FileNotFoundException, IOException
{

if (sourceLocation.isDirectory()) {
if (!targetLocation.exists()) {
targetLocation.mkdir();
}

String[] children = sourceLocation.list();
for (int i=0; i<children.length; i++) {
copyDirectory(new File(sourceLocation, children),
new File(targetLocation, children));

}
} else {

InputStream in = new FileInputStream(sourceLocation);
OutputStream out = new FileOutputStream(targetLocation);

// Copy the bits from instream to outstream
byte[] buf = new byte[1024];
int len;
while ((len = in.read(buf)) > 0) {
out.write(buf, 0, len);
}
in.close();
out.close();
}
}

4. Загружаю мир в игре командой /mw load world_name

проффит)
может это и костыль, но все работает правильно и быстро, на всякий случай между выполнением - /mw load /mw unload и удалением/копированием жду 3-4 секунды. (у меня все это делается в таймере, на определенных секундах)

p.s. (сами директории записал так
File name_1 = new File("world\\s_g_1\\region"); //путь к папке region
File name_2 = new File("world\\s_g_1\\5region\\region"); //путь к резервной папке region

После:
try {
deleteDirectory(dirreg1); //для удаления
} catch (IOException ex) {
Logger.getLogger(Instrument.class.getName()).log(Level.SEVERE, null, ex);
}

try {
copyDirectory(c_dirreg1,dirreg1); //для копирования
} catch (IOException ex) {
Logger.getLogger(Instrument.class.getName()).log(Level.SEVERE, null, ex);
}
без блоков try эклипс ругается...
)

Ах да, еще одно - команды /mw* прописываю от консоли
Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "mw load s_g_1");
Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "mw unload s_g_1");
s_g_1- мир


и еще одно :D после выгрузки и загрузки мира приходится обновлять все классы имеющие ссылки на этот мир,
например если есть локации или миры:
Location loc = new Location(s_g_1,-727,95,203);
World s_g_1 = Bukkit.getWorld("s_g_1");
Последние две команды надо местами поменять...
 
А тему закрыть, чтобы не апали?
 
UP закрываю)
 
Статус
Закрыто для дальнейших ответов.
Назад
Верх